OmniAICreator/Qiita-1.07M huggingface dataset:
Fastly のふたつの Rate Limiting の機能について

# はじめに

Fastly NGWAF の上位パッケージには Advanced Rate Limiting（ARL) という機能が含まれています。

これは NGWAF のエージェントが指定した条件のリクエストを IP アドレスなどをベースにカウントし、設定した閾値を超える場合にアクセスをブロックするなどの機能を提供するものです。

もうひとつ別の Rate Limiting の機能として、Fastly は CDN レイヤーに Varnish Configuration Language(VCL) で実装する Edge Rate Limiting（ERL） という機能も提供しています。

この記事ではこの二つの機能の特性と、それぞれに適した用途について説明します。

## ARL と ERL の比較


### Advanced Rate Limiting(ARL)
ログインやカートへのアイテムの追加など特定の動作の繰り返しなど**比較的小規模なアクセスに対するレートリミット**です。
分かりやすいユースケースで言うとログイン時に3回パスワードを間違えるとしばらくアクセスが出来ないようにしたり、クレジットカードの登録を繰り返す IP からのアクセスを自動でブロックするといったユーザーの行動やボットに対するレートリミットとして利用することが出来ます。

NGWAF の実装はオリジン側でも Fastly の CDN 上(Edge Deploy)でも構いません。

*ARL を利用するには本機能を含むパッケージの Fastly の NGWAF の契約が必要です。*

#### ARL 動作イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/05c7d8e8-fb68-697f-503b-ded68bce063f.png)



##### ARL の挙動
Rate Limit ルールに指定した条件に合致するリクエストを受信すると、`threshold signal` に指定した signal がリクエストに付与されます。この条件を満たすリクエストがカウントされ閾値を超えると指定した期間、ブロックなどの処理を行います。

設定する場所: NGWAF(Edge Deploy, オリジン環境へのエージェント）
カウント対象: IP, リクエストヘッダ、その組み合わせ
カウント場所: Agent、その後 CloudEngine を通じて数値を合算
検知期間: 1分 or 10分
閾値: 1 - 10,000
Actionの時間: 5分から24時間
Action の対象: カウントと同じ条件、特定のシグナル、全てのリクエスト
Action の種類: Block, Log

典型的な利用ケース: アカウントテイクオーバー(ATO)、クレデンシャルスタッフィング、スニーカーボット、コンテンツスクレイピング、クレジットマスターアタックなど


**設定画面**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/a6d24dda-a9b1-cb59-aa7e-c8fec18f1c99.png)


**制約事項**
・Site ごとに作成可能な Rate Limiting Rule の数には上限があります。

機能の詳細は以下のドキュメントをご参照下さい。
https://docs.fastly.com/en/ngwaf/working-with-advanced-rate-limiting-rules

### Edge Rate Limiting(ERL)
ERL は **DDoS など中規模、大規模な攻撃に対する対策**として主に利用されます。CDN レイヤーで実装されるため NGWAF の利用の有無に関わらず、Fastly CDN を利用していることが利用条件となります。

*ERL 自体は VCL で CDN 上に実装しますが、ERL を利用するためには ERL を含むセキュリティオプションの契約が必要です。*

#### ERL 動作イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/fbe34130-b883-ab9e-cfbc-ca7a8b01d0e7.png)


##### ERL の挙動
指定した条件を満たすリクエストが閾値（RPSで設定）を超えると指定したアクションをとる。ERL は Web UI でも設定可能ですが VCL を利用してより柔軟な設定を行うことも可能です。

設定する場所: VCL (Fastly CDN)
カウント対象: IP , User-Agent, IP and User-Agent
カウント場所: POP(配信拠点） 単位
検知期間: 1秒、10秒、60秒
閾値: 10 - 10,000 RPS
Actionの時間: 1-60分
Actionの種類: Block, Log

典型的な利用ケース: DDoS攻撃対策、中規模以上の不正アクセスに対する対策

※ 上記は ウェブ UI を利用して設定した場合の内容です。VCL を利用することでよりカスタマイズした挙動を設定することも可能です。

**設定画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128569/b21a794d-ccad-5f76-2321-9916a07bdae2.png)

**制約事項**
・数値は配信拠点（POP）ごとにカウントされ別拠点には共有されません。
・累積したカウント数は、1秒、10秒、または60秒のうち、設定した時間枠に基づいて計算された推定レートです。

機能の詳細は以下のドキュメントをご参照下さい。
https://docs.fastly.com/ja/guides/working-with-rate-limiting-policies

# まとめ
この記事では Fastly が提供する二つの Rate Limiting 機能について説明しました。用途に応じて使い分けることでサービスにあった最適なセキュリティを適用しましょう。

また、Fastly では Rate Limiting の機能以外にもセキュリティに利用可能な様々な機能を提供しています。Webサイトやアプリケーションのセキュリティにお困りの際はぜひご相談下さい。
【Java】不変オブジェクトのStringと可変オブジェクトのStringBuilder

## はじめに
不変オブジェクトのStringと可変オブジェクトのStringBuilderについてまとめました。そして、Stringオブジェクトに対して文字列操作を行う際の注意点を時間計算量とともに考察しました。

## Stringの基本
Stringは文字列を扱うクラスです。Javaの文字列は全てStringクラス（java.lang.String）のインスタンスとなります。

```java
String str = "abc"
```
また、Stringは文字配列を用いて定義することもできます。

```java
char[] data = {'a', 'b', 'c'};
String str = new String(data);
```

## 不変オブジェクトのString
Stringは不変オブジェクトであるため、一度作成すると変更することができません。
　
試しに、`str1.substring(1)`を実行して、str1に対して文字列操作を行ってみます。

```java: Main Class
public class Main {
    public static void main(String[] args) {
        String str1 = "abc";
        str1.substring(1);  // "bc"
        System.out.println(str1);  // "abc"
    }
}
```

```console:出力
"abc"
```
str1は不変オブジェクトであるため、str1に対して`substring`メソッドを使用しても元の文字列である`"abc"`は変更されません。

　
下の例でも、`str1.substring(1)`で作成された新しい文字列への参照をstr1に代入しただけで、元の文字列が変更されているわけではありません。

```java: Main Class
public class Main {
    public static void main(String[] args) {
        // 元の文字列が変更されているわけではなく、substring()で作成された新しい文字列への参照をstr1に代入した。
        String str1 = "abc";
        str1 = str1.substring(1);
        System.out.println(str1);  // "bc"
    }
}
```

```console:出力
"bc"
```

## Stringクラスのデメリット
Stringは不変オブジェクトであるため意図しない副作用の発生を防ぎ、安全性を提供します。しかし、注意点もあります。

### 計算量がO(xn^2)
文字列の連結のたびに新しい文字列が作成され、そこに２つの文字列が1文字ずつコピーされていきます。この操作は、文字列の長さに比例して時間計算量が増加します。時間計算量は`O(xn^2)`になるだけでなく、ループのたびに新たな文字列を作成することで多くのメモリを消費します。

**文字列wの長さ: x**
**文字列の個数: n**

```java
public String joinWords(String[] words){
    String sentence = "";
    for (String w: words){
        sentence = sentence + w;
    }
    return sentence;
}
```
 
:::note info
時間計算量の導出は、1つ目の参考文献のp.106をご覧ください。
:::

## 可変オブジェクトのStringBuilder
このような計算量の増加を避けるために、可変のStringBuilderクラスを使用することができます。

### 計算量がO(xn)
StringBuilderは可変オブジェクトであるため、文字列の連結の際に新しい文字列を作成するのではなく、StringBuilderオブジェクトが内部で管理しているchar配列（バッファ）に文字を追加していきます。そして、最後にtoStringメソッドを使用してStringオブジェクトに変更します。下の例では、時間計算量は`O(xn)`となり、`O(xn^2)`から大幅に改善しました。
　
**文字列wの長さ: x**
**文字列の個数: n**

```java
public String joinWords(String[] words){
    StringBuilder sb = new StringBuilder();
    for(String w: words) {
        sb.append(w);
    }
    return sb.toString();  // toStringメソッドでStringBuilderオブジェクトをStringオブジェクトに変更
}
```

:::note info
`m`を最終的な文字列の長さとするとき、`m = xn`であるため、`O(xn) = O(m)`と書くことができます。
:::

## まとめ
今回の例のようにループを使用して何度も文字列操作を行う場合は、StringBuilderクラスの使用が推奨されます。

