OmniAICreator/Qiita-1.07M huggingface dataset:
WEBエンジニアに転職して半年を振り返って

こんにちは！未経験からエンジニア転職した『まさきち』です。
異業種からエンジニア転職して６ヶ月経ちましたので業務や感じた事などを振り返ろうと思います。

この記事は2ヶ月〜6ヶ月目までの振り返りです。
エンジニア転職するまでと1ヶ月の振り返りは下記の記事に書きましたので
合わせて読んでいただけると嬉しいです。

https://qiita.com/masakichi_eng/items/be6604f78ebf90f5df69

## 2ヶ月目
研修も終わり、2ヶ月目から本格的に業務に入っていきました。
保守作業から始まり、まずは環境構築から。受託の会社などで抱えている案件も業界問わず多く、開発環境の構築やお客様の業務の理解をするのが大変だった記憶があります。

保守作案件の一つの作業で、新規機能の追加を任されました。
お客様の要望をヒアリングして、実現するにはどの様な実装をすれば良いか考える作業は頭を悩ませましたが、本番リリース後に自分の追加した機能が使われてお客様にフィードバックをいただけた時は胸にこみ上げてくるものがありました。


## 3ヶ月目
新規開発案件のメンバーとして入れることに。
1から進めていくので、開発ってこういう風に進めるのかーと開発手法の経験にもなりました。

React×TypeScript×Laravelとモダンな技術に関わることが出来てモチベが上がりました。
ReactやTypescriptはあまり触ったことがなかったので、Udemyや書籍などを購入してひたすら勉強。
(型定義やコンポーネントの粒度、状態管理など難しくて結構詰まりました。)

Laravel側は、今思えばクリーンアーキテクチャ等を採用していたのですが、当時はシングルアクションコントローラー？、アクション？、データクラス？、リソース？と自分にとって新しい言葉や考え方が多く出てきて、理解が追いついていませんでした。先輩の実装を見ながらついて行くのに必死でした。

## 4ヶ月目
この辺りは辛かった...
ざっくりご説明すると、外注さんにお願いしている検証案件の管理をするという案件なのですが、仕様書作成、整理作業、内容が間違っていないかのチェック...etc
エクセルやスプレッドシートを駆使しての作業が多かったので、あまりプログラミングに関われない時間が多く、開発をしたい私にとっては苦でした。

## 5ヶ月目
インフラの保守作業を主に行っていました。
アクセスログの解析やミドルウェアアップグレードなどです。

アクセスログの解析ではLinuxコマンドでユーザーエージェントから情報を抽出して検証する作業を行い手順書を作成したり、結果を報告書としてまとめて、お客様に提出したりしました。awkコマンドなど今まで使ったことのないコマンドやLinuxについて理解が深まったと思っています。

ミドルウェアのアップグレードではPHPのバージョンを上げる作業を行いました。
今までは新しいアプリをデプロイしたことはあるものの、現在動いているシステムをのバージョンを上げるという一つ間違えれば取り返しのつかない事になる作業だったので緊張しました。
事前にローカルで環境構築して検証したり、ステージ環境で検証したり、本番VMをクローンしたり、万全の体勢で臨みましたが、本番反映時は冷や汗が凄かったです。本番のシステムを触る時にどういう調整が必要(お客様との調整等)かを知ることが出来たのでそこも大きな学びでした。

## 6ヶ月目
APIの実装案件に入りました。
小規模の案件ですが、要件定義→実装→デプロイまで自分で考えて進めるという案件です。
いわゆる上流工程の作業もあるのですが、最初は何から手をつけて良いのか全くわからず、上司にアドバイスをもらいながら進めていきました。
全ての工程を自分ごととして関わることが出来るので多くのことを吸収できると思ってます。
上流工程については書籍などでもっと理解を深めないといけないと思っています。

## 終わりに
振り返りは以上になります。引き続き頑張っていこうと思います。最後まで読んでいただきありがとうございました。
100日後くらいに個人開発するぞ！day013

## 今日はメッセージ部分を作ってみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/b746b736-7cf3-4e0b-eed0-0fc5c7b921ce.png)

## 今日のアウトプット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/8c6aee06-1e0f-679b-f32c-31d37ff1edf7.png)


## 今日の学び

### 影をつける方法
- box-shadowプロパティを用いて「影の位置」と「影の色」を指定することで影をつけることができます
    - 例：20px左で10px真下に黒の影を付けたい場合
        - `box-shadow:20px 10px #00000d`

### マウスのカーソルの形を変える方法
- cursorプロパティを用いることでマウスのカーソルが要素に乗った時の形を変えることができる
    - 例：I字型のカーソルに変えたい場合
        - `cursor:text;`
    - 例：指型のカーソルに変えたい場合
        - `cursor:pointer;`
    - 例：矢印型のカーソルに変えたい場合
        - `cursor:default`

### クリック時に変化をつける方法
- セレクタに:activeを用いると要素がクリックされる間のCSSを指定できる

    - 例：クリック時にbuttonクラスの影を無くして要素を10px下げたい場合
        - `.button:active{`
        - `box-shadow:none;`
        - `position:relativel;`
        - `top:10px`

- プロパティにnoneを指定することでCSSを打ち消すことができる
    - 例：影を消したい時
        - `box-shadow:none`
- `position:relative`を用いることで要素の位置を変えることができる
    - 例：要素を下に5px左に10px動かしたい時
        - `position:relative`
        - `top:5px;`
        - `left:10px;`
Qiita の記事で、単語に下線を引く方法

# Qiita の記事で、単語に下線を引く方法
【方法】
下記の様に書けばよい。
\<INS>下線\</INS>

【結果】
<INS>下線</INS>

【参考】
https://qiita.com/APO/items/f2212bee7f0b2c69228f
Combineを用いた非同期処理の直列・並列実行

## はじめに
Playground環境で実行しています。

## 準備
### 非同期処理を実行する関数の定義
``` Swift
func fetchA() -> Future<String, Error> {
    return Future<String, Error> { promise in
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            promise(.success("Aを取得"))
        }
    }
}

func fetchB() -> Future<String, Error> {
    return Future<String, Error> { promise in
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            promise(.success("Bを取得"))
        }
    }
}

func fetchC() -> Future<String, Error> {
    return Future<String, Error> { promise in
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            promise(.success("Cを取得"))
        }
    }
}
```
この３つの関数を直列・並列で実行します。

