OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript React Native｜授業のカリキュラム

> JavaScript React Nativeのための12の授業のカリキュラム


1. **授業1: JavaScriptとReact Nativeの基礎**
    - 概要: JavaScriptとReact Nativeの概要を理解する
    - 説明: JavaScriptの基本概念とReact NativeがどのようにJavaScriptを使用してモバイルアプリケーションを構築するかについて学びます。

[**授業1: JavaScriptとReact Nativeの基礎**](https://twitter.com/PLab2020/status/1682005889950289920)


2. **授業2: Reactの基礎**
    - 概要: Reactの基本的な概念と構造について学ぶ
    - 説明: コンポーネント、プロパティ、ステートなど、Reactの基本概念を学びます。

[授業2: Reactの基礎](https://twitter.com/PLab2020/status/1682007941921255424)

3. **授業3: React Nativeの環境設定**
    - 概要: 開発環境のセットアップとReact Nativeプロジェクトの作成
    - 説明: React Nativeの開発環境をセットアップし、新しいプロジェクトを作成します。

[**授業3: React Nativeの環境設定**](https://twitter.com/PLab2020/status/1682012806688952321)

4. **授業4: React Nativeコンポーネント**
    - 概要: React Nativeで使用される主要なコンポーネントを学ぶ
    - 説明: View、Text、ImageなどのReact Nativeの主要なコンポーネントについて学びます。

[**授業4: React Nativeコンポーネント**](https://twitter.com/PLab2020/status/1682013592235958273)

5. **授業5: スタイリングとレイアウト**
    - 概要: スタイルとレイアウトの基本を理解する
    - 説明: Flexboxを使ってReact Nativeコンポーネントを配置し、スタイルを適用します。

[**授業5: スタイリングとレイアウト**](https://twitter.com/PLab2020/status/1682014083082780673)

6. **授業6: ユーザーインタラクション**
    - 概要: ユーザーとのインタラクションを実装する
    - 説明: ボタン、タッチ可能なコンポーネント、スクロールビューなどを使ったユーザーとのインタラクションについて学びます。

[**授業6: ユーザーインタラクション**](https://twitter.com/PLab2020/status/1682014609996402688)

7. **授業7: 状態管理とHooks**
    - 概要: Reactの状態管理とHooksの使用方法を学ぶ
    - 説明: useState、useEffectなどのReact Hooksを使った状態管理を学びます。

[**授業7: 状態管理とHooks**](https://twitter.com/PLab2020/status/1682015184037224451)

8. **授業8: ナビゲーション**
    - 概要: React Nativeでのページ間ナビゲーションを学ぶ
    - 説明: React Navigationを使用して複数のスクリーン間でのナビゲーションを実装します。

[**授業8: ナビゲーション**](https://twitter.com/PLab2020/status/1682015616612581376)

9. **授業9: ネットワーキング**
    - 概要: APIからデータをフェッチし、React Nativeアプリケーションで表示する
    - 説明: fetchやaxiosを使ってAPIからデータを取得し、アプリケーションで表示します。

[**授業9: ネットワーキング**](https://twitter.com/PLab2020/status/1682016109992775680)

10. **授業10: データの永続化**
    - 概要: ローカルデータの保存と読み出しを学ぶ
    - 説明: AsyncStorageを使ってデータを永続的に保存し、アプリケーション内で使用する方法を学びます。

[**授業10: データの永続化**](https://twitter.com/PLab2020/status/1682016610348052481)

11. **授業11: アニメーションとジェスチャ**
    - 概要: React Nativeのアニメーションとジェスチャを学ぶ
    - 説明: Animatedライブラリを使ったアニメーションとジェスチャの実装を学びます。

[**授業11: アニメーションとジェスチャ**](https://twitter.com/PLab2020/status/1682017133088346112)

12. **授業12: アプリケーションのテストとデバッグ**
    - 概要: React Nativeアプリケーションのテストとデバッグ方法を学ぶ
    - 説明: JestとReact Native Debuggerを使ったアプリケーションのテストとデバッグ方法を学びます。

[**授業12: アプリケーションのテストとデバッグ**](https://twitter.com/PLab2020/status/1682017661528731649)

全１２回
DatabricksのドキュメントにおけるAIアシスタント

気づいてませんでした...。

https://docs.databricks.com/

右下の吹き出しをクリックします。
![Screenshot 2023-07-20 at 20.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f2646161-740d-5881-a655-87c6c9c03517.png)

Databricks AI assistant!!!
![Screenshot 2023-07-20 at 20.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/48495e6e-ed16-2e46-de89-b7700fe9123a.png)

ちゃんと回答が返ってきます。
![Screenshot 2023-07-20 at 20.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/90090f76-d683-2da1-f65f-eed0ba792323.png)

では、日本語では...。

![Screenshot 2023-07-20 at 20.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b590af59-e519-8c2c-72e5-cd076c386f52.png)
![Screenshot 2023-07-20 at 20.37.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/21702a1d-92df-8653-dfcc-84ce25415d3b.png)

動く場合もあればダメな時もあります。
![Screenshot 2023-07-20 at 20.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6bf934f4-1e36-8b03-1de3-86d3babf6a28.png)

今後の成長を生暖かく見守ってください。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
テスト技法の基礎を学んだ話（同値分割法・境界値分析 編）

## 概要
テスト技法について基礎的な部分を学ぶ機会があったので
基本的な技法について簡単にまとめてみた。
JSTQB FLの内容なので出てくる用語もそれに準じた内容となります。
また、動的テストが主な内容となります。

## 同値分割法
### 手法
>同等に処理されると想定したデータすべてを同じパーティション(同値クラスとも呼ぶ)に
振り分け、各パーティションから少なくとも1個の値を選んでテストする。
なお、有効な値を有効同値パーティション、無効な値を無効同値パーティションと呼ぶ

あるメソッド（仕様）の入力値を条件分岐ごとにグルーピングして、そのうち何点か確認すればいいよね的な手法

例えばこんなコードがあった場合、（ホワイトボックステストの話になってしまいますが…）
~~~c:test.c
int foo(int a) {
    if(-5 < a) {
        return -1
    } else if((0 < a) && (a < 5)) {
        return 1
    } 
    // 仮想の異常通知処理
    Error();
}
~~~
同値パーティションは以下の通りに分割されます。
| 入力範囲 |パーティション|
|:-:|:-:|
| a <= -5   | 無効同値パーティション1 |
|-5 < a <=0 | 有効同値パーティション1 |
|0 < a < 5  | 有効同値パーティション2 |
| 5 <= a    | 無効同値パーティション2 |

数直線で出すとこのような感じ
![qiita_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747533/7e28ff19-8370-82d7-6efe-c19c84ab060d.png)

テストケースはこのパーティションから代表値を選ぶ手法
| 入力値 |テストケースの意図|結果|
|:-:|:-:|:-:|
| -7  | 無効同値パーティション1 代表値 |異常通知|
| -3  | 有効同値パーティション1 代表値 |     -1|
|  3  | 有効同値パーティション2 代表値 |      1|
|  7  | 無効同値パーティション2 代表値 |異常通知|

### メリット
やるべきテストケースを減らせる
(パーティションごとの代表値を選択するため）

### 注意点
イレギュラーな故障については見逃しやすい
（入力が2つ以上の場合にある特定のパターンの組み合わせでのみ出る故障など)

## 境界値分析
### 手法
同値分割法とセットで使う、各パーティションの境界部分についてテストする手法
さっきの例で行くと以下の通り
![qiita_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747533/7e28ff19-8370-82d7-6efe-c19c84ab060d.png)

| 入力値 |テストケースの意図|結果|
|:-:|:-:|:-:|
| -5  | 無効同値パーティション1 上限値 |異常通知|
| -4  | 有効同値パーティション1 下限値 |     -1|
|  0  | 有効同値パーティション1 上限値 |     -1|
| 1   | 有効同値パーティション2 下限値 |      1|
| 4   | 有効同値パーティション2 上限値 |      1|
| 5   | 無効同値パーティション2 下限値 |異常通知|

### メリット
故障の発見をしやすい
(エラーしやすい点を選んでテストするため )
### 注意点
実装の仕方によっては境界値分析でも網羅できていない可能性がある。
ubuntu18.04でapt-get installするとBad Requestなる場合の対処法

# 概要

遭遇したのはDocker環境なので以下Dockerの話
プロキシが必須の環境で具体的には以下のDockerfileをbuildしようとしたときに発生した

```dockerfile: Dockerfile
FROM ubuntu:18.04

RUN apt-get update
RUN apt-get install -y \
    software-properties-common
RUN apt-get install -y \
    python3.8 \
    python3.8-dev \
    python3-pip
```

で以下のBad Requestを確認

```bash: error
55.06 Err:58 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libpython3-dev amd64 3.6.7-1~18.04
55.06   400  Bad Request [IP: xxx.xxx....]

78.23 Err:62 http://archive.ubuntu.com/ubuntu bionic/main amd64 manpages-dev all 4.15-1
78.23   400  Bad Request [IP: xxx.xxx....]
```

# 解決策

apt-getの代わりにaptでinstallする

今回なら以下のように該当のapt-get installをapt installに置き換えて解決した（事前にapt updateしておくこと）。

```dockerfile
RUN apt update
RUN apt-get update
RUN apt-get install -y \
    software-properties-common
RUN apt install -y \
    python3.8 \
    python3.8-dev \
    python3-pip
```

どうせなら全部aptでインストールしたらよいのでは・・・
エンジニアが腕立て伏せをするべき理由5つ

## 背景
* 1日のうち多くの時間を椅子に座ってパソコンに向かっているエンジニアは不健康になりがちです。
* 健康のために何かした方がいいとはわかっているが
  * 何をするのが良いかわからない
  * 時間がないのでいろいろはできない
* そんなエンジニアにおすすめなのが __腕立て伏せ__ です。
* この記事ではなぜエンジニアに腕立て伏せがおすすめなのかを記載します。

## なぜ腕立て伏せなのか
### 1. 猫背対策
PCを扱う関係上、腕を身体より前に出していることが多いと思います。
その状態が長時間維持されていると、筋肉が固くなってしまい、凝りや呼吸が浅くなるなどの問題が発生します。
腕立て伏せを行って肩回りを動かすことで固まった筋肉を動かしてあげることができます。

### 2. 手軽にできる
腕立て伏せは最低限、寝転がるスペースがあれば行うことができるのでお手軽です。
また、膝をつけることで負荷を減らしたり、逆に足の位置を高くして負荷を増やす。腕の開き方を変えるなどして負荷の調整が容易にできます。
道具も不要ではありますが、私はプッシュアップバーを使うことをお勧めします。
理由については[後述](#プッシュアップバーをお勧めする理由)します。

### 3. お腹の脂肪をごまかせる
これは冗談半分、本気半分です。
腕立て伏せをして大胸筋を大きくすることで、服を着たときにぽっこりお腹をごまかすことができます。
効果としては、見た目の印象をよくすることで他人から見た印象を良くする。自分の姿を見たときの自己肯定感を上げることが期待できます。
※こちらは男性目線で書いているので、女性からしてどうなのかはわかりません。

### 4. 立ち（歩き）姿勢が良くなる
1. 3. にも関係しますが、大胸筋を大きくして胸を張って歩くと、見栄えが良くなります。
大胸筋を意識することで姿勢を正すことができます。

### 5. 上半身のでかさで相手を威圧する
昨今リモート会議が増えて、胸より上をカメラに映す機会が増えたかと思います。
そんなときに鍛え上げた大胸筋を見せることで相手にプレッシャーを与えることができます。
ハードネゴシエーションの可能性がある会議では是非会議前に腕立て伏せをしてパンプアップした状態で挑んでください。

### プッシュアップバーをお勧めする理由
腕立て伏せは基本道具は不要ですが、私はプッシュアップバーを使用するのをお勧めします。（どういうものかはググってください）理由としては下記2点です。
* 手首への負担が軽減する。
  → プッシュアップバーを使うと、使わない場合よりも手首への負担を軽減させることができます。手首を痛めるのはエンジニアにとっては死活問題なのでこれは重要です。

* 深く身体を下げることができるため、背中をより稼働させることができる。
  → 1. の猫背解消効果が高まります。

### 具体的なやり方
YouTubeなどで専門家の動画が大量にあるので思いますので、自分の筋肉量や目指すところに合わせて参照いただくのが良いかと思います。
筆者の知っている範囲でざっくりまとめると
* 負荷を下げる場合は膝をつく、逆に負荷を上げたい場合は足の位置を高くする
* 腕の位置によって大胸筋のどの部分に効くかが変わる


## ほかにもトレーニングをするなら
### スクワット
エンジニアは長時間椅子に座りっぱなしになりがちなので、下半身の血行を良くするためにスクワットが有効です。
しっかり負荷をかけて筋肉量を増やすのが理想ですが、まずはこちらから始めるのはいかがでしょうか。
https://www.youtube.com/watch?v=n5Sl3zSvIUQ

<iframe width="560" height="315" src="https://www.youtube.com/embed/n5Sl3zSvIUQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 補足
[上半身のでかさで相手を威圧する](#上半身のでかさで相手を威圧する) は冗談です。4つだとキリが悪いので無理やり5つにしました。ごめんなさい。
ハードネゴシエーションを必要としない関係性の構築に努めましょう。
【Unity】HDRPを使って簡単に自然のシーンを制作する vol.1 Physically Based Sky編

### はじめに
最近Unityを触る機会が減って完全になまっているので久しぶりに最新バージョンで何か簡単にシーンを制作してみようと思いました。
アンビエントチックな音楽を聴くことが多くなってきたので、それに合うようなVJ素材を制作したく、簡単に自然の環境をUnityで制作しようと思います。


今回、VOl.1, vol2で、physically based skyとwater systemを使って以下のようなシーンを制作します


<img width="800" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/4a793b40-8ceb-8113-7130-5ba3d24d2211.gif">



### 制作環境
#### Unity 2023.1.0b20 beta
※私の環境だけかもしれませんがアニメーションファイル作成し保存する際にエラーがでてしまいました。


### 準備
- Unity Hubを開く
- バージョンを指定する(今回はUnity 2023.1.0b20 betaをお試しで使用します)
- 3DcoreHDRPを選択する
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/6c810056-efec-3c20-ecec-d414f2d22e37.png">

そうするとこのような画面が起動するかと思います。
![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/b584ff06-d34f-6430-bdb5-6838dd8aa5e9.png)


では実際にPhysically based skyを使用します。
### Physically based skyとは？

###### Physically Based Sky (物理ベースのスカイ) は、高度と関連して指数関数的に密度が減少する 2 部構成の大気を持つ、球体惑星の空をシミュレーションするもの(Unityマニュアル参照)
で、太陽の角度を調節することで、夜や昼の環境を制作することが可能です。

デフォルトで設定されているSky and Fog Volumeを削除します
![スクリーンショット (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/f29c5af6-df14-fc35-98b8-12fcee3792c0.png)

GameObject　→ Volume → Global Volumeを選択する
![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/6079d947-88bd-f356-cf90-b66673fe9f17.png)

こうなるかと思います
![スクリーンショット (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/52a5299d-c974-5c9e-bf66-38874bd06b9d.png)


Profile → Sky and fog volumeに設定します(デフォルトのままでよかったかもです。)
![スクリーンショット (31).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/4b3644d8-872e-a517-42c6-4bb1b5e80279.png)

Sky typeにチェックを入れ、Physically based skyを選択
デフォでPhysically based skyになっているかと思います
![スクリーンショット (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/8993fb96-161f-bfc6-3260-6e64645e474a.png)

色々とプロパティを調節してみてください。
![スクリーンショット (33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/3f9bfaa5-ac15-982b-0d10-452d07c13dd1.png)


今回は、チェックマークを入れたPhysically based skyのModel → Earth(adbanced)を選択します。
調節できる項目が増えるので、よりリアルな環境を設定できます。
![スクリーンショット (34).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/d9bc234d-83d5-7c21-f013-7c6971175cbd.png)

Physically based skyのプロパティについてはUnityのマニュアルをご参照ください。
とてもありがたい。
https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.high-definition@10.5/manual/Override-Physically-Based-Sky.html

今回はこんな感じで設定してみました。HDRP便利。
![スクリーンショット (36).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/de89a36c-7be8-9b9d-bbe9-28a875a57c96.png)


![スクリーンショット (37).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/3513ead9-ee29-378c-e106-51e458df16d7.png)

Physically based skyに関してはまだまだ使いたい項目がたくさんあったり、特に
スペースのエミッシブエリアを表現するテクスチャを特定することができるプロパティである、　Space Emission Textureなどかなりすごい機能があるのでお試しください。



次回はWaterSystemを用いて水面(今回は表面だけ)を作ります。


余力があればvol.3以降でアセット追加などして、いい感じのシーンを制作してみようかと思います。　
続く.....
SwiftでJSONデコード用の構造体を楽に書く方法

## 背景

GMOコインのAPIでアプリを作ろうと思った際に、レスポンスの辞書のキーが多くてデコード用の型を書くのが大変だったため、楽に書ける方法を考えてみた。

## 普通にデコード用の構造体を作る場合

例えば、marginデータを取得したいときのパスとそのレスポンスは下記になる。
このレスポンスをデコードする場合は下記のようにデコード用の構造体を作る必要がある。

~~~swift:/private/v1/account/margin のレスポンス
{
  "status": 0,
  "data": {
    "actualProfitLoss": "5204923",
    "availableAmount": "5189523",
    "margin": "7298",
    "marginCallStatus": "NORMAL",
    "marginRatio": "345.6",
    "profitLoss": "8019"
  },
  "responsetime": "2019-03-19T02:15:06.051Z"
}
~~~

~~~swift:デコード用の構造体

struct Margin: Codable {
    var status: Int
    var data: MarginData
    var responsetime: String
}

struct MarginData {
    var actualProfitLoss: String
    var availableAmount: String
    var margin: String
    var marginCallStatus: String
    var marginRatio: String
    var profitLoss: String
}

// デコード
let decodedData = try! JSONDecoder().decode(Margin.self, from: jsonData)
~~~

これでも問題ないのだが、margin以外にもアクセスしたいパスが沢山あり、それらのレスポンスに対していちいちレスポンスのキーを調べて書くのが大変だったため、楽にかける方法を考えてみた。

## 極力簡単にデコード用の構造体を作る方法

ネストのうち、同一階層のデータの型が同じであれば、下記のようにDictionaryで指定してあげれば、辞書の長さに関係なく一行で書くことができる。

~~~swift
    struct Margin: Codable {
        var status: Int
        var data: Dictionary<String, String>
        // var data: [String: String] でもいける
        var responsetime: String
    }
~~~

## その他
いちいちデコード用の型を指定する必要があるということは、そうしないと不都合があるのでは？とも思うため、これはこれで何か落とし穴がありそう。
この書き方で懸念されるバグなどあれば教えていただきたいです。
Amazon Polly と SSML(音声合成マークアップ言語)に関する備忘録

ジャーニーマン( @beajourneyman )です。

Amazon Polly で音声合成して Amazon Connect の音声プロンプトを実装する際に都度調べたりする手間を省くために備忘録をまとめます。

# Amazon Polly

Tomoko と Kazuha が登場しました。「Mizuki じゃないの？」とは思いましたが、嬉しいアップデートでした。Polly のポータルもまとめておきます。担当システム界隈では Tomoko が人気です。

https://aws.amazon.com/jp/about-aws/whats-new/2023/02/amazon-polly-two-japanese-ntts-voices/

https://aws.amazon.com/jp/polly/

# SSML 音声合成マークアップ言語

この2本は本当に重要な情報の宝庫です。必読のリファレンスです。

https://aws.amazon.com/jp/blogs/news/optimizing-japanese-text-to-speech-with-amazon-polly/

https://docs.aws.amazon.com/ja_jp/polly/latest/dg/supportedtags.html

# トークスクリプトでチューニングしたいモノ(適宜追加)

## 失礼いたします

「失礼いたします」は結構重要な気がします。残念ながらMP3ファイルが掲載できないのです(やり方をご存知の方教えてください！！)が、SSMLだけメモ。ちなみに検証は「ニューラル Tomoko」でやってます。

```
<speak>
失礼いたします。
</speak>
```

調整後、こっちの方がまなってない気がしてます。

```
<speak>
<phoneme alphabet="x-amazon-pron-kana" ph="シツ'レイ">失礼</phoneme>いたします
</speak>
```

## 似た固有名詞でもイントネーションがガラッと変わる

「カネイシ」だとイントネーションが普通に感じ、「ミネイシ」だとなまって感じます。こちらはニューラルのTomoko、Kazuha、スタンダードのMizukiでも感じました。

事前に用意するケースは少ないですが、お名前のように可変で埋め込む音声の場合は、固有名詞を判定して以下のSSMLを書く対策は現実的ではないです。比較的ニューラル音声が聞き取りやすいので音声エンジンを変えるくらいでしょうか？知見があれば、教えてください。

```
<speak>
<phoneme alphabet="x-amazon-pron-kana" ph="ミネ'イシ">みねいし</phoneme>
</speak>
```

書いていて、標準語のイントネーションを確信を持って合ってると言えるのか疑問に思いました。関西とか西日本について考えると、何が正解は地域で変わったりするのかもしれません。

今後も気が付いたら備忘を追記して行こうと思います。

以上です。
【GAS】"Hello World"出力してみよう！

:hatching_chick:今の仕事で活用できるように、GASを使って次のようにしたいなー

スプレッドシートでタスク一覧・ガントチャートを作成して
タスクとガントチャートの内容をGoogleカレンダーに反映したい！

そこで私は思った...
**GASを使ってみよう！:fist_tone1:**

まずは、"Hello World"を出力してみた:hand_splayed_tone1:

# GAS(Google Apps Script)とは

### Googleが提供しているアプリケーション開発プラットフォーム

 - Googleが提供しているサービス(GoogleスプレッドシートやGoogleカレンダーなど)の自動化や連携に対応するための開発ツール
 - Gmailアカウントさえ作成すれば、誰でも無料で使用できる
 - GASで記述するプログラムコードは、JavaScriptを基に作られているため、一部の関数を除いた基本的な文法はJavaScriptと同じ
 - Microsoft Officeと同様にマクロ機能があるので、ノンコード開発をすることもできる

### GASを使う際の注意点

 - ローカルドライブに置いているファイルを開いたり編集をすることができない
   →GASを使ってスクリプトを実行したいファイルはGoogleドライブ上に置く必要がある
 - 実行時間に制限がある
   →スクリプトの実行時間：１回あたり6分まで
    　カスタム関数の実行時間：１処理あたり30秒まで

### GASの２つの開発方式

 - コンテナバインド型
   + GoogleスプレッドシートやGoogleドキュメントなどの、特定のGoogleサービスに紐づくプログラムを開発する際に使用する
   + Microsoft OfficeのExcelやWordのVBAと同じ感じ
 - スタンドアロン型
   + 特定のGoogleサービスとは紐付けず、独立したプログラムを作成する際に使用する


# GoogleスプレッドシートでGASを使ってみよう

### １.AppScriptを起動

① Googleスプレッドシートでファイルを開く
　
② ツールバー「拡張機能」>「AppScript」の順に押下
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473595/70a02e9c-da02-c815-b917-14fb86155504.jpeg" alt="AppScript起動">
 

③ AppScriptの画面を表示
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473595/9a3a5de8-e645-80aa-732e-b51711c7be9a.png" alt="AppScript起動">


### ２."Hello World"をコンソールに出力する

① AppScript画面の右側に表示しているスクリプトエディタに次を入力
   　・スクリプトエディタ
    <img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473595/078df2ea-ffd9-1535-5583-295bc5c7563d.jpeg" alt="スクリプトエディタ">
   　・入力内容
<dd>
<pre>function myFunction() {
  Logger.log('Hello World'); ←追記※
}</pre>
※console.log('Hello World'); でも可<br>
※Loggerクラスとconsoleクラスの違いについては、<br>
　<a href="https://tetsuooo.net/gas/338/">【GAS】consoleとLoggerの違いとは</a>を参照
</dd>



　
② 保存ボタンを押下して、プロジェクトを保存する
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473595/bb39140a-fd1d-a67c-ebed-7d96f80e93f1.jpeg" alt="スクリプトエディタ">

 
③ 実行ボタンを押下して、プログラムを実行する
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473595/88922e58-940d-8fc4-9890-788cfc92e795.jpeg" alt="スクリプトエディタ">

　
④ コンソールに"Hello World"を出力しているのを確認する
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473595/045eb5b1-8706-960a-2559-9996c32f85d2.jpeg" alt="スクリプトエディタ">

　
あ、"Hello World"って打ったつもりが、"Hello Wordld"...
ご愛嬌ってことで:sweat_smile:
cscの作法 その417

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
automationでexcelに九九を書き込こめ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8a4bc90a-a910-1ad1-32c0-3dde3900cf1e.png)


# サンプルコード

```


using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Automation;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace App
{
	class Program {
		static void Main(string[] args) {
			AutomationElement aeForm;
			Process excel = Process.Start(@"C:\Program Files (x86)\Microsoft Office\Office12\excel.exe");
			Thread.Sleep(2000);
			aeForm = AutomationElement.FromHandle(excel.MainWindowHandle);
			aeForm.SetFocus();
			int i;
			int j;
			int s;
			for (i = 1; i < 10; i++)
			{
				for (j = 1; j < 10; j++)
				{
					s = i * j;
					SendKeys.SendWait(s.ToString());
					SendKeys.SendWait("{RIGHT}");
				}
				for (j = 1; j < 10; j++)
				{
					SendKeys.SendWait("{LEFT}");
				}
				SendKeys.SendWait("{DOWN}");
			}
		}
	}
}





```

以上。
継続力という魔法のスキル

# はじめに
記事の投稿を458日間、毎日しています。
英単語の学習も145日間、毎日しています。

継続力について聞かれた時に全く答えられなかったので、言語化してみました。

![スクリーンショット 2023-07-20 18.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c7f18047-99ac-91c2-4654-e19b1756ca9d.png)

# 継続はなぜ難しいの
### モチベーションの波
モチベーションは一時的なものであり、波があるため、意欲が高まっているときは順調に取り組めるものの、しばらくするとモチベーションが低下し、継続することが難しくなります。

### 目先の欲に負ける
今の時代、ゲームやNetflixなど娯楽は溢れています。
そんな娯楽の誘惑に負けて継続が後回しにしてしまうと、継続することが難しくなります。

### 挫折への不安
長期間にわたって取り組むことは挫折する可能性も高くなります。
失敗への恐れや、途中で目標を達成できないのではないかという不安が継続を難しくしています。

### 目標の曖昧さ
目標が具体的でない場合、進むべき道が明確でなくなります。
それにより、取り組むべきことが不確かになり、継続することが難しくなります。

### 周囲のサポートの欠如
継続するためには、周囲のサポートが重要です。
家族や友人、同僚などのサポートが欠けていると、継続することが難しくなります。

# ではこれらの問題をどう解決するのか
### 具体的な目標の設定
明確な目標を設定し、それを達成するための計画を立てることが重要です。
計画を具体的かつ実行可能なものにすることで、進むべき道が明確になります。

私が設定しているのは、「いつまでに」「なにを」「どうしたい」かです。

達成したい時期が決まっていれば、1日にどれくらいの量をすればいいかを逆算することができます。

### 継続の記録
継続の記録することで、積み上げを崩したくないという気持ちが生まれて継続を促進できます。
記事は投稿した日付が残るので偽造できません。
それにより、毎日やってることが保証されます。

英単語の勉強は[mikan](https://mikan.link/)を使ってやっています。
mikanは学習の連続日数が表示されるのでこちらも偽造できません。
![IMG_3438.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e66a21be-dc0e-810b-4a11-7380aa7ea86a.jpeg)

また、「これから継続をする」「いま◯日継続してる」等をSNSで発信して周囲の人に認知してもらうことでも、継続の促進になると思います。

### ストレスのコントロール
やりたくないことをやるのはストレスです。

親「まだ宿題やってないの」
私「これからやるつもり」

これを言われると強制的にストレスと向き合わないといけなくなります。

大人になった今、親にこれを言ってとお願いするわけにもいきません。

しかし、幸いにも私たちはエンジニアです。

頼める人がいないなら作るしかないでしょ。

![IMG_3439.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/90dd4e30-e859-b2e8-778c-38c2571754ef.png)

はい、作りました。

私はこれで継続をBotにサポートしてもらっています

# 継続で得られるもの
### スキル
もちろんスキルを得ることができます。
これのためにやってるので当たり前ですね。

### 圧倒的な自信
こんだけ頑張ってるんだから大丈夫。という謎の自信を手にいれることができます。

### 継続力
継続で得られるものに「継続力」があります。
継続力は継続で得られるスキルです。
継続で目標は達成できなかったとしても「継続力」を身につけることができれば、人生何事もなんとかなるはずです。

# おわり
誰かの頑張るきっかけになれたら嬉しいです。
free()したらデバッガにヒープ破壊してますよと言われた時の対処

# 環境
windows11
visual studio 2022


# エラーメッセージ

free()が実行されると表示

### HEAP CORRUPTION DETECTED
### 訳：ヒープ破壊を検出したで

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2944355/4f7e3b47-6737-9364-3d34-72cd44d944ea.png)

# 対処
問題のfree()の前のどこかでメモリ領域外アクセスしてないか確認

# 覚えておこう
**デバッガは領域外アクセスしても意外と止めてくれない**
cscの作法 その416

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
automationでexcelに100までfizzbuzzを書き込こめ。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/261ad976-de88-1ea8-ae0c-25fb0b059d82.png)


# サンプルコード

```

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Automation;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace App
{
	class Program {
		static void Main(string[] args) {
			AutomationElement aeForm;
			Process excel = Process.Start(@"C:\Program Files (x86)\Microsoft Office\Office12\excel.exe");
			Thread.Sleep(2000);
			aeForm = AutomationElement.FromHandle(excel.MainWindowHandle);
			aeForm.SetFocus();
			int i;
			for (i = 1; i < 101; i++)
			{
				if (i % 15 == 0)
				{
					SendKeys.SendWait("FizzBuzz");
				}
				else if (i % 5 == 0)
				{
					SendKeys.SendWait("Buzz");
				}
				else if (i % 3 == 0)
				{
					SendKeys.SendWait("Fizz");
				}
				else
				{
					SendKeys.SendWait(i.ToString());
				}
				SendKeys.SendWait("{DOWN}");
			}
		}
	}
}



```

以上。
GitHub Desktopから起動するコマンドラインツールを変更する

## この記事は何？
GitHub Desktopから起動するコマンドラインツールを変更する記事です。（OS：Windows10）

スタートメニューからの起動もできますが、普段使っていないとテンパるのでGitHub Desktopから呼び出せるよう設定を変更します。
この記事では「Git Bash」への変更を記載しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630627/e09ccea4-7fa6-0cdd-2e6f-43f362193be9.png)

## そもそもどこから起動できるのか？
「Repository」から起動できますが、デフォルトでは「コマンドプロンプト」になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630627/e52d22e3-d385-9690-21a0-e90579a25daf.png)

## 変更手順
「File」>「Options…」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630627/871324db-bea5-2f93-3afc-db4bbf96c56e.png)

1. Options のモーダルが表示されるので、「Integrations」をクリック
1. 「Shell」で変更したいコマンドラインツールを選択
1. 「Save」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630627/293638f6-e5ff-93b8-2d50-25ad8162d3cd.png)

選択したコマンドラインツールに表示が変わっていればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630627/d2bd225b-84e4-659a-bff7-178b115de0f5.png)
curl コマンドでヘッダーのみ出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98745/e2ebd11a-0259-538d-7898-9c07101e112b.png)
今回はコマンド curl でのレスポンスのHTTPヘッダ情報取得のお話です。

## 経緯

「ターミナルで curl コマンドを使って得た**レスポンス内容のヘッダだけを表示する**にはどうしたらいいのだ？」と必要にかられ、ググりました。
いくつか方法を紹介しているウェブページに、大文字の `-I`（アイ）オプションをつけて、

```sh
curl -I リクエストURL
```

とすればよいと紹介されています。
むむむ、でもこれ、厳密には **違いました**。

## とりま答えです

コマンド `curl` を使ってHTTP(s)にドキュメントを取得する場合、特にオプションを指定せずリクエストするとGETメソッドが利用されます。
このGETメソッド利用時で**HTTPヘッダだけ**を表示させる方法をいくつか提示しましょう。


### `-i` オプションを利用

`-i` オプションはレスポンスのヘッダも表示させるオプションです。（ロングオプションだと `--include`）
表示させるというか、HTTPにおける素の応答テキストが表示されるので、プロトコル仕様上ヘッダ部とボディ部が空行で区切られていることを利用してヘッダ部を抽出します。

```sh
curl -si https://qiita.com | awk '/^HTTP/,/^[\r\n]+$/'
```

Awkのフリップフロップ機能を使っています。[^aboutflipflop]
HTMLドキュメントの改行コードはまちまちなので、”空行”判定はどの改行コードでも判断できるようにしてみました。
なお、`-s` オプションは任意です（以下同じ）。

[^aboutflipflop]: フリップフロップについては小生の別な記事[『Ruby でフリップフロップ』](https://qiita.com/Ping/items/acb7fbb9aa141c2c46df) が参考になるかと。AwkでなくともRubyやPerlなどでも表現は可能です。フリップフロップはあまり使われない機能ですが時々便利なかわいいやつです。


### `-v` オプションを利用

`-v` オプションではデバッグ用にレスポンスヘッダも含めた情報が表示されます。（ロングオプションだと`--verbose`）
ヘッダ情報は `>`（リクエストの場合） か `<`（レスポンスの場合） に続いて表示されるので、これを条件に抽出します、

```sh
curl -sv https://qiita.com 2>&1 >/dev/null | grep '^<'
```

ただこれ、標準エラー出力に出力されるので、リダイレクトを使って標準出力に流してgrepします。[^redirect]

[^redirect]: 当方Macで確認しているのでちょっと Windows WSLx でできるかは不明です。


### `-D` オプションを利用

`-D` オプションはヘッダ情報のみをファイルに出力します。（ロングオプションだと `--dump-header`）
`curl` 実行時のターミナルに直接表示されないとは言え、一番素直な方法かもしれません。

```sh
curl -s -D headers.txt https://qiita.com > /dev/null
# cat headers.txt
```

### `-w` オプションを利用

比較的新しいオプションである `-w` を使います。これは得られた情報を任意のフォーマットに整形できます。（ロングオプションは `--write-out`）
ただこのオプション、今のところ必ずレスポンスのボディ部が表示されるので、フォーマット指定した内容のみ表示させるにはちょっと工夫が必要でした。今後もう少し使いやすくするのかな。

```sh
curl -s -w '%{stderr}%{header_json}' https://qiita.com 2>&1 >/dev/null
```

サンプル実行例は標準エラー出力にJSON化したヘッダを出力させ、それを標準出力にリダイレクトさせています。
JSON化された情報になるので `jq` などにパイプも可能です。それを使うとちょっと見やすくなるかもですね。


## なぜ `-I` ではダメなのか

さて、冒頭で書いた”厳密には違った”理由の説明です。

curl の `-I` （ロングオプションは `--head`）は、レスポンスのヘッダ情報のみを出力するオプションではなくて、*HEADメソッドによって得られた結果を表示する*、というのが正しい説明になります。[^fromman]

それゆえサーバによってはGETメソッドで得られるドキュメント内容と異なる場合があります。具体例として Qiita の API（v2） がそのタイプでした。[APIドキュメント](https://qiita.com/api/v2/docs)で”レスポンスのヘッダにある”と書かれているヘッダ情報が得られないなぁ、、、と悩んだのがこの記事のきっかけですね。

なお、HEADメソッドを使うので、APIのような動的ではない静的なコンテンツの場合には、ほぼ”ヘッダのみ表示させる”と等価な結果とはなるのかなと思われます。

この記事を参考にうまく使い分けてもらえればと思います！

（おわり）


[^fromman]: [curl man page `-i`](https://curl.se/docs/manpage.html#-I)

## 資料

[curl man page](https://curl.se/docs/manpage.html)
Azure Functions docker container (Python) を Apple silicon Mac 環境で動かす

Intel Mac で動いている Azure functions docker container (Python) が Apple silicon Mac で動かなかったので、動かすためにやったことをメモする。


対応無しだった場合には Apple silicon Mac では以下のエラーが出た。

- `System.IO.IOException: Function not implemented`



# 動かす方法

以下のリンクにある x68 architecture を Rosetta 2 で emuratort を使用することで動かすことができた
- http://issamben.com/running-azure-function-as-docker-container-on-an-m1-m2/


- 利用 image 
    - `mcr.microsoft.com/azure-functions/python:3.0-python3.9-appservice`
- Docker Desktop Version
    - 4.21.1

# 参考
http://issamben.com/running-azure-function-as-docker-container-on-an-m1-m2/

https://levelup.gitconnected.com/docker-on-apple-silicon-mac-how-to-run-x86-containers-with-rosetta-2-4a679913a0d5

https://github.com/Azure/azure-functions-docker/issues/487

https://github.com/Azure/azure-functions-core-tools/issues/2901#issuecomment-1412660399
Reactメモ

## React17のインストールから起動まで
1. `npx create-react-app react-test`でreactファイル作成
2. dependenciesを下記に書き替える
`
  "@testing-library/jest-dom": "^5.16.2",
  "@testing-library/react": "^11.2.7",
  "@testing-library/user-event": "^12.8.3",
  "react": "^17.0.2",
  "react-beautiful-dnd": "^13.1.0",
  "react-dom": "^17.0.2",
  "react-scripts": "5.0.0",
  "web-vitals": "^0.2.4"
`
3. package-lock.jsonとnode_modulesを削除
4. `npm install` で再インストール
5. index.jsを下記に書き替える

import React from 'react';
import ReactDOM from 'react-dom';

const App = () => {
return (
<>
<.h1>こんにちは</h1>
</>
);
}

ReactDOM.render(<App />, document.getElementById("root"));

6.App.jsを下記のように書く

`const App = () => {`
 ` return (`
    `<>` 
      `<.h1>こんにちは</h1>`
`    </>`
`  );`
`}`

`ReactDOM.render(<App />, document.getElementById("root"));`

7, `npm start　react-test` で表示されたらOK
Azure DevOpsの権限回りで困ったら確認したい設定

# はじめに
Azure DevOps利用時に新規参画者を登録したところ、セキュリティグループにはしっかりと登録されていることが確認できて必要なアクセス権限も問題ないはずなのになぜか特定の機能にアクセス（表示されない）できないといったことが起きました。
その時の原因と解決方法について紹介します。

DevOpsの権限周りの詳しい説明や、セキュリティグループってなに？という方は以下の記事がとても分かりやすいため参照頂けると幸いです。

https://qiita.com/mstakaha1113/items/961c8bfb02159fd1118b



# 結論
Azure DevOpsのOrganization SettingsでUsersからアクセスレベルを確認しろ！
アクセスレベルが「Stakeholder」になっていると制限が多いので使えない機能がある。

https://learn.microsoft.com/ja-jp/azure/devops/organizations/security/access-levels?view=azure-devops


# 確認手順

Azure DevOpsのトップページから左下にあるOrganization Settingsを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/e4be047e-efc6-d898-de41-522ae7da0cf3.png)


Usersを選択すると各ユーザーのアクセスレベルが確認できる。
アクセスレベルがStakeholderになっていると限られた機能にしかアクセスができません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293404/bf168069-ff7b-0fbd-5304-cd3dca2565e1.png)




# おわりに
Azure DevOpsのOrganization作成から実施している管理者レベルの方であれば把握されていることかと思われますが、プロジェクトに途中から参加しAzure DevOpsを利用し始めた方からすると分かりづらいポイントかと思います。

アクセスレベルは以下の通りとなっているので必要に応じて変更する必要があります。
- **Basic** : ほとんどの機能にアクセスできます。
- **Basic + Test Plans** : Basic に含まれるすべての機能とAzure Test Plansへのアクセスを提供します。
- **Stakeholder** : アクセスできる機能に制限があります。ユーザーに無料で割り当てることができ、ユーザー数に制限はありません。
- **Visual Studio Subscription** : 既に Visual Studio Subscription を持っているユーザーに割り当てます。各サブスクリプション レベルに含まれる機能がすべて有効になります。
オペレーティングシステム（OS）の種類

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/d0e3ad7f-5be0-beb6-9aa8-3dc5783f4b7a.png)
１：オペレーティングシステム（OS）の種類
①Unix系OS：1969年にAT＆Tで開発されたUnixを参考にして作られたOSdearu.マルチタスク、マルチユーザ対応である。基本的にはCUIで用いる。GUIを利用する際にはXーWindowシステムを用いる。TCP/IP（インターネット）の開発に利用された経緯から、ネットワークサーバ用OSとして広く利用されている。代表的なUnix系OSとして、Linuxがある。

②Windows：米マイクロソフトしゃのOSで、パソコンで広く利用されている。マルチタスク、マルチユーザ、GUI対応のOSである。

③MacOS：米アップル社のMac用のOSである。Unix系OSをベースとしており、マルチタスク、マルチユーザ、GUI対応のOSである。

④Android：Unix系OSであるLinuxをベースとしたスマートフォン、タブレットコンピュータ用のOSである。

⑤iOS：MacOSをベースとした、米アップル社のスマートフォン用のOSである。
Javaの変数とデータ型について学習してみた

# 概要

Javaの変数とデータ型について学習してみました。以下のページを参考にしました。

変数とデータ型

https://www.javadrive.jp/start/var/

Javaにおける変数とは

https://www.javadrive.jp/start/var/index1.html

変数を宣言する

https://www.javadrive.jp/start/var/index2.html

変数名のつけ方(識別子)

https://www.javadrive.jp/start/var/index3.html

基本のデータ型

https://www.javadrive.jp/start/var/index4.html

変数の初期化と変数への値の代入

https://www.javadrive.jp/start/var/index6.html

変数の値を取り出す

https://www.javadrive.jp/start/var/index8.html

変数宣言で型推論を利用する

https://www.javadrive.jp/start/var/index9.html

final変数を定数として利用する

https://www.javadrive.jp/start/var/index10.html

キャスト演算子と型変換ルール

https://www.javadrive.jp/start/var/index11.html

演算の時に自動的に行われる型変換

https://www.javadrive.jp/start/var/index12.html

ラッパークラスの利用

https://www.javadrive.jp/start/var/index13.html

# 変数名には日本語も使えるみたいです
以下のファイルを作成しました。
```JSample1_1.java
class JSample1_1{
    public static void main(String[] args){
	int 日本語も使えるよ = 10;
	System.out.println(日本語も使えるよ);
    }
}
```
以下のコマンドを実行できました。
```
$ javac JSample1_1.java 
$ java JSample1_1 
10
```


# まとめ
何かの役に立てばと。
技術同人誌を残す技術 - 国立国会図書館に納本する

執筆された同人誌はどう残していますか？。自室や会社の本棚、パソコンやクラウドの中に電子データとして保存すると様々な手段があります。

実際の紙の本に関しては確実に残す手段があります。それは国立国会図書館への納本です。

## 納本制度

「納本制度」とは、図書等の出版物をその国の責任ある公的機関に納入することを発行者等に義務づける制度のことです。わが国では、国立国会図書館法（昭和23年法律第5号）により、国内で発行されたすべての出版物を、国立国会図書館に納入することが義務づけられています。

https://www.ndl.go.jp/jp/collect/deposit/deposit.html

ここで気になるのは素人が出版した同人誌を納本出来るの？だと思いますが、出来ます。国会図書館の Q&A から、自費出版の同人誌でも納本の対象となっています。

> Q1：どんなものを納めなければならないのですか？
> A1：原則として、頒布を目的として相当部数作成されたすべての出版物です。図書、雑誌・新聞だけでなく、CD、DVD、ブルーレイ、レコード、楽譜、地図なども対象となります。また、社史・団体史等の自費出版でも、相当の部数を作成し配布されているものは納本の対象となります。ただし、ホチキス留めなど簡易綴じのもの、広く一般に公開することに支障があるものなどは、納本の対象とはなりません。

https://www.ndl.go.jp/jp/collect/deposit/qa05.html

なお、トラブルの回避として、本人（または本人が含まれるグループ）で出版した本のみを納本してください。

## 実際に納本してみた

技術書典14のオフラインイベントの翌日、作成した技術同人誌を持って国立国会図書館（東京本館）に行きました。

![IMG_0823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24345/c21ab9ab-0f6e-eafd-fdc8-46cdbb344c04.jpeg)

一般利用者の入口とは異なり、通用口（西口）に向かいます。建物外の歩道から回って行きます。なお、画像の右下は国会図書館の入口ではありません（おそらく何かの点検口兼ゲート格納）。ご注意ください。

![IMG_0826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24345/c4fc3fa9-8fe5-352f-1c1e-be2757aab004.jpeg)

入口で警備員さんに「納本しに来た」と伝え入館手続きを行い、納本カウンターに進みます。そして、職員さんに納本する本を渡して、必要な書類（名前、住所、本のタイトル）を書いたら完了です。渡す際に、寄贈か納入出版物代償金支払い（半額買取）を尋ねられれます。個人的には、特別な事情がない限り、寄贈がよいです。また、郵送での受付もされているので遠方の方でも簡単に出来ます。今回は新刊と既刊を2冊ずつ納本したので、それぞれが東京と大阪に所蔵されています。もしお近くにお住まいでゆめみ大技林（紙の本）に興味ある方は、ぜひ手に取ってみてください。

https://ndlonline.ndl.go.jp/#!/search?searchCode=SIMPLE&lang=jp&keyword=ゆめみ大技林

![スクリーンショット 2023-07-20 18.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24345/94e9525a-b547-8e15-c078-589479a7d9be.png)

## まとめ

商業誌以外で個人が国会図書館に納本されるのは博士論文ぐらいだなーと諦めていましたが、無事に実績を解除することが出来ました。やったね！。なお、後々自分の名前で検索すると昔に投稿した論文誌が既にあり、知らないうちに実績を解除してました。


## 追記

この記事をまとめて、[YUMEMI.grow 技術同人誌を支える技術](https://yumemi.connpass.com/event/291439/) にて発表しました。

https://speakerdeck.com/mitsuharu/2023-08-23-keep-techbooks
セルフホストしたNocoDBで画像が表示されない問題を解決

# [結論だけ知りたい人](#解決方法)

# NocoDBとは
データベースと接続してExcel感覚でDB操作が出来るOSSです。また、作成したDBをもとに、API、Swagger UIを自動生成してくれます。

https://nocodb.com/

アカウントや権限の設定も行なえるので、社内向けの簡単なアプリのバックエンドとして利用しようと思いNocoDBのセルフホストを行ないました。

# ホスティング環境
ホスティング先 : AWS EC2　VPC プライベートネットワーク内
OS : AlmaLinux
Version : 9.2 (Turquoise Kodkod)
接続先DB : RDS MySQL

`npx create-nocodb-app`コマンドでインストールを行ない、
NginxをリバースプロキシとしてSSL化しました。

https://docs.nocodb.com/getting-started/installation/#npx

# 今回ハマったこと
**NocoDBにアップロードした静的ファイルがダウンロード（表示）できない**

### 詳細 ～問題発生から沼るまで～
NocoDBのAttachment型に設定した項目に、画像をアップロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102795/5ae0c312-bfe2-83fb-61f5-87d6859cef88.png)
アップロードは成功するが、画像が表示されず、ダウンロードボタンを押しても失敗する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102795/6b96e786-1787-35c6-8d99-49f779ad8d07.png)
開発者ツールでリクエストを確認してみたら、リクエストURLがhttpになっていて、cross-originで引っかかっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102795/adf07c59-749e-08f5-63b4-ae7a7e518d56.png)

NocoDBの環境変数でそれらしきもの（NUXT_PUBLIC_BACKEND_URL）を見つけたので、`.env`にhttpsで設定してNocoDBを再起動するも、変化なし。。。
https://docs.nocodb.com/getting-started/environment-variables

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102795/365433c3-2842-ff09-8c42-04a5325e53c6.png)

`bashrc`の設定や別の方法でのデプロイなど色々試しましたが、どれも上手くいかず沼沼沼


# 解決方法
NocoDBのissuesを漁っていたところ、それらしきissueを発見！

https://github.com/nocodb/nocodb/issues/3239


**`NUXT_PUBLIC_BACKEND_URL`ではなく、`NC_PUBLIC_URL`で`https://hogehoge`と設定したら静的ファイルのリクエストURLがhttpsになりました。**（swagger UIのリクエスト先も、httpsに変わりました）

<br/>
<br/>

NocoDBの環境変数ページの説明に、招待メールの送信に使用と書かれていたので、関係ないものと思いこんでいました。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102795/33947f54-0435-a381-7970-0486c62aa1e7.png)

改めて、公式ドキュメントを確認しても解決できない問題は、Githubのissuesを隈なく探してみましょうという教訓になりました。
NFTについて（課題と懸念点）

# 盗作、詐欺問題
NFTでは、盗作がとても増えてきていることが問題となってきております。
特にNFT化されていない作品を、他者が勝手にNFT化してしまい、販売してしまうケースも存在するようです。

また、有名なCryptoPunksをコピーして安価なNFTとして販売しているケースも多数あるので、発行者を確認して真贋を見極める必要があります。
見た目上は全く同一の作品になるので、うっかり盗作のNFTを購入しないように注意が必要です。

**●対策**
・信用できるリンクから作品ページへアクセスする。
・クリエイターに直接販売を依頼する。

# 人気を自作自演できる
NFTは、取引履歴がブロックチェーン上に残るのが特徴とお伝えしています。その取引履歴を自分自身で売買を繰り返し、あたかも人気の作品に見せるのが、こちらの問題です。

オープンになっている情報は、あくまで「ウォレットアドレス」という数字の羅列でしかないため、
1人の出品者が複数のウォレットアドレスを保有し、異なるウォレット間で売買を繰り返せば、その作品を「取引が活発で、人気のある作品だ！」と思わせることも可能になってしまいます。

**●対策**
・取引履歴の作品に紐づくSNSアカウントが、別人かチェックする。
・取引履歴に不自然な点がないかチャックする

# ガス代の高騰
**ガス代とは？**
NFTのガス代とは、簡単に言うと手数料です。
NFTは現状、イーサリアムという仮想通貨を使って取引を行います。ブロックチェーン技術で取引履歴を記録するのがNFTの特徴ですが、現状はイーサリアムのブロックチェーンを利用しているんです。
このイーサリアムのブロックチェーン上に取引履歴などの情報を記録するための手数料を、ガス代と呼んでいます。

そのガス代が高騰し、利用者が問題視している。
イーサリアムの利用者が急激に増えたことで、ネットワークの処理が遅くなり、ガス代が高騰する要因になりました。

**●対策**
・混雑している時間を避ける
・安いガス代で取引の承認を待つ

# 環境問題
NFTの急速な成長に伴い、ブロックチェーンの採掘作業には多くのエネルギーが必要とされます。これにより、環境への影響やエネルギー効率の問題が浮上しています。

例えば、Proof of Work（PoW）と呼ばれるブロックチェーンの採掘方式は、高い計算能力を要求し、膨大な電力消費を伴います。このため、一部の人々はNFTのブロックチェーン採掘によるエネルギーの浪費や環境への悪影響を指摘しています。

**●対策**
・環境に配慮したNFTの取引プラットフォームを利用することで、環境負荷を軽減することができる


# まとめ
新しい技術には問題等がつきものですね。こういった問題が解決されていく事も願いつつ、自分自身も購入をする際には注意をしていきたいなと思いました。
最後まで読んでいただきありがとうございました！
Karateでの実行オプション追加

# はじめに
Karateを使ってAPIの自動テストを実装していると、パラメータ化して実行時に切り替えてテストしたい場合があるかと思います
今回はそのパラメータを実行オプションで設定する方法を書いていきます
# 設定ファイルへの定義
以下の2つのファイルにパラメータを設定します
### build.gradle
testブロックにて、テスト実行時に渡されるパラメータをシステムプロパティに追加してください
以下はkarate.prm1というシステムプロパティにパラメータを設定するサンプルコードです
```build.gradle
test {
    ...
    systemProperty "karate.prm1", System.properties.getProperty("karate.prm1")
    ...
}
```
### karate-config.js
各テストスクリプト共通で該当のパラメータ値を利用したいので、karate-config.jsでシステムプロパティから取得します
karate.properties[key]を使ってシステムプロパティから値を取得してprm1という変数に設定するサンプルコードです
```karate-config.js
function fn() {
    ...
    var config = {
        baseUrl: 'https://example.com',
        prm1: karate.properties['karate.prm1']
    };
    ...
}
```
# テスト実行
以下はGradleでテスト実行する際の例です
この様にオプションを追加するとkarate-config.jsにてxxxxxxxという値がprm1に設定されてテストランナーが実行されます
```
./gradlew clean test -Dkarate.prm1=xxxxxxx --tests ApiTestRunner
```
Rustでタイムアウト時間を設定して外部コマンドを実行する方法

# はじめに
Rustでタイムアウト時間を設定して外部コマンドを実行する際にそこそこ苦労したので備忘録として残しておきます。

# 環境
* OS: Windows 10
* rust: 1.70.0

# 方法
### 1. `wait-timeout`クレート追加
```sh
cargo add wait-timeout
```
```toml:Cargo.toml
[dependencies]
wait-timeout = "0.2.0"
```

### 2. タイムアウト時間を設定して実行
タイムアウト時間を10秒に設定して`sample.exe`を実行する場合は以下のようになります。
タイムアウトの発生，または実行時エラーが発生した場合はpanicし，成功した場合は出力を標準出力に出力しています。

```Rust: main.rs
use std::{
    io::Read,
    process::{Command, Stdio},
    time::Duration,
};
use wait_timeout::ChildExt;

/// タイムアウト時間
static TIME_LIMIT: u64 = 10;

fn main() {
    let duration = Duration::from_secs(TIME_LIMIT);

    let mut child = Command::new("./sample.exe")
        .stdout(Stdio::piped())
        .spawn()
        .unwrap();

    // タイムアウト処理
    let status = match child.wait_timeout(duration).unwrap() {
        Some(status) => status,
        None => {
            child.kill().unwrap();
            child.wait().unwrap();

            panic!("タイムアウトエラー");
        }
    };

    if !status.success() {
        panic!("実行時エラー");
    }

    // 標準出力を取得
    let mut stdout = String::new();
    child.stdout.unwrap().read_to_string(&mut stdout).unwrap();

    println!("{}", stdout);
}
```

実際に実行に10秒以上時間がかかる`sample.exe`を実行させてみるとタイムアウトエラーを吐いてくれました。
```sh
> cargo run -q
thread 'main' panicked at 'タイムアウトエラー', src\main.rs:26:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
```

# 参考文献
* [wait_timeout - Rust](https://docs.rs/wait-timeout/latest/wait_timeout/#)
* [multithreading - Terminate process when timeout has been reached and process output in Rust - Stack Overflow](https://stackoverflow.com/questions/62120000/terminate-process-when-timeout-has-been-reached-and-process-output-in-rust)
KatalonのTestCloud（検証機リモートサービス）使って自動テストを実行してみた

# TestCloudとは
要約すると、テストに必要なスマートフォンやMac,Windowsなどの環境をリモートで借りてテストを実行できるサービスです。
公式ドキュメントの説明は[こちら](https://docs.katalon.com/docs/execute/test-execution-with-testcloud/testcloud-overview)。


# 料金
年間$1,849 で使い放題
（2023.07時点、KSE・KREは別途契約）

# 使用感
## Katalon Studio でTestCloud を使用する
実行ボタン横の▼押下メニューよりTestCloudを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/adc46a1c-56f7-c20f-4b66-b2b6068d1036.png)
実行環境を選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/f3b28d21-afa4-06c2-68d5-890a3d064920.png)
``Run``をクリックで選択した環境での実行が始まります。
実行状況はログのみ確認できます。画面は見えません。


## KatalonTestOps（Katalonのテストやレポートを操作できるサイト）からテストを実行
設定は環境を選択するのみです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/50fa6530-5363-a7d6-f3da-2bb9730be938.png)
KatalonStudioからのときと同様に、実行状況はログのみ確認できます。画面は見えません。

## いいところ
・KatalonTestOps（Katalonのテストやレポートを操作できるサイト）からテストを実行するときに、既に環境セットアップがされてあるので自分たちでセッティングする必要が無くすぐ使えた
・Macが無い・Androidが無い・iPhoneが無い、といった時に簡単に使える。

## 悪いところ
・KatalonStudioから環境を選んでテストを実行したところ、物理的な距離があるために非常に遅く、普段失敗しないようなところでテストが失敗していました。
・リモートした端末を直接操作できるわけではなく、自動テストのスクリプトを送って実行するだけなので、スクリプトを実行するのはいいが作成するときに使うことはできない。
・画面が繋がるわけではないので、実行中に見える情報はログ文字列のみ。（後から動画のスクリーンショットなどを取得することは可能）

## まとめ
類似サービスとして[BrowserStack](https://www.browserstack.com/)などの別サービスでも自動テスト連携ができ、そちらは料金は高くなるものの手動テストができたり実際の画面を確認できるので、個人的には他サービスの方がいいかなと思いました。
【JavaScript】【Jquery】チェックボックスで片方チェックしたら片方外す


# html inputでtypeがcheckboxのセレクタが対象
```html
<div>
  <div>
    <label><input type="checkbox" id=1 value=2>チェック1</label>
    <label><input type="checkbox" id=2 value=1>チェック2</label>
  </div>
  <div>
    <label><input type="checkbox" id=3 value=1>チェック1</label>
    <label><input type="checkbox" id=4 value=1>チェック2</label>
  </div>
</div>
<p></p>
```

# js
```javascript
$('label input[type="checkbox"]').change(function() {
  //両方チェックを外す
  $(this).closest('div').find('label input[type="checkbox"]').prop('checked', false);
  //押したチェックボックスにチェックする
  $(this).prop('checked', true);
   //チェック数をカウント
  $('p').text($('input:checked').length);
   //チェックされてるvalueの合計       
  let sum = $('input:checked').get().reduce((sizai, gokei) => + gokei.value + sizai, 0);
  console.log(sum);
 //チェックされてるidの配列を作成    
  let ids = $('input:checked').map((_,e) => $(e).attr('id')).get();
   console.log(ids);
})
```


実行環境
https://jsfiddle.net/nishikawa_naonori/of0xnzut/3/
初心者レベルでも書く

ブログ代わりにQiitaに記事を書いていこうと思うので、自分なりの書き方を今後のために書こうと思った。
まだスライムくらいしか倒せないような初心者🔰のうちからでも書いていく！

## Qiitaで記事を書くのはなぜ？
- 転職する時、アピールする材料になる。
- 自分の言葉でまとめることができるようになる=>文章力アップ💪
- 学んだことを整理できる。

## どんな内容？
- 学んで得たことのまとめ。
- 詰まったところ。
- エラー内容、解決した方法など。
- 慣れたら、もっと技術的なことを書く。

## 習慣にするために
★ハードルはとことん下げるようにする。

①書きやすくする
テンプレートを使う。
見出しから書いていく。
書きやすい所から書く。
重複した内容でもOK（自分なりのまとめ方）。
壮大な記事を書こうとしないこと！


②2～3分でも記事に向かう
まずPCの電源を入れる。記事を1つ書きあげることを目標にしないこと！（出来ない時に挫折しやすいため）

③ざっくり時間を決める
家事が全部終わった後、寝るまでの時間。

④最初は文章が短くてもOK！
まずは書くことに慣れることが目標なので、短くても**駄文**（←ここかなり重要）でも投稿する。
> 　技術ブログは「未来の自分へのメモ書き」

自分の記事に助けられる日が来るかも！？

★参考にした記事のURLは必ずのせる
感謝を込めて！

## テンプレート

<pre>## 導入部分
「はじめに」の部分。
なぜこの記事を書こうと思ったのか？
どんなエラーに詰まってどう解決したのか？
解決できなかった場合は自分でTryしたことなどを書く。

## 対象者
- 駆け出しエンジニア
- プログラミング初学者

## 環境

## （あればエラー内容）

## 結論

## 内容

### 詳細

## おわりに

## 参考記事
[リンクタイトル](url)

## コード
```php:example.php
```

> 引用

> > ネストされた引用です。

##　表 
3x(英小文字のエックス)2　→　エンターキー

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|   |   |   |
|   |   |   |

## 背景に色をつける
:::note info
緑
:::

:::note warn
黄色
:::

:::note alert
赤
:::

##画像はコピペで貼り付けられる
</pre>

## おわりに
エラー内容は別にテンプレートを作った方がいいかも。


## 参考記事
[初めての「技術ブログ」書き方のご紹介](https://blog.soracom.com/ja-jp/2018/04/18/howto-techblog/#co-index-5)
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
bundle install先に 'vendor/bundle'を指定しないとLambdaでInit error when loading handlerになる

# はじめに
Rubyを使用しているプロジェクトで3.2にバージョンアップする対応を進めていたのですが、その際に発生したエラーに沼ってしまい、参考記事も見つけることができなかったのでまとめることにします。

# 環境
- Ruby2.7.5→3.2
- Rails5.2→7.0
- Docker image public.ecr.aws/lambda/ruby:2.7→3.2
- serverless 3.33.0

# 状況
Ruby on Railsアプリケーションをサーバレスデプロイしているプロジェクトでバージョンアップ対応を行っていました。具体的にLambdaのランタイムイメージとGemfileをRuby2.7から3.2にバージョンアップし、デプロイを行ったのですがページにアクセスできなくなりました。

Cloud Watchでログを確認すると以下のエラーが発生していました。

```
"Could not find net-pop-0.1.2, net-smtp-0.3.3, rake-13.0.6 in locally installed gems"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/99095c94-10cf-f999-1b34-805ee3e51495.png)


どうやら上記のgemはRuby3.1より標準ライブラリから外れているようなので、手動で追加する必要があるようです。

https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/

しかし、追加してデプロイし直してみてもエラーは変わりませんでした。

ローカルのGemfileの変更がデプロイしたコンテナパッケージに含まれていなかったのかなと思い、
ECRにpushしたイメージをpullして中身を確認してみましたが、問題なくGemfile.lockに変更が反映されていました。

また、Gemfileから任意のgemを削除してデプロイし直してみましたがエラーは変わりませんでした。


# 原因
Lambdaがgemのインストール先を参照できていない…？と思い、
Dockerfileを見直してみました。

```Dockerfile
FROM public.ecr.aws/lambda/ruby:3.2 as builder

ENV LANG C.UTF-8

RUN yum update -y && yum groupinstall -y "Development Tools"

WORKDIR /var/task

RUN gem install bundler -v 2.3.5

COPY lambda.rb /var/task
COPY ./Gemfile /var/task
COPY ./Gemfile.lock /var/task
ENV GEM_HOME=/var/task
RUN bundle install

ADD . /var/task/

CMD ["lambda.App::Handler.process"]
```

バージョンアップに成功している他のプロジェクトと比べてみるとbundle install先のpath指定がありませんでした。

試しにapp配下で```cat .bundle/config```を実行してみるとエラーになりました。
![l_9007702_938_93fb0ce626dfdb55bcabd9dc18e68dc5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/0cb3b85a-0a19-18c7-b24c-fe0be7cf1ded.png)

# 解決方法

公式を参考にbundle installしている箇所を以下のように修正しました。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/ruby-package.html

```Dockerfile
RUN bundle config set --local path 'vendor/bundle' && bundle install
```

この状態でデプロイを行うと問題なくページにアクセスできました。

先ほどと同様に```cat .bundle/config```を実行してみます。

![l_9007702_936_68f4a83535aca8f1d9869c2baa65e3b4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/2c8fc500-0021-52c8-b6b3-8f844334f144.png)

BUNDLE_PATHがありました。
おそらくLamnbdaでエラーになっていたのはこれが原因なのかなと思います。
(そうなるとバージョンアップ前は問題なく動いていたのが気になりますが…)


# おわりに
今回のバージョンアップ対応が原因だったのかまでは分かりませんでした。これまでは問題なく動いていたので原因を突き止めるのに時間がかかってしまいました。同じような状況の方に少しでも参考になればと思います。
rails APIのバージョンについて

#### RailsのAPIのバージョンについて
自分が参画した開発現場では一からサービスを作成しておらず、すでにリリースしているサービスの改修をしていました。その中でAPIの機能を使用して実装していたのでメモを残します。

#### RailsのAPIとは？
API専用アプリケーションを支援するRailsの機能のことであり
近年、さまざまなクライアント側フレームワークが登場したことによって、Railsで構築したバックエンドサーバ―を他のWebアプリケーションとネイティブアプリケーションの間で共有する手法が増えてきました。

たとえば、Twitterは自社のWebアプリケーションで パブリックAPI を利用しています。このWebアプリケーションは、JSONリソースを消費するだけの静的サイトとして構築されています。

多くの開発者が、Railsで生成したHTMLフォームやリンクをサーバー間のやりとりに使うのではなく、Webアプリケーションを単なるAPIクライアントにとどめて、JSON APIを利用するHTMLとJavaScriptの提供に専念するようになってきました。

#### コントローラー作成に関する以下のコマンドを実行しましょう。

```
rails g controller v1::todos 
```

コントローラーを作成していますが、v1::todosという見慣れない書き方をしています。
vはバージョンを表す英単語で、数字はそのバージョンを示しています。

こちらの書き方でコントローラーの作成を実行すると、ご覧の通りv1というディレクトリの中にコントローラーを作成してくれます。
また、作成されたコントローラーのファイルも確認してみてください。

api/app/controllers/v1/todos_controller.rb
```
class V1::TodosController < ApplicationController
end
```

#### バージョンを指定してコントローラーを作成した理由
上では、v1というバージョンを指定してコントローラーを作成しました。
本段落では、その理由を説明します。

そもそもAPIは機能の追加や変更、更には廃止といった多くの修正を開発現場ではしていきます。
一度公開したAPIはできるかぎり変更しない方がユーザーにとって良いですが、なかなかそれは難しいです。

そのような状況下でAPIの修正を行っていくためには、前からサービスを使用しているユーザーにも、新しく使用するユーザーにも対応できるAPIを作成していかなければなりません。
つまり、複数のバージョンのAPIを同時に提供する可能性があるということです。

具体的に言うと、リリースしているサービスに影響が出ないようにバージョン1のAPIのある部分を残したままバージョン2で新機能を追加してバージョン1に影響が出ないようにするといった感じです。

#### コントローラーの書き方
以下コントローラーは、
TODOのデータ全てをJSONの形式でユーザーに返すアクションです。これでjson形式のAPIが出来ています。

サンプル

```
def index
  todo = Todo.all
  render json: todo
end
```

以下のサンプルコードの意味はv1のバージョンでTODOのデータ全てをJSONの形式でユーザーに返すindexアクションです。

```

class V1::TodosController < ApplicationController
　　def index
  　　todo = Todo.all
  　　render json: todo
　　end
end
```

このようにバージョンを分けられるようにしておけば、古い形式でアクセスしてきているユーザーに対してはバージョン1のAPIでデータを渡したり、新しいユーザーにはバージョン2のAPIでデータを渡したりといったことが可能になります。

#### ルーティングの作成

サンプル

```
Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  namespace :v1 do
    resources :todos, only: [:index, :create, :destroy]
  end
end
```

まずは、namespaceの部分から。前の節では、APIのバージョンを分けることに関して、以下のような説明をしておりました。

このようにバージョンを分けられるようにしておけば、古い形式でアクセスしてきているユーザーに対してはバージョン1のAPIでデータを渡したり、新しいユーザーにはバージョン2のAPIでデータを渡したりといったことが可能になります。

つまり、ルーティングでも、バージョンの変更がしやすい実装を心がける必要があります。
Railsのルーティングではnamespaceという機能を使うことができ、こちらを使うとURLのHelperとPathに指定した文字がつきます。
アンケートデータを分析するときのポイント

# はじめに

分析・集計する対象のデータがアンケートデータのように、ひとつの設問に対して複数の選択肢を回答できるデータの場合、データの持ち方に工夫が必要となります。

## アンケートサンプル

今回は、アンケートのフォームが下記のような場合を考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/19fa66ad-b8fe-8fda-c99e-400c9f36e5f4.png)

## 取得されるアンケートデータ

上記のようなアンケートの場合、収集されたデータは以下のようなデータレイアウトになります。（アンケートサンプルデータ_1.csv）

```アンケートサンプルデータ_1.csv
氏名,問１,問２
田中太郎,0～10 歳,春
鈴木次郎,11～20 歳,春/夏
小林三郎,21～30 歳,夏/秋/冬
山田花子,31～40 歳,春
佐藤健太,41～50 歳,夏/秋
高橋美咲,21～30 歳,冬
中村直人,61 歳以上,春/夏/秋/冬
伊藤直子,51～60 歳,春/夏
木村大介,31～40 歳,冬
渡辺真理子,51～60 歳,秋/冬
```

## MotionBoard で可視化してみる

このデータを使用して、アンケート回答者の年代別割合と、どの季節が好きだと答えたかの割合を表現してみます。
今回は、MotionBoard を使用して、それぞれの割合を円チャートで表現してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/04207086-fe0e-bb60-5a79-240459596586.png)

すると、上に配置した年代別の割合を表現した円チャートは問題ありませんが、下に配置した季節別の割合を表現した円チャートが、複数回答を許可しているため、うまく表現できません。

## 思い通りの割合を表現するために、データを加工する

そこで、季節別の割合を正しく表現するためにデータを加工します。（アンケートサンプルデータ_2.csv）

```アンケートサンプルデータ_2.csv
氏名,問１,問２
田中太郎,0～10 歳,春
鈴木次郎,11～20 歳,春
鈴木次郎,11～20 歳,夏
小林三郎,21～30 歳,夏
小林三郎,21～30 歳,秋
小林三郎,21～30 歳,冬
山田花子,31～40 歳,春
佐藤健太,41～50 歳,夏
佐藤健太,41～50 歳,秋
高橋美咲,21～30 歳,冬
中村直人,61 歳以上,春
中村直人,61 歳以上,夏
中村直人,61 歳以上,秋
中村直人,61 歳以上,冬
伊藤直子,51～60 歳,春
伊藤直子,51～60 歳,夏
木村大介,31～40 歳,冬
渡辺真理子,51～60 歳,秋
渡辺真理子,51～60 歳,冬
```

問２の回答を、区切り文字（/）で分割し、得られた配列を１行ずつ行に展開したデータを用意します。

## もういちど、MotionBoard で可視化してみる

加工したデータを使用して、再度 MotionBoard でチャートを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/72fb8afa-5f9f-ac09-9840-24cf5d5d285e.png)

すると、季節別の割合もきれいに表現することができます。

アンケートに限らず、例えば製造現場での不具合報告やチェックシートなど、選択肢の中から複数データを選択するケースは業務の中で多くあると思います。
そのようなデータを可視化・分析する場合、このようなデータ側での工夫をあらかじめしておくと、そのあとの作業が簡単になります。

データの加工はさまざまな方法で行えますが、せっかくですので、今後、Dr.Sum で実装する場合や、MotionBoard でどうにか頑張る方法なども投稿していきたいと思います。

### ※ 注意点 ※

加工したデータ（アンケートサンプルデータ_2.csv）で、年代別の割合を表現する円チャートを作成する場合、回答した季節の分だけデータが行に展開されているため、「鈴木次郎」のデータが２行・「小林三郎」のデータが３行存在します。
そのため、集計方法は単純なデータ件数ではなく、Distinct 件数を使用する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630903/37346d40-07ff-43d2-7808-75c8d172d7c8.png)
Katalon実行結果のhtmlが文字化けするとき

# htmlレポート内の日本語
テストスクリプトに以下のようにテストの説明を記載していると、レポート内にも同じ記載がされます
```
'ブラウザを開いてyahoo.co.jpにアクセス'
WebUI.openBrowser('https://www.yahoo.co.jp/')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/1fd7f78a-a4ae-af52-9a52-ea063324ea59.png)


# 文字化けする場合の対応
環境により上述のhtmlレポートの日本語が文字化けすることがありました。
テスト機へのリモートで実行した場合など、環境が変わっても文字コードUTF-8を維持する必要があります。
設定方法は以下

``Open Project`` -> ``Settings`` -> ``Execution`` -> ``Launch Arguments``を開く。
``-Dfile.encoding=utf-8``を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/61698a17-74ec-5e06-208c-09e2ac553db6.png)


以上。
[Servicenow][Flow]REST Messageの実行

# REST Messageの実行
REST Messageの呼び出し方法が何種類かあるので実施したことを簡単にまとめておきます。

## 環境
- Version：Tokyo

## 設定手順
1. Flow ActionからRest Messageを呼び出す（REST Step）
https://qiita.com/tabuchi530/items/996bbdc7cea44f7c608c

1. Flow ActionからRest Messageを呼び出す（Script Step）
https://qiita.com/tabuchi530/items/e5fb3589da85ca8f7bd6