## 参考文献
* [世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~ 
(Gayle Laakmann McDowell・著)](https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E3%81%A7%E9%97%98%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%E6%9C%AC-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E9%9D%A2%E6%8E%A5189%E5%95%8F%E3%81%A8%E3%81%9D%E3%81%AE%E8%A7%A3%E6%B3%95-Gayle-Laakmann-McDowell/dp/4839960100)
* [クラスStringBuilder - Oracle](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/StringBuilder.html)
* [JavaのStringについて - Qiita](https://qiita.com/SUZUKI_Masaya/items/47bb767aaef40a51b400)
遺伝研のスパコンでminiconda3のbaseとenvのパスがシステム側になってしまったときの修正法

遺伝研のスパコンでローカルにminiconda3をインストールして使っていたら、condaのbaseとenvのパスが、システムのパス(/opt/)になってしまったときの解決法。理由は、単にconda deactivate baseをしてしまったこと、かもしれない。


スパコンでのminiconda3のインストール　https://sc.ddbj.nig.ac.jp/software/python/

```
$ conda info

   active environment : base
  active env location : /opt/pkg/intel/oneapi/intelpython/latest
      shell level : 1
    user config file : /home/hoge/.condarc
 populated config files : /opt/pkg/intel/oneapi/intelpython/latest/.condarc
             /home/hoge/.condarc
     conda version : 4.11.0
  conda-build version : not installed
     python version : 3.9.10.final.0
    virtual packages : __linux=3.10.0=0
             __glibc=2.17=0
             __unix=0=0
             __archspec=1=x86_64
    base environment : /opt/pkg/intel/oneapi/intelpython/latest (read only)
   conda av data dir : /opt/pkg/intel/oneapi/intelpython/latest/etc/conda
 conda av metadata url : None
      channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
             https://repo.anaconda.com/pkgs/main/noarch
             https://repo.anaconda.com/pkgs/r/linux-64
             https://repo.anaconda.com/pkgs/r/noarch
             https://conda.anaconda.org/conda-forge/linux-64
             https://conda.anaconda.org/conda-forge/noarch
             https://conda.anaconda.org/bioconda/linux-64
             https://conda.anaconda.org/bioconda/noarch
             file:///opt/pkg/intel/oneapi/conda_channel/linux-64
             file:///opt/pkg/intel/oneapi/conda_channel/noarch
             https://conda.anaconda.org/intel/linux-64
             https://conda.anaconda.org/intel/noarch
     package cache : /opt/pkg/intel/oneapi/intelpython/latest/pkgs
             /home/hoge/.conda/pkgs
    envs directories : /home/hoge/.conda/envs
             /opt/pkg/intel/oneapi/intelpython/latest/envs
        platform : linux-64
       user-agent : conda/4.11.0 requests/2.28.1 CPython/3.9.10 Linux/3.10.0-1160.el7.x86_64 centos/7.9.2009 glibc/2.17
        UID:GID : 3167:10805
       netrc file : None
      offline mode : False
```


解決法
```
$ source /home/hoge/miniconda3/etc/profile.d/conda.sh
```
実はsourceを使う方法は上記のスパコンのページで紹介しているので、それに従えば良かっただけ。
conda initではうまくいかないので注意。
【AWS】パブリック IPv4 アドレスを使用していると追加で料金が発生する件

## はじめに
先日AWSから「パブリック IPv4 アドレスの利用に対する新しい料金体系を発表 」がありました。

https://aws.amazon.com/jp/blogs/news/new-aws-public-ipv4-address-charge-public-ip-insights/

>AWS は、パブリック IPv4 アドレスの利用に対して新しい料金体系を導入します。2024 年 2 月 1 日より、特定のサービスに割り当てられているかどうかに関わらず、すべてのパブリック IPv4 アドレスの利用に対して 1 IP アドレスあたり 0.005 USD/時間 が課金されます（アカウントに払い出されているものの、 どの EC2 インスタンスにも割り当てられていないパブリック IPv4 アドレスに関しては、すでに課金が適用されています）。

## 確認方法
AWS環境にて実際に利用しているパブリックIPv4 アドレスを確認してみましょう。

#### 1.AWSコンソールを開いたら、上部の検索用バーに「VPC」と入力し、検索結果から「VPC」をクリックする。
![qiita23111301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811087/891c2efc-5efd-9a37-9bf4-808e64eb172f.png)

#### 2.左側にある「VPC IP Address Manager」をクリックする。
![qiita23111302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811087/8bda675b-1f6c-f491-9d2c-3f5d0dcda3eb.png)

#### 3.「VPC IP Address Manager」が表示されたら、左側にある「パブリックIPに関するインサイト」をクリックする。
![qiita23111303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811087/675977d1-36fb-404c-5d33-6ff7808befaa.png)


#### 4.「パブリックIPに関するインサイト」が表示されるので、ここで確認する。
![qiita23111304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811087/8bd9c10d-aa0a-39c3-4d20-d5f6f0272540.png)

上記の画像を確認しますと、18パブリックIP使用している事がわかります。
グラフで利用されている用語を説明します。

>* Elastic IP アドレス (EIP): Amazon が提供する静的なパブリック IPv4 アドレスであり、EC2 インスタンス、Elastic Network Interface、または AWS リソースと関連付けることができます。
>
>* EC2 パブリック IPv4 アドレス: Amazon が EC2 インスタンスに割り当てるパブリック IPv4 アドレスです (デフォルトのサブネットで EC2 インスタンスが起動された場合、またはパブリック IPv4 アドレスを自動的に割り当てるように設定されたサブネットでインスタンスが起動された場合)。
>
>* BYOIPv4 アドレス: Bring-Your-Own-IP (BYOIP) 機能により AWS に持ち込む IPv4 アドレス範囲のパブリック IPv4 アドレスです。
>
>* サービスマネージド IPv4 アドレス: AWS サービスにより自動的に AWS リソースにプロビジョニングされて管理されるパブリック IPv4 アドレスです。例えば、Amazon ECS、Amazon RDS、Amazon Workspaces のパブリック IPv4 アドレスなどです。

https://docs.aws.amazon.com/ja_jp/vpc/latest/ipam/view-public-ip-insights.html

## 料金について
2024年2月1日より以下の料金が追加で発生致します。
| パブリック IP アドレスのタイプ | 現在の料金/時間 (USD)|新料金/時間 (USD)<br>(2024年2月1日より適用)|
| ---- | ---- | ---- |
| VPC 内のリソース、Amazon Global Accelerator、AWS Site-to-Site VPN トンネルに割り当てられた、使用中のパブリック IPv4 アドレス（AWSが提供するパブリック IPv4 アドレスおよび Elastic IP アドレスを含む） | 無料 |$0.005|

例.パブリック IPv4 アドレス18個利用
```
■パブリックIPの利用料金(1か月)
・1時間： 0.09ドル (0.005ドル ✕ 18個)
⇒日本円：150×0.09＝13.5円

・月額： 64.8ドル (0.09ドル x 24時間 x 30日) 
⇒日本円：150×64.8＝9,720円
※レート（1ドル：150円）
```
意外と金額が大きいことがわかります。

## 所感
AWSとしては、以下のような意図があるようです。

>IPv4 アドレスはますます希少な資源となっており、パブリック IPv4 アドレスを取得するためのコストは、過去 5 年間で 300％ 以上上昇しています。この新しい料金体系の導入は、私たち自身のコストを反映したものであり、また、パブリック IPv4 アドレスの使用を節約し、モダナイゼーションおよび IPv4 アドレスの保全策として IPv6 の採用を奨励することを意図しています。

https://aws.amazon.com/jp/blogs/news/new-aws-public-ipv4-address-charge-public-ip-insights/

パブリック IPv4 アドレス一つのコストは小さいかもしれませんが、
積み重なると無視できないものになるかと思います。

今一度、環境を見直し不要なパブリック IPv4 アドレスは削除するよう徹底した方がよいでしょう。
AndroidStudio: 単体テスト

## ツリー構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a79302cd-90b9-c776-0f7b-f6a3f8dcef02.png)


## テスト対象の　Class

```Calculator.kt
package com.example.calc06

class Calculator {

    fun multiply(a: Int, b: Int): Int {
        return a * b
    }
}
```

## テストプログラム

```CalculatorTest.kt
package com.example.calc06

import org.junit.Assert
import org.junit.Test

class CalculatorTest {

    @Test
    fun multiply() {
        val calculator = Calculator()
        val expected: Int = 6
        val result = calculator.multiply(2,3)
        Assert.assertEquals(expected, result)
    }

    @Test
    fun multiply2() {
        val calculator = Calculator()
        val expected: Int = 10
        val result = calculator.multiply(2,5)
        Assert.assertEquals(expected, result)
    }

    @Test
    fun multiply3() {
        val calculator = Calculator()
        val expected: Int = 20
        val result = calculator.multiply(4,5)
        Assert.assertEquals(expected, result)
    }
}
````

## テスト結果

```text
Tests passed: 3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4f1f8a69-08c6-755c-9a1e-2e67fc4d262c.png)
HTMLに改行文字\nを含む文字列を改行として表示する方法