## 直列実行
``` Swift
fetchA() 
    .flatMap(maxPublishers: .max(1)) { _ in fetchB() }  // fetchAの結果はクロージャの引数
    .flatMap(maxPublishers: .max(1)) { _ in fetchC() }
    .eraseToAnyPublisher()
    .sink { completion in
        switch completion {
        case .finished:
            print("finished")
        case .failure(_):
            print("failure")
        }
    } receiveValue: { value in
        print(value)
    }
    .store(in: &cancellable)
```
maxPublishersは同時に実行できる処理の数です。１を指定すると、同期的(順番どおり)に実行されるようです。
詳しくは[CombineのflatMapで実行数を制御する](https://qiita.com/yimajo/items/f8968c1936a921a72a17)を参照してください。

maxPublishersの性質を利用すると、こういった書き方もできます。
``` Swift
let publishers = [
    fetchA(),
    fetchB(),
    fetchC()
]

publishers
    .publisher
    .flatMap(maxPublishers: .max(1)) { $0 }
    .eraseToAnyPublisher()
    .sink { completion in
        switch completion {
        case .finished:
            print("finished")
        case .failure(_):
            print("failure")
        }
    } receiveValue: { value in
        print(value)
    }
    .store(in: &cancellable)
```
ただし、この書き方の場合は直前の処理の値を利用できないので、注意が必要です。

## 並列実行
``` Swift
let publishers = [
    fetchA(),
    fetchB(),
    fetchC()
]

publishers
    .publisher
    .flatMap(maxPublishers: .max(publishers.count)) { $0 }
    .eraseToAnyPublisher()
    .sink { completion in
        switch completion {
        case .finished:
            print("finished")
        case .failure(_):
            print("failure")
        }
    } receiveValue: { value in
        print(value)
    }
    .store(in: &cancellable)
```
今回は３つの処理を同時に実行したいのでmaxPublishersにpublishers.count(この例では3)を指定します。

全てが完了したときの処理は`case .finished`内に書くといいと思います。
エラーが流れてきた場合は`case .failure`が実行されて、`.finished`は実行されません。

## エラー処理
非同期処理の返り値をResult型に変換し、
sink内で成功/失敗に応じた分岐処理を書きます。

### 並列処理における例
```swift
publishers
    .publisher
    .flatMap(maxPublishers: .max(3)) { $0 }
    .map { Result.success($0) }
    .catch { Just(Result.failure($0)) }
    .sink(receiveValue: { result in
        switch result {
        case .success(let response):
            print(response)
        case .failure(let error):
            print(error.localizedDescription)
        }
    })
    .store(in: &c)

```


エラー処理は、下記の記事を参考にしました。
[[Swift] Combine の flatMap で failure になると、以降は値が流れなくなる問題に対処する](https://qiita.com/hcrane/items/76d6a91d58459373eb0f)

## 終わりに
Combineで楽しい非同期処理ライフを！！
Heroku でのDBをリセットしシードデーターを投入する手順

```
この記事の環境
mac OS
Rails 6.0.3
ruby 3.0.1p64
```

gitの変更内容をherokuにpushsする
```
　git push heroku step5:master
```

新たにカラム追加やデータ内容を変更する為。データーベースリセットをする　。
```
 heroku pg:reset -a myapp
```

マイグレーション実行
```
heroku run rake db:migrate
```

seedデータ投入
```
heroku run rails db:seed
```

おまけ
データーベースの詳細が取得できるコマンド
heroku pg -a アプリ名
```
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           1/20
PG Version:            14.2
Created:               2022-04-11 15:14 UTC
Data Size:             9.2 MB/1.00 GB (In compliance)
Tables:                6
Rows:                  -6/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-rugged-59538
heroku pg:psql -c "\d" 
--> Connecting to postgresql-rugged-59538
                     List of relations
 Schema |         Name         |   Type   |     Owner      
--------+----------------------+----------+----------------
 public | ar_internal_metadata | table    | xzdtgqyfhtvpwu
 public | labels               | table    | xzdtgqyfhtvpwu
 public | labels_id_seq        | sequence | xzdtgqyfhtvpwu
 public | schema_migrations    | table    | xzdtgqyfhtvpwu
 public | taggings             | table    | xzdtgqyfhtvpwu
 public | taggings_id_seq      | sequence | xzdtgqyfhtvpwu
 public | tasks                | table    | xzdtgqyfhtvpwu
 public | tasks_id_seq         | sequence | xzdtgqyfhtvpwu
 public | users                | table    | xzdtgqyfhtvpwu
 public | users_id_seq         | sequence | xzdtgqyfhtvpwu
```
juliaの多重ディスパッチのありがたみをpythonと比較しながら理解する

## juliaの多重ディスパッチのありがたみをpythonと比較しながら理解する

プログラミングを学び始めた頃、同じ関数の名前でも引数の型によって関数を区別できる多重ディスパッチのありがたみがピンとこないことがあった。
そこで、本記事は、juliaとpythonと比較することで多重ディスパッチのありがたみについてまとめた。
また、多重ディスパッチした際の関数の実行速度についても少し触れる。

## python

以下のpythonコードを見てみる

```python
def f(x: int):
    return x

f(1) #1
#以下も通す
f(1.0) #1.0
f("1") #'1'

```

このようにpythonでは関数の引数に入る変数の型が違くても関数を通してしまう。

また、同名の関数が定義された場合、最後に定義された関数が実行される。

```python
def f(x: int):
    return x

def f(x:str):
    return x + x

#この場合、最後に定義されたfが実行される
f(1) #2
f("a") #'aa'
```

## Julia

多重ディスパッチが使えるjulia言語は、引数の型に応じて、同一の名前の関数のうちのどれを呼出す（ディスパッチする）かを決定することができる。

具体的には、

```julia
function f(x::Int)
    return x
end

f(1) #OK
f(1.0) #エラー
f("1") #エラー

```

このように、型に応じて関数を実行し、定義されていない型に対してエラーを吐くことができる。
また同名の関数が複数定義されている場合、型に応じて関数を選択的に実行できる。

```julia

function f(x::Int)
   return x
end

function f(x::String)
    return x*x
end

f(1) # 1
f("a") # "aa"
```
このように同じ名前の関数を定義でき、引数の方に応じて選択的に実行してくれる。

## 速度について

- 多重ディスパッチを使ったと言って速くなるわけではない。

- 関数の引数の型注釈は、計算の速度に影響しない


例えば、以下の２つの関数は同じ速度である。


```julia
f(x,y) = x +　y
f(x::Int, y::Int) = x + y
```

f(2, 3) が入ると内部で f(x::Int, y::Int) 用の実装がJITコンパイルされる. 一回コンパイルされればその結果を保持する．
f(-1, -4) のように別の値が渡されても `f(x::Int, y::Int)` の情報をもとに実行される。

詳しくは、こちらを参照。
https://docs.julialang.org/en/v1/manual/types/#man-abstract-types



## おまけ
おまけ的に、juliaの多重ディスパッチの具体例を２つ紹介して終わりたい。

例1)引数の一番目をとってくる関数

```julia
module MyPkg
    function get_begin(x::AbstractVector)
   　　　　 return x[1]
　　　end

    function get_begin(x::Int)
　　　　    x = [x] #　配列にしている。
　　　　    get_begin(x)
　　　end

end


using .MyPkg

julia> MyPkg.get_begin(1) 
julia> MyPkg.get_begin([3,2,1])
```

例２）Plots
Plotsも同名の関数の名前で定義されており、引数に応じて異なる振る舞いを実行している。

```julia
using Plots

plot(sin)

plot(cos, sin, 0, π, aspect_ratio=:equal)

plot([x -> x^n for n in 1:2:10], xlim=[-2,2])
```

## まとめ
多重ディスパッチについて例を通して理解を深めた。
Franklin.jlを使って自分のウェブサイトを作る話

# Franklin.jlを使って自分のウェブサイトを作りたい

Franklin.jlを使って簡単にWebサイトを作れるみたいです。以下のサイトを参考に作成したところ、途中でちょっと詰まった箇所があったので備忘録としてまとめておきます。

https://zenn.dev/terasakisatoshi/articles/7ad20e468d9ed7


基本的には記事に書いてあることを実行して、Webページを作ります。しかし、途中の実行結果がうまく表示されない事態が起こりました（以下の図を参照）

![franklin (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224085/f657e50e-945b-af3f-e311-4dfa6468f3ef.jpeg)


あれ、何かおかしい。。

原因は、config.mdのファイルがデフォルトのままになっていたことでした。解決するには、config.mdのファイルを自分のウェブサイトのURLに設定する必要がありました。
例えば私の場合、

```md
@def website_title = "Rihito Sakurai's website" @def website_descr = "website" @def website_url = "https://sakurairihito.github.io"

@def author = "Rihito Sakurai"

@def mintoclevel = 2

@def ignore = ["node_modules/", "franklin", "franklin.pub"]

\newcommand{\R}{\mathbb R} \newcommand{\scal}[1]{\langle #1 \rangle}

```

にする必要があります。

また、githubアクションでpushをトリガーに自動でWebページが更新されるようにします。
設定でsourceをgh-pagesに変更します。

Deploy.ymlは以下のように設定しました。（ほぼデフォルトのままです）

```yaml
name: Build and Deploy
on:
  push:
    branches:
      - master
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2
      with:
        persist-credentials: false
    # NOTE: Python is necessary for the pre-rendering (minification) step
    - name: Install python
      uses: actions/setup-python@v2
      with:
        python-version: '3.8'
    # NOTE: Here you can install dependencies such as matplotlib if you use
    # packages such as PyPlot.
    # - run: pip install matplotlib
    - name: Install Julia
      uses: julia-actions/setup-julia@v1
      with:
        version: 1.6

    - name: Install dependencies listed in Project.toml and build package
      uses: julia-actions/julia-buildpkg@master
    # NOTE
    #   The steps below ensure that NodeJS and Franklin are loaded then it
    #   installs highlight.js which is needed for the prerendering step
    #   (code highlighting + katex prerendering).
    #   Then the environment is activated and instantiated to install all
    #   Julia packages which may be required to successfully build your site.
    #   The last line should be `optimize()` though you may want to give it
    #   specific arguments, see the documentation or ?optimize in the REPL.
    - run: julia --project -e '
            using NodeJS, Franklin;
            run(`$(npm_cmd()) install highlight.js`);
            optimize(minify=true, prerender=true, clear=true)'
            
    - name: Build and Deploy
      uses: JamesIves/github-pages-deploy-action@releases/v3
      with:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        BRANCH: gh-pages
        FOLDER: __site
```

あとは、自分なりのHPを作ればよさそうです。

## 参考記事

https://zenn.dev/terasakisatoshi/articles/7ad20e468d9ed7
【メモ】プログラミング上達に向けた


- 一番簡単な具体的な例を通してそれを理解する。


- コピペはしない


- よくわからないコードは適当に数字を変えて動かしてみる



- 単体テストを書くこと

- 人に頼ること。

- 自由に楽しめるようになるには猛練習する必要があるから、毎日コードに触れる

- 既存コードにテストを書いて、今からこの変更加えたらこのテストが壊れるはず、みたいなのは先行して書く

- 公式ドキュメントを読む。（英語、活字を読む癖をつける。）

- 公式ドキュメントを例に出してまずはそれが動くかどうか確認してみる。その上で自分なりのテクニッ


- 自分の書いたコードに責任を持つ。
Apache AirflowのDAG設定値についてまとめてみる

　前回Cloud Composerを利用して、BigQueryへのデータの取り込みについて記事を書きましたが、DAG実装の詳細（特に各パラメータの役割）については、記事が長くなりすぎるので割愛しました。なので今回から複数回に渡って、以下の内容を深堀りしていこうと思います。

- DAGの設定値について（今回分）
- テンプレート内で利用可能な変数について

## DAGとオペレータについて
　細々した話をする前に、まずはDAGとオペレータの概略からまとめてみました。
|構成要素|概要|
|---|---|
|オペレータ|処理を定義するための関数。クラウド操作毎に細かく用意されているため、自身がやりたい処理のオペレータの利用方法を調べる必要がある。前回BigQueryへのデータ取り込みで使用したオペレータは、「GoogleCloudStoragePrefixSensor」、「GoogleCloudStorageToBigQueryOperator」、「DummyOperator」です。|
|DAG|オペレータから定義された処理＋処理同士の前後関係の情報をもった処理のグループのことです。|

　下の画面を例にすると、実行完了している濃い緑で囲われた部分がオペレータで定義された処理、赤枠で囲われた処理全体（処理の前後関係を含む）がDAGとなります。
![Composer12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541501/63735b57-d009-db81-bef8-9718d178f994.jpeg)

## DAGの設定一覧
　よく使うものをピックアップしました。
|パラメータ  |概要  |
|---|---|
|dag_id  |DAGをユニークに区別するID。  |
|description  |Web管理画面などで表示するDAGの概要説明。  |
|schedule_interval   |DAGの実行頻度を定義。最新のタスクインスタンスのexcecution_date（次回説明予定）に、schedule_intervalを足すと次回の実行スケジュールとなる。   |
|start_date|DAG実行を開始する日付。|
|end_date|DAG実行を終了する日付。|
|default_args|DAG内の演算子を初期化する時のパラメータとして利用される辞書型変数。DAGの初期化時に指定するが、設定対象はDAGではなく各オペレータであることに注意。|
|params|DAG内で利用可能な辞書型変数。テンプレートからのアクセスも可能。|
|catchup|過去に遡ってスケジュールのキャッチアップを行うかどうか、最新のものだけスケジュールするか？（デフォルト値はTrueで、キャッチアップする）|
|on_failure_callback|タスクの正常終了時に実行する関数を定義します。|
|on_success_callback|タスクの異常終了時に実行する関数を定義します。|

　他にも細かいものはたくさんありますが、ここでは省きたいと思います。詳細は、Apache Airflowのドキュメントの以下の部分を参照してください。

- DAG：[DAGの仕様](https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/dag/index.html?highlight=dag#module-airflow.models.dag)
- オペレータ（default_args）：[BaseOperatorの仕様](https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/baseoperator/index.html?highlight=baseoperator#module-airflow.models.baseoperator)

　設定値によってDAGの挙動が変わるので、自身がどのような設定をしたのかしっかり把握しておく必要があります。特に障害発生/対応時に、「思った動作と違う・・・」となりがちなので、そうならないようにしっかり理解しましょう！

## 最後に
　次回は、テンプレートで利用するマクロの紹介をしていきたいと思います。特に、タスクの再実行時に便利なexecution_dateを中心にして説明します。
【メモ】バグが出た時の対処方法


# バグが出た時の対処方法について

デバッグはプログラミングをする上で避けて通れない道なので、自力が解決する力が必要とされる。プログラミング初心者の頃は、エラーコードを見ると思考が停止してしまいがちなので、どのようにバグに対して対処するのか心構えをメモしておく。

バグを解決する方法をいかに書く。

- まずバグが出たら、エラーメッセージをよく読む。（たいてい、ERRORみたいに書いてあることがある）

- ERRORが起きている前後のコードを理解し、なぜエラーが起きているのか試行錯誤する。

- エラーメッセージを検索する。ここで単純にエラーメッセージを検索する場合（過去に同じ問題を誰かが解決してくれている場合など）もあれば、解決しない場合もある。


- GitHub の検索機能を使う。

下のようにエラーメッセージの単語を検索することができ、これも解決のヒントになることがある。

![githubf_serch_bug.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224085/fd25acdc-43c9-7829-3637-578ef0417f63.jpeg)


- Giuhubのissuesを見る

例えば、何かのインストールに失敗した場合、その何かのgithubがあれば、そのissuesを見れば、解決策が書いてあることがある。


## 数値計算系のバグ

### エラーの原因がどこかよくわからない場合、

- エラーの箇所を特定するために、コードを分割していく。

- 最小単位に分けることで、エラーの原因が特定しやすくなる。どこでうまく行かないのか、小さくした範囲で探すとエラーが見つけやすい。


### 予期しない結果が得られる場合

- 本当に予期しない結果なのかをよく確かめる。期待した変化が見られない場合、それが全く変化がないのか、少しだけ変化があるのかを見る。問題にもよると、最初の方は値が変わらないことがあるので、途中の値に着目すると良い。


### アルゴリズムの手順を確かめる

- 代入されているものが本当に正しいのかを調べる。
Dash.jl使ってみた


# Dash.jl入門

数学の可視化をWebアプリを使って構築することができます。本記事では通常のプロットで作るgif動画とDash.jlを比較してみます。

Dash.jlについては、以下の記事を一読すると良いです。
https://terasakisatoshi.github.io/MathSeminar.jl/slideshow/dash/build/#2


## Plots
指数関数をテイラー展開したものをプロットしてみる。


```julia
using Plots

function exp(x,N)
    s=1
    for n in 1:N
        s+= 1/factorial(big(n)) * x^n
    end
    return s
end
 
plot(x->exp(x,3))
```

![exp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224085/709f9fd8-fb76-87a9-0fc5-72bb00192780.jpeg)


```julia
p = plot( xlim=(-3,3),legend=:topleft)
plot!(p, exp, label="e^x") #expという関数がデフォルトである。それが呼び出される
for N in 0:5
    plot!(p, x->f_3(x,N), label=string(N))
end
plot(p)
```

![gif.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224085/b78b4f7a-e8d6-0788-d74d-d32cb0144e08.jpeg)



gifを作成する。

```julia
p = plot( xlim=(-10,10),legend=:topleft)
plot!(p, exp, label="e^x") #expという関数がデフォルトである。それが呼び出される
anim = @animate for N in 0:20
    plot!(p, x->f_3(x,N), label=string(N))
end
plot(p)
```

![tmp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224085/7bf520bd-f7e6-da7c-9388-b4d528838417.gif)




## Dash.jl

Plotの部分は、PlotyJSを用いた。
https://plotly.com/julia/line-charts/

```julia
using Dash
using PlotlyJS

function exp_t(x, n)
    s = 1
    for i in 1:n
        s += 1 / factorial(big(i)) * x^i
    end
    return s
end

function expplot(n)
    x = 0:0.01:1
    y = []
    for i in x
        push!(y, exp_t(i, n))
    end
    trace1 = scatter(x = x, y = y)
    trace2 = scatter(x = x, y = exp.(x))
    p = plot([trace1, trace2])
    p.plot

end

app =
    dash(external_stylesheets = ["https://codepen.io/chriddyp/pen/bWLwgP.css"])

app.layout = html_div(style = Dict(:width => "50%")) do
    html_h1("Exponential"),
    html_div() do
        html_div("slider", style = (width = "10%", display = "inline-block")),
        html_div(dcc_slider(
                id = "slider",
                min = 0,
                max = 9,
                marks = Dict(i => "$i" for i = 0:9),
                value = 1,
            ), style = (width = "70%", display = "inline-block"))
    end,
    html_br(),
    dcc_graph(id = "power", figure = expplot(1))
end

callback!(app, Output("power", "figure"), Input("slider", "value")) do value
    expplot(value)
end

run_server(app)
```

![dash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224085/5bced350-6d8d-2e2e-7e9b-7b5af10dce30.jpeg)


画像だとわかりづらいが、sliderを調節して、展開の次数を調節ができる。
ROS Cross-Distribution Communication

Just out of curiosity, I happened to check ROS cross-distribution communication.
Topic and Services are confirmed using latest container with host network.

### ROS 1

| Scenario | ROS Master | Can communicate? |
| --- | --- | --- |
| kinetic/melodic | kinetic | YES |
| melodic/noetic | kinetic | YES |
| noetic/kinetic | kinetic | YES |
| kinetic/melodic | melodic | YES |
| melodic/noetic | melodic | YES |
| noetic/kinetic | melodic | YES |
| kinetic/melodic | noetic | YES |
| melodic/noetic | noetic | YES |
| noetic/kinetic | noetic | YES |

- `ros-ROSDISTRO-roscpp-tutorials` package is used for verification.

### ROS 2 (Updated)

| Scenario | Can communicate? |
| --- | --- |
| foxy/galactic | YES |
| galactic/rolling(humble) | YES |
| rolling(humble)/foxy | YES |

- `export RMW_IMPLEMENTATION=rmw_fastrtps_cpp` is enabled always to specify rmw implementation.
- `export ROS_DOMAIN_ID=5` is specified.
- docker command `docker run -it --privileged --name ros2_distro ros:distro`. (need to replace `distro` into `foxy`, `galactic`, `humble` and `rolling`)
- Bind different IPC namespace and network interface to each container. (no argument `--net=host` nor `--ipc=host` to docker command.)

might be dependent on rmw implementation, but cross-distribution communication is not supported as official, see https://answers.ros.org/question/341372/can-nodes-from-different-ros-2-distributions-communicate-compatibly/.
「git rebase origin/main」と「git rebase origin main」の違いとは？

更新されたmainブランチを作業ブランチに取り込みたいときは
```
$ git rebase origin/main
```
ですよね。

ただ、間違えて
```
$ git rebase origin main
```
とやってしまいました

そしたら、作業ブランチから、いつの間にか mainブランチにいました。
なにかをrebaseしていました。。
調べたところ

```
$ git rebase origin/main
```

は以下のコマンドと同義ということがわかりました

````
$ git checkout main
$ git rebase origin
````

ただ、他のリポジトリで同じようなことをやったら、以下のエラーが出ましした。
```
fatal: invalid upstream 'origin'
```

ただ、以下で成功する理由が分からない。
```
$ git rebase origin
```

そこで、上記が成功するリポジトリと成功しないリポジトリを調べたところ
以下の違いが分かりました。

以下のコマンドを打つと
```
$ git branch -a
```

成功するリポジトリには「remotes/origin/HEAD -> origin/main」というのがある。失敗するリポジトリにはない。

どうやら、これはシンボリックブランチというものらしいです。

これをシンボリックブランチを設定していると、
例えば、git rebase origin/mainとやる必要がなく、git rebase originでよいとのことです。

セットする方法は、セットしたいブランチで
```
$ git remote set-head origin -a
```
です

削除する方法は、
```
$ git remote set-head origin -d
```
です。

# 結論

作業ブランチでの①と②の違い

## ①　git rebase origin/main

origin/mainの最新commitの上に、作業ブランチでcommitした自分の作業commitを付け足す。

## ②　git rebase origin main

以下と同義
```
$ git checkout main
$ git rebase origin
```
作業ブランチからmainブランチに移動し、設定された設定されたシンボリックブランチの最新commitの上に、mainブランチのcommitを付け足す。

# 参考
[Git: difference "git rebase origin/branch" VS "git rebase origin branch"](https://stackoverflow.com/questions/29164321/git-difference-git-rebase-origin-branch-vs-git-rebase-origin-branch#:~:text=if%20you%20want%20to%20rebase,way%20to%20rebase%20a%20branch.&text=then%2C%20your%20branch%20is%20updated%20to%20newest%20commits)
[Why is there a remotes/origin/HEAD -> origin/master entry in my git branch -l -a output?](https://stackoverflow.com/questions/12613793/why-is-there-a-remotes-origin-head-origin-master-entry-in-my-git-branch-l)
OpenSSHの主なファイル

||SSHクライアント|SSHサーバ(sshd)|
|:-:|:-:|:-:|
|設定ファイル|/etc/ssh/ssh_config|/etc/ssh/sshd_config|
|秘密鍵|~/.ssh/id_rsa|/etc/ssh/ssh_host_rsa_key|
|公開鍵|~/.ssh/id_rsa.pub|/etc/ssh/ssh_host_rsa_ket.pub|
|認証鍵リスト|~/.ssh/known_hosts(*1)|~/.ssh/authorized_keys(*2)|

*1 ホスト認証時に登録
*2 ユーザー認証時に登録
RailsとVueの組み合わせで'Hello Vue'がうまく行かなかったときの備忘メモ

## 背景
書籍『【Rails x Vue.js】メモアプリを作成しながらモダンな開発を学ぼう！』
を参考にVueを導入しようとするも、Hello Vue!になかなかたどり着けなかったため、備忘メモ

## 環境
Rails 6.1.5.1
vue ~~3.2.33~~ →　2.6.14 ※今回のエラーの原因

## 起きていた事象
以下記載があるViewページへアクセスしても、何も表示されない自称が発生
`<%= javascript_pack_tag 'hello_vue' %>`

コンソールに以下の表示有り。
`"export 'default' (imported as 'Vue') was not found in 'vue' RAILS`


## 解決方法
rails new のあとにpackage.jsonを以下の通り編集。

```diff_json:package.json
- "vue": "^3.2.33",
- "vue-loader": "^17.0.0",
- "vue-template-compiler": "^2.6.14"
+ "vue": "^2.6.14",
+ "vue-loader": "^15.7.0",
+ "vue-template-compiler": "^2.6.12" 
```

編集後、yarn install


## 原因（推定）
vue2とvue3でファイルのimportの方法が異なるとのこと。
vue2用の記載方法でvue3を動かそうとしていたのが原因の模様。
→vue2をインストールするように記載を変更

※今回は学習を目的としているため、書籍と同じvue2に合わせたが、vue3の設定に書き直すでも良さそう。


## 参考
https://qiita.com/Annmann3/items/9c99b0f9df9861da548b

https://zenn.dev/n199603/articles/a555f46fb6614d
日記；回すだけIII ⑮ ラズパイ、C++でプログラミング＜その1 準備（EPOS4）＞ベータ版

　前回まではWindowsPCを利用してモータを動かしました。今回から、プラットホームをラズパイにします。

### 環境
- Raspberry Pi 4 Model B 2GB
- Raspberry Pi OS with desktop。Release date: April 4th 2022
- EPOS4 Compact 24/1.5 CAN
- PiCAN2（MCP2151＋MCP2561、16MHz）

　[PiCAN2](https://copperhilltech.com/pican-2-can-bus-interface-for-raspberry-pi/)はebayで購入しましたが、動きませんでした。アマゾンでも同様なボードを購入し認識はしましたがCANバスの送信エラーを起こし、動作はしませんでした。秋月電子通商でパーツを購入し、ブレッドボード上で組み立てたのを使っています。

<img width="400" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/664ecfea-52fd-dd31-bef8-51285d8a5d54.png">

　PiCAN2の回路図（部品が載っている部分）です。[MCP2515のデータシート](https://ww1.microchip.com/downloads/aemDocuments/documents/APID/ProductDocuments/DataSheets/MCP2515-Family-Data-Sheet-DS20001801K.pdf)の回路図そのものです。もともとの回路図はそのままでは動かないので、修正してあります（MCP2515の電源の記述がなかった。R3=4.7kの表記だが実際は47kが入っていた）。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a79cd008-778f-a31e-45dd-ae2f91fdf2d5.png)

（**2022/05/8追記**）
　秋月でMCP2515を購入したとき、Webの画面に出てきたトランシーバをMCP2551だと思って購入しましたが、MCP2561でした。MCP2561/2は、リセット時の挙動がMCP2551とは異なります。調べると、まず、PiCAN2ボードのclockoutは信号が出ていて、正しく動いているようです。しかし、ラズパイ2/3ではパワーオン・リセット時に問題なくボードは正常に立ち上がるのですが、ラズパイ4はダメなようです。PiCAN3ボードではMCP2562が使われていて、リセットが正しく動作する配線になっています。
　MCP2551とMCP2561/2では、パワーオン・リセットの説明は2/3が同じですが、MCP2561/2には文章が追加されています。今回、ブレッドボードで動作したのは、この追加の機能の差かもしれません。
　なを、販売しているサイトには、The PiCAN board is fully compatible with the new Raspberry Pi 4 Model B.と書かれています。ラズパイ4にはV1.2からV1.4があります。newというのが何を指しているのか確認できていません。

　なお、認識はしたが動作しなかったアマゾンで購入したボードのトランシーバはNXPの製品でした。クロックが8MHzというのも異なります。

### 接続
　EPOS4のボードは、USB/RS232とCANバスのブリッジを搭載しています。
　[日記；回すだけIII ⑫ C++でプログラミング＜その1 準備 （EPOS4）＞ベータ版](https://qiita.com/jamjam/items/cc66cf1df8bd11e9ab8a)でも書きましたが、EPOS Studio 3.7ツールでチューニング、PDOマッピングをしておきます。
　EPOS4のnodeIDは5に、ボード上のDIPスイッチで設定しました。通信速度はAutoです。

![EPOS4-raspi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/3d6c1c6c-9d59-92a1-e866-af4e2a3918ff.png)



### サンプル・ソフトを用意する
　EPOS-Linux-Library-En.zipをmaxonからダウンロードします。筆者は、Windows PCでダウンロードしたのち解凍し、USBメモリでラズパイにコピーしました。
![2022-04-30 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/59df0b12-c61f-6c4a-8405-b4161236b081.png)

　インストールは、[EPOS Command Library Documentation](https://maxonjapan.com/wp-content/uploads/manual/epos/EPOS_Command_Library.pdf)の「9.2 Linux」から記述があります。
2022/5/1主にITとかセキュリティの記事

米国当局、サイバー攻撃に悪用されている脆弱性トップ15公開、ただちに確認を(4/29)
https://news.mynavi.jp/techplus/article/20220429-2332490/

2022年1月～3月対象「Webサイト・Webアプリケーションを狙ったサイバー攻撃検知レポート」を発表(4/29)
https://www.jiji.com/sp/article?k=000000276.000009107&g=prt

法人3割が個人情報流出、過去1年で　トレンドマイクロ(4/29)
https://www.nikkei.com/article/DGXZQOUC079GS0X00C22A4000000/

米国政府は、悪意のある仮想通貨取引アプリについて投資家に警告(4/29)
https://nextmoney.jp/?p=50054

米歯科医師会に身代金ウイルス攻撃、9ギガのデータが盗難(4/29)
https://forbesjapan.com/articles/detail/47271

2022年2月のモバイルマルウェアレビュー ― スパイウェア型トロイの木馬の活動増加、Google Play上の脅威等(4/29)
https://japan.cnet.com/release/30674749/?ref=rss

小学校の防犯カメラ映像、ネットオークションに出品され流出…性別や体格が判別可能(4/29)
https://www.yomiuri.co.jp/national/20220428-OYT1T50275/

“えきねっと”と“日本郵便”をかたるフィッシング詐欺が急増年度末・新生活に増える需要を狙った可能性大(4/29)
https://www.jiji.com/sp/article?k=000000142.000008525&g=prt

npmに悪意あるパッケージを植え付ける「Package Planting」とは(4/29)
https://news.mynavi.jp/techplus/article/20220429-2332558/

「最悪のパスワード」が原因で2400万人のデータ流出、南アフリカ(4/29)
https://forbesjapan.com/articles/detail/47232/1/1/1?s=ns

Apple、紛失防止タグ「AirTag」の新機能情報を公開。最新のファームウェアでは不要な追跡に使用されているAirTagを発見しやすいよう検出音を調整。(4/29)
https://applech2.com/archives/20220429-apple-update-unknown-airtag-sound.html

カレンダーの「共有」と「公開」はどう違うの? - いまさら聞けないiPhoneのなぜ(4/29)
https://news.mynavi.jp/article/20220429-iphone_why/

「10年後に消える職業予測」はその後どうなった？(4/29)
https://agora-web.jp/archives/2056210.html

「未来のインターネットに関する宣言」立ち上げイベントの結果(4/28)
https://www.soumu.go.jp/menu_news/s-news/01tsushin06_02000235.html

四半世紀の歴史を持つ「ペイント」アプリがシンプル・モダンな装いで復活(4/29)
https://forest.watch.impress.co.jp/docs/serial/newdefapps/1406642.html

中国のNFT業界容認派と規制派双方が動きはじめる(4/29)
https://nextmoney.jp/?p=50043

度重なる検閲を受けてなお存続する中国製SNS「Douban(豆瓣)」とは？(4/29)
https://gigazine.net/news/20220429-douban-chaotic-chinese-social-network/

令和4年度新規事業　DXによる旅行事業者レベルアップ応援事業
デジタル技術導入のための専門家派遣を開始します(4/28)
https://www.metro.tokyo.lg.jp/tosei/hodohappyo/press/2022/04/28/18.html

4月Webサーバシェア、Cloudflareトップ100万ビジーサイトで躍進中(4/29)
https://news.mynavi.jp/techplus/article/20220429-2332443/

イーロン・マスクvs.EUデジタル市場法…「言論の自由」は本当に守られるのか総額440億ドルの買収劇の行方(4/29)
https://gendai.ismedia.jp/articles/-/94893?page=1&imp=0
時差勘案について調べてみた

# はじめに
時差勘案を考慮する際にどこで何が必要かを調べたときのメモ
　※直近は何もしなくても大丈夫だったけど、今後使うことがあった場合にすぐに確認できるように...

# キーワード
i18n/ロケール(Locale)/タイムゾーン(Timezone)

# 参考サイト
◆C#で日時データをタイムゾーンをまたいで正しく変換する方法
　https://qiita.com/katz/items/d0cad9bfee79ef10ec5c
| Kindの値 | 意味 |
|:-----------|-----------|
| `DateTimeKind.Utc` | UTCの時刻を保持 |
| `DateTimeKind.Local` | ローカル時刻を保持 |
| `DateTimeKind.Unspecified` | UTCやローカル時刻ではない時刻を保持(★既定値) |

◆C#(.NET Core 3.1, .NET 6)のランタイム上のシステムタイムゾーンを置き換えたい（TimeZoneInfo.LocalがUTCを返すようにしたい）
　https://qiita.com/fukasawah/items/c42b586745be56fed674

◆.Net6 + Npgsql.EntityFrameworkCore.PostgreSQL(Ver6.0)にしたらハマったこと
　https://qiita.com/k-yamamoto/items/a87989569cb6f0415fbb
　　※こういうのがあると簡単にバージョンアップできないんだよな...
　　　対策も書いてあるので助かる

◆PostgreSQLのTIMESTAMP WITH TIME ZONE型は.NETのDateTimeOffset型ではなくDateTime型を使う
　https://qiita.com/kkino90h/items/147aed6162c82a1022f9
　　※PostgreSQLを使っているわけではないのだが...Denodoみたいにデータ仮想化したら考えないといけないなぁ～

◆NuGet Gallery | Npgsql 7.0.4
　https://www.nuget.org/packages/Npgsql/
　　※調べた時点でv8もある...

◆GitHub - npgsql/npgsql: Npgsql is the .NET data provider for PostgreSQL.
　https://github.com/npgsql/npgsql
　　※内部の動きを見るためにはこちらをダウンロードしてコード見ないと...

◆Npgsql 6 converts DateTime.UtcNow to local time during insert for timestamp without time zone column
　https://github.com/npgsql/npgsql/issues/4208
　　※v5/v6で試した結果が書かれているので助かる...

◆4.4.2 アプリケーションのデータ型とデータベースのデータ型の関係
　https://software.fujitsu.com/jp/manual/manualfiles/m170009/j2ul2244/01z200/j2244-00-04-04-02.html
　　※こういう一覧であると後で助かる...

◆【PostgreSQL】NpgsqlでTimestampTZは基本使わない
　http://www.madeinclinic.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9/20200414/
　　※「C# で Npgsqlを使ってtimestamp with time zoneのデータをinsertしていて、insertされた結果が9時間進んでいるという謎現象が起きて、しばらくはまったのでメモ。」だそうです...

◆Connection String Parameters | Npgsql Documentation
　https://www.npgsql.org/doc/connection-string-parameters.html
　　※Timezone(Default：PGTZ = 'Asia/Tokyo')というオプション有
　　★'Asia/Tokyo'は、後述の「タイムゾーンの一覧」のサイトにある、タイムゾーンID

---
◆タイムゾーン一覧
　https://www.jisakeisan.com/
◆タイムゾーンの一覧
　https://jp.cybozu.help/general/ja/admin/list_systemadmin/list_localization/timezone.html
◆サマータイムを処理するには？［.NET 3.5、C#／VB］
　https://www.atmarkit.co.jp/ait/articles/1809/05/news015.html#isdaylightsavingtime
◆サマータイムを考慮した PowerShell での時刻ハンドリング
　http://www.vwnet.jp/Windows/PowerShell/2018090501/DateTimeOffset.htm
◆アメリカ / ニューヨークの時差と現在時刻 - Time-j.net
　https://www.time-j.net/worldtime/location/america/new_york
◆Jenkinsのスケジュール実行をシステムのタイムゾーンとは、異なるタイムゾーンで実行する。
　https://dev.classmethod.jp/articles/run_job_scheduled_different_timezone/
DropboxAPIのAccessToken&RefreshToken備忘録

# 結論
DropboxAPIのAccessTokenは一定期間でリセットされアクセス出来なくなる。
毎回AccessTokenを発行しなおすのは面倒なので、RefreshTokenを発行し接続することで回避する。

## AccessTokenの発行方法（一応）

https://www.dropbox.com/developers/

ここにアクセスし、**アプリを作成** or **右上のAppConsole**から選択

permissonから必要な権限を有効化し、ダッシュボードの```setting/Oauth2/GenerateAccessToken```で発行する。

### AccessTokenでの利用方法
```
import dropbox

dbx = dropbox.Dropbox(`<ACCESS TOKEN>')
```

## RefreshTokenの発行方法
まずはauthorization_codeを取得する。（後で```<AUTHORIZATION_CODE>```に入力する）

ダッシュボードの```setting```にある**App key**と**App secret**を控える。

以下のURLの'<Appkey>'を自分のAppkeyに変更しアクセスする。
```https://www.dropbox.com/oauth2/authorize?client_id＝'<Appkey>'&token_access_type=offline&response_type=code```

認証画面みたいなものが出るので進み、最後の画面にある**authorization_code**を控える。


次に[Postman](https://www.postman.com/)を利用してRefreshTokenを取得する。
以下を用いてPOSTする。
 - **Request URL**
   - https://api.dropboxapi.com/oauth2/token
 - **AuthorizationType**
   - `Basic Auth`
   - `Username = '<Appkey>'`
   - `Password = '<Appsecret>'`
 - **Body**
   - `x-www-form-urlencoded`

|key|value|
|:--:|:--:|
|code|'/AUTHORIZATION_CODE/'|
|grant_type|authorization_code|

成功すると以下のようなJson形式の返答がある。これの**refresh_token**がそれ。
```
{
    "access_token": "sl.****************",
    "token_type": "bearer",
    "expires_in": 14400,
    "refresh_token": "*********************",
    "scope": <SCOPES>,
    "uid": "**********",
    "account_id": "***********************"
}
```

### RefreshTokenでの利用方法
```
import dropbox

dbx = dropbox.Dropbox(app_key='<Appkey>', app_secret='<Appsecret>',
                          oauth2_refresh_token='<Refreshtoken>')
```

## おまけ：ファイルのやり取り
```
# Dropboxからlocalに
with open('<Local上でのPATH>', "wb") as f:
    metadata, res = dbx.files_download(path=’<Dropbox上でのPATH>’)
    f.write(res.content)

# localからDropboxに（追記ではなく上書き）
dbx.files_upload(open('<Local上でのPATH>', "rb").read(), ’<Dropbox上でのPATH>’, mode=dropbox.files.WriteMode.overwrite)
```

## 参考文献
https://navi.dropbox.jp/dropbox-api-migrating-app-permissions-and-access-tokens

https://developers.dropbox.com/ja-jp/oauth-guide

https://dropbox-sdk-python.readthedocs.io/en/latest/
【PowerPointで作成した論文画像】様々な出力方法で画質を比較してみた

# 何の記事？

パワーポイントは論文にとても便利ですが、出力する際に画質が低下していまうことが指摘されています。画質の低下に対しては色々な対策方法がネット上に散見されますが、どの方法が最も良いかについては全く検討されていませんでした。そこで報告されている色々な方法について、出力された画像の見た目の綺麗さを比較検討してみました。
<br>

# 前提

多くの科学論文の画像では、投稿時に300dpi (dot per inch)以上の画質が要求されています。例として、4カラム、幅17cmの出力を想定しました。縦横比は4:3としました。このサイズだと、横のピクセル数は、6.69inch　× 300dpi = 2008pxということになります。

![スクリーンショット 2022-05-01 2.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/e894b5d0-3325-d928-b1d3-c53ddfb8a0bb.png)

<br>


# 画像出力の方法

以下の方法を検討しました。

- パワーポイントから直接300dpiのTiff画像を出力する （PowerPoint for Mac 2019)
- パワーポイントからPDFを出力、MACのPreviewで開いて300dpiでTiffを出力
- パワーポイントからPDFを出力、PhotoShopで開いて３００dpiでTiffを出力
- パワーポイントで画像サイズを4倍にしてPDFを出力、PhotoShopで開いて300dpiでTiffを出力
- パワーポイントからPDFを出力、Adobe Illustratorで開いて３００dpiでTiffを出力

それぞれの方法について簡単に解説します。

<br>




## 1. パワーポイントから直接300dpiのTiff画像を出力する

デザイン→スライドのサイズ→ページ設定から、ページの幅を17cm、高さを１2.75cmに設定します。で、スライドの編集をします。保存するときは、ファイル→エクスポートから、Tiffを選択します。PowerPoint for Mac 2019ではピクセル数を設定できるため、横幅を2008pxにして出力。

![スクリーンショット 2022-05-01 3.17.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/5d04a288-6e0d-fa30-b7a0-c9e995fc0843.png)

![スクリーンショット 2022-05-01 3.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/2be08753-39cd-7d9b-b6e0-6aa6088cecff.png)

<BR>

## 2. パワーポイントからPDFを出力、MacのPreviewで開いて300dpiでTiffを出力

PDFで出力することにより、文字がベクター形式で保存されるので、いくら拡大してもカクカクにはなりません（上図）。そのためPDF形式だと保存するたびに文字が荒くなっていくことを防げます。保存したPDFをMacのアプリであるPreviewで開いて300dpiで保存。

![スクリーンショット 2022-05-01 3.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/8c8029e3-fb87-3363-a572-f87e31c29b03.png)

![スクリーンショット 2022-05-01 3.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/c9a4ac92-ae84-0c23-7353-583e4491f6cb.png)

<BR>

## 3. パワーポイントからPDFを出力、PhotoShopで開いて３００dpiでTiffを出力

パワーポイントでPDFとして出力した画像を、Photoshopで開きます。開くときに、ファイルの横幅を2008px、解像度を300pxに指定しておきます。モードはRGBで良いですが、論文によってはCYMKが指定されているものもあります。

画像を開いたら、「別名で保存」から画像をTiff形式で保存します。画像圧縮はLZW、レイヤーの圧縮はRLEを選択しました。

![スクリーンショット 2022-05-01 3.21.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/4c78e67f-5ed4-7993-5da1-f2ecb6f2e9d5.png)

## 4. パワーポイントで画像サイズを56cmにしてPDFを出力、PhotoShopで開いて300dpiでTiffを出力

以前のパワーポイントでは保存時のデフォルト画素数が96dpiとなっており、もともとの画像サイズを大きくしておくことが推奨されていました。目標画素数300dpiと比較して1/3ぐらいなので、ざっと画像の大きさを3倍ぐらいにする必要があると考えました。

具体的には、パワーポイントのスクリーンサイズを横56cm、縦42cmで設定し、スライドを作成した後に、PDFとして保存します。それをPhotoShopで開いてTiffに変換。ファイルの横幅を2008px、解像度を300pxで開くので、最終的な画像のサイズは3と一緒です。

<BR>

## 5. パワーポイントからPDFを出力、Adobe Illustratorで開いて３００dpiでTiffを出力

Illustratorの強みは、ベクター画像をそのまま扱えることです。すなわちPDFをillustratorで開けば、文字を拡大してもカクカクになりません。書き出し→書き出し形式→Tiffを選択、保存時に解像度を聞かれるので高解像度（300ppi)を選択します。アンチエイリアスは「アートに最適（スーパーサンプリング）を、圧縮形式はLZWを選択しました。

<br>

#結果

左から、元画像、①パワーポイントで直接出力、②Previewを介して出力、③Photoshopを介して出力、④画像サイズを上げてPhotoshopで出力、⑤Illustratorで出力、です。

![スクリーンショット 2022-05-01 2.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/78bf3b6f-4ba4-1853-d4f9-05a438666ef3.png)

## 文字の鮮明さ

②Photoshopを介して出力、が最もぼやけが少ないように見えます。初めから目的のサイズで設定しておいた方が画質が良さそうです。
UnityでAudioFilterで左右のチャンネルを反転させる方法。

# StereoSwitch_AudioFilter.cs

UnityであまりAudioFilterについての記事をあまり見なかったので、自分の備忘録として記載しておきます。
何はともあれ、スクリプトを見せた方が話が早いと思うので、サンプルのスクリプトから。
以下サンプルスクリプト

```StereoSwitch_AudioFilter.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class StereoSwitch_AudioFilter : MonoBehaviour
{
    float[] backup  = new float[2048];
    void OnAudioFilterRead(float[] data, int channels)
    {
        Array.Copy(data, backup, data.Length);
        int harfLength = data.Length / 2;
        for (int i = 0; i < harfLength; i++) data[i * 2] = backup[i * 2 + 1];
        for (int i = 0; i < harfLength; i++) data[i * 2 + 1] = backup[i * 2];
    }
}
```


こちらのスクリプトをAudioSourceと同じゲームオブジェクトに入れるだけで、左右のステレオのチャンネルを入れ替えることが出来ます。
以下解説です。

## 解説

この「void OnAudioFilterRead(float[] data, int channels)」のイベントを使用する事で、同じゲームオブジェクト内で流れているaudioの波形を調整できるようです。
今回は、左右のチャンネルをいれかえているだけですが、自分好みのaudioFilterを実装する事ももちろん可能です。
なんなら、オリジナルのシンセサイザーも作れるかも。
ただ、audioFilter自体CPUに結構な負荷がかかるらしく、ヘルプを読んでいて気を付けてねっと所々書いています。

では具体的な内容に入ります。
第一引数は、実際の波形で、第二引数はチャンネル数となっています。
この第一引数のfloatの配列を調整する事で、音を変えることが出来ます。

音の波形と言っても、ただのfloatの配列です。
実際どうゆう動きをしているの確認するため、右スピーカーだけサイン音が流れるだけのaudioClipを用意して、この配列の数字にZ軸で上下するオブジェクトを配置するスクリプトを用意してみてみました。

あまり役に立たないかもしれませんが以下サンプル
```audioCheck.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class audioCheck : MonoBehaviour
{
    public GameObject copyobj;
    public float multiplay = 5f;
    GameObject[] gameObjects = new GameObject[2048];
    float[] backup = new float[2048];
    void Start()
    {
        for(int i = 0;i < 2048; i++)
        {
            gameObjects[i] = Instantiate(copyobj, new Vector3(0, 0, i), Quaternion.identity);
        }
    }

    // Update is called once per frame
    void Update()
    {
        for (int i = 0; i < 2048; i++) gameObjects[i].transform.position = new Vector3(0, backup[i] * multiplay, i);
    }
    void OnAudioFilterRead(float[] data, int channels)
    {        
        Array.Copy(data, backup, data.Length);
    }
}

```

そしてこれが表示結果
![audioTest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1690940/72943eb9-fadb-a3b2-e563-494bd63b282c.png)

まっすぐ一直線に微動だにしない線とうねうねと規則正しく揺れる波形が現れました。
この画像からもわかる通り、どうやら、波形のデータの中には、別々のチャンネルが分けて格納されているわけではなく、左右のチャンネルの波形が交互に配置されていることがわかると思います。
今回の場合は、偶数が右のチャンネル、奇数は左のチャンネルになっているようです。

後は、配列の奇数と偶数に入っている数値を入れ替えるだけで左右のチャンネルを反転することが出来ます。
以下がその個所

```sample.cs
  void OnAudioFilterRead(float[] data, int channels)
    {
        Array.Copy(data, backup, data.Length);
        int harfLength = data.Length / 2;
        for (int i = 0; i < harfLength; i++) data[i * 2] = backup[i * 2 + 1];
        for (int i = 0; i < harfLength; i++) data[i * 2 + 1] = backup[i * 2];
    }
```


以上で解説終わりになります。
このデータがどういう波形のデータを保持しているか、今回でわかったと思います。
audiofilterなど、初学者の参考になれば幸いです。
未経験Webディレクター向け入力フォームチェック方法・おススメ検証方法


サイトであればなんらかの入力フォーム（申込、購読、会員登録、問い合わせ）が存在するかと思いますが、リニューアルをした際に入力フォームのミスはとても発生しやすい部分です。自動返信メールが上手く飛ばなかったり、文章がおかしかったり、メールアドレスが間違っていたり、英数字or平仮名が入力できなかったり…。

大事なのは実装後の確認作業ですが、とくに初心者は確認作業を怠る人が多い印象です。ベテランと呼ばれる人も一度は確認漏れで失敗した経験があるはずです。

そのためテスト環境だけでなく、本番環境でもしっかり確認することが大事です（そもそも本番環境しかない場合もある）。ただ本番環境でのテストの問題点として、データベースに履歴が残ってしまいます。

以下で起こりやすい事例を紹介しながら、未経験Webディレクター向けに「入力フォームのチェック作業をするときはこうしたほうがわかりやすいよ」という注意点をまとめました。

## ①偽名を使わない（本名にする）
おすすめ例：〇〇〇〇（部署名）

例えば名前を「鈴木太郎」と入力したとします。チーム体制でやっているときに、あとから見返したときに「これ誰が作業したの？」となりやすいです。また１年後に作業者が退職して組織がシャッフルしても「これ誰が作業したの？」となってしまいます。

そうしたことを防ぐために「本名（部署名）」をおすすめします。※部署名は関わっている人間が多い場合は入れたほうがいいです。

## ②名前にテストを入れる
おすすめ例：〇〇テスト一郎（部署名）

本番環境でのテストを推奨しているわけですが、サイトによってはデータベースの削除は別部署（別担当）のケースや、テスト登録データの物理削除が難しいケースがあります。そのためテストデータがずっと残ってしまうケースがあります。この際におススメなのは「**テスト登録であることを明記すること**」です。

具体的な方法論としておすすめは名前に「テスト」を含めることです。これによって誰が見てもテスト登録であることがわかります。

トラブルになるケースとして後々テスト検証を知らない人がデータベースを見直した際に「（テスト登録を削除できず、データ報告ではテスト登録を省いている場合）２０２０年３月の会員登録に誤差があるけど何で？」「２０２０年３月だけ会員登録が増えているけど何か理由があるのかな？」となるケースが。

そのほかにも「データ集計間違えてない？（無駄な確認）」となってしまうからです。名前に「テスト」がなければ状況が把握しづらい。

企業によってはメンバーの入れ替わりが激しいので当時のメンバーが誰もおらず、ブラックボックス化してしまうことも考えられます。こうした将来的なトラブルを防ぐ意味でも名前に「テスト」は入れておいたほうがいいです。

## ③備考欄にテスト環境を入れる
大概のサイトで備考欄はあります。そこにテスト環境を入れてあげるとメンバーへの情報共有に便利です。例えば「ウィンドウズ、chrome」「iPhone6s」です。これを書くだけで、自分の履歴にもなりますし、情報共有にも使えます。「edgeで確認したっけ？」とド忘れしたときにも使えます。

## まとめ

しっかり作業履歴を残して、しっかり引き継げば問題ないと思う方もいるかと思いますが、そこは組織の難しいところでして…。私自身も様々な組織に様々な立場で携わりましたが、仮に作業履歴が残っていたとしても、数年前に誰がなにをしたのかをしっかり理解・記憶するのは困難です。

ちょっとの工夫で、トラブルが防げる可能性が１％でも上がるなら、その方法はやっておいたほうがいいと思います。




以上、メモ書きとしてまとめました。

[株式会社リクエストエージェント](URL "https://request-agent.co.jp/")
[採用百科事典](URL "https://media.request-agent.co.jp/")
[SEO対策専門ページ](URL "https://request-agent.com/")
Dockerとは

<h2>はじめに</h2>
<p>バイトで最近触りはじめたので、自分なりにアウトプットします。</p>
<p>初学者のメモ代わりなので内容は薄いです。</p>
<h2>Dockerのメリット</h2>
<h4>環境構築の差異がない</h4>
<p>Macとwindowsで開発環境が異なり、構築手順書が数種類必要だったり、windowsだけエラーが発生することがありますが、Dockerだと共通のコマンドを実行するだけで簡単に環境構築ができます。<br>
また設定ファイルを共有すればプロジェクトメンバー間で同じ環境を作ることができます。</p>
<h4>開発で動けば本番でもほぼ動く</h4>
<p>Dockerイメージさえデプロイすれば動くので開発環境と本番環境の環境差分が生まれにくいです</p>

<h2>Dockerとは</h2>
<h4>コンテナ型仮想環境を作成、実行、管理するプラットフォーム</h4>
<ul><li>コンテナとは、一種の仮想環境(パソコンやサーバなど一つのハードウェアの中で、仮想的な環境を構築したもの)</li>
<li>PCやサーバーにコンテナを作成して、コンテナの中でプログラムをプログラムを動かせます。</li>
<li>コンテナごとに様々なアプリを実行することができる</li>
</ul>

<h2>Docker用語</h2>
<h4>Dockerfile</h4>
<ul>
<li>Dockerイメージを作成するための指示書となる設定ファイル</li>
<li>イメージをカスタマイズするときに使用</li>
<li>ノーマルなイメージで設定が足りる場合は不要</li>
<li>DockerではデフォルトでDockerfileという名前のファイルをイメージのビルドに使用</li>
</ul>

<h4>Dockerイメージ</h4>
<ul>
<li>Dockerコンテナを作成するための雛形</li>
<li>アプリケ、ライブラリ、設定ファイルなど必要なもの一式をまとめたもの</li>
<li>別サーバーでも同じ環境を再現できる</li>
<li><a href="https://hub.docker.com/">Docker Hub</a>に様々なイメージが公開されている。あとで触ってみたい</li>
</ul>
<h4>Dockerコンテナ</h4>
<ul>
<li>Dockerイメージを元に作成されるコンテナ型仮想環境</li>
<li>コンテナと呼ぶ</li>
<li>Dockerでは、仮想環境＝コンテナという認識</li>
<li>イメージから同じコンテナを再現できる</li>
</ul>
<pre>
コンテナを作る流れ
コンテナ ←[run]- Dockerimage ←[build]- Dockerfile
</pre>
<h4>Docker Compose</h4>
<ul>
<li>複数のDockerコンテナやイメージを操作するためのツール</li>
<li>「docker-compose.yml」に記述することで、「docker compose」コマンドでまとめて実行できる</li>
<li>一気にコンテナまで作れる</li>
<li>イメージやコンテナが何百もある場合、「docker compose」コマンドで実行できるので楽</li>
<li>docker-compose.ymlを作れば、すぐに同じ構成の環境を別の環境に構築することが可能</li>
</ul>
<h3>Docker ComposeとDockerfile違い</h3>
<p>おおまかな設定はDocker Composeに記述して、必要があればDockerfileに記述していく</p>
<h4>nginx [エンジンエックス]</h4>
<ul>
<li>Webサーバーのソフトウェア</li>
</ul>
<h4>Postgresql</h4>
<ul>
<li>MySQLと同様にデータベースサーバーのソフトウェア</li>
</ul>
<h4>Node.js</h4>
<ul>
<li>サーバサイドのJavaScript実行環境</li>
</ul>
Go の Genericsで作れる（たぶん）一番便利なモノを作った

> 注意：Generics を 使用するためには Go 1.18 以上が必要です。

**有識者に怒られる覚悟で書いてます。先に謝罪しておきます。すみません。**

# TL;DR：一行で初期化されたポインタ作れるよ

```sh
go get github.com/ktnyt/ptr
```

```go
package main

import (
	"fmt"

	"github.com/ktnyt/ptr"
)

func main() {
	p := ptr.New(42)
	fmt.Println(*p)
}

```

# だからなんだよ

今までは Go で初期化されたポインタを作るためには最低でも二行使う必要がありました。

## 方法1 ポインタに値を突っ込む

```go
p := new(int)
*p = 42
```

## 方法2 変数のアドレスを取る

```go
i := 42
p := &i
```

これはつまり今までポインタを作るのに

```go
p := func() *int { i := 42; return &i }()
```

的なことをしなければなりませんでした。ところが、次のような Generic 関数を定義することで

```go
func New[T any](v T) *T {
	return &v
}
```

```go
p := New(42)
```

とすればよくなりました。型推論が効くので型変数を書く必要もありません。最強。
https://github.com/ktnyt/ptr は自分で再生産するのが面倒なので適当に公開しただけです。各位適当に使ってらくしましょう。

# 主語デカすぎだろ

はい、デカいです。すみません。たぶん他にもたくさん作ってる人もいると思うんですが、まだまだGenericsは浸透していないのと初心者には届きにくい内容なのであえて主語をデカくして記事にしてみました。三行なんで適当にプロジェクト内で定義したりして使ってみてください。これが 1.18 にバージョンアップするモチベーションにもなるかもしれません（そんなことはないか）。
auひかりで大容量のDockerイメージがpushできない

2年前ぐらいからauひかりであるDockerイメージがpushできない問題があったのですが、この度キャリアを変えたら解決したのでまとめました。

## 環境
* au one net auひかりホーム 10G
* Docker for Mac 4.5.0
* macOS Big Sur 11.4

## 再現方法

1. 以下の内容のDockerfileを作成します

    ```
    FROM ubuntu:22.04
    
    ENV GIT_SSL_NO_VERIFY=1
    
    RUN DEBIAN_FRONTEND=noninteractive \
        apt-get update \
        && apt-get -y upgrade \
        && apt-get install -y --no-install-recommends \
            git \
            cmake \
	    build-essential \
	    autoconf \
	    libtool \
	    pkg-config
        
    RUN git clone -b v1.43.2 --depth 1 https://github.com/grpc/grpc \
        && cd grpc/ \
        && git submodule update --init \
        && mkdir -p cmake/build/ \
        && cd cmake/build/ \
        && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE ../.. \
        && make -j8 install
    ```
2. ビルドします

    ```
    % docker build -f -t <Docker Hubのアカウント名>/test_au_hikari:latest .
    ```

3. ログインします
    ```
    % docker login
    ```

4. プッシュします
    ```
    % docker push <Docker Hubのアカウント名>/test_au_hikari:latest
    The push refers to repository [docker.io/<Docker Hubのアカウント名>/test_au_hikari]
    07049e040d3b: Pushing [==================================================>]  1.118GB/1.118GB
    bfdd4adb9139: Pushed 
    3826c26db80f: Layer already exists 
    write tcp 192.168.65.3:64172->192.168.65.1:3128: use of closed network connection
    ```
    接続が切れて失敗しました。
    二個目のbfdd4adb9139のレイヤーは443.3MBでプッシュできましたが、一個目の07049e040d3bのレイヤーは大容量過ぎてプッシュできたことがありません。

## 対策
OCN光　ネクストファミリーSHS隼だとプッシュできました。
皆さんもこのプランにすることをお勧めします👍
JavaScriptの省略といろいろな引数

# 省略が多いJavaScript
JavaScriptの省略形はES6以降かなり多くなっています。
この記事ではJavaScriptの省略形について説明して行きます。

# アロー関数
まずは```　=>(矢印)```を使うアロー関数から説明して行きます。
まずは基本形です。

```js
function fn(arg) {
  //処理
}

const fn = (arg) => {　　//無名関数を　=>で省略
  //処理
})
```

実際のコードをみて行きます。

まず***無名関数をアロー関数で定義した省略無し***のコードです。

```js
const message = (count) => {
  return count + 1;
};

const count = 10;
const result = message(count);
console.log(result);
//11と出力
```
次に***アロー関数の後ろのブロック省略***、***return省略***したコードです。

```js
const message = (count) => count + 1;

const count = 10;
const result = message(count);
console.log(result);
 //11と出力
```

# オブジェクトのメソッド省略


# 分割代入
分割代入の使い方を説明して行きます。まず基本形です。

```js
const staff = {
  name: 'Taro Tanaka',
  id: '4655',
  officeMember() {
    console.log('社員です。');
  },
};

//staffオブジェクトから分割代入
const { name, officeMember } = staff;
console.log(name);

//Taro Tanaka　と出力
```
```js

const staff = {
  name: 'Taro Tanaka',
  id: '4655',
  officeMember() {
    console.log('社員です。');
  },
};

//staffオブジェクトから分割代入
const { name, officeMember } = staff;
console.log(name);　//関数(function)を確認できる
officeMember(); 

//Taro Tanaka
// ƒ officeMember() {
  //  console.log('社員です。');
 // }
// 社員です。
```

# keyとvalueが同じなら省略できる

```js
const name = '太郎';
const id = 1;

const staff = { name: name, id: id };
console.log(staff);
//{name: '太郎', id: 1}
```

省略すると

```js
const name = '太郎';
const id = 1;

const staff = { name, id };
console.log(staff);

//{name: '太郎', id: 1}
```


# 引数
JavaScriptには色々な引数があります。
それぞれみていきます。


# デフォルト引数

```js
function execute(arg = 'デフォルト引数') {
  return arg;
}

//関数
const result1 = execute();
console.log(result1);

const result2 = execute('JS');
console.log(result2);

//デフォルト引数
//JS
```

# キーワード引数
***{}が引数***になります。
```js
function execute({ arg1, arg2, arg3 }) {
  return { arg1, arg2, arg3 };
 }
 const result = execute({ arg1: 'test1', arg2: 'test2', arg3: 'test3' });   
 console.log(result);

//{animal1: '犬', animal2: '猫', animal3: '猿'}
```

# 可変長引数
```js
function execute(...args) {
  console.log(args[0]);
  console.log(args[1]);
  console.log(args[2]);
}
execute('nori', 'sample@example.com', 'ぴーこ');
//nori
//sample@example.com
//ぴーこ
```

# オプション引数
```js
function execute({ ...args }) {
  console.log(args.name);
  console.log(args.email);
  console.log(args.number);
}

execute({
  name: 'nori',
  email: 'sample@example.com',
  number: '1234',
});
//nori
//sample@example.com
//1234
```
# 最後に
スプレッド演算子(```...```)で配列やオブジェクトが展開できます。
今後もいろいろな省略を更新して行きます。


⚫︎参考資料
https://qiita.com/nayuneko/items/e3ac089bdd6f6d726f9f

https://kde.hateblo.jp/entry/2018/10/15/042305

https://www.nslabs.jp/js-function-parameter-binding.rhtml
基本情報技術者試験　令和元年秋午前

正答率　60/80

１４
- デイジーチェーン接続
パラレル転送規格のSCSIなどで用いいられる接続方法で、PCー周辺機器ー周辺機器というように、PCを起点として複数の周辺機器を直列で接続する方法
- スター型接続
ハブを使った接続方法

１５
RAID
複数のディスクを組み合わせ、１つの仮想的なディスクとして扱うことで信頼性や性能を向上させる技術
- RAID0
複数のディスクに分散してデータを書き込むことでアクセス性能を向上させる。ストライピング。
- RAID1
複数のハードディスクに同時に同じデータを書き込む。ミラーリング。
- RAID2
データにエラー訂正用のハミング符号を付加したものをストライピングで書き込む。
- RAID3
データのエラー訂正用にパリティビットを使用し、１つのディスクをエラー訂正符号の書き込み専用とする。
- RAID4
RAID3でビット・バイト単位だったストライピングをブロック単位で行う
- RAID5
情報データとともにパリティビットも各ディスクに分散して書き込む方式。信頼性アクセス性能がともに高まる。
- RAID6

１９
- フルバックアップ
毎回、全ファイルのバックアップを行う方式。復旧時間は短くなるが、バックアップに必要な容量が多い分バックアップに要する時間は長い。
- 差分バックアップ
定期的にフルバックアップを行い、フルバックアップの間の期間は、フルバックアップ以降にあった変更のあったすべてのファイルを記録する方式。
前回のフルバックアップ以降に変更されたファリツだけをバックアップする。
- 増分バックアップ
定期的にフルバックアップを行い、フルバックアップの間の期間は、前回の増分バックアップ以降に変更のあったファイルだけを記録する方式。
前回のフルバックアップまたは増分バックアップ以降に変更されたファイルだけをバックアップする
カスタムクラスの使用で発生するEXC_BAD_ACCESSへの対処法

# 初めに
Xcodeを触って遊んでいたところ初めてのCocoaPods導入でエラーが発生。
同じような経験の浅いエンジニアの参考になれば幸いです。

# 環境
Xcode Version 13.3.1
CocoaPods 1.11.3

# 経緯とエラー内容
UILabelで文字が一つずつ表示する表示されるUIを試してみたいと思い調べたところ以下がHIT
[CLTypingLabel](https://github.com/cl7/CLTypingLabel)

公式ページのREADMEを参考にしてCustom Classを設定、コードも準備万端でいざ実行
![スクリーンショット 2022-05-01 0.05.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317291/7839220f-c11a-2029-1ac0-5f7f322f9ca4.png)

```ViewController.swift
import UIKit
import CLTypingLabel

class ViewController: UIViewController {
    
    @IBOutlet weak var typingLabel: CLTypingLabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 文字の表示される間隔
        typingLabel.charInterval = 0.03

        // labelにtextを設定
        typingLabel.text = "This is a demo of typing label animation..."
    }
}
````

あれ、ビルドは通るのにエラーになる。。。
![スクリーンショット 2022-05-01 0.18.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317291/eeb964e5-15e2-4af3-dcba-fba0ac79db06.png)

# 対応
早速Qiitaで検索するとどうやらCustom Classを設定していないと存在しないプロパティやメソッドへのアクセスということで同じエラーが出るらしい:thinking:
Custom Classはうまく読み込めていないのかと目星をつけて色々調べた結果、何も難しいことはなくModuleを指定したら普通に動いた（涙

![スクリーンショット 2022-05-01 0.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317291/d791870e-c7b5-dd81-0061-16589a0e72c9.png)

初めてCocoaPods使ったけどライブラリのカスタムクラスを使うからしっかりModuleも指定いないといけないのかと納得。
今まで自作のカスタムクラスを使う経験しかなかったから発想すら湧かなかった。。。
ちゃんと基礎知識を頭に入れないで付け焼き刃でコード書いていると痛い目に遭うんだなと反省。

# 参考

https://qiita.com/koutEngineerK/items/fde24bb81319c237ecf5

https://qiita.com/saten_qiita/items/ac960624cabfab69d725