OmniAICreator/Qiita-1.07M huggingface dataset:
【microCMS】 Nuxt.jsとの連携〜表示

#はじめに
こんにちは！
今回はmicroCMSをNuxt.jsと連携させ利用出来る状態にするとことまでをアウトプットしていきます！


#前提
・Nuxtで開発するためにNodeとnpmが必要になります。事前にご自身の開発環境にインストールしてください。
・microCMSのアカウント登録やサービス作成、API作成の仕方を理解している必要があります。こちらを参照してください。

https://document.microcms.io/manual/getting-started


#対象
・Nuxt.js上でmicroCMSを利用したい方


#実装
##①microCMSの準備
まずはmicroCMSで単純なAPIを作成します。
APIの作成の詳細手順については下記リンクのAPIの作成をご参照ください。

https://document.microcms.io/manual/create-api

##②nuxt-microcms-moduleのインストール
①microCMSの準備が終わったら公式で提供している`nuxt-microcms-module`をインストールします。

```:terminal
$ npm install --save nuxt-microcms-module
```

package.jsonに以下が追加されているかを確認してください。

```javascript:package.json
  "dependencies": {
    "nuxt-microcms-module": "^2.0.0"
  },
```

次に`nuxt.config.js`に下記のように記述します。
・serviceDomainはmicroCMSのサービスID（サブドメイン部分）を入力。
・apiKeyにはサービス固有のAPIキーを入力。
・今回はSPA実装で行うので、`mode: all`と記述。ただし、SSR実装の場合は、本番環境でサーバーサイドのみの読み込みを行うため、`process.env.NODE_ENV === 'production' ? 'server' : 'all'`を指定する。modeのデフォルト値はall。


```javascript:nuxt.config.js

  buildModules: [
    "nuxt-microcms-module"
  ],
  microcms: {
    options: {
      serviceDomain: "xxxxxxxxxx", //サービスID（サブドメイン部分）
      apiKey: "yyyy-yyyy-yyyy-yyyy", //サービス固有のAPIキー
    },
    //↓SSR処理をするならこっちにする必要がある
    //mode: process.env.NODE_ENV === 'production' ? 'server' : 'all',
    mode: 'all',
  },

```
下記事参考。

https://blog.microcms.io/nuxt-microcms-module/

SPA実装に関して下記事を参照。

https://www.oro.com/ja/technology/001/

SSR/CSR処理の違いについて、下記事参照。

https://www.japon-line.co.jp/tech/nuxt-js%E3%81%AEssr-csr%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

#実装・出力
ここまでの設定が終わったら、設定したモジュールを呼び出すことができます。
下記のように記述で、データを呼び出すことが可能です。
templateの`△△`、`××`はmicroCMS側のAPI⏩APIスキーマで表示させたい項目のフィールドIDを記述することでAPIを取得し表示させることができます。

```HAML:template
<template>
  <div>
    <pre>{{ 〇〇.△△ }}</pre>
　　　　　　　　<pre>{{ 〇〇.×× }}</pre>
  </div>
</template>
```

```javascript:script
<script>
export default {
  async asyncData({ $microcms }) {
    const 〇〇 = await $microcms.get({
      endpoint: 'あなたのAPIエンドポイント',
    });
    return { 〇〇 };
  }
}
</script>
```

#最後に
今回はmicroCMSとNuxt.jsとの連携〜表示までの実装法をまとめました。

今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
CXL (Compute Express Link) その5 - CXLとホストCPUとの接続

私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋です。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストまわりのこと経験・知識共に乏しいので、詳しい親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。

#1. CXL接続のトポロジー
CXLデバイスとホストCPUとのCXL接続を利用したトポロジーの例を下図に示します。
![Topology.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/8f21c7e5-76cb-3fc9-1654-64f53404cb12.png)
図中の「CXL1.1」で囲っている箇所はCXL1.1でサポート可能なトポロジー、「CXL2.0」で囲っている箇所はCXL2.0でサポート可能なトポロジーを示しています。
CXL2.0の仕様から、Switchが導入され、Switchを介して、ホストCPUとCXLデバイスの接続は、1対多の接続、多対多の接続がサポートされるようになりました。
ホストCPUとCXLデバイスが直接接続されているケースとSwitchを介して接続されているケース、いずれのケースでも、システムのソフトウェア視点で見ると、CXL Type3 Deviceのメモリ空間は、ホストCPUのNUMA Nodeとは、別のNUMA Nodeのメモリ空間として見えるよう扱われています。



#2. CXLのバージョンと接続性
CXLに対応した機器は、ホストCPUとCXLデバイス両者とも下位互換が必須となっています。
CXLでの接続時、Upstream(ホスト側)とDownstream(デバイス側)、それぞれがサポートするバージョンと、接続で使用されるCXLのバージョンの一覧表を以下に示します。

| Upstream Component         | Downstream Component     | Link Training Result |
|:---------------------------|:-------------------------|:---------------------|
| Host CPU - CXL 2.0 capable | Switch - CXL 2.0 capable | CXL 2.0 mode         |
| Host CPU - CXL 1.1 capable | Switch - CXL 2.0 capable | Fail                 |
| Host CPU - CXL 2.0 capable | Device - CXL 2.0 capable | CXL 2.0 mode         |
| Host CPU - CXL 2.0 capable | Device - CXL 1.1 capable | CXL 1.1 mode <br> (Hot-addはFail)         ​|
| Host CPU - CXL 1.1 capable | Device - CXL 2.0 capable | CXL 1.1 mode  <br> (Hot-addはFail) |
| Host CPU - CXL 1.1 capable | Device - CXL 1.1 capable | CXL 1.1 mode  <br> (Hot-addはFail) |
| Switch - CXL 2.0 capable   | Device - CXL 2.0 capable | CXL 2.0 mode         |
| Switch - CXL 2.0 capable   | Device - CXL 1.1 capable | CXL 1.1 mode  <br> (Hot-addはFail) |

Hot-Plug (Hot-AddとHot-Remove)のサポートは、CXL2.0以降となっていますので、ホストCPU側がCXL1.1の場合、デバイスがCXL2.0をサポートしていてもHot-Addには対応できません。
また、Switchの登場もCXL2.0以降となっていますので、ホストCPU側がCXL1.1の場合、Switchを接続しても、CXLでの通信はできません。

#3. Memory Pooling
CXLでは、Memory Poolingを以下のように定義しています。

*メモリリソースを効率的に利用するための、メモリリソースの動的な管理と割り当てを可能にするソフトウェア(OS、Fabric Manager)、ハードウェア(Platforms、Switches、Memory Devices)とプロトコル(CXL)の組み合わせ。*

上記の定義に従うと、CXL2.0からMemory Poolingに対応していることになります。
CXLの仕様書では、MLD (Multi Logical Device)に対応し、デバイスのメモリ空間を動的にホストCPUに割り当てることができるType3のデバイスを、Pooled Deviceと呼んでいます。

MLDとSLDの接続例を下図に示します。
![MLDSLD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/09fb0c45-de4e-d3d7-1a92-1bb3e6d6383c.png)
MLDはメモリ空間を複数のホストCPUに割り当てることが可能なデバイスで、SLDはメモリ空間を1つのホストCPUにのみ割り当てることが可能なデバイスです。
図中のFabric Managerは、ホストCPUとデバイスとの結び付けを管理するための仕組みです。Fabric Managerは、Host CPUで動作するアプリケーションであっても良いし、BMC (Baseboard Management Controller)で動作するアプリケーションであっても構いません。
Fabric Managerの詳細についてもそのうち書いていこうと思います。

---
次回以降もCXLの仕様の詳細について書いていきます。
自身のfx,仮想通貨取引の分析ができるトレードノートアプリを作成しました