HTMLタグ要素内容は、別の場所で設定され、改行の内容も含まれます。
``` html
<body>
  <p id='test'></p>
</body>
<script>
  const str = '{"text":"text検証\\n test"}'
  const obj = JSON.parse(str)
  document.getElementById('test').innerHTML = obj.text
</script>
```

しかしこの場合、改行は表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617547/7d0898a1-10b4-c93e-e65a-2760a1b67c8e.png)

修正方法は簡単で、```white-space```というCSSプロパティの追加です。
```html
<body>
  <p id='test' style="white-space: pre-line;"></p>
  <!-- <p id='test' ></p> -->
</body>
<script>
  const str = '{"text":"text検証\\n test"}'
  const obj = JSON.parse(str)
  document.getElementById('test').innerHTML = obj.text
</script>
```
これにより、改行が正しく表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617547/63c304d7-5961-ff93-82b7-bd846e90c767.png)
RustのPrelude(プレリュード)って何?

## 背景
Rustの概観を説明するドキュメントであるthe bookの[非公式の日本語訳](https://doc.rust-jp.rs/book-ja/)を読んでいる際に、 [2.数当てゲームのプログラミング](https://doc.rust-jp.rs/book-ja/ch02-00-guessing-game-tutorial.html)の章の中で下記の記述が見つけ気になったので、個人的なメモのためにもまとめておきます。

> Rustはデフォルトで、標準ライブラリで定義されているアイテムの中のいくつかを、すべてのプログラムのスコープに取り込みます。 このセットはprelude（プレリュード）と呼ばれ、標準ライブラリのドキュメントでその中のすべてを見ることができます。

## Q. Rust の Prelude って何?
では公式のドキュメントを確認してみると下記の様な記載があるように、ほとんど全てのプログラムで仕様されるようなライブラリのリストで、このリストにあるライブラリは自動的にインポートされます。

> The prelude is the list of things that Rust automatically imports into every Rust program. It’s kept as small as possible, and is focused on things, particularly traits, which are used in almost every single Rust program.

これをDeepLで意訳すると下記です

> プレリュードは、RustがすべてのRustプログラムに自動的にインポートするもののリストです。できる限り小さくし、Rustのほとんどすべてのプログラムで使用されるもの、特にtraitに焦点を当てています。

## Q. Prelude はなぜ必要？
A. Rustのほとんどのプログラムで必要になるようなライブラリを1つずつ指定するのは大変だから。

## Q. では全てのライブラリを読み込ませては？
A. ビルド時間の増加などリソース問題があるので、全てを読み込むわけにはないかないので、バランスを取る必要がある。

## Q. Preludeは他にも存在する？
`std::io::prelude` など標準ライブラリや任意のエコシステムにも存在するが、自動では読み込まれません。

## Q. Preludeには何が含まれる？
Rust 2015 と Rust 2018では 主に下記 (std::prelude::v1)

```
std::marker::{Copy, Send, Sized, Sync, Unpin}
std::ops::{Drop, Fn, FnMut, FnOnce}
std::mem::drop
std::boxed::Box
std::borrow::ToOwned
std::clone::Clone
std::cmp::{PartialEq, PartialOrd, Eq, Ord}
std::convert::{AsRef, AsMut, Into, From}
std::iter::{Iterator, Extend, IntoIterator, DoubleEndedIterator, ExactSizeIterator}
std::option::Option::{self, Some, None}
std::result::Result::{self, Ok, Err}
std::vec::Vec
```

Rust 2021 では 2015 及び 2018 の対象(std::prelude::v1)に下記を追加

```
std::convert::{TryFrom, TryInto}
std::iter::FromIterator
```

## Q. 実際にソース上でぱっと確認するには？

各エディションでの違いを確認する場合はこちら (Rust2015 ~ 2024)
- https://github.com/rust-lang/rust/blob/ea1e5cc91f413224741011cbd3c2ed380d3d3129/library/std/src/prelude/mod.rs#L102-L144

Rust2015 と Rust2018 が見ているstd::prelude::v1はこちら
- https://github.com/rust-lang/rust/blob/master/library/core/src/prelude/v1.rs

## 後書き
~preludeが増えることはめったにないと思うので永遠にv2こないやつでは…~
目下Rustを勉強中なので、同じ勉強中の方の参考になれば幸いです。

## 参考リンク
- https://doc.rust-jp.rs/book-ja/ch02-00-guessing-game-tutorial.html
- https://doc.rust-lang.org/std/prelude/index.html
- https://doc.rust-lang.org/std/io/prelude/index.html
- https://github.com/rust-lang/rust/blob/master/library/core/src/prelude/mod.rs
- https://github.com/rust-lang/rust/blob/master/library/core/src/prelude/v1.rs
【バグ日記】EditTextをLiveDataで持つむずかしさと立ち向かった

# この記事は
業務で少しつまづいたのでまとめます。
今更AndroidView&LiveDataの記事なんて誰も読まないかもしれませんが、これは私の知見としての備忘録というか、バグと戦った証というか。バグ日記（？）です。

# 概要
[仕様]
とある画面にEditTextが配置されています。
その画面に遷移するとRoomから永続化されたテキスト情報を取得し、EditText上に表示させます。
EditText上でテキストを編集し、保存ボタンを押すと、書き換えられた情報が永続化されます。

以上の仕様を踏まえて大体こんな感じのコードを書きました。
```kotlin
// === Fragment ===

override fun onViewCreated() {

    viewModel.currentInputText.observe(viewLifecycleOwner) {
        binding.editText.setText(it)
    }

    binding.editText.addTextChangedListener(
        afterTextChanged = {
            // readEditText()は現在EditText上に表示されているテキスト情報を取得する関数です
            viewModel.changeInput(readEditText())
        }
    )
}
```

```kotlin
// === ViewModel ===

// currentInputTextはEditTextに入力中のテキスト情報を保持しています
private val _currentInputText = MutableLiveData<String>()
val currentInputText: LiveData<String> = _currentInputText

private var savedText: String? = null

init {
    viewModelScope.launch {
        savedText = getTextData()
        _currentInputText.value = savedStateHandle[ArgsKey.HOGE] ?: savedText
    }
}

private suspend fun getTextData(){ // Roomから取得したテキスト情報を取得するUseCaseを呼び出す }

fun changeInput(text: String) {
        // 入力情報を更新する
        _currentInputText.value = text
        savedStateHandle[ArgsKey.HOGE] = _currentInputText.value
}
```

# バグ内容

## observeの中が無限に実行されちゃう
```kotlin
viewModel.currentInputText.observe(viewLifecycleOwner) {
    binding.editText.setText(it)
}
```
ここが無限に実行されちゃっていつまで経っても画面遷移が完了しません。

### :bug: 原因

`_currentInputText`が変化する → Fragmentの`observe`が呼ばれる → `observe`内でeditTextの値が変化する → editTextのListenerに登録されている`changeInput()`が呼ばれる → `changeInput()`内で`_currentInputText`が変化する → 以下無限ループ

**LiveDataとListenerの組み合わせには気をつけた方がよい** のかなと思いました。


### :bulb: : Fix
fix: 保存済みのテキストデータと入力中のデータが同じ場合は値を更新しない

```kotlin
fun changeInput(text: String) {
    // 入力情報を更新する
    if(_currentInputText.value != text) {
        _currentInputText.value = text
        savedStateHandle[ArgsKey.HOGE] = _currentInputText.value
        changeSaveButtonEnable()
    }
}
```
if文で条件を追加しました。

## EditTextのカーソル位置が先頭にきちゃう
これはどういうことかというと、EditTextに表示されている文字列を編集するたびにカーソルの位置が先頭にいっちゃう、という問題です。本来なら、編集した地点にカーソルがいてほしいです。

### :bug: 原因
**これは、`setText()`が問題のようでした。**
現在EditTextに表示されているテキスト情報と、`_currentInputText.observe`で反映しようとしているテキスト情報が同じである場合、そもそも`setText()`する必要がありませんが、してしまっていることでカーソル位置がおかしくなっているようです。

### :bulb: Fix
fix: 現在EditTextに表示されているテキスト情報と、`_currentInputText.observe`で反映しようとしているテキスト情報が同じ場合は`setText()`しない

```kotlin
viewModel.currentInputText.observe(viewLifecycleOwner) {
    val currentShownText = readEditText()
    setTextIgnoreSameValue(currentShownText, it)
}

private fun setTextIgnoreSameValue(
    currentShown: String, 
    currentInput: String,
) {
    if (currentShown != currentInput) {
        binding.editText.setText(currentInput)
    }
}
```
Eventbridge Schedulerによる Cloudwatch LogsのS3への出力について考えてみる

# 初めに結論
やってみると動くけど、実運用ではそのまま使うのは難しい。

# Eventbridge Scheduler
Eventbridge の機能でAWSのAPIをターゲットにしてスケジュール実行ができる。

# CLoudwatch logs
AWSのサービスやEC2などのログを集約できるサービス

# S3
言わずとれしれたオブジェクトストレージ、なんでも保存できる

# Cloudwatch logsをS3に保存したい
AWS上の種々のログはCloudwatch Logsに簡単に出力できる。なのでどんどん出力されたログは蓄積される。容量は制限がないので、蓄積したままでもよいが、Cloudwatch Logsに大量のログをずっとおいておくと費用がかかる。なので、蓄積したいログはなるべく安いところに移動して削除したい。

ということで、CloudwatchLogsからS3に移動して古いログはライフサイクルルールで安いストレージクラスに移動する、というのが常道。

# Cloudwatch logsからS3への移動方法

実運用を考えると一回ではなく定期的に実行する必要があるが、いくつか方法がとれる

- LambdaでCloudwatch LogsのAPI(Create Export Task)を呼ぶ処理をつくってEventBridge Schedulerとかで定期実行
- Cloudwatch Logs Subscription FilterとKinesisFirehoseで随時転送
- Eventbridge SchedulerからCloudwatch LogsのAPI(Create Export Task)を直実行

Lambdaは何でもかけるがコードを書かなくてはいけない。
Subscription FileterとKinesis Firehoseはコード書くのは不要だが別のサービスの設定を考えなくてはいけない。

それでは"Eventbridge SchedulerからCloudwatch LogsのAPI(Create Export Task)を直実行"だとどうなるだろうか。

# Eventbridge Schedulerの設定画面をみてみる
Eventbridge SchedulerのCreate Scheduleから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/c97840d1-813e-9e99-88d2-0d0893ed5b67.png)

