OmniAICreator/Qiita-1.07M huggingface dataset:
(補足) Dialog Skill とは

[Dialog スキルはもう使えないのか？](https://qiita.com/yanagih/items/9d2385c11ad8695468be)に関する補足記事です。

New Watson Assistant は、 対話フローを Actions で作成することをデフォルトとしていますが、 前バージョンである　Classic Watson Assistant では Dialog スキルを使用して対話フローを作成します。

# Dialog Skill を前提としたチャット・ボットの仕組み

Dialog Skill は、
* Intent (意図)
* Entity (対象)
* Response (回答)

を定義し、この 3 つの要素を組み合わせで対話フローを構成します。

<a href="https://ibb.co/1bM1rMB"><img src="https://i.ibb.co/Ws0Zk07/D1.png" alt="D1" border="0"></a>

# 3つの要素とダイアログ・ノード

この 3 つの要素とタイアログ・ノードの関係はこのようになります。

<a href="https://ibb.co/Ny3HVFL"><img src="https://i.ibb.co/DRbSV17/D2.png" alt="D2" border="0"></a>

# インテント、エンティティ、レスポンスの整理

対話シナリオを整理し、3 つの要素に落とし込みます。
対話シナリオを整理するためのツールは、問いません。MS Excel を使用するお客様が多いようです。

<a href="https://ibb.co/jLk9wzZ"><img src="https://i.ibb.co/nDMq1B8/D3.png" alt="D3" border="0"></a>

# インテントの学習

整理した内容を使って、インテントを実現する AI モデルを作成します。

<a href="https://ibb.co/GRD6YQ5"><img src="https://i.ibb.co/qp8SqYr/D5.png" alt="D5" border="0"></a>

# ダイアログ・ノードの構造

インテント、エンティティ、レスポンスの関係をダイアログ・ノードの中で定義します。

<a href="https://ibb.co/Qm8Wr9H"><img src="https://i.ibb.co/x5mnJhg/D6.png" alt="D6" border="0"></a>

# ダイアログ・フロー・エディター

ダイアログ・ノードを複数作成し、階層構造を持たせることで、複雑な対話シナリオを構成することが可能です。

<a href="https://ibb.co/jbFpjT8"><img src="https://i.ibb.co/8NVhQ0m/D7.png" alt="D7" border="0"></a>
【React】JSX記法を知る

どうも、豆腐メンタルな駆け出しエンジニアです。
最近、Reactの学習を始めたので、自身への備忘録として残しておきます。

# Reactの約束事
Reactを使う際に最初にやることとしては、まずは下記のように記述

```react
import React from 'react';
import ReactDom from 'react-dom';
```
こちらは、Reactを使う際の約束事という認識で問題ないかと。
HTMLで言うなら、DOCTYPE~みたいなものでしょうか。

# HTML側の準備

```html
<div id=pityu></id>
```
こいついつもピチュー言ってんな...
簡単に解説する程度なのでHTMLはこれくらい
# Reactの記述方法
```react
import React from 'react';
import ReactDom from 'react-dom';
```
上記のjsファイルの記述の下に、以下のように記述
```react
import React from 'react';
import ReactDom from 'react-dom';

const App = () => {
  return (
      <h1>ピチュー</h1>
      <p>こねずみポケモン</p>
  );
};
// 恐らくエラーが出るはず
```
アロー関数のAppを用意。returnで返却したい要素として、h1タグとpタグを入れています。
が、これだけだとエラーが出てしまいます。
何故か...

```react
import React from 'react';
import ReactDom from 'react-dom';

const App = () => {
  return (
     <div>
      <h1>ピチュー</h1>
      <p>こねずみポケモン</p>
     </div>
  );
};
```
Reactにおける記法、JSX記法では、
「returnする内容は、一つのタグで囲まなければならない」というルールがあります。
なので、divタグをつける...と言う認識ですね。

# 画面に表示する

最後に、記述された内容を画面に表示してみましょう

```react
ReactDOM.render(<App />, document.getElementById("root"));
```
上記のコードを入力すると画面に表示できます。
()内に注目。
,を基準にして、左が「何処から持ってきて」
右が「何処に表示させるか」と言う認識で間違いないかと思われます。

# 最後に
まだまだReact勉強したばかりですが、今後も継続して学習していきたいです。
何かあればご一報ください。それでは...
レオパレスのネット環境との闘い

## レオパレスって知ってますか？

諸般の事情により、筆者はレオパレスに住んでいるわけですが、住む前にネットで色々調べたところ
・隙間風がひどい
・音が駄々洩れ
・ネット環境が悪い
などなどの問題があるとのことでした。

## Wimax
ネット環境が悪いとのことだったので、入居前にWimaxを契約しました。
いざ入居後、ネットを使用しようと思ったらひたすらに遅い。
調子がいいと200Mbpsぐらい出るんですが、基本は数Mbpsぐらいしか出ない
そして、家の横に送電線がある影響なのか、通信がブチブチ切れる事象が発生してとてもじゃないが快適な通信は望めない状況でした。
この事象については、一度ホームルータを修理に出したのですが、事象の再発はしなかったとのことでここでwimaxはあきらめました。（解約）

## 光回線
次に目を付けたのが光回線。
固定回線だからブチブチ切れる事象とはおさらばだと思ったのですが、レオパレスは基本光回線は引けないとこのこと
一応管理会社に確認したのですが、NGとのことでした...

## 固定回線
最後に目を付けたというかほかに選択肢がなかったのが、レオパレスが提供しているレオネットという固定回線。
このレオネットというサービス、評判を調べたところ評判がレオパレス以上に悪い。
マンションで提供されている全戸一括回線タイプのサービスで、他の利用者が大量にトラフィックを流していると、遅いとか提供がUTPだとかいろいろ問題がありそうな匂いがしました

他に選択肢がなく、ネットがないと筆者は死んでしまうため、月額3000円台と安いこともあり試しに契約してみました。

## 開通とその後...
開通は簡単です。レオネットのページに行き、住んでるレオパレスの識別番号を入力すればもう開通できます。

いざ接続したところ、つかえません。

Free WIFIのように、最初と一定時間がたつごとに認証をしないと使用できないスタイルでした。←ゴミ

認証は筆者が使用してるiPhoneのシステムとすこぶる相性が悪く、基本的にiOS端末では認証ができません。
朝起きたら、PCを付けて認証しないとwifiがつながっていても、通信ができないという状況でした。

ネットで解決策を探したところ、以下の記事が見つかりました。
https://kikudai-2.hatenadiary.org/entry/20100918/1284827972

うちの無線LANには、そんな機能がないのでどうすればよいか30秒ぐらい考えた結果、Pingを定期的にどこかに投げるというアイデアを思いつきました。

家のPCはMacなので、cronが使えます。幸い大学の研究でcronは使用していたので、シェルスクリプトでpingを8.8.8.8（Google先生すみません）になげるコードを書き、1時間ごとだと認証が切れる恐れがあったので毎時00分と30分にping疎通をするように設定しました。

翌朝、起床してみて携帯を開いたところ、なんとスマホで通信ができるようになっていました！
いやースマホでネットができるってすばらしい。
めでたしめでたし。



ここでは終わりません。


人間というものは、生活レベルを上げると戻れない生き物といいます。
筆者もそうでした。ネットが使えるようになると今度はスピードを上げたくなります。


## 速度の向上

皆さんもおうちのインターネット環境のスピードテストをしていると思いますが、筆者の環境だと
下り88.27Mbps, 上り86.20Mbpsと
まあ普通に生きる分には申し分ない速度でした。
が速い方がなんかいい！との理論（スポーツカーはそんな好きではありません）でスピードテストを繰り返し～とやっているとその日がやってきました。
ある日、速度が
下り109.99Mbps, 上り188.84Mbps（Wi-fiでの速度）
出たのです。100Mbpsが限界かな？と心の中では思っていたのでテンション上がりまくりです。
この速度が上がったのはいまだに原因不明です。
住んでいるレオパレスの全部屋で共用の回線のはずなので、帯域をたくさん使っていた人が引っ越したぐらいしか筆者は思いつきませんでした。

無線LANでの速度は上がりましたが、無線LANルータから直接LANケーブルでつないでるPCに関しては、どうしても100Mbpsの壁が越えられませんでした。

感のいい皆さんならお気づきでしょうが、この繋いでいるLANケーブルは100Mbps対応のものでした（筆者はcat-5eのものを買ったと思い込んでいましたが、購入履歴を見たらcat-5と書いてありました...）
なんか通信がおかしいときはだいたいL1かL2とはよく聞きますがまさにそれ
これに気付くのに、普段あまり家にいないこともあり2か月かかりました笑

現在では上り下りともに300Mbps出る日もあります。

やはり固定回線は神

腐っても固定回線

ビバ固定回線

以上です。

文字ばかりですみません。
余裕があったら画像・イラスト追加します
regular expressionによるmatching

find()は部分一致検索
lookingAtは先頭一致
matchesは完全一致
```java
        String s = "ABC1DEF";
        Pattern p = Pattern.compile("[A-Z]{3}");
        Matcher mc = p.matcher(s);
        System.out.println(mc.find());
        System.out.println(mc.group());
        System.out.println(mc.find());
        System.out.println(mc.group());
        System.out.println(mc.find());
        System.out.println("-----------------");
        System.out.println(mc.lookingAt());
        System.out.println(mc.group());
        System.out.println(mc.lookingAt());
        System.out.println(mc.group());
        System.out.println("-----------------");
        System.out.println(mc.matches());
        mc = p.matcher("ABC");
        System.out.println(mc.matches());
```
```
true
ABC
true
DEF
false
-----------------
true
ABC
true
ABC
-----------------
false
true
```
React Native + Expo + Amplify アプリを EAS でデプロイ

更新：2022年12月23日
（本記事は、次の記事の続きです「[Amplify + React Native + EXPO で Authenticator](https://qiita.com/RYO_/items/96324bc4dfd2d7e00ae7)」）
React Native + Expo アプリを EAS (Expo Application Services) でデプロイしてみます。

# [Getting started](https://docs.expo.dev/eas-update/getting-started/)
ドキュメントに沿って、試しにやってみます。

```
% npm install --global eas-cli
% npm create-expo-app my-app
% cd my-app
% npx expo start
```
iOS simulator 上でアプリ実行できました。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/2fd416a2-b02e-5dd1-63cb-2f9cbd442eed.png">

さらにドキュメントに沿って進めてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/1994c7da-4440-2ecf-5e2b-9b9c4a747a83.png)

eas.json に channel プロパティを追加します。
```json:eas.json
{
  "build": {
    "preview": {
      "channel": "preview"
      // ...
    },
    "production": {
      "channel": "production"
      // ...
    }
  }
}
```

```
eas update --branch preview --message "Updating the app"
```
[Expo](https://expo.dev/)のページでQRコード表示させて、iPhoneで読み込ませると、iPhone実機でもExpo Go上でアプリ実行できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/5b57cd9e-5470-0ee9-ac91-dce38516098d.png)

# 認証アプリを EAS でデプロイ
以前作った [React Native + Expo + Amplify で作成した認証アプリ](https://qiita.com/RYO_/items/96324bc4dfd2d7e00ae7)を同じ手順で EAS にデプロイしてみます。
```
% npx expo start
```
iOS simulator 上で実行できています。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/26799a3f-4f47-afca-c2bf-b5bcd37ea9f0.png">

```
% npx expo install expo-updates
% eas update:configure
% eas build:configure
```

eas.json に channel プロパティを追加します。
```json:eas.json
{
  "build": {
    "preview": {
      "channel": "preview"
      // ...
    },
    "production": {
      "channel": "production"
      // ...
    }
  }
}
```
デプロイします
```
eas update --branch preview --message "Updating the app"
```
Expo のホームページでQRコードを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/94391072-284f-a459-7029-fada34db943a.png)

iPhoneでQRコードを読み取ると、iPhone実機のExpo Go上でアプリ実行できました。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/5287754f-d29c-c7c7-c6d2-8c3785b0c5f7.png">

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/5d1e819e-7438-46fb-517e-a75b59f73750.png">

以上です。
react-to-printを使って横向き印刷をする

ReactでWebアプリを作成する際、表示内容を印刷する機能を作ることがあります。

`react-to-print`というライブラリを使うことで、割と楽にDOMを印刷することができたので、備忘録としてやり方などを記載します。

# react-to-printのインストール

https://www.npmjs.com/package/react-to-print

npmなどでインストールできます。僕はyarnを使うので、

```shell
$ yarn add react-to-print
```

でプロジェクトファイルにいれます。

# 使い方

```react
import { FC, useRef } from 'react'
import ReactToPrint from 'react-to-print'

const PrintComponent: FC = () => {
    const componentRef = useRef<HTMLDivElement>(null)
    return (
        <>
            <div ref={componentRef}>印刷したいDOM</div>
            <ReactToPrint
                trigger={() => (
                    <button>
                        <div>ボタン要素的なもの</div>
                    </button>
                )}
                pageStyle="@page { size: A4 landscape; margin: 0; }"
                content={() => componentRef.current}
            />
        </>
    )
}
```

上記のような感じで使えます。
`yarn start`などで立ち上げたアプリ上でbuttonタグのボタンを押下すると、印刷用プレビューページ(ブラウザ機能のやつ)が開き印刷内容が確認できるはずです。

ポイントは、`useRef`を使って印刷対象のDOM要素を参照し、その参照を`ReactToPrint`コンポーネントの`content`に渡しているところです。
参照する要素をうまく変えれば、表示しているページの中の一部だけ印刷する、ということも可能です。

# Tips
## pageStyleでできること
`pageStyle`というパラメータで、印刷設定用のCSSを渡すこともできます。
横長の要素を印刷したい場合は`size: A4 landscape;`という形で`landscape`をつければ横向き印刷のプレビューを表示してくれます。

また、`size: A4;`に納めるための縦横それぞれのpx値は、僕が測ってみた限り`792x1144`でした。(ブラウザ環境その他でもしかすると変わってくるかもしれませんが)
上記より大きいDOMを印刷しようとすると印刷プレビューからはみ出てしまいますが、`size: A3;`などと指定すれば上記の許容px数が増えて印刷プレビューからはみ出なくなります。
A3と指定しても、印刷時に印刷機の方でA4紙を指定すれば普通にA4で印刷できるため、大きすぎるDOMを印刷したい場合は検討してみてください。

## margin: 0;はChromeだけ
`pageStyle`の中で`margin: 0;`と指定していますが、こちらはページ名やページ数などのメタ情報を印刷させなくする工夫です。ただGoogleChromeしか適用されないそうなので使用時にはご注意をお願いします。

# ページを分けて印刷したい時
`react-to-print`とは直接関係ない話になりますが、1ページ目から2ページ目などとページを跨ぎたい場合は、`<section></section>`で囲みつつ、`page-break-after: always;`のstyleを当てることで各ページのセクションを分けることができます。

```react
import { FC, useRef } from 'react'
import ReactToPrint from 'react-to-print'

const PrintComponent: FC = () => {
    const componentRef = useRef<HTMLDivElement>(null)
    return (
        <>
            <div ref={componentRef}>
                <section style={{page-break-after: always;}}>1ページ目</section>
                <section style={{page-break-after: always;}}>2ページ目</section>
            </div>
            <ReactToPrint
                trigger={() => (
                    <button>
                        <div>ボタン要素的なもの</div>
                    </button>
                )}
                pageStyle="@page { size: A4 landscape; margin: 0; }"
                content={() => componentRef.current}
            />
        </>
    )
}
```

# 最後に

`react-to-print`はReactアプリでDOMを印刷したくなった際に、かなり手軽に実現できるライブラリです。印刷で困っている方の助けになれば幸いです。
Opensearchをローカル環境で起動+アクセスしたい

# はじめに

AWS Opensearch をローカル環境で使えるよう設定します。
Opensearch を起動するために Docker を使います。

---

現在あるプロジェクトでdynamoDBを使っています。
しかし、dynamoDBは検索が不得意（RDBのSQLのように複雑なクエリを実行することができない）なので、検索が得意なOpenSearchを導入します。

# 環境

macOS Catalina
Docker version 20.10.2
docker-compose version 1.29.2

（ Dockerの基礎学習は、下記がおすすめです。）
>Udemy　[米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/course/aidocker/)
ブログ　[かめさんブログ - Docker超入門①](https://datawokagaku.com/whatisdocker/)
Twitter　[かめさんツイッター](https://twitter.com/usdatascientist?s=21)

# Docker起動
参考：[OpenSearchをローカル環境でDockerを利用して構築する](https://dev.classmethod.jp/articles/how-to-build-opensearch-with-docker/)

## 1. プロジェクト内にDocker用ファイルを 2つ作成

```docker-compose.yml
version: '3'

services:
  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:1.1.0
    container_name: opensearch-dashboards
    environment:
      OPENSEARCH_HOSTS: "https://opensearch:9200"
    ports:
      - 5601:5601
    links:
      - opensearch
    networks:
      - sandbox

  opensearch:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: opensearch
    environment:
      - cluster.name=docker-cluster
      - node.name=os-node
      - cluster.initial_master_nodes=os-node
      - bootstrap.memory_lock=true
      - http.host=0.0.0.0
      - transport.host=127.0.0.1
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - $PWD/.local/opensearch:/usr/share/opensearch/data
    ports:
      - 9200:9200
    networks:
      - sandbox

networks:
  sandbox:
```

```Dockerfile
FROM opensearchproject/opensearch:1.1.0
RUN /usr/share/opensearch/bin/opensearch-plugin install analysis-kuromoji
RUN /usr/share/opensearch/bin/opensearch-plugin install analysis-icu
```


## 2. Docker起動
Docker Desktopを立ち上げ、以下コマンド実行

```terminal
$ docker-compose up -d   #（buildされていなければbuild後に）コンテナ起動後、コンテナから出る
$ docker-compose ps   #コンテナのステータスを確認する
```

opensearchとopensearch-dashboardsのコンテナがUP状態のはず。



## 3. curl コマンドで Opensearch へアクセスする
参考：[Elasticsearchの個人的によく使うコマンド集](https://zatoima.github.io/aws-elasticsearch-commands-lists.html)

```terminal: インデックスの確認
$ curl -u admin:admin --insecure https://localhost:9200/_cat/indices?v
```

```terminal: インデックスの詳細確認
$ curl -u admin:admin --insecure https://localhost:9200/インデックス名/_settings?pretty
```

```terminal: エイリアスの確認
$ curl -u admin:admin --insecure https://localhost:9200/_aliases?pretty
```

```terminal: インデックスの作成
$ curl -X PUT -u admin:admin --insecure https://localhost:9200/インデックス名
```

```terminal: インデックスの削除
$ curl -X DELETE -u admin:admin --insecure https://localhost:9200/インデックス名?pretty=true
```

```terminal: 件数確認
$ curl -u admin:admin --insecure https://localhost:9200/_cat/count/インデックス名?v
$ curl -u admin:admin --insecure https://localhost:9200/インデックス名/_count?pretty

```

```terminal: データ検索（無条件）
$ curl -u admin:admin --insecure https://localhost:9200/インデックス名/_search?pretty
```

```terminal: 統計情報
$ curl -u admin:admin --insecure https://localhost:9200/インデックス名/_stats?pretty
```

# さいごに

Opensearchをlocalで試したい、、さっそく出来ちゃいました！（Docker便利！）
ここからは、実際にドキュメントを作成したり、クエリ叩いたりしてみます。

今後、追記予定です。
Zoomでタイムキーパー：時間経過を表示してベル音を自動で鳴らす（Windows向け）

# 背景
オンライン会議などでタイムキーパーをする際、参加者が経過時間を確認でき、ベル音で時間を発表者に伝えられると便利です。
しかし、ZoomでPC音を流すには画面共有する必要があるため、資料を共有しながら行う会議には不向きです。また、Zoomアプリのタイマーは1度しかベルを鳴らすことができません。
本記事ではフリーソフトを用いて時間経過をZoom背景で表示し、ベル音を自動で流す方法を記載します。
※VoiceMeeter Bananaは**Windowsのみ対応**ですが、同様の機能を持つソフトを使用すれば他のOSでも実行できると思います。

# 使用ソフト
OS: Windows 10 Pro (10.0.19043)
Zoom: v. 5.12.2 (9281)
OBS: v. 27.1.3
VoiceMeeter Banana: 2.0.6.8　**※Windowsのみ対応**

# 方法
#### 1. OBSとVoicemeeter Bananaのダウンロード・インストール
OBSはタイマー映像、VoiceMeeter Banaanはベル音をzoomに流すのに使います。

https://vb-audio.com/Voicemeeter/banana.htm

https://obsproject.com/ja/download


#### 2. タイマー映像の取得
ブラウザからアクセスできる「Time Keeper」を利用します。
Time Keeperはベルを鳴らすタイミングを3回まで設定でき、ベル音もシンプルなので使いやすいです。

https://maruta.github.io/timekeeper/

![Image 2022-12-22 17.53.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/05209539-580d-d023-ce52-e977eea5b4a2.png)

#### 3. タイマー映像をZoomの背景に設定する
OBSを起動し、「ソース」タブの＋ボタンをクリック。ソース選択画面が表示されるので「ウィンドウキャプチャ」にてタイマーを表示させているブラウザを選択します。
大きななどを調整して仮想カメラ開始をクリックします。
![Image 2022-12-22 17.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/7f6b554a-f761-8fd1-0b98-ce41e8df3d11.png)

#### 4. Zoomのビデオ設定
Zoomを起動し、設定→ビデオの「カメラ」で「OBS Virtual Camera」を選択すると、Zoomの背景にOBSを介したTime Keeperの映像が表示されます。
![Image 2022-12-22 18.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/b6f444c9-6fcd-a517-e846-f2cc6e8d60d5.png)

#### 5. VoiceMeeterの設定
VoiceMeeter Bananaを起動し下記の設定を行います。
①HARDWARE INPUT1をクリックし、物理マイク（PCに接続しているマイク）を選択
②B1を選択
③VIRTUAL INPUTSの「VoiceMeeter Aux」でA1とB1を選択
④HARDWARE OUTのA1をクリックし、物理スピーカー（PCに接続しているスピーカー）を選択
※自分の音声を流さずベル音のみをZoomに流したいときは、②でB1に加えて「Mute」を選択すると物理マイクからの音声を拾わなくなります。

![221222_voice_meeter設定_revised3 2022-12-22 18.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/82f5fcc2-7377-fd93-b571-f0f53b60733b.png)

#### 6. Windowsのオーディオ設定
Windowsの設定→サウンドで出力デバイスに「VoiceMeeter Aux Input」、入力デバイスに「VoiceMeeter Output」を選択。
![221223_サウンド設定 2022-12-23 11.10.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/22d94985-b54e-65d1-b35c-0ff3b6b283f2.png)


#### 7. Zoomのオーディオ設定
Zoomの設定→オーディオでスピーカーにVoiceMeeter Aux Input、マイクにVoiceMeeter Outputを選択。
オーディオプロファイルのバックグラウンドノイズ抑制で「低」をクリック。
※自動や高を選択するとベル音がノイズと判断されて除去されてしまいます。

![221222_zoom設定_revised 2022-12-22 18.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/3238f61d-1e01-b85a-2275-ee4c3c84105d.png)
以上の設定でタイマーをZoom背景で表示しつつ、ベル音を流すことができます。

# トラブルシューティング
#### ベル音が大きい
VoiceMeeterのMASTER SECTIONでB1の「FaderGain」を下げる（音が小さい場合は上げる）。
![221222_voice_meeter設定_revised3 2022-12-22 18.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/11ca93f1-d41e-6759-211e-d3c19616d28e.png)

# 参考
http://blog.media.teu.ac.jp/2021/08/post-5371c6.html

https://note.com/hiroetty/n/n79a3ad07e362
【MicroStrategy】Lag関数使用時の注意点

# はじめに
前回Lag関数の設定方法について記事を投稿しましたが、その際に気づいた注意点についてまとめます。

# そもそもLag関数とは？
以下5つを設定して、指定した順序でメトリック値を表示させる関数です。
・**ValueList**：表示させたいメトリック　※選択肢はデータセット内のメトリック
・**Offset**：並べ替えで指定したものに対し、いくつ前を表示するか
・**DefaultValue**：初期値
・**区切り(BreakBy)**：並べ替えの区切りとなるもの
・**並べ替え(SortBy)**：基準となるもの

　
設定方法など詳細は以下記事をご参照ください。

https://qiita.com/m_zeal/items/2182c008702ac62f5f88

# Lag関数使用時の注意点
#### 表示された結果から「いくつ前（後）」の値を表示する
[Offset]には<INS>「1ヵ月前」という設定はできず、「表示結果のいくつ前」</INS>という設定をします。
※「いくつ後」という設定も可能
そのため、たとえば以下のようなダミーデータ、6月、8月、9月のデータがあった場合に「1つ前のデータ」と設定すると以下結果となります。

|　月　|　金額　|　前月金額（Lag関数を使用した1つ前の金額）　|
|--:|--:|--:|
|06|1,000|0<br>（表示するものがないため[DefaultValue]に設定した値を表示）</br>|
|08|1,300|<font color="red">1,000（6月の金額）</font>|
|09|1,700|1,300（8月の金額）|

7月分が存在しないため、8月の前月金額には6月の金額が表示されます。

　
ドシエの表示結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768514/0bc6a2c4-5086-9515-6caa-dbd1121bd9e8.png)

※前月金額には以下のようにLag関数を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768514/a8b44b44-d6d5-7c53-bb9c-35bee696cb37.png)


#### 定期的に発生するデータに対して有効
毎月など定期的に発生するデータを表示させる場合には、この関数はとても便利だと思います。

また、今回の例のように7月データがない場合は、あらかじめ「7月：0円」というデータを作成しておけば、出力結果にも7月データが表示され、1つ前＝前月となります。

|　月　|　金額　|　前月金額（Lag関数を使用した1つ前の金額）　|
|--:|--:|--:|
|06|1,000|0<br>（表示するものがないため[DefaultValue]に設定した値を表示）</br>|
|07|0|<font color="red">1,000（6月の金額）</font>|
|08|1,300|<font color="red">0（7月の金額）</font>|
|09|1,700|1,300（8月の金額）|

　
先ほどのデータに「7月：0円」を追加した場合：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768514/300456bc-3390-7694-b5ac-9b7f7c9e2332.png)

# おわりに
MicroStrategyの関数は意外なところに落とし穴があるので、一度試してから使用を検討するといいかもしれません。
使いこなせると関数も豊富にありますし、様々な要望を実現できるかと思います。



#
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
ゼロ秒思考　-頭の中の混乱を整理する手法とその効果-



# 初めに

はじめまして。グロースインクの安藤恵美と申します（@e_ando）
本記事は、グロースエクスパートナーズアドベントカレンダー2022年23日目の記事です。

この記事では『ゼロ秒思考』について、その手法と得られる効果、約1年間の実体験を踏まえた感想についてご紹介させて頂きたいと思います。

**ゼロ秒思考とは？**
同名書籍『ゼロ秒思考』が発行されたのが2013年ということもあり、既にご存知の方も多いかもしれません。著者の赤羽氏が、外資系コンサル会社マッキンゼーにて、14年間の過酷な業務を経て辿り着いた思考法です。
言葉の通り『ゼロ秒』＝瞬時に頭の混乱を整理し、感情面も含めて冷静且つ適切な判断が可能になる画期的な手法です。

頭の中を整理する手法の一つとして、業務にも活かせて大変有益だと思いましたので、今回ご紹介しようと思いました。


# 実践方法
『ゼロ秒思考』とはすなわち『メモ書き』です。

**手法**
以下の手順に従ってメモを書くだけです。
【用意するもの3種】A４用紙10枚/ペン/タイマー
1. タイマーをセットします。（制限時間は1分です）
2. 用紙の左にタイトル、右端に日付を書きます。
3. タイトルの下に、その言葉から想起されることを4〜6項目ほどを箇条書きにします。
4. これを１セット10枚、異なるタイトルで連続で繰り返します。（これを毎日行う）
![memo_0second.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078278/fd8b5895-02ce-d66f-fb31-6d4ec280534a.png)

最初は２、３枚が限界かもしれませんが、慣れてくると連続で10枚以上書けるようになります。これは基本的に他人に見せるものではありません。ネガティブな内容も頭に浮かんだまま正直に書き綴る事が大切です。

何故この時代に手書きなのか？と不思議に思われた方もおられると思います。
ゼロ秒思考は瞬間的な思考力を鍛える手法です。テキストのみであれば、デジタル入力が早いかもしれませんが、ちょっとした図などを書き入れたり、紙面を自由に矢印を入れたりなどは、手書きの方が柔軟に対応できます。なのでデジタルではなく、敢えて手書きが推奨されています。
中にはipadで手書きをする方もおられますが、私は盤面の大きさやペンの筆感を比較すると、アナログな方がスピーディに書けるように感じました。（ここら辺はお好みかもしれません！）


# 得られる効果
モヤモヤした悩みや、ふわっとした感情を、一旦メモとして言葉に落とし込む事により、自分の悩みを客観的に見る事ができるようになります。
また、頭の内部の情報が外部のメモに置き換わりますので、それだけで頭の中がスッキリと整理されます。
こうして1分という限られた時間の中で、書き出す事により、次第に物事の優先度や区別がつくようになり、また、感情的な事柄も冷静に捉える事が出来るようになります。

これを毎日継続します。
集中力と思考力のスピードが加速してゆき、次第に、問題の把握出来る範囲、深さなどが強化されてゆきます。

問題や悩みは、頭の中で考えているだけでは、何も解決しません。
書き出して、客観的に見る、という行為を行うだけで相当頭の中が整理されます。
当たり前のようで、実践してみるとその効果に驚かされます。


# 解決されたこと　
**個人的な体験と感想**
私がゼロ秒思考を始めたのは、2021年の10月頃。元々頭が混乱しがちで、いつも悩みを沢山抱えて右往左往していました。
それから約１年間、自分なりに続けてみた結果、以下のような変化がみられました。

---
・頭の中が圧倒的に整理されるようになった。
・問題に対して、解決策が明確に出るようになり、すぐに行動に移せるようになった。
・同じ事で悩まなくなり、ストレスが減った。
・精神的なもの「怒り」「不安」などが以前と比較して軽減された。
・生活リズムの改善、早朝に起きる習慣がつき、自己研鑽の時間を持てるようになった。

---
一番大きかったのは、早朝に起きる習慣をつけられるようになった事でしょうか。
メモ書きでは、
「なぜ起きられないのか？」
「どうしたら起きる事が出来るようになると思うか？」
「起きる事が出来たとして、どのように過ごしたいか？またその時どう感じるか？」などなど...
何度も何度も問い掛けて行きました。その結果、様々なアイディアが沸き、強固な習慣化が実現されました。

この朝の時間で学んだ事柄は、日々の私の業務をどれだけ助けてくれたかしれません。
これだけでも、人生が180°変わったように感じていますし、ゼロ秒思考に出会えた事に心から感謝しています。

ただ、1点だけ注意点もあります。
ゼロ秒思考をしばらく続けていると段々と自己流になってしまいがちです。
箇条書きにする文章が「やることリスト」のような名詞や極めて短いフレーズで終わってしまったり、はたまた制限時間を超えて書いてしまったり、、こうなってしまうと、メモ書きを続けても瞬間的な思考力の強化には繋がらなくなってしまいます。やはり基本の手法は厳守すべきだと痛感致しました。


# 終わりに
このQiitaをご覧になるような方は、そもそも頭が混乱する、といった悩みをお持ちの方はいないのでは..とも思います。

ゼロ秒思考をご紹介させて頂きましたが、私自身、現時点ではこの手法の素晴らしさを体現しているとは言い難い状態です。

然しながら、万が一、私のように頭の中が混乱していたり、問題の解決方法が分からなかったり、感情的な悩みで動けなくなっているような方が、おられるようであれば、何かの一助になるかもしれないと思い、書かせて頂きました。

ご精読ありがとうございました。
どうか幸せなクリスマスをお過ごしください。


参考書籍『ゼロ秒思考 頭がよくなる世界一シンプルなトレーニング/赤羽雄二/ダイヤモンド社/2013年』

https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E7%A7%92%E6%80%9D%E8%80%83-%E9%A0%AD%E3%81%8C%E3%82%88%E3%81%8F%E3%81%AA%E3%82%8B%E4%B8%96%E7%95%8C%E4%B8%80%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E8%B5%A4%E7%BE%BD-%E9%9B%84%E4%BA%8C/dp/447802099X
Docker内でnode-modules消してしまって環境が壊れた時の対処法

yarnでインストールしてきたnode_modulesを直接フォルダをぶち消して、そこまで作っていたDocker内の環境が壊れてしまいました。
localhostにアクセスできなかったり、動作がエラーになるなど起きるようになりました。

yarnは高速化のために必要なキャッシュをローカルに保存しています。
このせいでDocker内とローカルで差分ができてしまうため、新規にDockerファイルを立ち上げようとするとDocker内で壊れた状態のnode_modulesを再利用されてしまい環境が壊れたままの環境を構築することになってしまいます。

キャッシュするディレクトリパスは以下になります。
`yarn cache dir`

キャッシュされているnpmリストの確認は以下になります。
`yarn cache list`

キャッシュクリアは以下になります。
`yarn cache clean`

私の場合はキャッシュクリアのコマンドをDocker内で行うと
下記のように表示されてしまい失敗してしまいました。消す対象が大きいのか、スペックが低いのか。。。

```
rm: cannot remove '/usr/local/share/.cache/yarn/v6': Device or resource busy
```

そしてフォルダパス削除コマンドを打つだけを実行してみると
```
# yarn cache dir
/usr/local/share/.cache/yarn/v6 ※私の場合のディレクトリパス

# rm -rf /usr/local/share/.cache/yarn/v6
rm: cannot remove '/usr/local/share/.cache/yarn/v6': Device or resource busy

# yarn cache list
yarn cache v1.22.19
Name Version Registry Resolved
Done in 0.10s.
```

同じように失敗したメッセージが表示されるものの `yarn cache list` で確認するとキャッシュは消えていました。
これでキャッシュクリアをなんとかできました。
年に数回使用するコマンドで忘れがちなもの


# sshの認証鍵を作りたい

```sh
ssh-keygen
```

# git

## リモートリポジトリの確認

```sh
git remote -v
```

## リモートリポジトリの設定削除

```sh
git remote rm ｛originとか｝
```

## 全てチェックアウト（または変更を破棄）したい

```sh
git checkout . && git submodule foreach --recursive git checkout .
```

`git submodule foreach --recursive {やりたいコマンド}` は結構使える。 

## クローンで recursive 忘れてサブモジュールが空っぽ

```sh
git submodule update --init --recursive
```

## git の ssh 接続で複数のアカウントを取り扱う

```sh:~/.ssh/config
Host XXXX.bitbucket.org      # XXXX を任意に設定
	HostName bitbucket.org   # ここは実際のアクセス先　（HostとHostNameがテレコじゃん。。。）
	User YYYY
	PreferredAuthentications publickey
	IdentityFile /***/.ssh/***　  # 公開鍵へのフルパス
	UseKeychain yes
	AddKeysToAgent yes
```

```config:各リポジトリ/.git/config
[remote "origin"]
        url = git@XXXX.bitbucket.org:YYYY/***.git
```

### これで接続できない場合

`ssh` で接続してみる。

```sh
ssh -T XXXX.bitbucket.org
```

```:成功時のメッセージ
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled
```

これがエラーにならないのであれば、この状態で再度 `git` でアクセスすると接続できる。（何で？）


## クローンしたら、先方のsshのfingerprintが更新されたっぽい

```sh
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.
```

`~/.ssh/known_hosts` で該当のドメインの行を削除

```sh:~/.ssh/known_hosts
github.com ssh-rsa XXXXXXX.......
```

下記コマンドで更新

```sh
ssh -T git@github.com
D25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
```

## XCode

### ビルドキャッシュを削除

CLIじゃなくて、IDEで用意して欲しい

```sh
rm -rf ~/Library/Developer/Xcode/DerivedData
```

### XCBuild の切替

#### 設定

```sh
sudo xcode-select --switch /Applications/Xcode.app
```

#### 確認

```sh
xcode-select --print-path
```
ネガティブフィードバックって難しい

エンジニアマネージャーとなり、一番悩み困ったのがネガティブ・フィードバックでした。
指摘したり課題を伝えるのって難しいですよね。
だれかのなにかの役に立てることができれば幸いです。

## :hatching_chick:ネガティブ・フィードバック

### 目的

育成、改善、課題解決のために行うものです。
指摘・指導ですね。

### なにが難しい？

1. 課題の特定
2. 伝え方
3. 伝えるときの気持ちの持ちよう

### :one: 課題の特定

チームリーダー自体はポジティブ・フィードバックはするものの、ネガティブ・フィードバックはほぼしたことがありませんでした。
ん？と思うことがあったとしても、「人それぞれやしな」「この言い方はよくないんじゃない？」のような主観で捉えていました。
また課題だと思うことをうまく言語化するのが難しかったです。計画的ではないように見えるがなんて言ったらいい？みたいな（※今回はこの話はしません）

マネージャーになり、メンバーの振る舞いや言動を見て感じたことがあったとしても
「それって本当に課題なのか？」
「私の価値観と遠いだけなのかも」
「なんか傷ついたけど正しいことを言われている気がする・・・」
「課題に感じるがなんて言ったらいいかわからない・・・」
など、ポイズン状態でした。（古くて伝わらない）

というのをある先輩に相談したところ
**「大事なのは事実と主観(解釈)をわけること」**
とアドバイスをもらいました。

私はこの２つがごっちゃになっており言うべきことなのか・・？の判断に時間がかかり、タイミングが遅れてしまい効果的にフィードバックができていませんでした。
またマネージャーとして指針を決めると良いと聞きました。

#### 私が決めた指標
- 楽しく成長して働いてほしい
- チームワークを重視する
    - チームで成果を出す
- ルールは基本的に守る
    - ただMUSTにしない、臨機応変に対応する
- 企業理念や行動指針を大切にする
- 自分のためではなく相手のための課題と捉える

例：言い方に問題があるように感じた
→なぜか？→感じがわるく感じた→言い方として問題があるか？他の人だと何か感じそうか？→特になさそう→問題なし！
→なぜか？→それによってメンバーが気にしてしまい、パフォーマンスがでなくなっている→問題なのでフィードバック

なぜそう思うか？自分の主観で捉えていないか？それによってなにかに影響したか？を問いかけて課題を特定しています。
このやりかたにしてからアンガーマネジメントもできるようになってきました。

また伝える前に大事なのが相手と前提をあわせることです。
計画性が足りてないね、という話をしたときに「計画性がある状態というものはなにか」をすり合わせておくとよいです。
この前提がずれているとこのあとの伝え方を工夫しても伝わらないです。

### :two: 伝え方

耳が痛い話をするので、受け取る側は受け入れにくいこともありますよね。
実際自分も関係性がない人に指摘されたときにあまり受け入れることができませんでした。
フィードバックする目的は改善や成長のためなので、改善しよう！と思ってもらうことが重要ですよね。

なのでまずは関係構築が大事だなと思います。
- 相手を知ること、自分を知ってもらうこと
- ポジティブ・フィードバックを普段から伝えていること

あなたのことを承認していますよ:blush:あなたのことを応援していますよ:sparkles:
が伝わっている前提でネガティブ・フィードバックを行うのが大事だと思います。

伝え方は以下を大切にしています。
- 1on1の場や見えないところで行う
- フィードバック内容は整理してどう伝えるか考える
- 相手を思う気持ちを持って話す（押し付けない）
    - 自分の感情も混ぜて話す
        - こうしてくれるととても助かる等

プラスαとして、相手の価値観に沿ったフィードバックができるとなおよいと思います。
それについてはまた別の機会にでも。

### :three: 伝えるときの気持ちの持ちよう

勇気がいりますよね・・・・！

伝わるかなー、落ち込んだりしないかなー、また伝えたときの相手の反応など
気持ちの面でちょっと緊張感がありますよね。

これもわりとマネージャーになって長く悩んだことになるのですが、
**「変えられるものと変えられないものを区別したほうがいい」**
と先輩からアドバイスをもらいました。

全然響かないとか逆ギレされちゃうこともあるかもしれません。
相手を変えることはできません。自分の振る舞いは変えることができます。

なので響かなくても逆ギレされても気にする必要はないのです。
次どうやったら伝わるかなと考えて動くだけでよい。

とは言っても気にはなるのですが、このアドバイスをもらってからは勇気もでるし、ナイスチャレンジと自分にもフィードバックできるようになりました。


## :hatched_chick:まとめ

今でも苦手ですし、できることならやりたくない思いはありつつ、
でも役割なので頑張っています。
フィードバックする前に課題を整理→伝え方を考える→伝える→振り返る。エンジニアリングも似たようなもの。
ユーザに使ってもらえる機能を作るのも難しい。
そのために調査したりスキルを身につけたり、やっていることは同じなんだと。
上司との1on1や評価面談でこういった話をするのですが、書き起こすことはなかったので
アウトプットしてみて、言語化できてない部分に気づけたりして記事書いてみてよかったなーと感じました。
次回はポジティブフィードバックについて書こうかな〜と思ってます！
文系出身ITエンジニア1年目が応用情報も一発合格したので勉強メモ

## 概要
基本情報も応用情報も一発でとれたので、多分間違ったやり方ではないなと思って、今後のために勉強方法をメモしました。
誰かの参考になればうれしいです。

## この記事が参考になりそうな人
- 文系出身でIT初心者だけど応用情報試験受かりたい人
- 「応用情報受かった人ってどんな勉強したんだろー？」と思ってる人

## 私のバックグラウンド
- 経済学科出身（OSってなに？Javaってなに？のレベル）
- 元地方公務員（パソコンはwordとexcelとpowerpoint、マクロってなに）
- 2022年4月からソフトウェアエンジニアに転職
- "サー"の方にとても近いアラサー

## そもそも持ってた資格
- 簿記2級
- 基本情報技術者（2021年秋）

## 受かった応用情報
- 2022年秋

## 応用情報とりたいなーって人へ
- まず基本情報から挑むのをおすすめします。

## なんで基本情報からやるの？
- "応用"情報ってだけに、応用情報の試験は基本情報の知識を元にして深堀りした問題が出てきます。
- 私は基本情報から取る方が楽なんじゃないかなーと思ってます。

## 使った教材
1.  [令和03年 イメージ＆クレバー方式でよくわかる 栢木先生の基本情報技術者教室](https://gihyo.jp/book/2020/978-4-297-11716-0)
2. [キタミ式イラストIT塾 応用情報技術者 令和04年](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/429712453X)
3. [令和04年【春期】応用情報技術者 パーフェクトラーニング過去問題集 (情報処理技術者試験)](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C04%E5%B9%B4%E3%80%90%E6%98%A5%E6%9C%9F%E3%80%91%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E9%81%8E%E5%8E%BB%E5%95%8F%E9%A1%8C%E9%9B%86-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E5%8A%A0%E8%97%A4-%E6%98%AD/dp/4297124947)
4. [応用情報技術者試験ドットコム](https://www.ap-siken.com/)

## 教材の説明と使い方
1. 柏木先生の基本情報技術者教室
    - 基本情報受けた時に使っていた教材で、索引が充実している。
    - 応用情報の勉強している時に「この単語ってなんだっけ？」の時の辞書代わり。

2. キタミ式応用情報の本
    - 最初の2ヶ月を使って一通り読んだ。（応用情報の全体を掴むイメージで読んでいた。）
    - 柏木先生より細かい部分まで説明がある。
    - 本の中で登場している単語なのに索引にないことが多い。

3. 過去問集
    - 解きまくる

4. 応用情報技術者試験ドットコム
    - 過去問集の解説だけだと理解できないことがよくあったので、このサイトの解説も一緒に見ていた。


## 勉強期間と内訳
1月〜10月（10ヶ月）

内訳：
　1月〜2月：キタミ式の本を読む
　3月：問題集を買って午前問題、午後問題をちょろちょろ解く
　4月：なにもやっていない
　5月：午前問題中心に解く
　6月〜8月：午後問題中心に解く
　9月：週末ちょっと多めに時間取って午前・午後を解く
　10月：試験

すみません合計９ヶ月でした

## 1日何時間やったの
- 1日3時間くらい
- 少ないと30分とか
- なんならやらない日もあった（嫌々やっても頭に入らないので）

## 午前問題のコツ
- ひたすら過去問を解きまくる
- なんなら答え覚えてもいいです

私は10年ぐらい遡りました。

## 午後試験のコツ
- 早いうちから自分の得意そうな大問を選んで、その種類の過去問を解きまくる
- 他の人は午後問題どれを選んでるかネットで調べる
- 時間配分を意識する

私は経済学科だったからなのか「経営戦略」とか「プロジェクトマネジメント」とかが入ってきやすかったです。

## その他やったこと
- フラッシュカードをつくって出先でもやる
- 何回も間違えるやつを紙に書いて壁に貼る
- 職場の先輩に過去問の質問

## おすすめ
- 基本情報受かったら速攻応用情報の勉強を始める
   →基本情報の記憶が新しいうちの方が覚えることが少ない
- 試験受けることを公言する
   →やらざるを得なくなります(笑)

## 試験前日
- 持ち物チェック
- 試験会場までの行き方をシミュレート（試験会場間違えたって人がTwitterでまあまあ居たのでまじで気をつけてください）
- **さっさと寝る**


## 試験本番（感想）
- 午前問題：まだ試験時間あるのにみんな解答提出してわらわら出ていくので焦る
- 午後問題：まだ試験時間あるのにみんな解答提出してわらわら出ていくので焦る

よそはよそ、うちはうちで気にせず時間いっぱい解きました。
AirbyteとGrafanaとAWSでデータを可視化する（デザイン編）

## はじめに

　私の現在の所属部署では、オブザーバビリティの一環として組織やサービスの各種KPIを自動で可視化することで、組織やサービスの状態をいつでも確認できるように進めています。  このためには利用している各種サービスや提供しているサービスからデータを収集、蓄積、加工、分析、可視化する基盤が必要となります。この基盤はKPIだけではなく様々なデータを収集し可視化する際の基盤として汎用的に利用することができます。
　本記事は各種データを可視化する基盤をどのように構成しているか、全体のデザインとその工夫点を説明します。

## 基盤のビジョン
- できるだけ簡単に構築、設定でき、継続的に改善できるようにする
- なるべく汎用的で安価にする
- エンジニアによるエンジニアのためのシステムにする

## 構成するためのサービス、ツール

- Airbyte: 各種サービスのデータを収集するOSS
- Grafana: データを可視化するOSS
- AWS
  - S3 : データを蓄積するストレージサービス
  - Glue : データを加工するサービス
  - ECS : AWS 上で Docker をマネジメントするサービス、Grafanaはこの上に立つ
  - Fargate : ECS のサーバレス基盤、EC2などのホストマシンが不要に
  - Athena: S3のデータをSQL likeに集計できるサービス

## システムアーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774545/fff45a76-0984-484c-452a-4ae5964da937.png)

- データ収集（ポーリングやバッチ収集）が必要なサービスは Airbyte で収集し、S3に格納。AirbyteはEC2上のDocker上に構築（[ECSに構築しない理由は後述](https://qiita.com/siwa/private/fe10f1a99b18c0828aa9#%E6%B3%A8%E6%84%8F%E7%82%B9)）
- S3に直接投入できるサービスのデータはそのままS3に格納
- AWS Glue でS3のデータをテーブル化
- データ加工が必要な場合はGlueで加工し、S3に蓄積
- Grafanaで可視化、GrafanaからAWS Athenaにリクエストし、S3のデータを可視化。GrafanaはECS で構築（Fargate利用） 
 
## 主要サービス説明

### Airbyte

https://airbyte.com/

- 最近ホットなデータ収集ツール（2020年創業わずか1年でシリーズAに到達、$26Mの資金調達成功）
- OSSでAWSなどにone lineでデプロイ、簡単に様々なデータ元からコネクタを通してデータを収集し指定したストレージ、DBなどに蓄積が可能
- [データ元は100種以上、先は30種以上](https://airbyte.com/connectors)
  - 主要なクラウドサービス、データベースに対応
  - マイナーどころも結構多い
- 収集を含む各種設定が楽(GUIベースで必要最小限)
  - source（データ元） -> destination（データ先） -> connection（接続）
    ![image.png](https://qiita-image-store.S3.ap-northeast-1.amazonAWS.com/0/774545/a2c778b9-55fb-3970-f0da-6a70d0d97b91.png)

##### 注意点
  - べータ版(コネクタによってはα版)なので注意
  - ECSなどのマネージドサービスに対応していない
    - Airbyte が、他の docker コンテナーを作成する必要があるため
    - 将来的には[対応予定](https://docs.airbyte.com/deploying-airbyte/on-aws-ecs/)

### Grafana

https://Grafana.com/

- デファクトな可視化ツール
- OSSで様々なデータの可視化に対応、プラグインも豊富
- Grafanaだけでもある程度色々なサービス元からデータを拾って可視化が可能
- AWS Athenaに対応しており、S3のデータを集計して可視化することもできる
  ![image.png](https://qiita-image-store.S3.ap-northeast-1.amazonAWS.com/0/774545/07b602e8-d108-ebad-b35f-c78d56174ac8.png)

### AWS Glue
- S3のデータを読み取りテーブル、構造化し、加工できるサービス
- クローラー：AirbyteがS3に入れたデータをテーブル化し、Athenaから読み取れるようにする
- ジョブ：S3のデータを読み取って加工、分析する。
  - パイプラインとして全体を構築して各種処理はGUIベースでもCodeベース（pyspark）で書くこともできる。 

### 構成の工夫点
- なるべくシステムをAWSに集約、自分たちで手を入れられるように（OSSを利用）
  - 外部サービス使うと社内の手続きや監査がめんどくさい面も
- AWS S3を利用してコストを低減（結構DB高いのでコスト削減）
- Glue を利用して、S3に蓄積されたデータを複雑な二次加工できるように、コードで書けるはエンジニアにとってかなり重要
- GrafanaからAthenaを通してデータを可視化する
  - SQL Likeに書けるのでAWSに精通してなくても新しい可視化用パネルを作れる

### おわりに

今回は構築するデータ可視化基盤の全体概要、アーキテクチャ、デザインを紹介しました。  
次回以降では具体的に各種サービスの構築手順を説明予定です。

# 商標
- AWSおよびAWSの各種サービスは、Amazon.com, Inc.またはその関連会社の商標です。
- 記載の会社名、製品名、サービス名等はそれぞれの会社の商標または登録商標です。
instanceが同一か確認。equals method

newした２つのinstanceを比較する
```Sample.java
public class Sample {
    int i;
}
```
```java
    public static void main(String[] args) {
        Sample s1 = new Sample();
        Sample s2 = new Sample();
        System.out.println(s1.equals(s2));
        s1 = s2;
        System.out.println(s1.equals(s2));
    }
```
```
false
true
```
ブラウザで音声ファイルを任意のタイミングで再生する方法

# 概要
　ブラウザで音声ファイルを再生する実装をする際に多くの場合は、`HTMLMediaElement`ベースの[audioタグ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio)や[Audio()コンストラクター](https://developer.mozilla.org/en-US/docs/Web/API/HTMLAudioElement/Audio)で事足りると思います。が、`iOS Safari16.0`では`Click Event`を都度拾わないと再生ができない状況に出くわしました。そこで本記事では、その回避策として[AudioContext](https://developer.mozilla.org/ja/docs/Web/API/AudioContext)を利用したWebブラウザで音声ファイルを任意のタイミングで再生する実装を以下に記します。(iOS Safari16.0, Android Chrome108で動作確認)

## 実装方法

```typescript
// WebKitを使えるように型拡張
declare global {
  interface Window {
    webkitAudioContext: typeof AudioContext
  }
}
/**
 * 一度のclickイベントの後なら自由に音声ファイルを操作できるようにするクラス
 */
export default class Sound {
  audioArrayBuffer?: ArrayBuffer
  soundPath: string
  constructor(soundPath: string) {
    this.soundPath = soundPath
  }
  /**
   * 音声ファイルをロードするメソッド
   */
  async load() {
    // audioデータをArrayBufferに詰める。
    // XMLHttpRequest, fetch() or FileReaderのどれかを利用すれば良し
    const audioResponse = await fetch(this.soundPath)
    this.audioArrayBuffer = await audioResponse.arrayBuffer()
  }
  /**
   * 音声ファイルを任意のタイミングで再生するメソッド
   */
  async playSound() {
    if (!this.audioArrayBuffer)
      throw new Error('load メソッドを実行してください。')
    const audioContext = new (window.AudioContext ||
      window.webkitAudioContext)()
    const source = audioContext.createBufferSource()
    source.buffer = await audioContext.decodeAudioData(
      this.audioArrayBuffer.slice(0)
    )
    source.loop = false
    source.connect(audioContext.destination)
    source.start(0)
  }
}
```

## 使い方
どこかで`Click Event`を受けた後に以下のように利用してください。おそらく、複数回`playSound`メソッドを叩いても動作するはずです。
```typescript
const soundPath = 'path'
const sound = new Sound(soundPath)
sound.load()
sound.playSound()
// ...何かの処理(Click Eventを受け取る必要なし)
sound.playSound()
```
insetプロパティでつくる上下左右中央揃え

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 23日目です。

inset プロパティを使ってみます

## inset プロパティとは

https://developer.mozilla.org/ja/docs/Web/CSS/inset

top, right, bottom, left を指定できるショートハンド。

## inset で作る上下左右中央

背景画像を置いたボックスを画面の上下左右中央に配置するようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/2ec0e325-116b-5ce2-74be-ee4cbb530d3b.png)

```html
<div class="wrapper">
  <div class="img-box"></div>
</div>
```

```css
.wrapper {
  height: 100vh;
  position: relative;
}

.img-box {
  position: absolute;
  inset: 0;
  margin: auto;
  width: 150px;
  height: 180px;
}
```

https://codepen.io/becolomochi/pen/gOjpbbg

### メモ

- 途中まで margin:auto を指定し忘れていた
    - 指定しないと中央に行かない
- top, right, bottom, left それぞれに 0 を指定せずに済むの楽だな


## 参考

- https://developer.mozilla.org/ja/docs/Web/CSS/inset
rails のヘルパーメソッドで yield を呼び出すと HTML が2重で表示される

Railsで「特定の条件の時だけ div 要素でラップする」みたいなヘルパーを作りました。

```rb
module MyHelper
  def wrap_if(condition, ...)
    # false の時は、何も加工せずにブロックで渡されたHTMLを描画したい
    return yield unless condition

    # true の時は div 要素でラップする
    tag.div(...) { yield }
  end
end
```

```erb
<%= wrap_if(@flag, class: 'wrapper') do %>
  <p>こんにちは！</p>
<% end %>
```

しかし、実際に動かしてみると、条件が `false` のとき、ブロックで渡したHTMLが2回描画されるという結果に・・・

```html:結果
<!-- false のとき2重で描画される。2回目は何故かエスケープされる -->
<p>こんにちは！</p>
&lt;p&gt;こんにちは！&lt;/p&gt;

<!-- true のときはOK -->
<div class="wrapper">
  <p>こんにちは！</p>
</div>
```

こういうときは `capture` を使って String オブジェクトに変換すると良いらしいです。

```rb
module MyHelper
  def wrap_if(condition, ...)
    content = capture { yield }
    return content unless wrap

    tag.div(content, ...)
  end
end
```

ドキュメント:
https://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-capture
【Django】個人的に好きなディレクトリ構成と設定方法

# はじめに
Django のディレクトリ構成を変更したい方は多いかと思います
個人的に下記のようになって欲しいので、その変更方法を共有したいと思います
・JavaScript, css の static ファイルを機能(app)単位でまとめたい
・機能(app)を apps のディレクトリ配下にまとめたい
　→ デフォルトでは、ルートディレクトリ直下になっているので、ごちゃっとしている…
・設定ファイル(setting.py等)関係のディレクトリ名を config に変えたい
　→ デフォルトでは、サイト名になっている!


#### 下記の環境を想定しています
```
- django 3.2.10
```


# もくじ
- 目指すディレクトリ構成
- setting.py の変更
- manage.py の変更
- asgi.py の変更
- wsgi.py の変更
- 参考サイト
- GitHub

# 目指すディレクトリ構成
app が apps 配下にまとまりスッキリ!!
static ファイルが app ごとに納まっている!!
設定ファイルのディレクトリ名が config に!!
```
src
│  manage.py
├─apps
│  └─sample
│      │  __init__.py
│      │  apps.py
│      │  urls.py
│      │  views.py
│      ├─static
│      │  └─sample
│      │      ├─css
│      │      │   sample.css
│      │      └─js
│      │           sample.js
│      └─templates
│          └─sample
│               sample.html
└─config
     __init__.py
     asgi.py
     settings.py
     urls.py
     wsgi.py
```

# setting.py の変更
下記の箇所を変更していきます。
※必要な個所のみ抜粋
```diff_python
# インポートを追記
+ import os
+ import sys

# ※下記より「BASE_DIR = Path(__file__).resolve().parent.parent」の記述以降に追記してください

# app を apps 配下にまとめておけるように下記を追記
+ sys.path.insert(0, os.path.join(BASE_DIR, "apps"))

# wsgi の配置を config ディレクトリ配下にするため下記を変更
- WSGI_APPLICATION = 'mysite.wsgi.application'
+ WSGI_APPLICATION = 'config.wsgi.application'

# ルートの urls を config ディレクトリ配下にするため下記を追記
+ ROOT_URLCONF = 'config.urls' # 

# static を app ごとにまとめられるように下記を追記
# 本番環境では static を一纏めにするので切替られるように分岐する
+ if DEBUG == False:
+    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

```

# manage.py の変更
下記の箇所を変更していきます。
※必要な個所のみ抜粋
```diff_python
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
```

# asgi.py の変更
下記の箇所を変更していきます。
※必要な個所のみ抜粋
```diff_python
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
```

# wsgi.py の変更
下記の箇所を変更していきます。
※必要な個所のみ抜粋
```diff_python
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
```



# 参考サイト
・[[Django] プロジェクト構成のベストプラクティスを探る - １．設定ディレクトリの名前を変更する](https://qiita.com/okoppe8/items/6227d753185fccf21c75)
・[Djangoプロジェクト構造のカスタマイズ（分割と構造化）](https://qiita.com/aion/items/ca375efac5b90deed382)
・[とほほのDjango入門 (settings.py)](https://www.tohoho-web.com/django/settings.html)
・[【開発効率up】アプリ開発でおすすめのディレクト](https://code-ship-blog.wemotion.co.jp/technology/%E3%80%90%E9%96%8B%E7%99%BA%E5%8A%B9%E7%8E%87up%E3%80%91%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88/)

# GitHub
ひな形として使えるものを置いておきます
[https://github.com/tsk1000/django_seed-docker](https://github.com/tsk1000/django_seed-docker)


# おわりに
小～中規模くらいで使った実績があります。
ぶっちゃけその規模ならどんな形になっていようが把握出来るので拘る必要ない気も…
IDEやツールのペインを慣れてる位置に変えちゃう感覚に近いかも!!
Integerクラスについて。

Stringからintへの変換
```java
    public static void main(String[] args) {
        Integer i1 = Integer.valueOf("2");
        int i2 = i1.intValue() * 3;
        System.out.println(i2);
    }
```
```
6
```
Integerからintはunboxingのため、intValue()は省略できる
```java
    public static void main(String[] args) {
        Integer i1 = Integer.valueOf("2");
        int i2 = i1 * 3;
        System.out.println(i2);
    }
```
```
6
```
IntegerのConstructorでもString→intできる
```java
    public static void main(String[] args) {
        Integer i1 = new Integer("2");
        int i2 = i1 * 3;
        System.out.println(i2);
    }
```
```
6
```
"a"をintに変換しようとするとExceptionが発生
```java
    public static void main(String[] args) {
        Integer i1 = new Integer("a");
        int i2 = i1 * 3;
        System.out.println(i2);
    }
```
```
Exception in thread "main" java.lang.NumberFormatException: For input string: "a"
```
なお、valueOfに似たものでparseIntがある。return typeがint。
```java
    public static void main(String[] args) {
        int i1 = Integer.parseInt("2");
        int i2 = i1 * 3;
        System.out.println(i2);
    }
```
```
6
```
Blazorで何故かIConfiguration(ConfigurationManager)のDIができない(ビルドエラー：CS1929：'IConfiguration' に XXX の定義が含まれておらず、最も適している拡張メソッド オーバーロード YYYYY には 'IConfiguration' 型のレシーバーが必要です)

## コード
```csharp
@page "/IConfiguration"
@using Microsoft.Extensions.Configuration
@inject IConfiguration config;

pg_con = @connection_str

@code {
    private string? connection_str;

    protected override void OnInitialized() {
        connection_str = config.GetConnectionString("db_con");
    }
}
```

# ビルドエラー
:::note alert
- 重大度レベル：エラー (アクティブ)
- コード：CS1929
- 説明：'IConfiguration' に 'GetConnectionString' の定義が含まれておらず、最も適している拡張メソッド オーバーロード 'ConfigurationExtensions.GetConnectionString(IConfiguration, string)' には 'IConfiguration' 型のレシーバーが必要です
:::

## 【変更前】
IConfiguration.razor　→ 上記ビルドエラー

## 【変更後】
Iconf.razor　→ ビルドエラー解消

# 何故…？
razorのファイル名っての制限あるん？ドキュメント探しても見当たらん(´･ω･`)
OCI Container Instanceが出来ること・出来ないこと（2022/12/22時点）

OCIに2022年12月にGAされたばかりのContainer Instanceについて、現時点で出来ること出来ないことをまとめました。

# 概要：Container Instanceとはなにか
一言でいうと、サーバレスコンテナです。
サクッと立ち上げて、すぐ破棄できるのが最大のウリです。

- 数秒でコンテナとコンテナ実行用のVMをデプロイ可能
- k8sなどのオーケストレーションの知識は不要
- （Container Instanceが実装されている）VMの管理、パッチ適用等は不要
- オーケストレーションはしない

VPC・サブネットの作成も含め、下の構成が作成可能です。
![container_Instance構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/90dfc588-8c86-fe61-8037-242cf0384c01.png)



# ユースケース
- 作成したコンテナの動作テスト
- 開発 / テスト環境
- ジョブ実行用コンテナ
    - Functionsだと制限時間超えそうな処理の実行など
- コンテナの学習用実行環境


# 出来ること
- コンテナの作成
    - デフォルトはOCR（Oracle コンテナレジストリ）とDocker Hub
    - もちろん、外部レジストリサービスも指定可能
- 環境変数の設定
- 起動オプションの設定
- CPUとメモリの指定
    - 2vCPU～128vCPU
    - 1GB～1024GB
- パブリックIPアドレスを付与
- 15GBのエフェメラルストレージが付与
- コンテナログ出力
    - コンテナで確認
    - APIによる取得も可


# 出来ないこと（2022年12月22日時点）
- LoadBrancerのバックエンドに指定
- 永続ボリューム未対応
- 追加・変更が必要な場合は基本作り直し
    - 起動後のCPUとメモリの変更
    - パブリックIPの有無
    - コンテナの追加
- スケーリング
- コンテナへの直接ログイン
- プライベートサブネットでの作成


# まとめ
サクッとコンテナ立ち上げるのは本当に快適で便利です。
本番ワークロード用のOKEとの使い分けですね。

今は出来ない部分も、これからのアップデートに期待です。

・PS
筆者はJupiter Notebookサーバ立ち上げて遊んでます。
![jupyter_notebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/c68fc583-8897-77a8-5f7d-736dec1b59e3.png)
webサーバをubuntuにしたらlogrotateできなくなった

# はじめに
WebサーバをCentOSからubuntu22.04に引っ越しをしたらlogrotateがうまく動かなくなりました。
「/usr/local/apache/logs」とフォルダを作成してログを書いていたけど
```
Xxx  X 00:00:00 webt3-1 logrotate[96234]: error: failed to rename /usr/local/apache/logs/access_log to /usr/local/apache/logs/access_log.2022XXXX: Read-only file system

```
Read-only file systemだから書けなくて怒っていました。

# 原因
検索してみるとlogrotateのsystemdユニットファイルの設定に「ProtectSystem=」があり、
その設定がCentOSだと
```
$ systemctl show logrotate.service --property ProtectSystem
ProtectSystem=no
```
でしたがUbuntu22.03だと
```
$ systemctl show logrotate.service --property ProtectSystem
ProtectSystem=full
```
になっています。「ProtectSystem=full」になっているので「/usr」などが読み込み専用でマウントされるらしいです。
https://askubuntu.com/questions/1275668/logrotate-succeeds-when-manually-run-as-root-but-fails-with-read-only-file-sys

# 対応
```
$ cat /lib/systemd/system/logrotate.service

[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
RequiresMountsFor=/var/log
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

# hardening options
#  details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
#  no ProtectHome for userdir logs
#  no PrivateNetwork for mail deliviery
#  no NoNewPrivileges for third party rotate scripts
#  no RestrictSUIDSGID for creating setgid directories
LockPersonality=true
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectClock=true
ProtectControlGroups=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectSystem=full
RestrictNamespaces=true
RestrictRealtime=true
```
/lib/systemd/system/logrotate.serviceの「ProtectSystem=full」をCentOSと同じく「ProtectSystem=no」に変更するとCentOSと同じくかけると思います。
しかし、せっかくある設定なので生かしたいので
logrotate.serviceファイルの一番下に「ReadWritePaths=/usr/local/apache/logs/」を追加します。
すると、ログを書くフォルダだけWriteが出来るようになります。

# 最後に
CentOSとubuntuは結構違うなと思いました。
Cognos Framework Managerで同じテーブルを複数回取り込む

CognosのFramework Managerでモデリングをしている時に、同じテーブルを別のデータベースクエリーサブジェクトとして複数回取り込みたいときの方法について紹介します。

知ってれば簡単な方法なので気張らず読んでもらえたらと思います。

# よくある要件

ありそうな要件としては、下記の2ケースが多いと思います。

１．汎用区分マスタのように一つのテーブルに複数の意味合いの情報を持つテーブルがあった際などに、Framework Managerでそれぞれの区分用のデータベースクエリーサブジェクトをビューの用に作成し、トランザクションのクエリーとリレーションを定義する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/f7aee27c-3c73-96a2-b0d4-d5f89b9f1ad2.png)

２．Cognosサンプルでもあるように、トラン側で「注文日」と「発送日」というカラムを持っていてそれぞれカレンダーマスタと紐づけたいが、同じカレンダーマスタに対してリレーションを作成するとモデルがめちゃくちゃになるので、カレンダーマスタのクエリーを2つ作成したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/39ab5693-8170-25d4-057c-24cbc5612270.png)



# 複数回取り込む方法

では、ここからはどのように同じテーブルを複数回取り込むかについて紹介します。
Framework Managerでメタデータウィザードを実行し、取り込む対象のテーブルを選択します。
メタデータウィザードの「インポートして一意の名前を作成」にチェックをいれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/40d9feee-79d5-a021-263e-68f2d20b38b5.png)


これで完了です。
あとは普段と同じようにメタデータウィザードを進めてテーブルの情報をインポートします。

そうすると、別名でデータベースクエリーサブジェクトが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/fd35e8e3-6e24-80f4-ea5e-5e62cb615a83.png)

上記の１．のパターンのように取得するデータを絞る場合は、データベースクエリーサブジェクトのSQL定義を更新し、where句を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/ba2607d7-2d81-0236-f896-cbaf6f1f1653.png)



# さいごに

メタデータウィザード実行中にオプションを1箇所変更するだけという簡単な操作ですが、
知っているのと知らないのとでFMでモデルする時の効率が格段に変わるのでぜひ覚えておいてください。


# 自己学習記事一覧

Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト
https://qiita.com/shinyama/items/95885c7246dc413b6448
必要最小限のjupyter_lab_config.pyを作る

　JupyterLabで、初期ディレクトリと起動ブラウザを指定するだけの`jupyter_lab_config.py`を作るPythonコードです。

```python
import os


def generate_config():
    user = os.environ.get("USER")  # Ubuntuの環境変数
    username = os.environ.get("USERNAME ")  # Windowsの環境変数
    if user:  # Ubuntu
        config_list = [
            "c = get_config()",
            f"c.ServerApp.notebook_dir = '/home/{user}/Documents/'",
            "c.ServerApp.browser = '/usr/bin/google-chrome-stable --args --app=%s --start-maximized'",
        ]

        config_file = f"/home/{user}/.jupyter/jupyter_lab_config.py"

    elif username:  # Windows
        config_list = [
            "c = get_config()",
            f"c.ServerApp.notebook_dir = 'C:/Users/{username}/Documents'",
            "c.ServerApp.browser = '\"C:/Program Files/Google/Chrome/Application/Chrome.exe\" --app=%s --start-maximized'",
        ]

        config_file = f"C:/Users/{username}/.jupyter/jupyter_lab_config.py"

    else:
        return

    with open(config_file, "w") as f:
        f.write("\n".join(config_list))

    with open(config_file, "r") as f:
        print(f.read())

    return


generate_config()
```
【Heroku】manage local git repository for app エラーの解決方法とは...！？

# エラー内容
* gitを使用したherokuでのデプロイで`manage local git repository for app`というエラーメッセージが表示された。
    * エラー詳細

```terminal
manage local git repository for app

USAGE
  $ heroku git:COMMAND

COMMANDS
  git:clone   clones a heroku app to your local machine at DIRECTORY (defaults to app name)
  git:remote  adds a git remote to an app repo
```

# 原因
* 「`manage local git repository for app`」と調べても全然記事が出てこない...何なんだこれは、、、

と思ってよくよくコマンドを確認したら凡ミスでした。

↓ターミナルに打ち込んでいたコマンド↓
```terminal
heroku git push heroku main    
```

なんと！
頭にherokuがついていた！！！汗
（他のherokuコマンドで勝手に頭につける癖がついていた模様...）

# 解決方法
```
git push heroku main
```
* 上記コマンドで無事に解決。めでたしめでだし。