# こんな感じで分析できます！
* 資産推移(これは投稿者のみ閲覧化)
[![Image from Gyazo](https://i.gyazo.com/fd6b39337d26c7f5c5bb91084a3cc233.png)](https://gyazo.com/fd6b39337d26c7f5c5bb91084a3cc233)

::: note 
他にも勝率、PF、取引傾向、改善点...etc
:::

# アプリの紹介

## URL

https://trade-note.jp

## できること
1. トレードノートの作成
1. 記事の作成
1. トレードノートを元にした取引分析


# トレードノートの作成について
入力した内容は表にして示しているので見やすくなってます。
![スクリーンショット 2021-12-13 18.57.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/71b53bd0-ec00-848b-86ea-21cd723a15cd.png)


# 記事の作成について
今回ここではsimpleMDEとredcarpetを用いてマークダウン方式を採用しました。ActionTextでの記事作成も考えましたが柔軟性を重視しました。
マークダウン方式の導入によってwebサイト登録ユーザーがアフィリエイトをすることが出来ます。つまり記事の収益化ができるわけです！
デメリットとしてマークダウンがわからない方もいますし。記事の質か悪くなる可能性があります。なので以下のルールと作成方法が書かれた記事を用意しました。

https://trade-note.jp/posts/2
[![Image from Gyazo](https://i.gyazo.com/5c76403410f133e69fc0c4dd17d37751.jpg)](https://gyazo.com/5c76403410f133e69fc0c4dd17d37751)

# トレードノートを元にした取引分析
* 資産推移(これは投稿者のみ閲覧化)
[![Image from Gyazo](https://i.gyazo.com/fd6b39337d26c7f5c5bb91084a3cc233.png)](https://gyazo.com/fd6b39337d26c7f5c5bb91084a3cc233)
* 勝率とプロフィットファクター（ペアごとにみられます）
[![Image from Gyazo](https://i.gyazo.com/2dcea2c36d6b1d6abd26040ac066374a.png)](https://gyazo.com/2dcea2c36d6b1d6abd26040ac066374a)
* 取引傾向と改善点の明確化
[![Image from Gyazo](https://i.gyazo.com/20e34b248747036e16c5070ae2025609.png)](https://gyazo.com/20e34b248747036e16c5070ae2025609)

それぞれ全体と今月分の２種類みることが出来ます。

# お問い合わせに関して

1500通まではお金がかからないそうなのでこんなの導入してみました。

![スクリーンショット 2021-12-13 19.18.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/5629e100-eb08-5253-1d86-a1f884565b10.png)

新規登録していただけるとハンバーガーメニュー内にありますので必要であればぜひぜひ！

# 利用方法

1. 新規登録
2. メールの確認及びメール認証
3. ログイン
4. ハンバーガーメニューから「新規TradeNoteの作成」または「新規記事の作成」
5. 必要情報を入力し投稿する

:::note alert
メール認証が実装されています。認証できないとサービスはご利用いただけません。
:::
[![Image from Gyazo](https://i.gyazo.com/b3f9f9e1c0aaf43cc5e9eab3cc1330c8.png)](https://gyazo.com/b3f9f9e1c0aaf43cc5e9eab3cc1330c8)

# snsに関して
OGP設定が指定あるのでtwitter, facebook, line, slack, qiitaのそれぞれでいい感じになります。
それぞれのページで違うものが指定されているので、

* top (qiita)

https://trade-note.jp

* top (tweet)

[![Image from Gyazo](https://i.gyazo.com/6cfb75b0221c38be1efde2885c56ce62.png)](https://gyazo.com/6cfb75b0221c38be1efde2885c56ce62)

* /posts/2 (qiita)

https://trade-note.jp/posts/2

* /posts/2 (twitter)

![スクリーンショット 2021-12-13 19.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/7d59c560-b479-b7d3-0a7a-de2d5bfaf489.png)

となります。
ので、できれば、できればねぇ、笑
【Vue CLI】ファイル構成 :main.js, vueファイル編

# vueCLIの基本的なディレクトリ構造
```bash
└── test #ルート
    ├── README.md
    ├── babel.config.js #ES5への変換設定ファイル
    ├── node_modules #各種ライブラリ
    ├── package-lock.json
    ├── package.json #npmの設定ファイル => node_bodulesから使用するライブラリ
    ├── public #テンプレート
        ├── favicon.ico 
        └── index.html #main.jsのマウント先
    └── src #開発フォルダ
        ├── App.vue
        ├── assets
        │   └── logo.png
        ├── components
        │   └── HelloWorld.vue
        └── main.js #エントリーポイント 最初に読み込まれる。設定変更はvue.config.jsを作成して変更する。

```

# main.jsの中身

```js
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false //

new Vue({
  render: h => h(App), 
}).$mount('#app')

//render関数:htmlを関数で書ける 
// hは createElementのエイリアス（別名）
```
render関数についてはこの記事が詳しく載っています。[Vue.jsのrender: h => h(App)について調べた](https://qiita.com/teinen_qiita/items/ed1bb1909a17f9ca9daa)

# vueファイル

* vueファイルの頭文字は大文字になる。
    * hell.vue ×
    * Hello.vue ○
* vueファイルはファイルベースのコンポーネント。すなわち単一ファイルコンポーネント

``` vue
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
// import 名前は任意 from ファイルの場所
//アドレスの別の書き方:@/componets/some.vue => @はsrcフォルダの略
import HelloWorld from './components/HelloWorld.vue'

export default { //App.vueファイルをエキスポートしている。
  name: 'App', //コンポーネントの名前
  components: { //importしたコンポネートを登録
    HelloWorld
  }
}
</script>

<style scoped> /*scopedとつけるとcssのスコープがコンポーネント単位になる。*/
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```

# vue.config.js
* vueの設定を変更するファイル。
    * package.jsonと同じ階層に配置する。
* vue設定ファイルは内部的に存在している。
    * `vue inspect > some.js`で設定ファイルを書き出せる。

* 使用例
    * `npm run build`コマンドで本番環境にコンパイルされたdistフォルダを作る。
    * コンパイルされたdist/index.htmlを開くと何も表示されない。
    * `Failed to load resource` というエラーがconsoleで表示されている。
        * cssやjsファイルが読み込まていない。
    * なぜか？
        * head情報を見てみる
            * `<link href="/css/app.fb0c6e1c.css" rel="stylesheet">`
        * cssが（ローカル上の）ルートから読み込まれてる。
        * vue.config.jsでこの設定を変更する。
    * vue.config.js
        * [vue CLIのリファレンス（英語）に設定方法が書いてある。](https://cli.vuejs.org/config/#target-browsers)
        * 変更方法はpublicPathのところに書いている。
            * Defaultに`/`とありデフォルトだと先頭に`/`が入ることになる。
            * vue.config.jsにここを変更する記述をする。

```root/vue.config.js
module.exports = {
    publicPath: ''
  }

```

 * 改めて`npm run build`するとファイルが表示されるようになる。
アラフォー2児の母がAWS Certified Cloud Practitioner(CLF)を取得

# はじめに


みなさんこんにちは。子育てしながらクラウド資格取得！ということで，この度アラフォー2児の母がAWS Certified Cloud Practitioner(CLF)を取得しましたので，マンガ形式でゆるくお伝えします！


# AWSはじめの一歩！AWS Certified Cloud Practitioner(CLF)

![slide01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/28ca7477-d78f-39e5-47d6-5014d30aee2c.png)


![slide02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/25a62f63-ae7c-2f23-9dd0-a8859311ffbc.png)


![slide03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/6ab7b677-4b05-dbf5-23b7-cc57c572b246.png)


![slide04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/01b1538f-fda7-1b40-487e-dc8846caf9d1.png)


![slide05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/cd0c2944-4e47-f678-6134-f48cabb4925d.png)


![slide06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/ba21948a-86b4-43be-21b9-5af982a5b0ec.png)


![slide07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/d0540ed8-2746-e4ea-f4fc-50ff7043af99.png)


![slide08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/05d1bf58-d861-9be3-46dc-db5002f99717.png)



今回ご紹介したAWSOME DAYはこちら。

https://aws.amazon.com/jp/about-aws/events/awsomeday/
wipe-out で HDD の内容を消去しよう！

# はじめに
HDD (SSD も含む) を 廃棄・譲渡 などする際に、「HDD の内容を消去してから廃棄しましょう」などと言われていますが、本記事では FreeBSD を使用して HDD の内容を消去する方法を説明します。
* ここでいう「消去」とは、ファイルをゴミ箱に入れる、del コマンドでファイルを削除するといった操作のことではなく、HDD 上に書き込まれたファイルのデータ領域を上書きするなどの方法でファイルを復活できなくすることです。

# wipe-out の紹介
[wipe-out](http://www.wheel.gr.jp/~dai/software/wipe-out/) というツールがあります。
このソフトウェアは、FreeBSD ベースの HDD 消去ツールです。

CD-R などに焼いて使用する .iso とメモリースティックに書き込んで起動する .usb が提供されているので、使いやすい方をダウンロードして使用してください。

使用手順はいたって簡単で、wipe-out を書き込んだ CD-R やメモリースティックをパソコンに装填し、BIOS などの設定を操作してその CD-R あるいはメモリースティックから起動するだけです。
* UEFI では起動できないかもしれないので、BIOS のセキュアブートを OFF にしたり、CSM を有効にするなどの操作が必要になるかもしれません。

# 起動画面
ここでは、Mac 上の VMware Fusion で wipe-out の安定板の[v1.1](http://www.wheel.gr.jp/~dai/software/wipe-out/index-v11.html#download) を起動した時のスクリーンショットを紹介します。
* wipe-out は、開発版 (v2.1)、そこそこ安定板 (v2.0) なども提供されています。新しい版を使用した場合、以下のスクリーンショットと多少の違いがあるかもしれません。

wipe-out を起動すると、以下のように FreeBSD の boot loader の画面が表示され、
![スクリーンショット 2021-12-13 18.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/128f47a5-9409-3e44-768f-1e509e6ccbe3.png)

FreeBSD の起動の様子が表示された後に、
![スクリーンショット 2021-12-13 18.36.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/28ca17cb-fee8-6a55-f1f0-479f2832189e.png)

「select console mode」と表示されます。
![スクリーンショット 2021-12-13 18.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/eca01821-6a8c-213f-9dd0-3c142a5fc209.png)

ここで何も入力せずに放置しておくと、「処理を続行するには『exit』を入力してください。」と表示されるので、
![スクリーンショット 2021-12-13 18.37.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/1149135a-e441-95af-8f6d-1e5a293ea6a0.png)

「exit + Enter」を入力すると、以下のメニュー画面が表示されます。
![スクリーンショット 2021-12-13 18.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/18a8ede0-dc20-d29b-c1f6-e2abdbd0c85e.png)

上下の矢印キーを使用して実行したい機能を選択し、Enter キーを押下するとその機能が実行されます。
* HDD を消去する操作 (上記の画面の「0を上書きして、このディスクのデータを消す」) を実行する際には、以下のような確認画面が表示され、ここで「Yes」が選択されている状態で Enter を押下すると実際の消去が実行されます。
* 「No」を選択するには、TAB キーを押下します。

![スクリーンショット 2021-12-13 19.00.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/894ffddb-15e7-de6b-44fc-dd358d309e2f.png)

# wipe-out を終了する
メニュー画面で下矢印を押して「シャットダウンする」を選択して Enter キーを押下します。
![スクリーンショット 2021-12-13 19.11.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/124b762b-0885-3ea1-d768-a9c1fdf46e63.png)
シャットダウン処理が開始され、電源 が OFF されます。

# 注意事項
wipe-out を使用して HDD の消去を実行すると、HDD 復旧ソフトウェアなどを使用してデーターを復旧することができなくなるので、消去を実行する際にはくれぐれも重要は HDD を消去してしまわないように注意してください。
* 実際に消去する HDD のみを接続し、重要な HDD は外しておくなどしておくとより安全かもしれません。
[iOS]カスタムUIView研究

こちら https://qiita.com/maebaru/items/90f915f82e3d6425cbdc のやり方だが、カスタムビューを他のstoryboardから生成するとエラーになる。

init coder -> loadNib -> CustomView.xibを見に行く -> CustomView.xib上のViewがCustomViewクラスに設定されている -> init coder...という無限ループになってしまう。

CustomView.xibで、カスタムクラスとして設定するのをやめると上手く行くようだった。
https://tellusium.hatenablog.com/entry/2018/09/30/183523

files ownerとはxibをロードするクラスで、ibOutletなどを設定するクラスのことを意味する。通常ViewControllerはこれに当たる。UIViewでも、xib上のibOutletを受け取りたい時は、そのクラスをfiles ownerに設定すべきと考えられる。
https://stackoverflow.com/questions/15251370/what-is-the-files-owner-in-interface-builder

ただfiles ownerとして設定した場合はViewとしてクラスに紐付いていないため、そのカスタムViewのnibファイルをインスタンス化しても、init?(coder aDecoder: NSCoder)とawakeFromNibが呼ばれないようである。nibインスタンスから取得できるのはただのUIViewである。カスタムViewクラスのイニシャライザ内で、このUIViewを取り出し、自分にaddsubviewしていくことになる。

一方、カスタムクラスとして設定してもibOutletは受け取れる。
https://qiita.com/marty-suzuki/items/7c7ecdcb1f16c21b0051#2-xibのfiles-ownerをクラスに紐付ける

カスタムクラスとしてCustomViewクラスを設定した場合、CustomView.xibを指すnibインスタンスを生成し、そこからCustomViewクラスのインスタンスを直接取り出して使うことができる。

nibが初期化された段階でそのクラスのinit from coderとawakeFromNib関数がよばれるので、そこで何か必要なUIのセットアップなどをすることができる。ただ、何か必要な値を外からinitializerへ渡すことはできないので、初期化が終わった後に注入していくしかないと思われる。

### 注意

カスタムクラス・Files Ownerとして何かのクラスを設定する場合、`Module`の欄が空だとうまく特定できない場合があるため、inherit Module From Targetにチェックを入れるなどしよう。

なおCustomViewクラスをprivateにしていると、xibから該当のクラスを見つけられず、上手く呼ばれないケースがあったため注意しよう。
API Manager カスタムAPIを使ってみる

#API Managerとは
API ManagerはCloud Application Integration (CAI)で作成したプロセスを管理対象APIとして登録して公開・管理することができます。また、管理対象APIの利用ポリシーやセキュリティの設定、利用状況を監視する機能もあります。
######APIの管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/4e60fd61-9c22-96e1-6d33-1ebdf1ee00f0.png)
######APIの監視
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/3016117a-c899-1b0f-9dc7-b366d105297f.png)
ここでは、CAIで作成したプロセス以外のAPIをカスタムAPIとして管理する方法を紹介致します。

#カスタムAPIを作成してみる
本記事では、政府統計の総合窓口であるe-Statにて提供されているオープンデータを取得するREST APIをカスタムAPIとして登録します。
######1. e-StatからAPI経由でデータを取得するためのURLを取得
ここでは、令和2年の国勢調査のデータをcsv形式で取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/7f78cdd8-ad66-f13e-8504-d18c71145e21.png)
*e-StatからAPIを使用してデータを取得する方法の詳細については、下記URLをご参照ください。
https://www.e-stat.go.jp/api/api-dev/how_to_use
######2. API ManagerでカスタムAPIを作成
(2-1) API ManagerのAPIレジストリ画面の[カスタムAPIの作成]ボタンから作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/a337704d-8a21-2569-818a-ca51c109382e.png)
(2-2) [名前]を「custome_api_estat」として[API URL]に1.で取得したURLを入力し、[保存]ボタンで保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/121aa61d-0cd5-e881-1189-f45bd48dd703.png)
######3. API Managerから作成したカスタムAPIを確認しURLを取得
API ManagerのAPIレジストリ画面から2.で作成した 「custom_api_estat」 APIを確認し、[URLのコピー]からURLを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/d9edf525-fe6b-0e1d-b787-f37eaa741b40.png)

######4. 取得したURLからデータをcsvで取得
API Managerで管理するAPIはAPI Gatewayのサーバで実行されるようになるので、設定したポリシーに従ってAPIが実行できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294379/032968e0-2edb-a70a-635c-5eb788689330.png)
#まとめ
カスタムAPIで取得したオープンデータをCAIで作成した加工・集計するプロセスと連携することで、ワンストップで一連の処理を実行することができます。また、定期的に更新されるオープンデータの取得・加工・集計処理を自動化設定をすることで、最新データを利用できるようになります。

##注意事項
2021年12月時点ではカスタムAPIはテスト目的でのみ使用でき、本番環境では使用できません。
アラフォー2児の母がMicrosoft Azure Data Fundamentals(DP-900)をサクッと取得

# はじめに


みなさんこんにちは。子育てしながらクラウド資格取得！ということで，この度アラフォー2児の母がDP-900 : Microsoft Azure Data Fundamentalsを取得しましたので，マンガ形式でゆるくお伝えします！



# サクッととれる！DP-900


![slide01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/596d12ba-dc8b-a613-db57-38e9cc6db156.png)


![slide02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/9729072e-fe3c-8931-110f-1e6ed539b9f4.png)


![slide03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/bb80604e-2c71-eadd-60b4-36b36a22bc1a.png)


![slide04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/b3861837-d883-d2f7-0cf3-765cf0389acf.png)


![slide05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/30fcaccc-98b3-5e08-a049-79e39fc56610.png)


![slide05-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/31701d25-6b51-b79d-ad30-2c2d9d1c3936.png)


![slide07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358174/855232cf-333d-604a-4fe2-6cacb4241bd4.png)



# 終わりに


テストは15分ぐらいでサクッと終わりました！子育てしながらでもちょっとした空き時間を使うだけで1週間ぐらいで取得できました。みなさんもDP-900を目指してみてはいかがでしょうか。


今回ご紹介した教材「DP-900:Microsoft Azure Data Fundamentals試験対策」については次のURLをご参照ください。


https://info.microsoft.com/JA-AzureSQL-WBNR-FY21-04Apr-14-MKTOFY21DP900PrepSessionOn-demandWebinar-SRDEM71243_LP02OnDemandRegistration-ForminBody.html
平面的なUIを作りたい

この記事は[スライドバー的なUIを作りたい](https://qiita.com/sakkinonana/items/f0892a67e9990975f535)の続編のようなそうでもないようなUIの記事です

# 平面のUIを作りたい
VRではUIを使いたいときに、あまりそういうコンポーネントが用意されているわけでもないので、各人作らないとなりません。特にバーチャルキャストはすべて自分で作らなくてはいけません。
いちいちUIで時間を消費するのもあまり良くないと思いますので、ここで共有したいと思います。

作るのは↓みたいな感じです。

https://twitter.com/sakkinonana/status/1470400325266059266
#モデル
今回はモデリングが必要でした。今回は原点位置の設定が重要です。スタイラスペン代わりになるモデルの先っちょに原点を設定しましょう

unityのヒエラルキー（階層構造）は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/080a84c4-458d-9bba-9435-eacadcf74efa.png)

selection_coneが実際に持つアイテム、Sphereが操作に連動して動くインジケーター（最悪なくてもよい）、cubeが板で、ホワイトボードみたいな役割をします。

前回同様バーチャルキャストではある経路に沿ってだけ動く、みたいな拘束はかけられないため、掴みたいスタイラスと、実際に値をとるものとを別にします。その上で板上のインジケーターの座標を計算してスクリプトで移動させるという形式を取ります。

#スクリプト
以下スクリプトを貼り付けておきます。前回の流用なので、例によって別オブジェクトの色を位置に応じて変えています。

```lua:main.lua
local stylus = vci.assets.GetTransform("selection_cone")
local indicator = vci.assets.GetTransform("Sphere")
local plane = vci.assets.GetTransform("Cube")

function update()
    local pos = Quaternion.Inverse(plane.GetLocalRotation())*Vector3.ProjectOnPlane(stylus.GetLocalPosition()-plane.GetLocalPosition(), plane.GetLocalRotation()* Vector3.up)*2
    indicator.SetLocalPosition(pos)
    print(pos)
    vci.assets.material._ALL_SetColorFromIndex(0,Color.HSVToRGB(pos.x+0.5,pos.y+0.5,pos.z+0.5))

end
```

骨子は前作のスライドバーと同じですが、今度は取れる情報は二次元情報です。
なのでポイントは

```lua
    local pos = Quaternion.Inverse(plane.GetLocalRotation())*Vector3.ProjectOnPlane(stylus.GetLocalPosition()-plane.GetLocalPosition(), plane.GetLocalRotation()* Vector3.up)*2
```

ここですね。今回は指示点を求めるのに、

1. 板のある平面に、持っているslection_cone(stylus)の位置を投影する
1. 板は自由に動くので、回転角分の補正を行う。
1. 投影された位置を求める。

ということをやっています。ProjectOnPlaneはこういうことにも使えるので、結構便利に使っています。


#おわりに
実際UIを一から作るのは以外に大変ですから、VCI製作者としては他にも使いたいUIはたくさんあると思うので、ぜひ皆さんも作ったら共有していってください。いちいちUIに消耗してるのはもったいないからね。


読んでいただきありがとうございました。
良い品質管理は思いやりのカタマリだ

#　はじめに
QA（品質管理）を仕事にしているみなさんは品質管理って難しいと思っていますか？
またどのようなマインドでこの仕事に向き合っていますか？

私の記事は、各方面の人それぞれに対して思いやる気持ちを持つことで、
最強の品質管理ができる！と言うことを記載して行きます。

#　この記事を書こうとしたきっかけ
まず私の経歴について紹介します。
前々職は別のテスト会社でデベロッパーとの窓口業務含めたリーダーを経験し、
前職では小売店の店長としてマネジメント業務を経験してきました。

その中でQAの仕事をしている人たちがどういったマインドで仕事を行っているのか考えた時、
関係各所に忖度するばかりだったり、ただただ自分の仕事を全うするだけという、
自分本位の考え方で進めてしまっている人が多いのではないかと感じました。

その思いやりが足りない結果が、QAは難しいと感じたり、
意思疎通がうまく行かなかったりにつながるのだと思います。

かくいう自分も状況によってはこのマインドに陥る時もあるので、
そうならないように、常に思いやりを持って考えるように心がけています。

#　どのように考えればいいのか
それぞれの立場の人に対して喜んでもらえそうなテーマを掲げれば、
自然と方針や考え方が決まってきます。

主にスマホゲームを想定した内容例を以下に記載します。
※タイトルによって変わってきます。

■プレイユーザーに対して
・ストレスなく快適にプレイすることができるか
・初心者に優しい作りになっているか

■デベロッパーやQA関係者に対して
・開発スケジュール通りに進めることができるか
・情報共有がしやすい体制になっているか

■パブリッシャーに対して
・売上の上がるタイトルになっているか
・パブリッシャーの色が出せているか

■作品に対して
・原作に忠実か（原作ありの場合）
・世界観に違和感がないか（原作なしの場合）
・キャラクターの魅力が伝わるか

どうでしょうか？
いいとこ取りなことばかり書いてるなーと思うでしょうが、
最初からいいとこ取りを目指さないでどうする！という感じですよね。

あとはこれを限られた工数の中でどれだけバランスよく大きな円にできるかが、
品質管理の仕事ということになるわけです。

#　まとめ
思いやりは気を遣うこととは違います。
どれか一つに気を遣って円がいびつになってしまっては、良い品質にはなりません。

よく品質管理の中の一つとして、原作に対する作品愛が必要だと言いますが、
その愛をすべての方向に向けることで、良い品質を目指すことはできるのです。
これを念頭において、みなさんも良い品質の商品を作れるように、
一緒にがんばりましょう！
伝送=食事!? 伝送技術を食事に置き換えて考えてみた

1. はじめに 
2. Baud rate  
3. Modulation  
4. bps 
5. (発展) 光伝送-WDM 
6. おわりに 

この記事はシスコの同志による Cisco Systems Japan Advent Calendar 2021 の一部として投稿しています

2021年版(1枚目): https://qiita.com/advent-calendar/2021/cisco
2021年版(2枚目): https://qiita.com/advent-calendar/2021/cisco2

以下、昨年までのものです
2017年版: https://qiita.com/advent-calendar/2017/cisco
2018年版: https://qiita.com/advent-calendar/2018/cisco
2019年版: https://qiita.com/advent-calendar/2019/cisco
2020年版: https://qiita.com/advent-calendar/2020/cisco
2020年版(2枚目): https://qiita.com/advent-calendar/2020/cisco2

##はじめに
私は今年の3月まではネットワーク未経験のソフトウェアエンジニアでした。
4月にシスコへ入社しましたが、始めは伝送技術について全く理解できませんでした。
しかしそこで理解の助けになった、伝送技術を食事に置き換える考え方を共有させていただきます。
本記事は情報通信分野の初心者で中々直感的なイメージができずに困っている方々を対象としています。

##Baud rate
Baud rate は、伝送分野における一般的なパラメータで、1秒間あたり何回変調できるかを表す数です。
急に変調と言われても何が何だか分かりません。食事に置き換えて考えましょう。
Baud rate とは、以下の図のように1秒間に口に運ばれる数なのです。
1秒間に3口分運ばれるならば、3 Baud となります。
図に記載されている「信号」がイメージできないならば、グミ1粒と考えましょう。
「この機器のbaud rate は 3 baudである」と言われたら、「この機器は1秒間あたり3回の変調に対応している」=「この機器は1秒間あたり3個のグミを作り出すor食べることができる」と考えることができます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272631/f1cf5530-01bb-0b78-c686-f514296823ab.png)

##Modulation
Modulation も伝送分野における一般的なパラメータで、変調方式を表します。
前章と同様にグミで考えると、Modulationはグミの種類の増やし方を表します。
以下の図のように、甘さと歯ざわりについてそれぞれ2種類のグミを作り出すことができるのであれば、計4種類の情報を定義することができます。
1信号あたり4種類の情報、すなわち2ビットの情報を伝送することができるため、2 bits/symbol となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272631/d5788449-f23e-6e49-4973-23f0e6a1affb.png)
実際には信号波の振幅や位相にバリエーションを与えますが、振幅や位相がイメージにできないのであれば、味の大小や歯ざわりを変えているとイメージしましょう！

##bps 
bps とはbits per second の略で、その名の通り1秒間あたりに伝送できるビット数です。
これまでの例えを踏まえると bps は以下に分解され両者の積であることが直感的に分かるのではないでしょうか。
　　　　bps = bits/s = bits/口 × 口/s = bits/symbol × baud
例えば、4種類の情報が割り当てられた信号が1秒間に3回伝送される場合、2 bits/symbol × 3 baud = 6 bps となります。

##(発展) 光伝送 - WDM
ここまでは一般的な伝送パラメータについて紹介してきました。
最後に、近年ルータとの融合で注目が集まっている光伝送のWDM技術についても食事に置き換えて考えてみたいと思います。
	  
光伝送では1本の光ファイバで大容量の信号を伝送するために、以下の図のように波長の異なる複数の光信号を伝送するWDM（Wavelength Division Multiplexing ）技術が用いられます。
合波器によって各波長の光が1本の光ファイバにまとめられ、分波器によって各波長の光に分解されます。
1本の光ファイバで1種類の波長の光を伝送することと比較して、光ファイバのコストを抑えてより多くの信号を伝送することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272631/34ef6663-8197-08fa-0617-4cf0f6dc6d7b.png)


Modulation の例では、味の大小や歯ざわりが変わるグミを例として紹介しました。
WDMは、以下の図のように複数の味のグミを同時に運ぶことができると考えることができます。
Modulation の例と比較して、1度に伝送できる情報量が２倍に増加したことがわかります。
このように、複数の波長の光によって光ファイバ1本あたりの通信量を増加させる技術がWDMです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272631/979547eb-900b-474a-4aad-8627b3f6a2cb.png)


##おわりに
本記事では伝送分野の初心者向けに直感的なイメージの助けとなるよう伝送技術を食事に置き換えた考え方を紹介しました。
伝送分野に対する直感的な理解の助けになっていれば幸いです。
ここでは紹介しなかったパラメータや技術についても、一度食事に置き換えて考えてみると直感的に理解できるかもしれません！
もうすぐ2022年になるのに今からVimを学ぶべきか？

[PONOS Advent Calendar 2021](https://qiita.com/advent-calendar/2021/ponos)の14日目の記事です。

昨日は @iixd_pog さんでした。
  → [Unityのツールバーに特定シーン再生ボタンを追加する方法](https://qiita.com/iixd_pog/items/f9536aefb2f5c00c3913)

## はじめに

こんにちは。@honeniqです。
ポノスでは情報システム担当とインフラエンジニアを兼任しています。

寒くなってきましたね☃
自転車に乗っていても、寒さで頭が冴えて色々なことを考えてしまいます。
何のスイッチが入ったのか、Vimのことを考える機会があったので、記事にしてみました。

10年以上昔、自分がインフラエンジニアをやり始めた頃は「まずVim(vi)を使えるようになれ」と言われたものですが、同じことが現代でも言えるでしょうか？🤔

### Vimとは？

> Vimはオランダ人のプログラマーBram MoolenaarによってAmiga向けに開発された。のちにWindowsを含むさまざまな環境に移植され、特にUnix系オペレーティングシステム (OS) ではEmacsと並んで広く使用されているテキストエディタとなっている。 [Wikipedia](https://ja.wikipedia.org/wiki/Vim)

Vimは主にCLI上で利用される高機能なエディタです。
使いこなせば強力なものの、一般的なエディタとは操作体系が全く異なるため、最初は取っ付きにくさがあります。


### 自分とVimの関わり方

私の場合、2021年12月現在のVimとの関わり方はこんな感じです。

* PC(Mac)
  * メインエディタはVSCode + [vscodevim](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)
  * ターミナルで作業していて何か編集したいときはVim
  * VSCodeの起動を待っていられないときもVim
* 管理しているサーバーで作業するときに素のVimを使う
  * 重い作業だとVSCodeのRemote Developmentを使うことも
* Dockerコンテナの中で何かするときに素のVim/viを使う

Vim歴だいたい10年くらい。
常にVimを使っているわけではないけど、Vimキーバインドじゃないと生きられない体ではあります。


## もうすぐ2022年になるのに今からVimを学ぶべきか？

本題です。

10年前ならいざ知らず、高機能なエディタやIDEが選び放題なこのご時世に、Vimを学ぶ必要はあるのでしょうか？


### あります！

オンプレ・クラウド問わず、サーバーを操作する機会のある人は学んでおいたほうが良いでしょう。
（そうじゃない人は別にいいかも）

理由は1つ。 **いざというときに備えて** です。

* 急遽httpdの設定を変えないといけない
* 稼働中のサーバーに入って大量のログを漁らないといけない
* コンテナの設定をちょっとだけ変えて問題を切り分けたい
* etc...

サーバーを担当する人って、**いざというとき**は大抵CLIしか使えないし、何かをインストールする権限もないことが多いです。
それでも仕事は待ってくれないので、**その場にあるVimを使えるようになりましょう**。（だいたい最初から入っています。）


## Vimのはじめ方

ここまで読んで「そうかもしれない」と思った方は始めてみて下さい。
MacやLinuxの人はすぐに始められます。
Windowsの人は・・・  WSLを入れるか、GVimを使うのがいいんじゃないでしょうか。

### まずはvimtutor

ド定番の``vimtutor``がオススメです。

ターミナルから``vimtutor``コマンドを実行しましょう。
Vim上でチュートリアルのドキュメントが開きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/83866e05-5a84-d87b-4f9d-210b88676809.png)

手元のMacで実行するとこんな感じでした。

あとは、チュートリアルに書かれている通りに練習していけばOKです👍
丁寧に全項目をこなして1時間くらい、必要なさそうな項目を流し読みすれば30分くらいで終わります。
意外と短くないですか？

一度に全部は覚えられないと思いますが、重要な操作はチュートリアル中でも多用させられます。
とりあえず必要な編集ができるくらいには習得できるでしょう。

### 次のステップ

ここからは、自分のPCや開発環境のサーバーで、恐る恐る使ってみましょう。
いつものエディタでやっている作業を、ちょっとだけVimでやってみるのが良いです。

小規模な編集から少しずつやっていくのが、挫けない秘訣です。


### 最初はやらなくてもいいこと

#### 全部覚えようとしない

Vimはとても奥が深く、一度に全部覚えようとしても挫折してしまいます。
というか、私も含めてほとんどの人は、何となく覚えた範囲で何となく使いこなしていると思います。

手前味噌ですが、以前こんな記事を書きました↓
[Vimをメモ帳程度に使うために覚えておくべきコマンド](https://qiita.com/honeniq/items/201156650310c4968c3a)
2014年に書いた記事ですが、今でもたまにLGTM/ストックして頂いています。

それくらいの理解度で使っても全然いいんだよ　ってことで。


#### カスタマイズしない

Vimの世界には豊富なプラグインと活発なエコシステムがあり、カスタマイズの可能性は無限大です。
しかし、いわゆる **沼** へと一直線に向かう道でもあります。

気を抜くと
*「開発の進捗はないのに.vimrcの行だけ増えた」*
*「年末年始は.vimrcの整理をして過ごす」*
のような人になってしまうので注意しましょう。

というわけで、最初はカスタマイズせず、素のVimを使ってみてください。
使い方に慣れてVimのことが好きになってきたら、沼に一歩踏み出しましょう。（楽しいよ！✨）


## まとめ

* Vimはいざというときに役立つ
* vimtutorをやっておけばOK
* 最初から全部覚えなくていいし、カスタマイズしなくていい
    * でも、好きになったら沼に突っ込もう 💨


------

明日は @714ho さんです！
たまに50〜100LGTMくらいのQiita記事を書く僕が、技術記事書くとき意識してること

アドカレの時期なので書き出してみました。
自戒を込めての備忘録なので、語気が前のめりになっちゃってる部分はご容赦いただけると幸いですm(_ _)m

# もくじ
* ドキュメントを書くつもりでまとめる
* 最初に「この記事で実現できること」を見せる
* 個人の感想やジョークを入れない
* 極端に固い文章にしない
* メイン話題の解説に「こちらを参照」をできれば入れない
* 文章だけで画面が埋め尽くされないよう気を付ける

# ドキュメントを書くつもりでまとめる
* この記事で実現できること
* 手順概要
* 手順１、２、３...
* 結果
* まとめ・課題・今後の抱負

という構成以外になることはほとんどないはず。

# 最初に「この記事で実現できること」を見せる
この記事を読むとこういうことができるようになる・これが解決する・・・ということがわからないと、読む時間を割きたくない。
**技術記事を読みに来る人は大抵何かに困ってて、Google検索に引っかかった大量の情報から潜ってきてる＝ストレス溜まってる**
なので、記事リンク踏んでからそこそこ読み進めないと目的の情報が得られるかわからない状態だと、キレちゃう。

「記事で実現できること」をスクショやGIFで見せられるならそれを冒頭に載せる。
なければ「○○○をできるようにしてみました」「○○○という問題を×××で解決しました」を簡潔に書く。

「はじめに」みたいな単元作って２〜３行に収められると良さげ。

「なぜこの問題に向き合ったのか」などの経緯や、「この技術はどれほど素晴らしいか」みたいなアピールもとりあえず冒頭にはほぼ必要ないです。それらはまとめに全部寄せてとか、手順説明でどうしても必要ならそのタイミングで最低限の文量で入れましょう。

# 個人の感想やジョークを入れない
**知りたいのは技術情報であって、記事を書いてるあなたではありません。**
前述のとおり記事リンク踏んだ時点で結構ストレス抱えてるので、無駄話は控えて必要なことだけ描くのが好ましいです。
自分の色を出したければTwitterなりブログなりに書きましょう！

# 極端に固い文章にしない
一方で無闇に正しい日本語にこだわったりすると、それはそれでやはり読むのに時間がかかってストレスになりそうです。
**そこそこ仲が良い先輩に説明するくらいのテンションがちょうどいいかなと思います。**

また、誤解を減らすために補足を入れたり例外ケースについて説明したりしたくなることも多いと思いますが、それも読む時間を増やしてしまう原因になるので、「まとめ」に入れるか、まとめの後に「補足」みたいな節を作ってそこに寄せるといいと思います。

# メイン話題の解説に「こちらを参照」をできれば入れない
何かに困ってて、Google検索でやっとたどり着いた（であろう）記事を頼って読んでるのに、そこからさらに別記事に派生して読まないと理解できない・・・ってなると割と挫けます。
とはいえ何かの情報を参照しないことは少ないと思うので、参照先は載せつつ、その記事の理解に必要最低限の情報は記事内で簡単に説明するのが誠実かなと思います。

# 文章だけで画面が埋め尽くされないよう気を付ける
文章だけで画面がバーーーーッと埋まってるとやっぱり読む気失せます。
画像・コードブロック・テーブルなどを程よく入れて、ぱっと見の印象にメリハリつけるようにすると、同じ文量でも挫けずに読み進められるように思います。（ラノベの挿絵みたいな感覚かもしれない）

# さいごに（宣伝）
こんな記事を書いてます。
ここに書いてることが完璧に実践できてる自信はないですが、もし面白そうだなと思ったら読んでもらえると嬉しいです！

https://twitter.com/flankids/status/1429436004197277697

https://twitter.com/flankids/status/1397589474129825797

https://twitter.com/flankids/status/1402648722186543106

https://twitter.com/flankids/status/1466585390589308932
! Unable to load application: Zeitwerk::NameError: expected file /var/www/~ to define constant Users::SessionsController, but didn'tの解決方法

##背景
pumaを起動させると

```
! Unable to load application: Zeitwerk::NameError: expected file /var/www/~ to define constant Users::SessionsController, but didn't
```
のようなエラーが発生しました。

##解決方法
エラーの翻訳としては「アプリケーションが読み込めません: Zeitwerk::名前エラー:　SessionControlerのUser定数を定義するための予期されたファイル/var/www/~ ,しかし読み込めなかった。」

Zeitwerkというのは調べてみるとrails6から導入された自動でファイルを読み込んでくれものです。それがうまく動作していなくてアプリケーションを読み込めませんということです。

(参考)
https://zenn.dev/murakamiiii/articles/893d83626c9f15


解決の仕方を調べてみると、stack overflowで以下の記事が見つかり、これを参考に

```
config.autoloader = :classic
```
をconfig/application.rbに記述し、

```
bundle exec pumactl start
```
を出力すると無事、pumaを起動することができました。

(参考2)
https://stackoverflow.com/questions/57277351/rails-6-zeitwerknameerror-doesnt-load-class-from-module
Xfce4/Gnome3 でLibreOffice の日本語入力が出来ない場合

#LibreOffice で日本語入力できない
　私は ThinkPad T530/X250 とかに FreeBSD を入れてデスクトップ用途で使っています。
　デスクトップ環境としては Xfce4を使っています。Xfce4が私の環境で一時期不安定だったので Gnome3 を使って時期もありましたが、いまはまたXfce4 を使っています。
　デスクトップで業務で使用するとなると、Office ファイルを開かざるを得ないケースが多いので libreoffice を使うことが多いのですが、pkg で入れた libreoffice だと日本語入力がうまくいかない問題に悩まされました。
　日本語入力は ibus+mozcやFcitx+anthyなどを使っているのですが、どちらでも同じです。他のアプリケーションでは普通に日本語入力は出来ているので、libreoffice および依存ライブラリがおかしいようです。

#portsで「GTK3」 のオプションを有効にして libreoffice をビルド
　結論から言うとportsで make config して、「GTK3」をチェックしてからビルドしなおすと日本語入力が出来るようになりました。

```
# cd /usr/ports/editors/libreoffice
# make config
(GTK3をチェック)
# make install
```
以下が make config で出てくるメニューです。ここで　GTK3 をチェックしてください。
![Screenshot_2021-12-13_18-59-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103137/871b8ad9-ef1d-f3b1-19d5-5a7f178456e5.png)

　pkg は ports のデフォルトオプションでビルドしたバイナリ何ですが、デフォルトだと GTK3はチェックされてないんですね。
　libreoffice のビルドは何時間もかかるのでなるべく pkg で済ませたいのですが、現状で Xfce4などの GTK系のデスクトップ環境でlibreoffice を使用したいとなるとやらなくてはいけないようです。
　QT5のオプションはデフォルトでチェックされているので KDE環境だとすんなり入力できるかもしれませんが試していません。
　すぐに改善されるかもしれませんが、現状のバッドノウハウです。
apacheでテストページの表示に失敗した際に試してみてほしいこと


#はじめに

テストページにアクセスしようとしたらこんなのが表示された人は試してみてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/382ffca5-d414-3c32-26d3-bfb495216868.png)

#修正点

こうなっているひとはエラーになる可能性があります

```txt:/etc/httpd/conf.d/welcome.conf

<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>
```

このように追加してみてください

```txt:/etc/httpd/conf.d/welcome.conf

<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>

<Directory /usr/share/httpd/noindex>
    AllowOverride None
    Require all granted
</Directory>

Alias /.noindex.html /usr/share/httpd/noindex/index.html
```
#考察

テストページが表示されない理由として以下を疑いました。
・ .htaccessの影響をテストページのファイルも受けているかもしれない
→そちらを無効にする設定を追加
・参照先ファイルのパスが違う
→Aliasで定義しました。

http://piyopiyocs.blog115.fc2.com/blog-entry-753.html
Blenderチャレンジ：平面の丸い穴

3DCGソフトウェアのBlenderを使って、お題のモデルを作成してみましょう。
やり方は一通りではないと思います。あなたは、どんな方法を考えますか？

## 問題

「メッシュ」の「平面」を追加してください。追加した平面に下記のように丸い穴を開けてください。

![スクリーンショット 2021-12-14 7.30.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/94c0de6d-503c-13af-5154-7fbfdb0f773f.jpeg)

[完成物をSketchfabで見る](https://skfb.ly/orXx8)

…
…
…

OK？

---

## 解答例

作成する手順です。macOSのキーを書いています。Windowsの場合は、`Option`を`Alt`に読み替えてください。

- 「平面」を選んで編集モードに入ります。
- `Shift + E`、`1`、`[Enter]`（辺のクリースを1に設定）。
- 2回「細分化」してください。
- 中央の`2 x 2`の四角の外側の8点を選択してください。
- `Shift + E`、`1`、`[Enter]`。
- 中央の点を追加で選び、9点を選択してください。
- `Option + Shift + S`、`1`、`[Enter]`（球状に変形）。
- `E-.5`、`[Enter]`（押し出し）。
- オブジェクトモードに戻り、サブディビジョンサーフェスモディファイアーを追加し、「ビューポートのレベル数」を2にしてください。

以上
技術選定を疎かにしたツケを払ったお話し

この記事は，フラー株式会社 Advent Calendar 2021 の 12 日目の記事です。

11日目の記事は @shogo82148 さんによる [AWS ClockBound で遊んでみた](https://shogo82148.github.io/blog/2021/12/11/aws-cloud-bound/) でした。

フラーに来てAndroidエンジニアとして活動を始めてから3年、マネージャーになってからも会社でも個人でもちょこちょこ開発に携わっているのですが、今回は個人アプリの開発をするときに技術選定を疎かにして、その結果どんなツケが回ってきたかのお話でもしようと思います。

##技術選定の経緯

もう2年も前のことになりますが、SUZURIさんのAPIを使ってアプリの開発をしていました。
https://qiita.com/seto_inugami/items/952a41e63c403b7e8fb2

そのときにアプリではよく見る`ViewPager + PageIndicator`のレイアウトを組みたくなってPageIndicatorのライブラリを導入することを検討しました。
いくつかライブラリの候補はあったものの、最終的には使ったことのあった以下のライブラリを選定しました。
https://github.com/romandanylyk/PageIndicatorView

選定理由としては
・Star数が多い
・利用経験がある
・リリースから時間が経っていて安定していそう
など、一般的な理由ですね。

見てもらうとわかるのですが、ライブラリの最終更新が2018年ですね…！
もちろん導入時に大丈夫か…？と一瞬頭をよぎりましたが、この時点でライブラリ選定で痛い目を見たことのなかった私は、「まぁ大丈夫だろ」とあまり深く考えず導入してしまったのです。

## 作ったSUZURIアプリの特性

ツケを払うことになった話の前に、作ったアプリの特性だけ簡単にお話ししておきます。
作ったアプリではSUZURIさんのAPIを使って、SUZURIに掲載されている商品をリストで表示しています。
商品にはそれぞれカテゴリがあり、SUZURIさんの公式ページではカテゴリの上位概念として大カテゴリのようなものを用意しています。
(T-シャツはファッション、サコッシュはバッグといった分類のイメージ)

アプリでもこの形に準拠しているのですが、カテゴリと大カテゴリの繋がりを取得するAPIはないためローカルで無理やり紐づけており、カテゴリが追加されるたびにアプリをアップデートして紐付け直さないと、新しいカテゴリは正常に検索に引っ掛からなくなってしまいます。

こんな感じ

```kotlin:category.kt
enum class ItemCategoryRelation constructor(
    val id: Int,
    val text: Int
) {
    T_SHIRT(1, "T-シャツ"),
    RINGER_T_SHIRT(2, "T-シャツ")
    SMARTPHONE_CASE(3, "スマホケース"),
    CLEAR_SMARTPHONE_CASE(4, "スマホケース");

    companion object {
        fun getById(code: Int?): Int {
            for (p in values()) {
                if (p.id == code) return p.text
            }
            return "その他"
        }

        fun getByText(text: Int): Int {
            for (p in values()) {
                if (p.text == text) return p.id
            }
            return 1
        }
    }
}
```

未だ使ってくれている方もいるので、アップデートしないわけにもいかず…と思って時たま気が向いたときにアップデートしています。


##審判の時

その時は突然に訪れました。はい、今年のビッグイベントだったJcenter閉鎖ですね。
`PageIndicatorView`ももれなくJcenterに乗っていたわけですが、もちろんすっとMavenCentralに移行はされませんでした。
しかも`PageIndicatorView`を使っている箇所は数箇所あり、忙しくてメンテに時間をかける余裕も全然なかったのでライブラリの切り替えはできそうもなく…

そもそもJCenter閉鎖自体かなり大きなことではありますが、こんな根幹から揺らぐことがあるのかと衝撃をうけました。
ライブラリに依存していると口では言いつつ、本当に依存しているということを思い知ったのはこのタイミングだったと思います。
「結局依存しててもなんとかなるだろ」みたいな考えが正直あって、実際時間さえあれば何とかはなるんですがかかる労力の大きさを叩きつけられた感じです。

##現在

更新はしておきたかったので、一旦そのタイミングでは[こちらの対応](https://github.com/romandanylyk/PageIndicatorView/issues/141)を実施してフェッチして逃れていますが、記事を書いている現在もそのままになっていて、心の片隅にモヤモヤが残っています。
理想は別のちゃんと更新されているライブラリへの乗り換えですが、なかなかコスト的にもそういうわけにもいかずずっと苦しいお気持ちです。
ちゃんと最初でライブラリの選定をしておけばこんなことには…とずっと考えているので、開発時の最初の技術選定はちゃんとやりましょう…やります…
ナイトライフにちなむ布地をプレゼントします


<h2>🎁メリークリスマスまであと少しですね！🎁</h2>

![Spangle_orbolt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/847445/5448b85d-1c29-c14b-c11b-5bd34148d85a.png)

白雪に照らされた極夜が美麗な季節に似合いそうなパーティドレスに使える布地が作れたので
HDAとして配布します。

<a href="https://app.box.com/s/8u3wa8esiictqe1sud42kzb0xsgiybws">こちらになります</a>


キャラクターが着飾る布地だけでなく　画面の密度を濃くしたり
Vellumソルバを扱う際の指針に使えるのではないでしょうか？
![Spangle_orbolt_Thmn01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/847445/a1a8fa49-9bd9-5619-55c9-8f8863f77dfd.png)
![Spangle_orbolt_Thmn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/847445/a3d9f73a-388d-05ea-f330-cfe5385f231c.png)
ではでは！
XDとPhotoshopのアセット連携

はじめまして。
オークファンでWebデザイナーとして働いています
@af_takeと申します。

アドベントカレンダー14日目ということで今年も残すとこわずか。
時間の流れるスピードに戦慄を覚えますが、、気を取直していってみましょう。

日々デザインツールで使用しているPhotoshopとXD。
自分はUIデザインはXD、その他のバナーやLPはPhotoshopと完全に使い分けていますが、
それぞれの良い点を利用しつつ、お互いを連携させて制作が進められないかと思い
記事を作成してみました。

Photoshop1本で最後までデザインされる方も多いかと思いますが、
XDを使用する事で以下のような恩恵を受けられます。

・XDの機能「リピートグリッド」で作業効率をアップ
・プロトタイプで実際の動作を確認できる
・URL共有ですぐさま確認だし
・動作が軽くサクサク動く

それでも痒いところに手が届くPhotoshopの力も借りたい。
そこでPhotoshopで作成したデザインをCCライブラリを使用して
XDでレイアウトしてみたいと思います。

##Photoshopで作成したデザインをCCライブラリに保存
CCライブラリとは保存したデザインアセットをどこからでも使用できる便利な機能ですが、作成したデザインをCCライブラリパネルにドラッグ＆ドロップするだけで簡単に保存できます。
####1.保存するライブラリを選択
CCライブラリパネルでアセットを保存するライブラリを選択します。
![画像01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913908/1ea402f1-8709-b052-57bd-4901d0286652.jpeg)



####2.作成したデザインをドラッグ＆ドロップで保存
今回Photoshopで用意したクリスマスカードをレイヤーグループごと
CCライブラリパネルにドラッグ＆ドロップするとアセットが保存されます。
![画像02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913908/1d7f1185-fd1c-7a90-4b33-e87d3623a17b.jpeg)


##XDにアセットを配置
XDを開き、ツールバーのアイコンからライブラリパネルを選択。
ドキュメントアセットが表示されている場合は左上の戻るボタンからライブラリ一覧に移動します。
![画像03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913908/7e251969-06f2-af1e-4c87-334dfc608bff.jpeg)




アセットを保存したライブラリを選択します。
![画像04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913908/afd96d30-e9c5-70b3-5cff-ed628d4a3a27.jpeg)

保存したアセットが表示されるので
選択してカンバス上へドラック&ドロップすることで配置できます。
![画像05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913908/defede25-929e-2028-c60f-801e426b25c3.jpeg)

##アセットの再編集
配置したオブジェクトはリンクオブジェクトとして配置されているため
Photoshopでの再編集が可能です。

アセットを右クリックし、編集を選択。
![画像06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913908/6260f1b7-38f8-52a5-8c4f-30baf8e449eb.jpeg)

Photoshopが開くのでアセットに変更を加え保存します。
![画像07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913908/43a3fee1-ea77-d865-312b-83102704cf75.jpeg)


XDに戻ると変更した内容が反映されます。
またアセットの左上のアイコンをクリックすることで、リンクが解除され独立したアセットとしても表示できます。
![画像08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913908/d5cb9b5d-1e90-8857-c87d-0d0b29672909.jpeg)


##まとめ
今回、実際にCCライブラリを使用して作業してみましたが
使ってみた感触として、少々動作が不安定な気がする...でした(^^;
自分の使い方が間違っているのか、なにか設定が悪いのか
Photoshop側でアートボードやレイヤーマスクを設定していると
何故か再編集しても更新されない。
またデザインデータが重いとやはり更新されないことがありました...

検索してみると、どうやらそういう事がちょこちょこあるようで、
Adobe Creative Cloudを再起動してみるなど
いろいろと手を打たれているようで、自分も行ってみましたが上手くいかず
結局今回はアートボードは設定せず軽めのデザインデータで実践してみました。
（きっともっと簡単なデザインパーツの共有などに適しているのでしょうね）

そして一番重要なことですが
CCライブラリに保存したアセットはチーム内で共有しておかないと
**リンクが切れます。**
昔作ったデザインを再編集したいのだが
リンクが切れとる (；´Д｀)
というような事にもなりかねませんね。
利用するにはそういったことをしっかり管理して使いたいところです。

ということで少し歯切れの悪い結果となってしまいましたが
うまく使いこなせばきっと便利な機能のはず..！
気になった方は是非試してくださいませ🙇‍♂️

最後までお読み頂きありがとうございました。それでは！
tempfileライブラリを使った、AWS Lambdaの一時ディスク領域のスマートなクリーンアップ処理

# 概要
AWS Lambdaのウォームスタートによるバグ防止のための一時ディレクトリのクリーンアップについて、Python標準ライブラリ `tempfile` を使うとスマートに実装できる。

# Lambdaのウォームスタートの仕様と問題
Lambda関数が呼び出されると一時的な実行環境が生成され、一定時間内に同じ関数が呼び出された際は同一の実行環境が再利用される仕様(ウォームスタート)がある。その際、Lambdaの実行環境における書き込み可能領域の `/tmp` ディレクトリについても、複数の呼び出しで共有される。

> 各実行環境には、`/tmp` ディレクトリ内に 512 MB～10,240 MB (1 MB 単位) のディスク領域が用意されています。ディレクトリのコンテンツは、実行環境が停止された際に維持され、複数の呼び出しに使用できる一時的なキャッシュを提供します。
>
> [AWS Lambda 実行環境 - AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtime-environment.html) (参照 2022-06-03)

この仕様により、以前の呼び出し時に書き込んだファイルを意図せず読み込んでしまったり、複数回の実行によりディスク領域が不足してしまうなどのバグを生む可能性がある。

# os/globライブラリを使ったクリーンアップ処理の実装
上記のような問題を防ぐには、実行終了前に一時ディレクトリ内をクリーンアップする処理を行い、複数の呼び出し間でファイルが共有されないようにする必要がある。
Pythonスクリプトにおいてこの処理を実装すると下記のようになる。

```app.py
import os
import glob

def lambda_handler(event, context):

    # 一時ディレクトリ下でファイルの書き込み処理
    tmpfilename = "/tmp/temp.txt"
    with open(tmpfilename, "w") as f:
        f.write("This is temporary file")

    # 一時ディレクトリ配下のファイルを全て削除
    for p in glob.glob("/tmp/*"):
       if os.path.isfile(p):
           os.remove(p)
```

これで `/tmp` 配下のファイルは全て削除できるので解決…ではあるがこの処理を毎回書くのはやや冗長にも感じられる。（上記の処理だけではファイルが削除されただけで、配下のディレクトリが残るのも少しモヤモヤする。）

また、ローカルの開発環境がWindowsの場合、ローカルで実行しようとした際にLinuxとWindowsで一時ディレクトリのパスが異なるため、同一コードで実行できないという問題もある。

# tempfileライブラリを使ったクリーンアップ処理の実装
標準ライブラリの `tempfile` の `TemporaryDirectory()` を使用すると、一時ディレクトリの生成や削除を自動で行ってくれる。

https://docs.python.org/ja/3/library/tempfile.html

`TemporaryDirectory()` を使った実装例は下記の通り。

```app.py
import tempfile
import os

def lambda_handler(event, context):

    # 一時ディレクトリの生成
    with tempfile.TemporaryDirectory() as tmpdirname:

        # 一時ディレクトリの絶対パスが tmpdirname に代入され、ディレクトリの存在も確認できる。
        print(tmpdirname) # '/tmp/tmp5c4nrfhm'
        print(os.path.isdir(tmpdirname)) # True

        # 一時ディレクトリ下でファイルの書き込み処理
        tmpfilename = os.path.join(tmpdirname, "temp.txt")
        with open(tmpfilename, "w") as f:
            f.write("This is temporary file")

    # with句を抜けると、生成された一時ディレクトリは削除される。
    print(os.path.isdir(tmpdirname)) # False

    # 当然、一時ディレクトリ内に保存したファイルも削除される。
    print(os.path.isfile(tmpfilename)) # False
```

Lambdaの実行環境の場合、一時ディレクトリは `/tmp/tmp********` (*は乱数)に生成され、このパスが `TemporaryDirectory()` の戻り値になる。このディレクトリパスは実行環境に合わせて自動で設定されるので、Windowsで実行する際も同一コードで対応可能である。

:::note
実行中の環境においてどのディレクトリに一時ディレクトリが作成されるかは、`gettempdir()` メソッドで確認できる。

```python
print(tempfile.gettempdir()) # '/tmp'
```

一時ディレクトリが生成される場所については、ドキュメントにもルールの記載がある。

> 1. 環境変数 TMPDIR で与えられているディレクトリ名。
> 1. 環境変数 TEMP で与えられているディレクトリ名。
> 1. 環境変数 TMP で与えられているディレクトリ名。
> 1. プラットフォーム依存の場所:
>     1. Windows ではディレクトリ C:\TEMP 、 C:\TMP 、 \TEMP 、および \TMP の順。
>     1. その他の全てのプラットフォームでは、 /tmp 、 /var/tmp 、および /usr/tmp の順。
> 1. 最後の手段として、現在の作業ディレクトリ。
>
> [tempfile --- 一時ファイルやディレクトリの作成 — Python 3.10.4 ドキュメント](https://docs.python.org/ja/3/library/tempfile.html#tempfile.gettempdir) (参照 2022-06-03)
:::

# まとめ
`tempfile` を利用することでコードの記述量が減り、Windows等の異なる環境でも実行できるソフトコーディングな実装ができる。
また、一時ディレクトリが必要となるスコープも明確になるため、可読性の向上も期待できる。
少人数で開発するためにGitHub Actions を使ってみた感想

# はじめに
先日、少人数でスピード感を持って開発するためにGitHub Actionsを導入したため、
技術選定の際に、考慮した点をメモりました。

# 始めやすい
##### GUIでぽちぽちつくれる
GitHubリポジトリ上からActionsタブを開き、`New workflow`をクリックすると、テンプレートを選ぶ画面になります
最低限のパラメータを記入すればすぐに使えます。

##### テンプレートが豊富に揃っている
各種言語・フレームワークにおけるCI、各プラットフォームへのCDのテンプレートがデフォルトで揃っているため、
採用する技術に応じてテンプレートを選択するだけで使えます。
また、テンプレートがないものについても、公式ドキュメントも豊富なため、ベースとなるテンプレートを選んで編集することも容易です。

# Codeシリーズと比べて
普段業務でCI/CDを構築する際はAWSのCodeシリーズを使うことが多いので比較しました。
## Pros
### インフラにはねない
GitHub Actionsでは、workflowの定義ファイルをアプリのコードと一緒に管理できます。
SRE部隊がいる組織であればいいのですが、アプリとインフラでチームが分かれている組織はまだまだあります。
CodeシリーズはAWSリソースになるので、インフラチームの管理下になりますが、CI/CDはアプリチームで管理したいことが多いと思います。

### GitHub内でSecrets管理できる
Secretsも同様に、Codeシリーズでは、AWS Secret Managerを使うのが一般的ですが、
GitHub Actions ではリポジトリのSecretsにそのまま登録できます。

## Cons
### 特定のジョブを再実行できない
GitHub Actionsでは、Workflowを定義する際に複数のジョブを組み込めますが、
Workflowがこけた際に、特定のジョブのみを再実行することができません。。。

### サブルーチン的な使い方ができない
Workflowの中では別の定義を呼び出すことができません。
次にこのWorkflowを実行する、みたいな定義はできますが、あくまで別Workflow扱いになります。
そのため、開発ブランチではCIだけ、masterブランチはCI+CDの構成な時、それぞれ定義する必要があります。

### GHEだとランナーを自前で用意する必要がある
GitHub Enterpriseでは、ランナーを時前で用意する必要があります。
そのため、CI/CD用のEC2やらコンテナをたてないといけないので、少人数開発にはオーバースペックなところがあります。

# 総評
- スピード重視なら良い選択肢
- なにより無料なのが熱い
- ナウい技術なので使っていてたのしい
Gtk3アプリ GtkNoteBookを使う

###GtkNoteBookを使う

いわゆるTabViewのことです。

<img width="250" alt="Screenshot from 2021-12-13 18-46-05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/c216c8d7-a5e6-45f7-d647-37bfcba2b6ca.png">

###GtkNoteBookのView領域にコントロールを追加する

page1の下にあるView領域にコントロールを追加します。
<img width="500" alt="Screenshot from 2021-12-13 18-34-30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/923787c0-39dc-9ce9-9949-5baf1e15fe40.png">

GtkBoxをドラッグして追加しました。
<img width="500" alt="Screenshot from 2021-12-13 18-37-06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/4d3c7642-74b1-bca7-fb32-65bda86e39c8.png">

###違うタブにコントロールを追加する

**Page2をダブルクリックします**

<img width="500" alt="Screenshot from 2021-12-13 18-28-29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/c402a3c2-8d1d-04f2-f231-79e3853d3012.png">

GtkGridViewを追加しました。
<img width="500" alt="Screenshot from 2021-12-13 18-28-42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/1c957f34-b3f4-07ec-4288-a8201e726a1b.png">

スクロール可能にチェックを入れると便利
<img width="400" alt="Screenshot from 2021-12-13 18-39-49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/ea589c97-aed8-fa1a-91ce-91103c1f5990.png">

####ポイント

**Viewコントロールを追加するにはPageをダブルクリックする。**プロパティパネルからは追加できないです。

[Gtk3アプリ DateTimeピッカー](https://qiita.com/iota_11/items/9fde59f95165966a1aa0)に続く
全角英数字を半角に変換【BigQuery】

# やりたいこと
BigQueryで全角英数字を半角に正規化する。

# 方法
[NORMALIZE()関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators?hl=ja#normalize)を使う。

```SQL
NORMALIZE(正規化したい文字列, 正規化のオプション)
```

### 正規化のオプション４つ

| 値 | 名前 | 説明 |
| -------- | -------- | -------- |
| NFC  | 正規化形式 C | 標準的な同値によって文字を分解し、再構成する。|
| NFKC | 正規化形式 KC | 互換性によって文字を分解し、標準的な同値によって再構成する。 |
| NFD |正規化形式 D  | 標準的な同値によって文字を分解し、複数の結合文字を特定の順序で並べる。 |
| NFKD | 正規化形式 KD | 互換性によって文字を分解し、複数の結合文字を特定の順序で並べる。 |

```sql
select 
    normalize("ＡＢＣABC漢字１２３123\u00ea", NFC) AS NFC,
    normalize("ＡＢＣABC漢字１２３123\u00ea", NFKC) AS NFKC,
    normalize("ＡＢＣABC漢字１２３123\u00ea", NFD) AS NFD,
    normalize("ＡＢＣABC漢字１２３123\u00ea", NFKD) AS NFKD
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/d971b18c-ba97-1891-4145-9c6507bfb288.png)

全角を半角にしたいよ…というときは2つ目の「**NFKC正規化**」を使えば良いらしいとのこと。

この４つの正規化手法の定義について調べてみましたが、、説明できるほどちゃんとは理解できませんでしたm(__)m　[こちらの記事](https://qiita.com/fury00812/items/b98a7f9428d1395fc230)がとてもわかりやすかったです。


# 参考にさせていただいた記事
[ITIPS様　「BigQueryで全角半角変換など文字列の正規化する方法」](https://itips.krsw.biz/bigquery-how-to-normalize-multi-byte-string-text/)
[@fury00812様　「Unicode正規化」](https://qiita.com/fury00812/items/b98a7f9428d1395fc230)
Vuetifyを初めて使ったときの備忘録

## はじめに

最近とある機能で[Vuetify](https://vuetifyjs.com/ja/)を使う機会がありました。
初めての使用だったので色々わからないことも多く公式ドキュメントをひたすら行ったり来たりしていました。
今回はその時調べたことなどをメモ的に置いておきます。どなたかの参考になれば幸いです。

**環境**
Vue v2.6.14
Vuetify v2.5.10



## レイアウト編
### v-col ? v-flex ?どちらを使うべき？

Vuetifyのレイアウトについてネットで調べると`v-col`や`v-flex`というコンポーネントが出てきます。
これらコンポーネントはグリッドレイアウトを作るときに主に使いますがどれを使えばいいの？と迷うかもしれません。 
結論から言うと、最新のバージョンでは`v-col`を使えば問題ありません。（v-flexを使うこともできます）

1.5系から2.0系へのアップデートで以下のように置き換わっています。

```
v-layout --> v-row
v-flex --> v-col
```
[コードの比較はこちら](https://gist.github.com/johnleider/207f63c9d30fb77042a0bb0258c5ab32)


### アイコン付きボタンを作るときのひと手間

Vuetifyではボタンは`v-btn`、アイコンは`v-icon`を使います。シンプルに作るなら以下のような構成になると思います。

```
<v-btn><v-icon>mdi-plus</v-icon>登録する</v-btn>
```

アイコンが左側にあるとき`v-icon`に対して`left props`を設定するとアイコンに対して余白などをいい感じに調整してくれます。

```
<v-btn><v-icon left>mdi-plus</v-icon>登録する</v-btn>
```

このように組み合わせる際にいい感じに見た目を調整してくれるpropsが他にもコンポーネントに用意されていたりするので、知っておくとスマートに書けます。

https://vuetifyjs.com/ja/api/v-icon/



### 通知のコンポーネントどれ使う？

何かしらのユーザー操作の後に成功や失敗を通知したい場合は`snackbars`を使いましょう

https://vuetifyjs.com/ja/components/snackbars/

小窓を開いてユーザーに何かしらのタスク操作や重要な情報の確認・意思決定を促す場合は`daialogs`を使いましょう

https://vuetifyjs.com/ja/components/dialogs/

それ以外のアプリケーション側からのお知らせは`alerts`を使いましょう。

https://vuetifyjs.com/ja/components/alerts/



Vuetifyはマテリアルデザインを採用しているのでマテリアルデザインの文脈に沿った使い方をするのがベターです。

## 要望・トラブル解決編


### テキストフィールドのカウンターで特定の文字列を省いた文字数を使いたい

テキストフィールドで`v-text-field`を使いカウンターを表示している場合の話です。
空白や特定の記号があるとその分の文字数がカウントされてしまうので省きたいという話だったのですが、`v-text-filed`にはしっかりと用意されていました。
`couter-value props`に関数を渡すことでやりたいことが出来ます。
以下の例は正規表現で空白を削除した文字数を返すようにしています。

```
<v-text-field
 value="text"
 counter="10"
 :counter-value="v => v.replace(/\s+/g, '').length"
></v-text-field>
```

 https://vuetifyjs.com/ja/components/text-fields/#counter



### v-checkboxを使っている時に:valueが上手く動作しない

`v-model`を使わず、`:value`を使いたいシーンがあったのですが`v-checkbox`では意図した動きにならず困りました。結論から言うと`input-value props`を使うことで解決できました。

```
<v-checkbox
 :input-value="checked"
></v-checkbox>
```

`v-checkbox`の場合は、`v-model`を `input-value`と`@change`のように分解できます。

以下の記事が参考になりました。

https://uncle-javascript.com/vuetify-checkbox



## おわりに

今回初めて触ってみましたが、複雑な要件ではない管理画面などをサッと作るのにVuetifyという選択肢はありだなと思いました。
来年Vue3に対応したVuetify3が正式リリースされる予定なのでこちらも楽しみです。
testcafe環境構築する

#はじめに
testcafeをインストールするまでの道のり。

# 最終更新日
2021年12月13日

# 環境の情報
OS
Ubuntu2004

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

#　公式はこちら
https://testcafe.io/

# 環境を作っていきます
### 確認します

```
node -v 
v14.18.1
```

```
npm -v 
6.14.15
```

### インストールします

```
npm install -g testcafe
```


```
testcafe -v
1.17.1
```

バージョンが出てくれば問題ありません。