スケジュール名は適当にして、スケジュールを考える、定期的に、と考えるととりあえず毎日0時に一回実行、と考えてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/21dff9aa-d2d8-256c-57ae-37b33cdf1ce9.png)

ターゲットにLogsを検索し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/63f2ffc9-4ea8-0000-66e8-587c247f9251.png)

CreateExportTaskを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/76be288f-567f-6da1-63d8-2479f58aae6a.png)

さて、以下の画面になってAPIに与えるパラメータが必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/70fb5d7b-1fb5-ff59-a19f-1a6fdbc40b2b.png)

Desitinationは宛先のS3、LogGroupNameは対象のLogGroupName、ここまではよい
"From"と"to"がある。1日一回毎日実行、とすると、この枠に対象の日の時間枠を設定してあげないといけないはず

CreateExportTaskのリファレンスを確認する
https://docs.aws.amazon.com/cli/latest/reference/logs/create-export-task.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/5ace1d8d-7d2f-354b-98b4-f9dbb047c20c.png)

どうもFrom,toは必須であり、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/7eca8cd6-7978-d220-f7ab-22b75bb652a1.png)

"1970 00:00:00"からのミリセカンドの経過時間でしか指定できない。。。

ということは、毎日異なる時間枠で実行するためには毎日分のスケジュールを個別につくって全部固定値を入れる必要がある、ということなので、やろうとすると実現性がなさそうである。
(CDKかなにかである程度の先まで毎日分のスケジュールをFromとto固定値で作成しておく？とかになってしまう)


ということでこの方法での定期Exportは実運用ではつかえなそうなので、"Cloudwatch Logs Subscription FilterとKinesisFirehoseで随時転送"が適していると考えている。

# 考察と期待
　
"やってみて機能としてできる"、と"実運用でも使える"はギャップがあるので、運用考えて設計しないといけないな、と思いました。

AWSさん、ぜひEventbridgeからの実行時に実行時間などから可変のパラメータを渡せるように(24時間前から実行時までとか)機能拡張をお願いします
Raspberry Piでコンソールサーバ作ってみる

# 環境
- Raspberry Pi 4B
    - 今回はUSBシリアルケーブルでルーターに繋げています。
![IMG_7534.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084346/ec0960f1-06b5-c646-58a4-7ce271681869.jpeg)
- Ubuntu Server 22.04.3 LTS 64bit

# 導入
### インストール

    sudo apt install conserver-server
    sudo apt install conserver-client
    
### USB番号を確認する

    fuuma@ubuntu:~$ ls /dev/ | grep USB
    ttyUSB0
    
### conserver.cfに設定を追記

    sudo vi /etc/conserver/conserver.cf
    
以下を追記

    console com0 {
        master localhost;
        type device;
        device /dev/ttyUSB0;
        baud 9600;
        parity none;
    }

### パスワード認証をなくす

    sudo vi /etc/conserver/conserver.cf

trustedのコメントを外す

    access * {
        trusted 127.0.0.1;
        allowed 127.0.0.1;
    }

conserver.passwd を編集する

    sudo vi /etc/conserver/conserver.passwd

空なので以下を追記

    *any*:*

### 設定を読み込む
    
    sudo service conserver-server restart
    
設定できているか確認する
    
    fuuma@ubuntu:~$ console -x
     com0                     on /dev/ttyUSB0@localhost           at    9600n
     
### 動かしてみる
    
    fuuma@ubuntu:~$ console com0
    [Enter `^Ec?' for help]
    
    Router>

## 基本的なコマンドの方法
「Ctrl +  e」 を押した後、 「c」を押すと「[」が現れます。その後 下にあるコマンドを入力します
## Helpの見方
Helpを見たいなら以下の順番に押します。すると以下のようなhelpが出てきます。
    1. Ctrl + e
    2. c
    3. ?
        
    Router>[help]
     .       disconnect                     ;       move to another console
     a       attach read/write              b       send broadcast message
     c       toggle flow control            d       down a console
     e       change escape sequence         f       force attach read/write
     g       group info                     i       information dump
     L       toggle logging on/off          l?      break sequence list
     l0      send break per config file     l1-9a-z send specific break sequence
     m       display message of the day     n       write a note to the logfile
     o       (re)open the tty and log file  p       playback the last 60 lines
     P       set number of playback lines   r       replay the last 20 lines
     R       set number of replay lines     s       spy mode (read only)
     u       show host status               v       show version info
     w       who is on this console         x       show console baud info
     z       suspend the connection         !       invoke task
     |       attach local command           ?       print this message
     <cr>    ignore/abort command           ^R      replay the last line
     \ooo    send character by octal code
        
## コンソールの抜け方
接続を解除して抜けたい場合はこのようにします
1. Ctrl + e
1. c
1. 「 . 」(ドットです。見にくいので「」を付けています)

# まとめ
普段使っているUbuntuで簡単にコンソールサーバーが出来てびっくりしました。
IPアドレスの固定をやっていないので追加でやりたいですね
# 参考
https://infrapod.net/linux-console-server/
React: Chakra UIのButtonを操作できなくするプロパティはdisabledではなくisDisabled

使い始めた[Chakra UI](https://chakra-ui.com/)について、プロパティの扱いでつまずいたため、情報を共有します。


# `Button`コンポーネントを操作できなくするプロパティは`isDisabled`
Chakra UIのButtonコンポーネントを操作できなくするために用いるプロパティは[`isDisabled`](https://chakra-ui.com/docs/components/button/props#:~:text=false-,isDisabled)です。HTMLの標準プロパティ[`disabled`](https://developer.mozilla.org/docs/Web/HTML/Attributes/disabled)は使えません。

TypeScriptを備えた環境でも、`disabled`は`Button`コンポーネントの型として通ってしまうのが悩ましいところです(「[disabled prop does not work for Button and Radio despite the type allowing it](https://github.com/chakra-ui/chakra-ui/issues/7269)」参照)。公式ドキュメントに、`disabled`がダメという情報は、探した範囲では見当たりません。


# カスタムボタンなら`disabled`が使える
辛うじて公式ドキュメント「Button」の「[Custom Button](https://chakra-ui.com/docs/components/button/usage#custom-button)」の項には、カスタムボタンなら`disabled`プロパティは定められるという説明があります。ただし、コンポーネントは[`Box`](https://chakra-ui.com/docs/components/box/usage)を用い、[`as`](https://chakra-ui.com/docs/components/box/usage#usage)プロパティでDOM要素`button`に設定したうえで(`as="button"`)[^1]、スタイルは細かく決めなければなりません(「[Custom Button](https://chakra-ui.com/docs/components/button/usage#custom-button)」参照)。

なお、`disabled`が`true`のときのスタイルは、`_disabled`プロパティに定めてください。

```react
<Box
	as='button'

	_disabled={{ bg: 'lightgray' }}
	disabled={true}
>
```

というより、`Button`コンポーネントに`disabled`はプロパティとして使えないということを、まずドキュメントに明記してほしかったです。

[^1]: `Box`コンポーネントは、[デフォルトでは`<div>`要素として描画されます](https://chakra-ui.com/docs/components/box/usage#:~:text=By%20default%2C%20it%20renders%20a%20%60div%60%20element)。`as`はこれを他のDOM要素、ここでは`<button>`に切り替えるプロパティです。


# `Checkbox`がチェックされているかは`isChecked`プロパティ
筆者は、チェックボックスがチェックされていなかったら、ボタンは押せないという動作を書いていました。このときまた、`Checkbox`コンポーネントに用いるプロパティは[`checked`](https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/checkbox#%E8%BF%BD%E5%8A%A0%E3%81%AE%E5%B1%9E%E6%80%A7)ではありません。[`isChecked`](https://chakra-ui.com/docs/components/checkbox/props#:~:text=InputHTMLAttributes%3CHTMLInputElement%3E-,isChecked,-Description)です。

`boolean`(論理値)型のプロパティには接頭辞`is`を付するという命名規則は、明確だといえるかもしれません。ただ、標準HTMLと異なる点については、もう少し説明がほしいでしょう。
[Flutter] TextFieldを数字のみだけでなく、小数点も使えるようにする方法

![スクリーンショット 2023-11-07 16.38.31（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/4a0ffb7b-1bbc-8992-0161-dcc78f641734.png)


:::note info
この記事は、<b>株式会社ゆめみの23卒 Advent Calendar 2023</b>のアドベントカレンダーになります！！
色々な種類の記事が投稿されるので、お楽しみに🤗
:::


https://qiita.com/advent-calendar/2023/yumemi-23-graduation

# 本題

こんにちは。いせりゅーです。
今回は、TextFieldについての記事はたくさんありましたが、「数字のみ」かつ「小数点は2文字目以降の入力ができる」という実装の記事が見つからなかったので、共有しようと思います！

### やりたいこと
- 11.0Kや6.12Mなどをよく見かけるが即座に数字のみに変換するやり方を忘れてしまう
  →よし、作ろう。

### 問題点
- TextFieldの入力を数字のみにしたいー＞すぐにできた。
- でも小数点も入力できるようにしないとだめだな・・

# 数字のみの制限にする

数字のみの制限をするのはとても簡単に作ることができます。たった2行で実装することができます。

```dart
TextField(
  // 数値のキーボードが表示される
  keyboardType: TextInputType.number,
  // コピペなどで数字以外の入力を防ぐ
  inputFormatters: [FilteringTextInputFormatter.digitsOnly]
),
```

上のコードで実装自体は、70％ぐらいできましたが、「小数点は2文字目以降の入力ができる」という実装はまだできていません。
現状だと、数字のみの入力になるため、小数点は入力できません。


小数点を入力できるようにするには以下の考え方が必要になります。
- 最初の1行目は小数点を入力できないようにする
  - 例）.01や.10は 今回の実装としては、入力できないようにしたい。
- 2文字以降は自由に使えるようにしたい。
- 小数点は、1回までの入力にしたい
  - 例）1.01.0や1.0.0.1.3...4などは変換するうえで不正な値になるから避けたい。 



では実装した内容をご紹介します。

```dart
TextField(
  keyboardType: TextInputType.numberWithOptions(decimal: true),
  inputFormatters: <TextInputFormatter>[
    FilteringTextInputFormatter.allow(RegExp(r'^\d+(\.\d*)?')),
  ],
)
```


# 最後に
今回、参考になる記事が見つからなかったときに、いろいろと試行錯誤を練ることはとてもいいなと思いました。考え方さえ理解してしまえば、ChatGPTと協力すれば実装できる気がしています。
今回の一番の収穫は、考え方を自分なりにまとめられたことだと思います。このいい発見を今後も実感できるといいなと思います！！


![NewGradsAdventCalendar_2023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/a237a03d-865a-4cb7-b825-5bb70a0f80da.png)
ライセンス管理のお仕事内容、苦労話

本記事は [オルトプラス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/altplus2023) の12/03の記事です。

はじめまして。オルトプラス yusukegと申します。

冒頭に申し上げておきますが、本記事はエンジニア向けの技術的な内容ではありません。
私の仕事は、弊社オルトプラスの従業員が日々使う、いろいろなソフトウェアの「ライセンス管理」を行っています。

# 目次
[1.やっていること](#やっていること)
[2.具体的にこころがけること](#具体的にこころがけること)
[3.やったことの成果](#やったことの成果)
[4.苦労話](#苦労話)
[5.おわり](#おわり)

それではいきます。

# やっていること
ソフトウェアライセンスや契約ツールの管理作業では、下記のものを扱っています。
開発系:
　Unity
　Docker
　各種エディタ
　ほか
デザイン系:
　Adobe CreativeCloud
　Autodesk
　OPTPIX ImageStudio
　各種フォント
　ほか
UI系:
　Figma
　ほか
管理系:
　Backlog
　Notion
　Slack
　ほか

これ以外にも必要に応じて扱っています。
ゲーム事業ではこうしたものをいくつも利用して、ゲームタイトルやサービスを作ることになります。
これだけ多いと、ひとりで管理するのはむずかしく、複数の管理担当者がいます。
例えば全従業員がデフォルトで使うようなものは、管理部門の方にやってもらっています。
これは担当の明確化だったり負荷分散、属人化を防ぎたいためです。
[目次へ戻る](#目次)

# 具体的にこころがけること
例えば製品ごとに契約期間があります。だいたい1年間が多いです。
当然メーカーが異なる製品ばかりなので、使用期限もバラバラになります。
(管理例)
Adobe CreativeCloud 2023/4/1～2024/3/31
Unity Pro 2023/8/1～2024/7/31
メーカーが同じ製品だと既存の期限にあわせて契約することができ、それによって管理がしやすくなります。

(既存管理に本数を追加する時の例)
Adobe CreativeCloud
└コンプリートプラン 2023/4/1～2024/3/31
└イラストレーター単品 2023/4/1～2024/3/31
└11/10にPhotoshop単品を買いたい→2023/11/10～2024/3/31の期間で購入する、といった具合。
逆にこういうところを何も考えずに買ってしまうと、使用期限が終わるたびにライセンス更新や使用者の確認を都度することになってしまいます。

(上述の例)
Adobe CreativeCloud
└コンプリートプラン 2023/4/1～2024/3/31
└イラストレーター単品 2023/10/11～2024/10/10
└イラストレーター単品2個目 2023/10/19～2024/10/18
└フォトショップ単品 2023/12/29～2024/12/28
こんなのが何十個もあると管理不能になります。
そこを考えながら購入のタイミングやライセンス期限を検討していきます。
期限管理をするのですから、更新手続きもしますし、継続しない場合は解約手続きもします。
稟議申請などの社内事務手続も付随業務として発生します。
更新にあたって、ライセンス貸与者に継続するのかしないのか、
しないのならいつ返却するのかなどの対応も必要です。

これらはひとりでやるのではなく、
プロジェクトにアサインされている現場の人達と連携しながら、実状に合わせて進めていきます。
[目次へ戻る](#目次)

# やったことの成果
こんなことをしながら、
契約期限が同じ製品なのにバラバラだったりしたものをまとめたり、
こまめに棚卸して無駄な貸与をなくし解約などを行い続けていきました。
また、貸与や返却のフローなどを策定して、省力化や効率化を行いました。
その結果、年に約6～700万円の削減ができました。現在、この状態を数年維持しています。
[目次へ戻る](#目次)

# 苦労話
変な言い方、真面目にやっていればいったんは成果が出ると思っていますが、継続がたいへんです。
例えるなら、ゴミ屋敷の掃除みたいなものです。
いつかはキレイになりますが、キレイにするまでと、キレイを維持するの大変ですよね。

この維持する部分に関わる話ですが、自動化がなかなかできません。
上述のような一連を私のほうで対応しているのですが、自動化の目途が立ちづらいと感じています。
部分的に自動化はできるのですが(例えば期限が来たら関係各所へアラート投げるなど)、
結局そこから代理店やメーカーに見積書依頼を出したり、社内稟議を作って申請したり、
稟議決裁がおりたら発注したり、支払が終わったらライセンス貸与したり、請求書が来たら経理にまわしたり、
使わなくなった人、退職した人から回収したり……といった部分がどうしても人間のやることになります。

そのため、エンジニアの方々からせっかく自動化の提案いただいても、
個人的には自分自身がまったく楽になる気がしないと、
後ろ向きな思考になってしまうのは自分が嫌になります(笑)。

資産管理ツール系などを導入すると、また変わってくるのでしょうが、
こうした人でやるところがある以上はトータルではコスト増になってしまうかと思っています。
[目次へ戻る](#目次)

# おわり
ここまで私が行っているライセンス管理について述べさせていただきました。

半分冗談半分本気ですが、誰か私の脳みそを解析してAIにでもしてくれれば、
少なくとも上述のような管理は全自動化できるのに、と思ったりしています(笑)。
[目次へ戻る](#目次)
ひらがなを含む行を見つけるための正規表現

### ひらがなを含む行を見つけるための正規表現

正規表現は、文字列のパターンを記述するための強力なツールです。ここでは、特定の条件を満たす行を見つけるための正規表現について学びます。具体的には、以下の条件を満たす行を見つける方法を説明します：

1. 行には「//」が含まれていないこと。
2. 行には少なくとも1つの平仮名が含まれていること。

#### 正規表現の構造

このタスクを達成するための正規表現は次のようになります：

```
^(?!.*//).*[ぁ-ん].*$
```

この正規表現を部分ごとに分解してみましょう：

1. `^` は行の始まりを意味します。

2. `(?!.*//)` は否定的先読みアサーションです。これは、「//」を含む行にはマッチしないことを意味します。具体的には、行のどこかに「//」があれば、その行は無視されます。

3. `.*` は任意の文字が0回以上続くことを意味します。これにより、平仮名の前後にどんな文字があっても構いません。

4. `[ぁ-ん]` は、少なくとも1つの平仮名文字にマッチします。この範囲は全ての平仮名をカバーしています。

5. 最後の `.*` は、平仮名の後に続く任意の文字列にマッチします。

6. `$` は行の終わりを意味します。

#### 他のケースの例

1. **カタカナを含む行を検索する：**
   ```
   ^[^\x00-\x7F]*[ァ-ン]+[^\x00-\x7F]*$
   ```
   この正規表現は、カタカナを含む行にマッチします。ASCII文字（英数字など）を含まない行にのみマッチするようにしています。

2. **英数字のみを含む行を検索する：**
   ```
   ^[A-Za-z0-9]+$
   ```
   この正規表現は、英字と数字のみを含む行にマッチします。

3. **特定の単語を含まない行を検索する：**
   ```
   ^(?!.*特定の単語).+$
   ```
   この正規表現は、「特定の単語」を含まない任意の行にマッチします。

正規表現は非常に柔軟で強力なツールですが、複雑になりがちなので、使い始める際には少し練習が必要です。しかし、基本を理解すれば、テキストデータの検索や処理を大幅に効率化できます。
ひつじがいっぱい出るアプリ

[クソアプリ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kuso-app)　1日目の記事です。

# 羊
羊を数えれば寝れる。
せっかくなので羊が走る姿も見たい。
ということで作りました。

# 完成したもの

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">qiitaアドカレ用　修正版　ひつじ <a href="https://t.co/hLrHTfkHpF">pic.twitter.com/hLrHTfkHpF</a></p>&mdash; ある暇な人 (@Aruhimanahito) <a href="https://twitter.com/Aruhimanahito/status/1723932564518297936?ref_src=twsrc%5Etfw">November 13, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

羊がいっぱい出ます。無限に数えられます。
数える以外の使い道がないのでクソアプリです。

# 中身
Unityで作りました。
結構シンプルです。

羊のイラストを手に入れて、いろいろやれば誰でも簡単に作れます。
↓羊が動く方
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HItujiMove : MonoBehaviour
{
    public int HitujiRandom;
    public GameObject Hituji;
    public string HitujiName;
    public Vector3 HitujiPos;
    // Start is called before the first frame update
    void Start()
    {
        Hituji.GetComponent<Transform>();
        HitujiRandom = Random.Range(-4, 4);
        HitujiPos.x = 5;
        HitujiPos.y=HitujiRandom;
        this.transform.position = HitujiPos;
        
    }

    // Update is called once per frame
    void Update()
    {
        HitujiName = this.name;
        if (HitujiName.Contains("Clone"))
        {
         
            this.transform.position = HitujiPos;
            HitujiPos.x -= 0.5f;
           
            if (HitujiPos.x <= -8)
            {
                Destroy(gameObject);

            }
        }
    }
}

```
↓羊が生まれる方
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class HitujiUmareru: MonoBehaviour
{
   
    public GameObject Hituji;
  
  
   
    
    public int time;
    // Start is called before the first frame update
    void Start()
    {
        time = 0;
     
    }

    // Update is called once per frame
    void Update()
    {
        time = time + 1;
      
        if (time >= Random.Range(6,20))
        {
            var HitujiClone =Instantiate(Hituji);
            HitujiClone.GetComponent<HItujiMove>();
            time = 0;
        }
    }
}
```
羊のクローンを作成して、名前にクローンが入っている羊だけ動かしています。
ランダムで羊がでて、特定の位置まで来たら勝手に消えます。
それだけです。
# 使った感想
目が覚めた
npm / yarnを実行するためのDocker環境構築

## 準備

Docker Desktopをインストールし起動しておきます。

プロジェクトルートに以下の内容で `compose.yaml` を作成します。

:::note warn
以下のサンプルではnode_modulesはホスト側と同期していません。
必要に応じて `type` を `bind` に変更するか、設定を削除してください。
:::

```yaml:compose.yaml
version: '3.7'
services:
  node:
    image: node:20.9.0
    container_name: node
    tty: true
    environment:
      - NODE_ENV=development
    ports:
      - '3000:3000'
    volumes:
      - type: bind
        source: .
        target: /usr/src/app
      - type: volume
        source: node-modules
        target: /usr/src/app/node_modules
    working_dir: /usr/src/app
volumes:
  node-modules:
    external: true
```

以下のコマンドを実行してDocker volumeを作成します。

```shell:volumeの作成
docker volume create node-modules
```

## コンテナを起動

```shell:コンテナ起動
docker compose up -d
```

## コンテナ内でコマンドを実行する例

```shell:npmの場合
docker compose exec node npm i
docker compose exec node npm run dev
```

```shell:yarnの場合
docker compose exec node yarn
docker compose exec node yarn dev
```
【Power Automate】フローの所有者を変更する方法

こんにちは！
M365（特にSharePoint,Power Automate,Power Apps,Teams）に関する記事やちょっとした小ネタなどをご紹介していきます。

## はじめに
エンドユーザー様のM365テナントで、構築用に借りたアカウントでフローを作成したものの、最終的に構築アカウントを削除することになってしまった、なんてことはありませんか？
そんなときの対処方法についてご紹介します。

## フローの所有者
フローの所有者には、「①フローの新規作成時に自動的に設定される所有者」と「②フロー作成後に追加出来る所有者」が存在します。

どちらも呼び方は同じ「所有者」ですが、1点大きな違いがあります。
それは、**①フロー作成時の所有者は「所有者」の編集画面から削除できない**です。
（図の通り、フロー作成者の右側のごみ箱がグレーアウトされ、クリック出来ないようになっています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/adc207fc-289c-6a06-e0dd-9d189a273780.png)

フローの所有者は、SharePointのサイト管理者（プライマリ管理者と追加の管理者）のように所有者の入れ替えも出来ないようなので、どうしても作成時の所有者を変更しなくてはいけない場合は、所有者に設定したいアカウントでフローをコピー作成することで目的を達成することが出来ます。

最初から本番用のアカウントを使って構築すればそのようなことにはならないのですが、、、

## 所有者変更の手順
大まかな作業の流れは以下の通りです。

・現在のフロー所有者（ユーザーA）でサインインし、新しく所有者に設定するアカウント（ユーザーB）にフローを共有する
・ユーザーBで対象のフローをコピー作成（名前をつけて保存）する

---
1．ユーザーAでマイフローを開き、対象のフローを選択し「共有」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/7c6c05b1-1176-b406-a5c0-74569e8bf716.png)

2．所有者の編集画面で、テキストボックスに追加したい所有者（ユーザーB）の名前またはメールアドレスを入力して検索候補から選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/f5ac977f-6ff5-30b8-ff42-cc43433b300b.png)

※ユーザー選択後に、以下の画面が表示されたら「OK」をクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/8b66c48e-512f-2b58-9b90-237b27638673.png">

3．ユーザーが追加されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/c76b4e8c-c681-7673-fbd2-362fbd9b7191.png)

4．ユーザーBでマイフローを開き、「自分と共有」タブに表示されたフローを選択し、「名前をつけて保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/2b12fd18-8caa-a94e-7a0f-5073c29e6c6a.png)

5．以下の画面が表示されたら「続行」をクリックし、次の画面で新しいフロー名に変更して「保存」をクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/ae7dc5d7-6e97-f864-02aa-288f0cc33f1f.png">

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/edf9425b-9a3f-2d45-ad37-2546c75b7de9.png">

6．マイフローの「クラウドフロー」タブに、複製したフローが表示されます。
　フローの詳細を開き、接続および所有者がユーザーBに変わっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/82131a0b-a7ef-7cfa-ddd3-2ddbeb8406b4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/d1b69486-ca30-14dd-618a-490ddb5a79c4.png)

## まとめ
もし所有者を変更する必要がある場合は、ぜひこの方法を試してみてください。
単純に既存のフローをコピーしたい場合は「名前をつけて保存」からの手順で複製が出来ますのでそちらも活用いただけたら幸いです。
macos xattr cli

```shell
xattr file.jpg

xattr -l file.jpg
```

```shell
ls -al@

ls -al@ *.jpg

ls -l@  file.jpg

-rw-r--r--@ 1 who staff

	com.apple.macl	    72
	com.apple.quarantine	 29
	com.apple.lastuseddate#PS	    16
	com.apple.metadata:kMDItemWhereFroms 137
```

## delete key

```shell
# Pick a Key to delete
xattr -d com.apple.metadata:kMDItemWhereFroms file.jpg

# REMOVE ALL keys for a particular file
xattr -c
```

## com.apple.quarantine

```
xattr -rd com.apple.quarantine file.dmg
```

---

Refs:

https://zhuanlan.zhihu.com/p/611471192

https://superuser.com/questions/28384/what-should-i-do-about-com-apple-quarantine

https://stackoverflow.com/questions/4833052/how-do-i-remove-the-extended-attributes-on-a-file-in-mac-os-x
パーミッションについて

デプロイ中にパーミッションで行き詰まったので、学習しながらまとめます。

# パーミッションとは

パーミッションとは、フォルダやファイルへのアクセス権です。
アクセス権を最小に設定することでセキュリティを担保します。

複数のファイルを持つディレクトリでも、ディレクトリだけにパーミッションを設定すればいいというものではなく、ファイルとディレクトリ個々に設定が必要です。

※ディレクトリへのパーミッションは、あくまでフォルダに対するもの。

〇パーミッションで設定できる3つの権限
・読み取り権限
・書き込み権限
・実行権限

# ターミナル上でのパーミッションの表記法

| | 読み取り権限 | 書き込み権限 | 実行権限 |
|--|--|--|--|
| アルファベット表記 | r | w | x |
|数値表記|4|2|1|

パーミッションは、8進数を3つ組み合わせた形表します

```
-rw-rw-r--. 1 root root  193  11月  13 11:17 test.txt
drwxr-xr-x. 2 test test    6  8月  1 12:45 ダウンロード
```
ターミナル上では上記のように表示されます。
行の左端、`-rw-rw-r--`、`drwxr-xr-x`がパーミッションです。

## アルファベット表記

下記のように3つのユーザーごとに権限が振られています。

|-rw-|rw-|r--|
|--|--|--|
|所有者|グループ|その他|

例えば、表のように表示されている場合は、所有者に読み取り権限・書き込み権限が与えられ、実行権限はありません。

また、所有者に`d`が付いている場合は、ディレクトリを表しています。

## 数字表記

数字の表記では、各ユーザーごとに、数値を足して表します。

|-rw-|rw-|r--|
|--|--|--|
|所有者|グループ|その他|
|4+2|4+2|4|
|6|6|6|

# パーミッションの変更方法

コマンドで変更する方法とFTPソフトで変更する方法の2通りあります。
※ここでは、コマンドでの変更方法のみ扱います。

## コマンドでの変更方法

パーミッションを変更できるユーザーは、ファイルとディレクトリの所有者、またはrootユーザーです。

### パーミッションを変更するコマンド
```
chmod アクセス権 ファイルorディレクト名
```

|操作対象|記号|
|--|--|
|所有者|u|
|グループ|g|
|その他のユーザー|o|
|全てのユーザー|a|

|権限操作|記号|
|--|--|
|アクセス権限の追加|+|
|アクセス権限の削除|-|
|アクセス権限の指定|=|

|操作権限|記号|
|--|--|
|読み取り権限付与|r|
|書き込み権限付与|w|
|実行権限付与|x|

例）
```
chmod u+w test.text
chmod 666 test.text
```
# 参考記事

https://qiita.com/nikoniko/items/7ebdad48a3c35fbc538e

https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95

https://qiita.com/tomoyuki_okawa/items/e4444e727946b956e1ee
AWS OpsWorks デプロイ時実行されるChefのレシピファイルを知る方法（メモ）

## 概要

OpsWorksにてデプロイ時に実行されるように設定されているChefのレシピを見る方法を簡単にまとめる。

## 方法

1. AWSコンソールにログイン
1. OpsWorksを開く
1. OpsWorks Stacksを開く
1. デプロイスタック名をクリック
1. 左サイドバーのLayersをクリック
1. レイヤー名の「Recipes」をクリック
1. 「Custom Chef Recipes」にデプロイ時に実行されるレシピが表示されている
ユースケース図を作る

こんにちは。ネオシステムの高橋です。
今回はユースケース図を作成したいと思います。
[前回の記事](https://qiita.com/szn-t/items/6e1db534c0a848605ede)も併せてご活用ください。


# 目次
- なぜユースケース図を作るのか
- ユースケース図作成の注意点
- アプリの機能を整理する
- ユースケース図を書く
- 追加情報を書く
- ユースケース記述を書く
- まとめ

# なぜユースケース図を作るのか
ユースケース図とは**ユーザーの視点でアプリの利用例を表現する図解術**です。
また、ユースケース図はUMLの一つであり、全世界共通で用いられています。
これを作成することによって以下のメリットが得られます。
### 顧客の要求を明確化できる
アプリ開発では、ユーザ自身が要求を明確にできていないケースが多いです。
ユースケース図を活用することで、顧客の要求を視覚化したり、隠れた要求を引き出したりすることができます。
また、口頭や文章だけでは認識に齟齬が必ず出るため、齟齬を減らすためにもユースケース図は役立ちます。

### アプリの開発範囲を明確化できる
前回の記事ではアプリの範囲について記載しましたが、ユースケース図を使うことでより分かりやすく表現することができます。
アプリでできることとできないことが明確になり、メンバ全員の理解度を上げることができます。

# ユースケース図作成の注意点
注意点は大きく分けて2つあります。

## システム利用者視点で書く
ユースケース図は**アプリユーザ**のための図解術です。
開発者向けの図ではないということを念頭に置きましょう。

## シンプルに書く
エンジニアは、条件分岐などのシステム内部のロジカルなところに目が行きがちですが、ユースケース図はそのような細かいところを表現する図ではありません。
シンプルすぎるのではと心配になるくらいで問題ないです。

# アプリの機能を整理する
[前回の記事](https://qiita.com/szn-t/items/6e1db534c0a848605ede)では、必要な機能をピックアップし、その優先度を決めました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599668/89040f53-b070-d265-7fa8-e2c70ef008d9.png)

まずはこれらの機能の詳細を洗い出します。
これらの機能に対して誰がどんなことをするのか整理していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599668/f83d0d07-5102-c46f-3a1e-0c0a7defd8fc.png)

ここまでできればユースケース図作成の準備は完了です。

# ユースケース図を書く
上のセクションで整理した機能を基にユースケース図を作成します。

![testname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599668/610b0b43-e3e7-437a-5719-baf3c8f597bc.png)



# 機能の関連性を見直す
次に、ユースケースそれぞれの関連性を見直していきます。
ある機能Aが他の機能Bを包含していたり、拡張した機能であるか見ていきましょう。

![testname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599668/b2e96778-007d-2304-cdf0-36183c51b792.png)

今回は3点修正しました。
- 工事管理者が承認を完了する作業は、その作業の中に承認を受け取りも含まれている
- 工事受注者が補修情報を一時保存する機能は、補修機能登録機能の一部ととらえる
- 事故報告の承認申請は、補修情報を登録する機能の拡張機能としてとらえる

`<<include>>`や`<<extend>>`の矢印を活用することで、ユースケースの関係性を表すことができます。

# ユースケース記述を書く
冒頭にユースケース図はシンプルに書くことが大事であると書きましたが、ユースケース記述も用意しておきましょう。
ユースケース図とユースケース記述を切り離して管理することで、図はシンプルな状態を保つことができます。

以下にユースケース記述の項目の例を列挙します。
必要に応じて項目を取捨選択しましょう。
- ユースケース名
- 概要
- アクター
- 事前条件
- トリガー
- 基本フロー
- 備考
- 代替フロー
- 例外フロー
- シナリオ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599668/9214809e-597b-5c45-cf4e-9d75baaeb242.png)

ユースケースが増えるとアプリの機能や利用シーンも増えることにつながり複雑なアプリになっていくので、本当に必要なユースケースなのかを確かめながらユースケース記述を記載しましょう。

# まとめ

今回はユースケース図についてまとめました。
ユースケース図は非エンジニア向けの図解術であるため、UMLの中では簡単に作成できる方ではないかと思っています。
またアプリ開発のプロジェクトにおいて、ユースケース図は上流工程で活躍する図であるため、プロジェクト資料の中では重要性が高いものであるとも言えます。

皆さんもぜひユースケース図を書いてみてください。
また、[ER図の作成方法](https://qiita.com/szn-t/items/e05e9e59af3471a724a4)も記事にしていますのでこちらも参考にしてみてください。


# 参考資料
- [超絶分かるユースケース図](https://it-koala.com/usecasediagrams-1832)
40代事務職おじさんTOEIC350点からアメリカ大学のコンピュータサイエンス学部に入学してみた


40代おじさんがPythonの勉強を初めて、ちょっとKaggleやってみたら、英語できないと、大変だなぁ～っと感じたの・語学留学とか調べてたら、学費無料のアメリカのオンライン大学見つけて入学してみようと頑張った。

先日、正式に本科生として認められたので記事を書いておきます

プログラミングを始めたときの記事は下からどうぞ

https://qiita.com/usagipy/items/3cedb356702c1301028b

## 公式ドキュメントをよめ！　英語読むの大変

プログラミングを勉強していると公式ドキュメントをよめ！ってよく見るのですが、英語なので、読むの大変。じゃあ英語を勉強しないといけないっておもった

## Kaggle で英語圏の人とやり取り

色々教えてもらったり、アドバイスをもらって、スコア上げたりして楽しかった。でもやっぱり英語できないと大変よね。だって、問題で提供されるデータの意味とか調べるの大変だったりしたもん

## プログラミング初心者なら海外の大学で英語でコンピュータサイエンス学べばよくない！？

これに気がついたとき天才かよ！って思いましたね。色々調べてたらアメリカのオンライン大学 University of Peopleが学費無料、試験代のみで大体50万ぐらいで卒業できるってのがわかったんですよ。日本の大学の単位を移せばその半額ぐらいでも行けそうなのでチャレンジしてみようと思った

大学の詳細についてはこちらから

https://usagipy.com/uopeople-admissions/

## TOEICスコア350点 1年間英語勉強しました

入学条件が英語力は英検準1級以上必要ってかんじなので、TOEIC350点のおじさんには大変でしたね。幸い入学したい大学でESLコースがあったので1年勉強しました。死ぬほど大変だった。最後に受けた試験以降もちょこちょこ単語の勉強だけはやっていました

## 並行して数学や統計の勉強もしている

高校数学とか統計の勉強もしました。私、商業高校卒業したので、数学やってないんですよね。その代わり週7時間簿記の授業があったんです。

だから、数学を勉強したら感動がいっぱい。公式を使えば、プログラミングの計算が1行でかけたり、効率が上がったり感動しました

統計も勉強していますが、大学で統計の単位が必要なのでやっていてよかったです。kaggleで遊ぶのに必要な知識とかがかなり身につきました。

ブログでも書いてますが、こっちは英語の勉強メインの記事です長文を読みたい人は下からどうぞ


### 社内で英語の翻訳のお仕事を任されるようなったりデータサイエンティストの道も

英語の勉強をしたおかげで、社内のドキュメントを英語に翻訳するお仕事を少しずつ任されるようになりました。もちろんネイティブチェックは入るよ！

やりたければ、データサイエンティストのチームの仕事も手伝えるようにしてあげるよと上司に言われるようになりました。

会社がIT系なので、事務職からそういう仕事も少しずつアサインしてもらうことも不可能じゃないんだなって感じました。

## 英語勉強してよかったこと 海外のプログラミング系Youtberの動画が理解できる

日本でもいろいろ解説動画あるけど、やっぱり英語圏に比べたら本数が少ないし、なかったりする。Pythonのライブラリやパッケージの使い方の解説とかは海外の動画で勉強できるようになりました。

なんとなく英語ができると、解説見ながらだいたいこんな感じかな？ってノリで理解できるので楽しいです

## 問題点 英語と数学と統計でプログラミングほとんどやれてない1年だった

プログラミングしたいけど、数学やったり英語やったり、統計やったりと1年殆どプログラミングの勉強してませんでした。最近やっと大学入学できたのでコツコツまたプログラミングの勉強始めました。

最近はPythonでMySQL操作してRSSで取得したデータをSSH接続したDBに登録するってやつを作ってます

来週からは大学でJavaの勉強が始まるので、ちょっと怖くて震えています。でも、こうやって強制的に新しいことに触れることができる環境も大事ですよね

やっとコードが書けるよ！！！ワクワクしてます

## 40代で大学に入って何になりたいの？ かっこよくなりたい！

40代で大学に入って、プログラミング勉強して何になりたいの？って思うかもしれない。私も思う。でもチャレンジするってやっぱりかっこいい。

もう絶対にTOEIC受けたくないし、海外の大学卒業したらTOEIC持ってなくても、英語証明になるじゃん
海外の大学卒業したらかっこいいじゃない

もうね、ただかっこいいなぁ～っていうだけがモチベーションですよ

使える使えないは、取った後に考えればいいだけだし、やってないのに意味ないっていうのもカッコ悪いのでとりあえずみんなチャレンジしたいことはやってみてほしい

この記事の公開後から2年半後には卒業予定なので、そしたら卒業した！記事を書きたいと思う

ブログでは英語についてもうちょっと詳しく書いてます

https://usagipy.com/uopeople-enroll-40/
Airflow_使い始め備忘録

# これは何？
- Airflowの環境構築～デプロイの備忘録です。
- Airflowを使い始めたい方の参考になれば幸いです。

# 環境
今回はDockerイメージを立ち上げ、vscodeから特定のスクリプトをAirflowにあげる流れを踏みます

- Ubuntu
- vscode
- python 3.9.13
- Airflow 2.4.3

※Ubuntuのインストールはされてある前提です、まだの方は以下の記事を参考にしてください（WSL2をインストールすれば、Ubuntuもあわせて落とされます）
[1. WSL2のインストール](https://chigusa-web.com/blog/wsl2-win11/ )
[2. UbuntuにDockerをインストール](https://www.f-answer.com/archives/1012 )

# Airflow
### 1. Ubuntu上で準備
- まず、Ubuntuの環境構築ができていれば以下の画面を開けます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/4b3f7a5b-98d0-4e40-91a3-e8a2960de364.png)

- 次に、Airflowにあげるコードのディレクトリまで cd していきます
    - **ルートディレクトリはmntからスタートする点ご注意を**
    - 写真は、初めに ../../ としてルートまで行ってからのものです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/6617b9c3-703c-6fe6-3e7e-02c46ee0213a.png)


- 移動が終わったら以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/82c9df46-fa69-99d3-764a-6fdcaffda495.png)

- docker-compose.ymlを該当ディレクトリに用意
    - 以下でダウンロードが可能
    - $ curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.4.3/docker-compose.yaml'

### 2. Docker compose
- $ sudo docker compose upで立ち上げ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/0d51d76e-0edc-c268-0a5f-070d3174dbcf.png)

- $ sudo docker psで動いているコンポーネントを一覧化
    - 作ったままにしているものがちらほら…(後で消す)
    - 今回はCONTAINER ID：a179a7246182を使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/d2edbbe9-d833-bfa0-8311-676a19dd22c8.png)

- $ open http://localhost:8080 で立ち上げたAirflowに飛ぶ
    - 普通にhttp://localhost:8080と検索しても行ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/06ffad9e-ea2b-2ed9-1475-2535e7ed9164.png)

- ディレクトリを開くとcomposeされている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/ec4390c6-599e-5773-1308-62202486681d.png)

- このdugsフォルダの中にpythonコードを入れると、Airflowに反映される
- 試しにtest.pyを入れ、copose upする

<details><summary>test.pyファイルの中身</summary>
<div>

```python
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.bash import BashOperator

with DAG(
  'test',
  default_args={
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
  },
  description='Test DAG',
  start_date=datetime(2022, 11, 17),
) as dag:
  t1 = BashOperator(
    task_id='task1',
    bash_command='date',
  )

  t2 = BashOperator(
    task_id='task2',
    bash_command='echo current time is $AAAA',
    env={
      "AAAA": '{{ ti.xcom_pull(task_ids="task1") }}',
    },
  )

  t3 = BashOperator(
    task_id='task3',
    bash_command='sleep 20',
  )

  t1 >> [t2, t3]
```
</div>
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/af45efe2-4672-2435-bf64-a1fd7a3cdf6d.png)

- 開いてみると以下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/338d7362-04a0-6bb9-58ec-94d73921fbfd.png)

# 学び
- ローカルからDockerイメージを立ち上げてデプロイまでの流れは掴めました
- Airflowを使うあたり、DAG, タスク, TaskInstanceなどの概念を学ぶ必要があります…

# 参考
- [最も参考になった記事](https://www.sambaiz.net/article/425/)
- Ubuntu上にコピペを貼り付けたい場合、Ctrl + Vではなく右クリックで行えます