OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftで画面の縦幅・横幅を取得するプログラム

Swiftで画面の縦幅・横幅を取得するプログラムをメモとして残しておきます。

```swift
//横幅を取得
let screenWidth = UIScreen.main.bounds.size.width
//縦幅を取得
let screenHeight = UIScreen.main.bounds.size.height
```


iPhoneの画面サイズごとに処理を分けたい時などは各コードを使ってif文で条件分岐をすると便利

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
新卒1年目から取得するAZ-900 Microsoft Azure Fundamentalsの勉強法

## はじめに

初めまして。Watanabeです。
新卒でIT企業に入社し、もうすぐ1年が経とうとしている新米エンジニアです。
新人研修の一環として、Microsoft認定資格プログラム(MCP) の AZ-900:Microsoft Azure Fundamentals を取得しました。
この記事ではAZ-900の試験に向けた効率的な学習方法について記載します。
これからAzure資格を受験するという、新入社員の方やIT業界未経験の方の参考として役立てていただけたらと思います。

## AZ-900:Microsoft Azure Fundamentalsとは

AZ-900はMicrosoftの認定資格の一つであり、Azureに関しての知識が問われます。
クラウドサービスを使い始めたばかりの方や、Azureの初心者の方を対象とした試験です。

試験概要は以下の通りです。

- 試験時間　　　：60分
- ボーダーライン：700点/1000点
- 受験料　　　　：12,500円（無料で受験する方法あり）
- オンライン受験：可


試験範囲は以下の通りです。

|  出題範囲 |  出題割合  |
| ---- | ---- |
|  クラウドの概念の理解  |  15 ～ 20%  |
|  コア Azure サービスの理解  |  30 ～ 35%  |
|  セキュリティ、プライバシー、コンプライアンス、信頼 の理解  |  30 ～ 35%  |
|  Azure の料金とサポートの理解  |  25 ～ 30%  |

## 試験対策について
以下の２つのコンテンツを用いた学習を軸に試験学習を行いました。

- ラーニングパス
- ウェビナー

それぞれの概要と効率的な学習方法について、以下に記載します。

## ラーニングパス
[AZ-900の試験ページ](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900)には、認定を受けるために必要なスキルを身に着けるためのラーニングパスが記載してあります。
ラーニングパスは6部構成になっており、試験範囲の内容が詳しく記載してあります。
以前は翻訳機能で英語のページを読むような読みにくさがありましたが、現在(2021年3月)は読みやすい日本語のページとしてリニューアルされています。

## ウェビナー

Microsoftは定期的に無料のウェビナー（ウェブセミナー）を開催しています。
その中でも、Azureに関する基礎知識をつけたい方やAZ-900を受験予定の方向けのものが、「Microsoft Azure Virtual Training Day: Fundamentals」です。  
Microsoft Azure Virtual Training Day: Fundamentals は2日間にわたって開催されます。
Azureに関する基礎知識はもちろんのこと、AZ-900での試験で問われる重要なポイントを分かりやすく解説してくれます。
更に、このウェビナーを2日間受講すると **AZ-900を無料で受験できるバウチャー** を獲得することができます。
ただし実際にバウチャーを取得できるのは、受講完了から5営業日後となるのでご注意ください。   

ウェビナーの開催予定は、[Azureのイベントサイト](https://azure.microsoft.com/ja-jp/community/events/?query=Microsoft+Azure+Virtual+Training+Day%3A+Fundamentals&EventType=webinar) にて確認できます。
直近で開催する予定があれば、是非予約することをお勧めします。



## 効率的な学習方法
学習開始から試験受験までの効率的な学習の流れとしては、以下の順番での学習をお勧めします。

1. ラーニングパスで基礎的な知識をざっくりと学習
2. ウェビナーで理解を深める
3. 再度ラーニングパスで詳細な部分の知識を補足し、理解を深める

ラーニングパスは基礎知識の定着に向いていますが、情報量がとても多いです。
初めのうちはどこが重要なのか分からないと思います。
そのため、1度目のラーニングパスは全体をざっくりと学習し、全体像をつかむことを意識するのがよいです。  

一方、ウェビナーは基礎知識の深い理解に役立ちます。
内容はラーニングパスとあまり差異はありませんが、どこが重要なのかを分かりやすく教えてくれます。
そのため事前にラーニングパスで基礎を固めた内容について、より理解を深めることができます。
知識をチェックするための問題も出題されますので、自身の理解度の確認も出来ます。  

ウェビナーを受講した後にラーニングパスに再度目を通すと、驚くほど内容が頭に入ってくると思います。
試験本番では重箱の隅をつつくような問題も出題されますので、詳細な部分についての補足を意識しながら学習することをお勧めします。  


## オンライン受験について

私はAZ-900をオンラインにて受験しました。  
コロナ禍のご時世ですので、テストセンターに行かなくても受験できるのは大いにメリットです。
しかしながら、注意事項もいくつかありましたので以下に記載します。  

- 事前にPC周辺には何もない状態にしておくこと
- 安定した回線を使用すること  
  途中で回線が切れると試験が終了となる恐れがあります
- 時間に余裕をもって試験の準備を行うこと  
  試験前にはスマホ等で顔写真と免許証、PC周辺環境の撮影とアップロードが必要になります


## 本試験で得られる知識

本試験に向けた学習を行うことで、Azureにおける各サービスに対しての理解を深めることができます。
あくまで概念に対する理解がメインであり、実際にサービスを扱うための操作方法や、実践的な活用方法に関しての理解は別試験（[AZ-204](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-204)など）の学習をお勧めします。
しかしながら、私はAZ-900が **「Azureに関する理解の土台を固める」** という意味で大変意義のある試験だと考えます。
実際、業務でAzureサービスを扱っていたため、システムのサービス構成と各サービスの役割の理解に役立ちました。Azureサービスを利用した案件においては、よりスムーズに業務を進められるようになりました。



## まとめ

- 効率的な学習方法として以下の流れでの学習をお勧めします
  1. 「ラーニングパス」で基礎の定着
  2. 「Microsoft Azure Virtual Training Day: Fundamentals」で理解を深める
  3. 再度「ラーニングパス」を用いて詳細部分について補足
- オンライン試験の際は以下に注意してください
  - PC周辺は何もない状態にすること
  - 安定した回線を使用すること
  - 時間に余裕をもって試験の準備を行うこと
 

- ウェビナーで取得したバウチャーを用いれば、無料での受験が可能です
[Swift]複数のCoreAnimationを直列的にループ実行する

#はじめに
すみません、うまくタイトルが思いつかなかったので何がしたいのか詳しく説明すると、

1. Aのアニメーションを実行
1. Bのアニメーションを実行
1. (さらに任意の数のアニメーションを実行)
1. 1~3をループ


というのを、CoreAnimationでやりたかったという訳です。

具体的には[前回の記事](https://qiita.com/p_x9/items/c725e375476eef1e81be)の虹色ボーダーアニメーションに少し手を加えて、

1. 虹色のボーダーラインを時計回りのアニメーションで表示
1. 描画された虹色ボーダーラインを時計回りに消去
1. 1~2のアニメーションをループ

というようにしたいと考えました。

完成図だけ先に載せておきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">消える方にもアニメーション追加してみた <a href="https://t.co/2JKwIQRFS7">pic.twitter.com/2JKwIQRFS7</a></p>&mdash; M (@p_x9) <a href="https://twitter.com/p_x9/status/1384019341495078912?ref_src=twsrc%5Etfw">April 19, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##autoreversesではダメなのか
CoreAnimationにはautoreversesという機能がありますが、これはアニメーションを巻き戻すといった機能です。
そのため、以下のように描画されたボーダラインが反時計回りに消えていく形なので今回目的としたアニメーションとは違いました。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377767/6205e05c-3ecf-b790-c5a7-15542d6f800c.gif)



(こっちのアニメーションでもいいやないかと思う方もおられるかもしれませんが、そうするとこの記事の題名からして本末転倒なので許してください。)

#本編
では今回実装した手順を説明します。
##1. ループさせたい複数のCoreAnimationを作成
本題とズレる部分のコードの詳細についてはここでは避けますが([前回の記事](https://qiita.com/p_x9/items/c725e375476eef1e81be)を参考にしてもらえればと思います。)、以下のように繰り返したいアニメーションを作成します。

今回はanimation1についてはアニメーションが完了した時その状態を維持しておいて欲しいので、新たに`isRemovedOnCompletion`プロパティをfalseにしています。

```swift
//前回作成したアニメーション
let animation1 = CABasicAnimation(keyPath: #keyPath(CAShapeLayer.strokeEnd))
animation1.fromValue = 0.0
animation1.toValue = 1.0
animation1.duration = 1.0
animation1.isRemovedOnCompletion = false
aniamtion1.fillMode = .forwards

//今回新しく作成したアニメーション
let animation2 = CABasicAnimation(keyPath: #keyPath(CAShapeLayer.strokeStart))
animation1.fromValue = 0.0
animation1.toValue = 1.0
animation1.duration = 1.0
```

##2. 2番目以降のアニメーションの`beginTime`を設定
2番目以降に実行したいアニメーションについて、`beginTime`を

```
beginTime = これまでに実行したアニメーションのdurationの合計
```

となるように計算して設定します。
今回は、animation1のdurationが１なので以下のようになります。

```swift
animation2.beginTime = 1
```

もし仮にanimation3があったとすると、animation1とanimation2のdurationの合計を設定する必要があるので、

```swift
animation3.beginTime = 2
```

となります。

##3.`CAAnimationGroup`でアニメーションをグループ化
以下のようにアニメーションをグループ化します。durationには実行したいアニメーションのdurationの合計を設定します。

```swift
let group = CAAnimationGroup()
group.duration = 2.0
group.repeatCount = .infinity
group.animations = [animation1,animation2]
```

##4.グループ化したアニメーションを目的のレイヤに追加

```swift
self.shapeLayer.add(group, forKey: "animation-group")
```

##5.完了
これで正しく動くと思います。

##timingFunction
以下のように任意のtimingFunctionを設定するとより映えるかもしれません。

```swift
group.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
```

#おわりに
読んでいただいてありがとうございました。
ご指摘ご質問等ございましたら、コメントまたはDMまでお願いします。

この記事での内容は[こちら](https://github.com/p-x9/RainbowBorderAnimation)のgithubページからダウンロードできます。
iPhoneアプリにAppleWatchアプリを追加する方法

開発中のiPhoneアプリにApple Watchアプリを追加する方法を解説したものです。

#前提部分

「App」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/39468004-d0ba-7f8c-a124-a68535aedcc5.png)

任意の名前(今回はintroductionAppleWatch)を決め、任意の場所に保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/913f50f2-e161-a2b3-084f-4120b142d404.png)

画面左側のナビゲーターエリアを見ると(赤枠部分)フォルダは「introductionAppleWatch(アプリ名)」と「Products」がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/f07bf447-7fb1-b857-334d-cbb14f595726.png)

#Apple Watchアプリ追加方法
画面左のナビゲーターエリアの赤枠をタップし、画面左下の赤丸をタップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/67c18c10-cd00-6547-8510-88799a640807.png)
「watchOS」をタップし、「Application」の「Watch App」を選択した状態でNext。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/29badf1b-03b1-d6f2-80a1-03c4bc741514.png)
「Product Name」を決め、Finishをタップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/922c06d9-6073-e7c9-60fd-055cc1fc3af8.png)
赤枠のApple Watchアプリに関するデータが追加されます。これで終了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/6ec71105-1548-d601-61ee-c4af3d4cc9ad.png)
【Linux備忘録】shellの便利なショートカット

知らなかったショートカットしか書かないです

# 1.1 カーソル移動

|コマンド|動作|
|---|---|
|Ctrl+b(back)|行頭に向かって1文字分移動する|
|Ctrl+f(forward)|行末に向かって1文字分移動する|
|Ctrl+a|行頭に移動する|
|Ctrl+e|行末に移動する|

## 1.2 単語単位でのカーソル移動

|コマンド|動作|
|---|---|
|※1 Metaキー+b(back)|行頭に向かって1単語分移動する|
|Metaキー+f(forward)|行末に向かって1単語分移動する|

※1 Metaキー：メタキー（英語: meta key）とは、一部のコンピュータのキーボードにある修飾キーである。
(Weblio辞書より引用)
昔のキーボードにはあったらしいが、今のキーボードにはほとんど存在しないキーなので
AltかEscで代用するらしい(私の環境のTera termではAltをMetaキーとして使えないのでEscでのみ動作しました)

## 1.3 文字の削除

|コマンド|動作|
|---|---|
|Ctrl+w(word？)|行頭に向かって1単語分削除する|


## 1.4 カット&ヤンク(ペースト)

|コマンド|動作|
|---|---|
|Ctrl+k|※2 カーソル位置から行末までを削除する|
|Ctrl+u|カーソル位置から行頭までを削除する|
|Ctrl+y|カットした文字列をヤンク(ペースト)する|

※2：ここで削除した文字列はクリップボードに記録される(カット&ペーストのカットと同じ感じ)

# 2. 画面を消去する

|コマンド|動作|
|---|---|
|Ctrl+l|画面を消去する(Clearコマンドと同じ操作)|

# 3. コマンド履歴関連

Ctrl+rで「インクリメタルサーチ」というコマンド履歴の検索ができる

インクリメタルサーチ時の操作

|コマンド|動作|
|---|---|
|(文字列の入力)|検索語を追加して検索する|
|Ctrl+r|1つ前の検索結果に移動する|
|Enter|検索結果をそのまま実行する|
|Esc|検索結果を表示したままコマンドラインに戻る|
|Ctrl+g|検索結果を破棄してプロンプトに戻る|


##参考文献

新しいLinuxの教科書 (https://www.sbcr.jp/product/4797380941/)
AWSのEC2でバージョンが合わなくてpg_dumpできなかったのときの対処法

##EC2でpg_dumpしたとき

```
[ec2 ~]$ pg_dump -U postgres -h `host` -p 5432 `database` -f aws.dump
パスワード:
pg_dump: サーババージョン: 12.5、pg_dump バージョン: 9.6.19
pg_dump: サーババージョンの不整合のため処理を中断しています
```

このようなエラーが起きたときは、サーバーバージョンのほうのpg_dumpをダウンロードする必要がある。

下記でリンクアドレスをコピー
https://www.postgresql.org/ftp/source/v12.5/

```
$cd /usr/local/src
$wget https://ftp.postgresql.org/pub/source/v12.5/postgresql-12.5.tar.gz
```

- 解凍
- ディレクトリ作成
- makeの実行。

```
$tar xzf postgresql-12.5.tar.gz
$cd postgresql-12.5.tar.gz

$mkdir /usr/local/postgresql-12.5/

$./configure --prefix=/usr/local/postgresql-12.5/ --with-pgport=5432
$make
$make install
```

途中でこんな感じのエラーがでたら

```
configure: error: no acceptable C compiler found in $PATH
```

```
$yum install gcc
```

するとinstallできるようになります。
エラーが出てもググれば解決できるのでググりましょう。

## ダウンロードできたら
下記を実行し、ダウンロードしたpg_dumpのパスを確認。

```
$ find / -name pg_dump -type f 2>/dev/null
/usr/bin/pg_dump
/usr/local/src/postgresql-12.5/src/bin/pg_dump/pg_dump
```

確認したパスをつけてpg_dumpしてみる!

```
[myuser@ip-address ~]$ /usr/local/src/postgresql-12.5/src/bin/pg_dump/pg_dump -U postgres -h `host` -p 5432 `database` -f aws.dump
```

これでダウンロードできました...!!

## dumpをローカルに持ってくる
ローカルで下記コマンドを実行

```
scp -i (.pem) myuser@ip-address:(ec2上の持ってきたいdumpがある場所) (dumpを持ってきたいローカルのパス)
```


### 例

```
scp -i ~/.ssh/tumiki.pem myuser@ip-address:/home/myuser/aws0801.dump ./
```
Eclipseを使用したメインフレーム・アプリケーション開発 - (1)概要

# はじめに

当記事では、UIとしてEclipseベースのツールを使用してz/OSへのアクセスを行い、z/OS上のアプリケーション(主にCOBOL)を開発する流れを試していきたいと思います。
当記事ではz/OS側のコンポーネントはセットアップ済みの想定とし、Eclipse側の操作を中心に記載していきます。

## 関連記事
[Eclipseを使用したメインフレーム・アプリケーション開発 - (1)概要](https://qiita.com/tomotagwork/items/0a6b273473333f849116)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (2)z/OS基本操作](https://qiita.com/tomotagwork/items/67e7faac4ec30198f1d3)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (3)ソース編集](https://qiita.com/tomotagwork/items/2db56a0981e8dac57a20)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携](https://qiita.com/tomotagwork/items/da039208be2f77c21285)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (5)デバッガーの利用](https://qiita.com/tomotagwork/items/93457c9ba11870a7c357)

# Eclipse-z/OS連携概要

z/OSを扱うためのクライアントツールとしては、PCOMに代表されるTN3270クライアントが使われます。ブラウザベースのUIが出てきたり、API化なども進んでいますが未だに主流のUIはTN3270(黒背景に緑文字のCUI)だと思われます。
z/OS上のリソースの操作やアプリケーション開発においてEclipseをベースとしたツールも随分前から提供されておりそれぞれ機能拡張も行われています。
z/OS関連のEclipseベースのツールとしては、例えば以下のツールがあります。

- IBM Explorer for z/OS: z/OS基本操作 (以前はz/OS Explorerという名前でした)
- IBM Developer for z/OS: アプリケーション開発
- Wazi Developer for Eclipse: アプリケーション開発(Waziに付属)
- CICS Explorer: CICS管理
- IMS Explorer: IMS管理
- z/OS Connect API Toolkit: z/OS Connectアプリケーション開発
- などなど...

それ以外にも各種ツール関連のPlug-inが提供されていたりします。アプリ開発系のものやミドルウェア管理系のものはIBM Explorer for z/OSがベースとなっており、z/OSへの接続機能(FTPや後述のRSEでの接続機能)やPDSメンバー編集、USSファイル編集、JCLサブミット/JOBLOG確認機能などz/OS Explorerが持っている機能を内包していたりします。
このように、Eclipseというプラットフォーム上でz/OSに関する機能が充実してきているという状況があります。

後続記事では、主にz/OSのアプリケーション開発という観点で主にIDz(IBM Developer for z/OS) もしくは　Wazi Developer for Eclipseを中心に試していく予定です。

# 構成概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1206101a-4c9c-2e33-ea2a-a3dd9f0328fa.png)

Eclipseベースのツールからz/OSに接続して操作を行う場合、いくつか接続方式があります。1つのツールでも接続方式によってはできる機能や特性などに細かな違いがあります。
z/OSの基本操作を行う場合、FTP, z/OSMF, RSE(Remote System Explorer)という3つのタイプの接続方式があります。以下、z/OS Exporerの接続構成を行うビューの画面例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b581bda3-c13b-0f3b-ac5c-a96b0c6d7e97.png)

いずれかの接続構成を行って操作することになりますが、主な操作としては以下のような違いがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9c2ee0ae-87f6-1ecd-4f60-47db434184a5.png)

FTP, z/OSMFでの接続は機能がかなり限定的です。ホスト側でRSE(Remore System Explorer)の構成をする必要がありますが、細かな機能が充実しているので基本的にはRSEを使用するのが望ましいです(後続記事で紹介するアプリ開発機能を使用する場合、RSEでの接続が基本になります)。簡易的にホスト上のリソースを参照したり手っ取り早く修正したいというような場合であればFTP, z/OSMF接続でもOKです。
上で示した機能は追加コスト無しで無償の範囲で利用できます。
IDz(IBM Developer for z/OS) や Wazi Developer for Eclipseなどの有償製品はIBM Explorer for z/OSの機能(接続方式としてはRSE)をベースとしてアプリケーション開発の各種機能を追加提供しているとイメージです。

# 機能の整理

主な機能と、PC側、z/OS側で必要なコンポーネントについてざっくりと整理します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3b9e5f02-9eeb-da24-dfe0-4d6e7ccca897.png)
ADX2ロボットでブロックの長さを得る

#はじめに
ブロックの長さを知りたい時がよくあるので、
キューを選択して実行すると長さが得られるような
ADX2ロボット機能のスクリプトを書いてみた。

#やっていること
選択キューを取得
キューの中にあるブロックを取得
ブロックの長さ(BlockEndPositionMs)を得る
少し整形してログに表示

#出力結果
ログに出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/3012b036-a92a-a5fa-865b-2d0e66b14493.png)

何か最後に長いブロックが入っている・・・　これはいらないブロックかもしれない。
なんてことに気が付けたりする。

あと、長さが一定だった場合は、ここでも同じ値になっていれば心配ないなど安心できる。

#スクリプト

``` .py
# --Description:[tatmos][Analyze]選択したキューのブロックの長さをログに表示

import cri.atomcraft.debug as acdebug
import cri.atomcraft.project as acproject

# 選択しているCueを得る
selected_Cues = acproject.get_selected_objects("Cue")["data"]
if not selected_Cues :
    acdebug.warning("Please select at least a Cue.")
    sys.exit()

for cue in selected_Cues:

    # パス表示
    acdebug.log("Target Path:\"{0}\"".format(acproject.get_object_path(cue)["data"] ))

    Blocks = acproject.get_child_objects (cue, "Block")["data"]

    for block in Blocks:
        blockEndPositionMs = acproject.get_value(block, "BlockEndPositionMs")
        if blockEndPositionMs["succeed"]:
            length = "{:,.3f}".format(float(blockEndPositionMs["data"]))
            acdebug.log(" {0}\t {1}".format( "{:>12}".format(length) ,acproject.get_value(block, "Name")["data"]))
```

#おわりに
ブロックの長さ、ビートに合わせていたりした場合などに、半端なタイミングだとうまくループにならなかったりといろいろあるので、そういうチェックを入れても良いかもしれない。
【Kotlin】2021年版インタースティシャル広告の実装

###はじめに
久しぶりにインタースティシャル広告を実装しようとしたらInterstitialAdがdeprecatedされていたので更新しました。まだ日本語のドキュメントが更新されていないようでしたので備忘録も兼ねて残しておこうと思います。
変なところがあれば教えていただければ幸いです。
AdMob側の操作は割愛します。

```xml:build.gradle(app)
implementation 'com.google.android.gms:play-services-ads:19.8.0'
//19.7.0以降でdeprecatedのようです。
```

###実装

```kotlin:MainActivity.kt

import com.google.android.gms.ads.interstitial.InterstitialAd//新しい方

private var interstitial:InterstitialAd? = null
private val adInter = "ca-app-pub-3940256099942544/1033173712"//テスト用です

```
InterstitialAdはnull許容でいいみたいで、onResume等でロードしコールバックさせます。

```kotlin:MainActivity.kt

override fun onResume() {
        super.onResume()

        loadInterstitial()
    }

private fun loadInterstitial(){//インタースティシャル、ロード
        val adRequest = AdRequest.Builder().build()
        InterstitialAd.load(this,adInter,adRequest,object : InterstitialAdLoadCallback(){
            override fun onAdLoaded(p0: InterstitialAd) {//広告ロード成功時
                interstitial = p0
                interstitial?.fullScreenContentCallback = object : FullScreenContentCallback(){
                    override fun onAdDismissedFullScreenContent() {//広告を閉じた時
                    }
                    override fun onAdShowedFullScreenContent() {//広告表示成功時
                        interstitial = null
                    }
                }
            }
            override fun onAdFailedToLoad(p0: LoadAdError) {//広告ロード失敗
                interstitial = null
            }
        })
    }
```

広告の表示成功時も次の広告のためnullにしています。
あとは任意のタイミングでインタースティシャルをShowします。

```kotlin:MainActivity.kt

private fun showInterstitial(){
        if (interstitial != null){//ロードできていれば
            interstitial?.show(this)
        }
    }
```

###おしまい
リスナーからコールバックに変わっただけで仕様自体はたいして変わっていないようでした。
それにしても日本語のドキュメントが中々更新されないのはどうにかしてほしいですよね。
Herokuでファイルの変更履歴が存在しない場合にプッシュする方法

ファイルの変更履歴が存在しない場合、特に変更するファイルもないがHerokuに設定した環境変数だけ本番環境に反映させたい場合などはどうすればいいでしょうか。
最新のコミット履歴が存在しない状態でgit push heroku masterコマンドを実行しても「Everything up-to-date」と表示されるだけで何も起きません。
そこでターミナルで下記のコマンドを実行して空のコミットを生成することで解決できます。

```:ターミナル
% git commit --allow-empty -m "空のcommit" 
```

これでGitHub Desktopで空のコミット履歴ができたのでHerokuへプッシュすることができます。

```:ターミナル
% git push heroku master
```
あとはいつもの上記のコマンドを実行すれば問題なく反映させることができます。
SpringBootTestでmockito-kotlinを使ってみる

# はじめに
SpringTestにてmockito-kotlinを使用してテスト対象クラスから呼び出しているクラスをMock化したい時の記述例のメモです。

# 登場人物
あくまでも例です。
実在の人物や団体などとは関係ありません。

- mock対象のクラス 

```kotlin
@Component
class MockTargetClass(
    externalApiClient : ExternalApiClient
) {
   fun connectExternalApi() : ApiResult {
      return externalApiClient.connect()
   }
}
```

- test対象のクラス

```kotlin
@Service
class TestTargetClass(
    mockTargetClass : MockTargetClass
) {
   fun getExternalApiConnection() : String {
        return mockTargetClass.connectExternalApi().connectionStatus
  }
}
```
- testクラス(Mock導入前)

```kotlin
@SpringBootTest
class TestClass {
   @Autowired
   lateinit var testTargetClass : TestTargetClass

   @Test
   fun connectionTest() {
      val result = testTargetClass.getExternalApiConnection()
      assertEquals("OK", result)
   }

   @Test
   fun disconnectionTest() {
   ...
   }

...
}
```

- build.gradle.kts

``` build.gradle.kts
dependencies {
    ...
    testImplementation("org.mockito.kotlin:mockito-kotlin:3.1.0")
}
```
テスト環境では外部APIの接続で落ちるとします。

# Mock記述例

```kotlin
@SpringBootTest
class TestClass {
   @Autowired
   lateinit var testTargetClass : TestTargetClass

   @MockBean
   lateinit var mockTargetClass : MockTargetClass

   @BeforeEach
   init() {
      whenever(MockTargetClass.connectExternalApi(any())).doReturn(ApiResult.ok))
   }

   @Test
   fun connectionTest() {
      val result = testTargetClass.getExternalApiConnection()
      assertEquals("OK", result)
   }

   @Test
   fun disconnectionTest() {
   ...
   }

...
```

テストクラス(`TestClass`)から直接Mock対象クラスを呼び出していなくても、アノテーション(`＠MockBean`)でMock化したクラスを後からインジェクションできます。
`@Mock`アノテーションを使用するよりもすっきり書けるかと思います。

`init()` 関数でMock化したクラスの挙動を定義しています。
void型関数をMockして何もしないようにしたいという要求にはどうするの？と思われるかもしれませんが、`@MockBean`でインジェクションされたMockクラスのvoid関数はデフォルトで何もしない関数に置き換わるようです。
MacOSで.HEICフォーマットの画像を.jpgに一括変換するコマンド

とあるフォルダの中の百以上ある.HEICフォーマットの写真画像を、プレビューを使って一括変換しようとしたらフリーズしてしまったので、コマンドラインで変換した備忘録。

まず、そのフォルダに移動（cd）しておいてから、

```
for i in `ls *.HEIC | sed -e 's/HEIC//g'`; do echo sips --setProperty format jpeg ${i}HEIC --out ${i}jpg; done
```

上のコマンドをたたいて対象ファイルが正しいかなどを確認する。
（コマンド長いのでスクロールして最後までご覧ください）
それから、do echoの部分をdo evalに変更すると、表示されたコマンドがそのまま実行される。

同じフォルダの中に、拡張子が.jpgに変更されたファイルが大量にできます。
こうしてみると、たしかにHEICの圧縮率はjpgの２倍くらいにはなっている感じですね。

情報元：
https://www.labohyt.net/blog/apple/post-1730/
テックキャンプを受講してみた結果を包み隠さず話します！

私自身が受講してみた結果が思う感想です。

意外と中に入ってみたら想像と違うなと思うところもありましたので、もしテックキャンプに入ろうかなと悩んでいましたら読んで頂けると幸いです。

結論から申しあげると自分は100満点が最高点数だとして語るなら、50点ってところでした。
正直微妙です。

自分はコロナウイルスの影響で前職を解雇になり元々プログラミングに興味はあり、手に職をつけたいことから短期集中スタイルで受講を決めました。
多少調べてみて、メンターにも質問し放題、キャリアアドバイザーがついている、転職保証がある、自社開発企業の就職率が高い（コロナウイルス発生前の話）、広告で観てプログラミングスクールが一番有名な所ってテックキャンプなのかなと思い通い始めました。

自社開発の就職率はコロナウイルスが流行る前は高かったですが、今はSES企業に就職している人が多かったはずです、具体的な数字は忘れましたが、テックキャンプさんにグラフを以前見せてもらった際自分が最初みたときのグラフとは大幅に違いました、もし気になるのであればテックキャンプさんに見せてもらう事を推奨します。




なぜそう思うのか

良い点


受講開始となりますと、基本的に連絡の取り合いはSlackというアプリでやりとりはします。
SlackはITエンジニアが務める会社で大体使われているツールな気がしますので慣れておくにはとてもいいと思いました。



勉強自体は一人で行いますが、校舎メンバーの同期の方とチームになってカリキュラムの進捗状況や休憩時間や１時間に一回アウトプットの時間があり、早く終わったりして時間が余ったりするとそこで（あの問題難しかったですよね〜）なんて会話が出来るので一人じゃないところも良いと感じました。モチベーションを保つには良い環境です。
そしてライフコーチも最初はいますので、生活リズムについての相談や勉強の進め方についての相談も可能です。


朝9時から夜の10時までメンターに質問し放題、これはとても助かります、カリキュラムのことであればほんとになんでも質問し放題です、質問のしかたを少し変えて質問をしてみたりすると、たまにカリキュラム外の内容も答えてくれます。
一見カリキュラムに関係ない質問でも、カリキュラムの内容となんらかの関連付けて質問すると大抵答えてくれます。
他の方はどう質問しているのかは分かりませんが、自分の場合は９割型答えてくれるメンターさんが多かったです。


転職保証があることもとても安心できます。


更にキャリアサポートがあるのでこれまでに受講生がどんな企業に就職してきたのかなど分かります。
面接対策や聞きたいことがあれば全て対応してくれます。







悪い点

受講料ははっきり言って高いです、私は月々税込み3万５千円を24回お支払いしていきます。合計で84万円になります。
正直、他のプログラミングスクールでしたり、現役エンジニアが行っているサロンのほうが安くて良い所が有ると思います。

メンターに関しては現役のエンジニアの方もいれば、株式会社div(テックキャンプ）で初めてエンジニアになった方もいます。ここが難しいですよね、何の定義で現役エンジニアなのかが、、、

更にカリキュラムを進める際にエンジニア転職を成功させる上でとても大事なポートフォリオについてなのですが、テックキャンプさんは一切観てもくれませんし、アドバイスすらくれることはありません。たまにメンターと仲良くなって、すこーしだけ、ヒントをくれる方もいますが、基本的にはNGです。ここは正直テックキャンプに入る前に知りたかったです。自分の情弱性を恨みます。
観てくれるスクールさんも中には有るので、、もしヘルプが必要な方であればポートフォリオを観てくれるスクールさんをお勧めします。

キャリアアドバイザーに関しては、当たり外れが有ると思いました、
私の場合はめちゃくちゃ急かされて、早く就職をした方がいいと思います、どうせその会社に入ったとしてもずっといるわけじゃないので、どこか内定が出次第早く就職をしましょう、という方でした、正直あまり良い方ではなかったです、
ですが幸いにもその方が他の部署に移動になったので、別の方に変わりましたがしっかりサポートをしてもらいとても良い方でした。なので合わないなと感じた際に相談できる人も自分の担当のキャリアアドバイザーしかいませんし、相談できる場がないのは最悪でした、一応アンケートも有るには有るんですが、その自分に合わないなと思った方もみていますので、気まずいですよね、、


転職さきを探す際、一般非公開求人に出会える、とテックキャンプさんのホームページにありますが、このサービスはほとんど無い物とみて良いかもしれません。
自分はなんの案内も無かったです、企業説明会に関しても自分には案内があまりなくキャリアサポーターに聞いてみたところ
（大体の受講生はwantedlyなどの求人サイトから会社にひたすら応募してそこから引っ掛かった会社に面接をしにいくのがノーマルな動き）と行っていました。

以上になります、
特に減点対象として大きかったのはポートフォリオに関してですかね、ここがマイナス3~40点ぐらいあります。
初めてブログを書いたものなので文章がおかしいかもしれませんが、ここまでみてくださって誠にありがとうございます。
kubectl 1.21でapplyしたらpanic発生


いつもの通りアプリケーションを apply しようとしたら見たことのないエラーが発生した


```
$ kubectl apply -k ./

```
こんなエラーが出た

```
panic: runtime error: index out of range [9] with length 9 [recovered]
        panic: runtime error: index out of range [9] with length 9

goroutine 1 [running]:
k8s.io/kubernetes/vendor/gopkg.in/yaml%2ev3.handleErr(0xc0004e6d08)
/build/kubectl/parts/kubectl/go/src/github.com/kubernetes/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/gopkg.in/yaml.v3/yaml.go:276 +0x8d
panic(0x1d930a0, 0xc0034bd2c0)
/snap/go/7360/src/runtime/panic.go:965 +0x1b9
k8s.io/kubernetes/vendor/gopkg.in/yaml%2ev3.write(0xc0025ee380, 0xc003549e30, 0x9, 0x10, 0xc0004e4a80, 0xc0004e4a01)
/build/kubectl/parts/kubectl/go/src/github.com/kubernetes/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/gopkg.in/yaml.v3/emitterc.go:90 +0x245
k8s.io/kubernetes/vendor/gopkg.in/yaml%2ev3.yaml_emitter_write_comment(0xc0025ee380, 0xc003549e30, 0x9, 0x10, 0x18)
      
中略～

/kubernetes/vendor/github.com/spf13/cobra/command.go:958 +0x375
k8s.io/kubernetes/vendor/github.com/spf13/cobra.(*Command).Execute(...)
/build/kubectl/parts/kubectl/go/src/github.com/kubernetes/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/github.com/spf13/cobra/command.go:895
main.main()
_output/local/go/src/k8s.io/kubernetes/cmd/kubectl/kubectl.go:49 +0x21d
```

panic ??

僕がパニックです。


まずはバージョン確認

```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0",...
```

フムフム。
自分の記憶では、以前確認して覚えているのは「1.19」だったはず。。。

■公式ドキュメント
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/

```
$ mkdir ~/kubectl-1.19
$ cd ~/kubectl-1.19
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.19.0/bin/linux/amd64/kubectl
```

落としてきた場所のkubectlを指定して試してみる
バージョンで確認

```
$ ~/kubectl-1.19/kubectl  version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", ...
```

ディレクトリ移動して

```
$ ~/kubectl-1.19/kubectl apply -k ./
```

エラーなし。applyできた。

調べてみると、
kubectl 1.21.0 から built-in kustomize のバージョンが「4.0.5」になっていた。

原因は、manifestファイルのyamlのコメントアウト部分に「multi-byte（日本語）のコメント」が入っていると、panicを起こすという事らしい。

幸いなことに、複数の namespace で、同じコメントが多数散らばっていたので、VSCode の全文検索で英語に置き換えまくって、再度apply。

無事applyできるようになりました。

```
NAME                                       READY   STATUS      RESTARTS   AGE
zozo-monitor-cronjob-1618821900-zqckf      0/1     Completed   0          2m39s
zozo-monitor-cronjob-1618821960-d46t6      0/1     Completed   0          106s
zozo-monitor-cronjob-1618822020-gfw5h      0/1     Completed   0          42s
zozo-monitor-deployment-8547566c5c-hb8x9   2/2     Running     0          3m52s
```


#学び

解りがよかろうと日本語で細かくコメントを書いていたことが災いした。
コメントも英語で書くことにします。
コード署名の確認方法

AVで検出したマイクロソフト純正のプログラムに、コード署名がなかった。
そういえば、どうやって確認するんだろうというメモ

### コード署名あり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/2d914705-6ff3-87f4-e676-7cd60d00ab46.png)

### コード署名なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/cdb202dd-c196-ddbc-d926-9860ef116722.png)

コード署名がなかったのは、Windows Terminal。Microsoft Storeaからインストールされたもので、以下のフォルダーに格納される。このフォルダは、管理者権限でも中を直接見ることはできない模様

C:\Program Files\WindowsApps\　

システム管理者権限で開こうとすると、セキュリティ設定の変更が必要と出てくる。

パスを直打ちすると以下のダイアログ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/7f359315-6fce-daf9-3200-1819aad19c0b.png)

セキュリティタブでプロパティ-セキュリティに移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/9155c97a-af06-04ce-140a-b8e100393cb7.png)

「詳細設定」を開くと、こちらの画面に遷移。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/ec3b5962-cfc4-8958-6dc0-90f672382d4f.png)

上記プロパティは、タスクマネージャーから、稼働中のWindows Terminalを選択して、プロパティを表示したもの
応用情報技術者試験 合格のための勉強法

この記事では，私が実践した[応用情報技術者試験](https://www.jitec.ipa.go.jp/1_11seido/ap.html)のための勉強方法を残します．

# 1. 結論

- **[応用情報技術者試験.com](https://www.ap-siken.com/)の過去問をひたすら解く**
    - 午前試験は直近２回を除く過去５回分くらい解く（１０回分だと安心か？）
    - 午後試験は自分が得意な分野の過去問と解説を５回分くらい眺める

**参考書は特になくてもよい**です．知らない単語や概念が出てきても，ネットで検索すれば十分な情報を得られます．

# 2. 試験の概要

応用情報技術者試験は　午前と午後　に分かれています．

||形式|出題数|合格基準|時間|
|---|---|---|---|---|
|午前|選択式|80 問|60%以上|150 分|
|午後|記述式|大問11個 (それぞれ小問が8個程度)|60%以上|150 分|

午前と午後両方で合格することで，応用情報技術者試験に合格になります．

# 3. 午前の対策

**[統計情報](https://www.ap-siken.com/aptoukei.html)** にあるように，**午前の80問のうち，40問前後は過去に出題された問題がほぼそのまま出題されます**．

また，**直近２回分の問題は出ず，過去６～２年分から出題される**傾向があることから，その範囲に絞って勉強するのが最も効果的です．

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193401/5d2575d5-6b17-36ac-32e3-d92b0eb03ced.png" width="800">
（画像：[統計情報](https://www.ap-siken.com/aptoukei.html)より引用）

実際には何回分かの過去問を解いた時点でパターンが分かってくるので，10回分も解かなくてよいかもしれません．

パターンが把握できるまで，[応用情報技術者試験.comの過去問道場](https://www.ap-siken.com/apkakomon.php)の年度を限定してひたすら解きます．過去問道場には丁寧な解説がついているため，理解できずに困ることはほぼないと思います．

また，過去問道場には**復習機能**（間違えた問題だけもう一度解く機能）があるため，大変効率的に対策できます．

１問１問にあまり時間をかけず，**スピーディーに目を通す**のがおすすめです．

# 4. 午後の対策

午後は以下の項目の大問が１１個あり，１つが必須問題，残りの１０個から4つを選択する必要があります：

1. 情報セキュリティ(必須)
2. 経営戦略
3. プログラミング
4. システムアーキテクチャ
5. ネットワーク
6. データベース
7. 組込みシステム開発
8. 情報システム開発
9. プロジェクトマネジメント
10. サービスマネジメント
11. システム監査

大事なのは，**自分の解けそうな分野がどれかを知る**ことです．事前知識に応じて，オススメの問題は変わってきます．

解けそうな分野が決まったら，あとは**[応用情報技術者試験.com](https://www.ap-siken.com/)の過去問をひたすら解く**ことで対策は十分です．

### 事前知識なしでも解けるオススメの選択肢

以下の２つは国語の問題（読解力があればどうにかなる問題）が多いため，**非常にオススメ**です．

- **サービスマネジメント**
- **システム監査**

### その他のオススメの選択肢

- **プログラミング**
    - プログラミングの経験がある人ならぶっつけ本番でも解ける内容です．
- **システムアーキテクチャ**
    - ITの基本的な知識で対応できる問題が多いため，対策なしで解ける年度が多かった印象です．

# 5. 勉強期間

- 実務経験が数年あってIT関連の知識が豊富な場合
    - 前日に数時間勉強して，出題傾向を知るだけで十分だと思います．
- そうでない場合
    - 過去問がスラスラ解けるようになるまで準備するのがよいです．ネット記事を見ていると，数時間～1000時間と，人によって勉強時間が大きく違うようです．

# 6. 本番当日

- 午前も午後も150分という長丁場ですが，午前はほとんどの人が早く解き終わって途中退室します．
- 午後は１０個の大問をざっと眺めて，簡単そうな問題を解くとよいです．
system_specで直接javascriptを実行する

# はじめに

system spec を書いてるときに、javascript が起動しないときがあり直接 javascript を実行できたらエラーを回避できるときがあると思います。

# 解決法

capybara の execute_script を使うと javascript を実行させることができます。

```ruby
page.excute_script "console.log('javascript')"
```

これを利用すると、強引にフォームに値を送り込めます。

```ruby
page.excute_script "$('#form').val('フォームの値')"
```

本来は、エラーを解消してテストをパスするべきなので利用はご利用的に
MVVMモデルについて

#はじめに
この記事では、MVVMモデルについて簡単にまとめました。
⚠️当方初学のため認識違いがある可能性大です
誤りを見つけた際はコメントにて指摘していただけると幸いです🙇‍♀️🙇‍♂️


#参考
この記事は、以下の情報を参考にして執筆しました。

- [Wikipedia](https://ja.wikipedia.org/wiki/Model_View_ViewModel)
- [【ほりす】#4-1 MVVMとは/リファクタリング1](https://www.youtube.com/watch?v=KWs7WEeuat0)
- [キーマンズネット](https://www.keyman.or.jp/kn/articles/1906/26/news033.html)


#MVVMモデルとは
![Presentation and Presentation Logic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790168/5f976c19-b2db-9c13-7c3b-ac7615a01646.png)
(https://www.keyman.or.jp/kn/articles/1906/26/news033.html から引用)
※直線は直接的なAssociationを表し、破線は（例えば）Observer パターンを経た間接的なAssociationを表す

View : UIを表示するロジックのみをもつ
ViewModel : UIに表示するためのデータを管理
Model : 上記2つ意外の処理
DataBinding : アクションを監視し、変更があれば反映する
Presentation and Presentation Logic : Viewの表示と、Viewに関する処理
Businesslogic andData : ビジネスロジックと固有のデータの管理

UIを持つソフトウェアに適用されるソフトアーキテクチャの一種。
MVCパターンの派生。
Model、View、ViewModelのそれぞれに役割が分かれている。
依存関係としてはView → ViewModel → Modelという形でその逆はない。


#MVVMの利点
・責務の分離がしやすい
・スケーラビリティ（拡張しやすい）
・テストがしやすい（UIロジックとビジネスロジック が分離されているため）
・AACというライブラリと親和性が高い


#Model
固有のデータとそのビジネスロジックなどを扱う。
Viewの描画処理について何も知らないし関わらないが、Viewの見た目、装飾についての情報は保持している。


#View
アプリケーションの扱うデータをユーザへ見せるため表示し、ユーザからの入力を受け取る。（ユーザインターフェイス）
Viewは渡された値に基づいて描画を行う。
よって、状態は保持しない。


#ViewModel
Viewを描画するための状態の保持と、Viewから受け取った入力を適切な形に変換しModelに伝達する。
ViewとModelの間の情報の伝達と、Viewのための状態保持のみを役割とする。
リストで指定したファイルをバックアップ、削除する

linuxサーバー上で数十の任意のファイルを正確に削除する必要があったので、備忘録として実行したコマンドを残しておきます。ファイルリストさえ正しいことが確認できれば、汎用的に利用できるかもしれません。ご参考になりましたら幸いです。

環境：
ls data/
A	B	C	D

cat delete_list.txt 
data/B
data/C

上記のdataディレクトリとファイルリストが存在するディレクトリにて下記を実行する。

1.ファイルリストに記載されているファイルのバックアップを取得する
```tar cvfz delete_backup.tar.gz -T delete_list.txt ```

2.ファイルリストに記載されているファイルの存在有無を確認する
```cat delete_list.txt | xargs -I % sh -c "ls -ltr %"```

3.ファイルを削除する
```cat delete_list.txt | xargs -I % sh -c "/bin/rm %"```

4.ファイルが削除されているか確認する
```cat delete_list.txt | xargs -I % sh -c "ls -ltr %"
ls: data/B: No such file or directory
ls: data/C: No such file or directory```
備忘録hash関数

簡単なハッシュ関数

```c++
#include <functional>

Py_hash_t
lazyhash(void* data)
{
	auto n_hash =  hash<void *>()(data);
	size_t seed = 0;
	seed ^= n_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
	return seed;
}
```

テンプレ

```c++
#include <functional>

template <typename T>
Py_hash_t lazyhash_t(T data)
{
	auto n_hash = hash<T>()(data);
	size_t seed = 0;
	seed ^= n_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
	return seed;
}
```
【GCP】プロジェクトの考え方をわかりやすくまとめてみた

GCP 上で動くシステムは、「プロジェクト」の単位で管理されます。

AWSとかを先に使ってると、プロジェクトで管理する考え方がややこしく、とっつきずらいと思いますが、慣れれば、便利な考え方だなと思えます。
プロジェクトは複数作成することが可能です。

ポイントは、
プロジェクト毎にユーザー管理や課金が別個に行えるため、複数のクライアント向けにプロジェクトを進行する開発者の方々にとって、管理が容易になるというところです。

また、GCP で利用するリソース以外にも、Google Calendar や Google Map などで利用する Google API もすべてプロジェクトと紐づけられ、プロジェクト単位で課金やユーザー管理を行うので、Goolgeサービスを使う上で必須の知識です。

↓
だからプロジェクトという名前になっている

#公式ドキュメント
https://cloud.google.com/docs/overview

#図で書くとこんな感じ
![リソース階層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/28110ad9-94c3-71ee-181c-73ecb6985782.png)
フォルダとかありますが、この辺はここでは触れません。

#メリット
比較的簡単にシステムの分離ができる。
プロジェクトやGCP のサービス(Compute Engine とかCloud Storage とかそういったサービスを指します。)ごとにアクセス権限を設定でき、プロジェクトで分けると権限設定や管理が楽になる場合が多い。
請求はプロジェクト単位で発生するため、どのシステムでどの程度料金が発生したかが明確になる。
オペレーションミスやなんらかの理由でプロジェクトが乗っ取られた場合の影響範囲を最小限にできる。

#ベストプラクティス
https://qiita.com/kunitaya/items/94d36dcded51b41937f8
https://cloud.google.com/docs/enterprise/best-practices-for-enterprise-organizations?hl=ja
どんな管理の仕方がいいのかは、状況によって違うのでしょうが、公式によるベストプラクティスも公開されているので、参考になるかと思います。

#参考URL
https://cloud.google.com/docs/overview
https://cloud.google.com/resource-manager/docs/creating-managing-projects
https://www.topgate.co.jp/gcp02-getting-started-guide#gcp
https://apps-gcp.com/gcp-basic-01-preparation/#i
http://wild-data-chase.com/index.php/2019/08/31/post-931/
Dockerとコンテナの概要

# 本記事について
本記事は題名の通り、Dockerとコンテナに概要を記載したものです。
自分用メモですがDocker初心者がイメージしやすい…と思うレベルで記載したのでどなたかの参考になれば幸いです。

# Dockerとは
Dockerはデータやソフトウェアを隔離できる仕組みを持ちます。
通常、パソコンやサーバでは複数のソフトウェアが同時に動いています。
私のパソコンで例を挙げるとサーバにApacheを、DBにMySQLを、プログラミングにEclipseを使用している状態ですね。
このように複数のソフトウェアやデータをそれぞれ独立した環境に隔離できるのがDockerです。Dockerで隔離するのはソフトウェアやデータだけではなく、OS(ようなもの)ごと出来るのです。

# コンテナとは
簡単な例としてパソコンやサーバ上の環境をタンスのように細かい収納空間に分けている…と考えれば身近に思える(かな？)
独立した収納空間ごとにMySQLやEclipseと言ったデータやソフトウェアが入っています。
この収納空間のことをコンテナ(container)と言い、コンテナが使える仕組みを備えているのがDockerです。
GitHub Actions: jobのskipとneedsとalwaysとfailure。2021-04-19

# 概要

わかりにくいタイトルですみません。

* `needs` でjobを順番に実行したい
* 途中のjobはスキップする可能性あり
* でも一番最後のjobは必ず実行したい
    * 途中のjobで失敗しなかったら最後のjobは必ず実行したい

みたいなときの設定例を書きます。

# 設定例1

`needs` で順番に実行

```yaml
jobs:
  job1:
    ...
  job2:
    needs: job1
  job3:
    needs: job2
```

GitHub Actionsのjobは並列で動きます。
順番に動かしたいときはneedsを使うことで制御できます。

上記の設定だと job1 -> job2 -> job3 の順番で動きます。
（もちろん途中のjobで失敗したらそれ以降のjobは動きません）

# 設定例2

設定例1を変更して、job2にifを追加しました。

```yaml
jobs:
  job1:
    ...
  job2:
    if: ${{ 差分があったら実行みたいな条件 }}
    needs: job1
  job3:
    needs: job2
```

この設定だと差分があったらjob2が動き、差分がなかったらjob2は動きません（スキップします）。
**このときjob2が動かない（スキップする）と、 `needs: job2` の影響でjob3は動きません。**
（もちろん途中のjobで失敗したらそれ以降のjobは動きません）

# 設定例3

設定例2だとjob2が動かない（スキップする）とjob3が動きませんでしたが、job2がスキップしたときでもjob3が動いて欲しい時があります。

```yaml
jobs:
  job1:
    ...
  job2:
    if: ${{ 差分があったら実行みたいな条件 }}
    needs: job1
  job3:
    if: always()
    needs: job2
```

job3に `if: always()` を追加することでjob2がスキップした場合もjob3が動くようになります。

**ただし、`always()` を設定するとその名の通り必ず動きます。job2が失敗したとしても動きます。**

（参考: [`!cancelled()`の方が良さげ](https://qiita.com/abetomo/items/d9ede7dbeeb24f723fc5#comment-fed8c87e64a8fe780279)）

# 設定例4

設定例3だとjob2が失敗した時もjob3が動きました。
しかしjob2が失敗したときにはjob3が動いて欲しくない時があります。

要件が複雑になったので箇条書きにすると

* job2が成功したらjob3が動く
* job2をスキップしてもjob3が動く
* job2が失敗したらjob3は動かない


```yaml
jobs:
  job1:
    ...
  job2:
    if: ${{ 差分があったら実行みたいな条件 }}
    needs: job1
  job3:
    if: ${{ ! failure() }}
    needs: job2
```

`if: ${{ ! failure() }}` を設定することで「失敗しなかったら」という条件になるので、「成功した場合」、「スキップした場合」それぞれでjob3が動くようになります。

（参考: [`!cancelled() && !failure()` の方がよさげ](https://qiita.com/abetomo/items/d9ede7dbeeb24f723fc5#comment-fed8c87e64a8fe780279)）

# まとめ

説明が下手で伝えたいことが伝わったかわかりませんが、GitHub Actionsでは`needs` と `always()` や `failure()` を組み合わせることでいろいろ制御できます。

[`cancelled()`　もあります。](https://qiita.com/abetomo/items/d9ede7dbeeb24f723fc5#comment-fed8c87e64a8fe780279)
【Rails】画像投稿機能において画像を投稿していないときに代替画像を表示させる方法

#前提
・CarrierWaveは導入済み
・登録した画像表示はできる

#はじめに
画像投稿機能において画像を投稿していないときに代替画像を表示させる方法を記します。
基本的にはCarrierWaveを使ってデフォルト画像を設定すれば画像を投稿していないときに代替の画像を表示させることができます。ただ、アップロードする必要がある画像部分が全部同じデフォルト画像になってしまいます。アップロードにより表示させる画像に見境なく用意した画像を使用してしまう為、表示にそぐわない部分にも適用されてしまう可能性があります。

if文を使って画像を投稿していないときに代替画像を表示させることで、上記の問題を解決したので自らのメモとして残しておきます。

#手順
まず、`image_tag`で画像を表示させるコードを記述。

```
<% @posts.each do |p| %>
　　　　　
　　　　　
<%= image_tag p.image_url %>
　　　　　
　　　　　
<% end %>
```

そして、代替画像を表示させるコードも準備します。

```
<%= image_tag "no_imageとか書かれた代替画像" %>
```
そして下記のようにif文で記述する。

```
<% if p.image.present? %>
  <%= image_tag p.image_url %>
<% else %>
  <%= image_tag "no_imageとか書かれた代替画像" %>
<% end %>
```

presentメソッドを使って、`p.image`に画像が入っていればユーザーから投稿された画像を表示し、画像が入っていなければこちら側が準備した代替画像を表示させるようにしています。

#参考記事
[【Rails】image_tagの基本とデフォルト画像の設定方法](https://qiita.com/Toshimatu/items/a6382efd410fe5544406)
WSL：systemctlのPIDエラーで悩んだ話

# はじめに
ある日
株式会社Unreactの社長さん<font color="gray">（同級生）</font>と会食<font color="gray">（と言ってもジョイフルなんですが...笑）</font>中に「WSLって便利だよ」
という話を聞いたので早速WSLを使ってみようとインストール。
dockerの勉強もしたかったので、インストールしているときに直面したsystemctlに関するエラーのお話です。

# 解決法

```.bash
$ systemctl
   System has not been booted with systemd as init system (PID 1). Can't operate.
   Failed to connect to bus: Host is down
```
`systemctl`というコマンドを売ったときに上記のようなエラーが出ませんでしたか？
これは、下記の参考サイトでも説明されているのですが、**systemdを1番目のプロセスとして起動していない**ために
起こるエラーなのです。
では、1番目にすれば解決するはずです。

先に参考にしたサイトを紹介します。

>* [WSL2の新機能を試してみよう](https://www.school.ctc-g.co.jp/columns/miyazaki/miyazaki22.html)
>* [Windows 10 Home（WSL2）のUbuntuでsystemctlを利用する方法（systemdをPID1で動作させる方法）](https://snowsystem.net/other/windows/wsl2-ubuntu-systemctl/)

それではこのエラーを解決していきましょう！
自分の場合だけかもしれませんが、上記の2つのサイトのコマンドを組み合わせないとうまくいきませんでした。
うまくいかなかった部分も紹介していきます。
それとこの解決方法はWSLのみに使える方法なので注意してください。

## genieをインストール
`systemctl`のエラーを解決する方法には`genie`というものを使うことで解決することができます。
この`genie`を使う上では、debian系の場合に必要となるパッケージがあるので先にインストールを行います。
このへんは上記に紹介したサイトを引用させていただきます。
ここでインストールしてるのは

* daemonize
* dotnet-sdk-3.1

の2つです。

```.bash
$ sudo apt install daemonize
$ sudo apt-get install -y gpg
$ wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o microsoft.asc.gpg
$ sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
$ wget https://packages.microsoft.com/config/ubuntu/20.04/prod.list
$ sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
$ sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
$ sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list
$ sudo apt-get update; \
   sudo apt-get install -y apt-transport-https && \
   sudo apt-get update && \
   sudo apt-get install -y dotnet-sdk-3.1
```

つぎに本命の`genie`をインストールしていきます。ここで自分は少し悩んだのですが、多くのサイトで紹介されている方法ではうまくいかなかったのです。
そのコマンドは

```.bash
$ curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
```

なんですけども

```.bash
bash: 行 1: 予期しないトークン `newline` 周辺に構文エラーがあります
bash: 行 1: `<!DOCTYPE html>`
```

みたいなエラーがでます。`<!DOCTYPE html>`と出ている感じ、どうやらcurlで取ってくるサイトがないみたいです。
なので、`systemd-genie.deb`を[こちら](https://github.com/arkane-systems/genie/releases/tag/1.26)からダウンロードして`/home/<username>`にコピーします。
その後に以下のコマンドを実行して、

```.bash
sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y aspnetcore-runtime-3.1
```

最後にこのコマンドを実行したらインストールは完了です。

```.bash
sudo dpkg -i systemd-genie.deb 
```

そして、`genie`のインストールが完了したら以下のコマンドで起動してみましょう。

```.bash
genie -s
```

なにもエラーが出ずに、username@hogehoge-wslとなってれば起動は完了です。
試しに`systemctl`を打ってみてエラーがでなければ無事エラーを乗り越えることができました。
お疲れさまでした。

# おわりに
WSL...そこにはなにか魅力を感じます。まだまだ自分は触り始めたばっかですが、これからさらに勉強をしてWSLやdockerを扱えるようになりたいですね（＾＾）
Sequel Pro のお気に入りを2秒で引っ越す方法

# エクスポートしたいお気に入りを選択してエクスポートを選択

![スクリーンショット 2021-04-19 17.11.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63060/c01a65b2-4984-85ce-ec51-5256080c397b.png)

# ファイルをダウンロード

![スクリーンショット 2021-04-19 17.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63060/69caf0c7-4938-c3ed-27f1-0a422ddf4bc6.png)

# エクスポートしたファイルを新規PCに移して、左下の設定アイコンからインポートを選択

![スクリーンショット 2021-04-19 17.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63060/8458834d-d187-0aac-ab40-d2fbe98e22de.png)

# パスワードはkeychainの中にあるので、keychainのファイルを上書き

```
/Users/{{name}}/Library/Keychains/login.keychain-db
```
＊上書きする場合、新しいPCで既に新規のアクセスを登録していないか注意
駆け出しエンジニアがLeetCodeを30問解いてみた

## 概要
海外や外資系の面接では、多くがコーディングテストを取り入れているらしく、私自身コーディングテストを受ける身になったのでLeetCodeでEasyの問題を30問解いてみました。
![Screen Shot 2021-04-19 at 16.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764231/5ca3ee75-4b2e-f8b4-ffc0-37962a64e304.png)

## LeetCodeとは
コーディング面接で使われるプログラミングの学習サイト。あるお題に沿って、関数やクラスの中身をコーディングしていくというもの。好きな言語を使って学習をすることができますが、基本的なメソッドを理解していれば、あとは「アルゴリズムを自分でどのように組み立ていくか」が試される問題になっています。

https://leetcode.com/

## 著者のプログラミング歴
### スキルセット
JavaScript / PHP / Vue / React / Laravel / MySQL

### 学習歴
2020年６月 学習開始。
2020年１１月　転職
実務経験は3ヶ月ほど。

## LeetCodeを30問解いて変わったこと
### アルゴリズムを仮説を持って組み立てることができるようになってきた
最初の５〜10問ほどはアルゴリズムを自分で組み立てることができず、四苦八苦していたのですが、基本的な問題であれば仮説をもってコードを書くことで次のデバッグに生かすことができたり、１発で正解する問題もちらほら出てくるようになりました。

### 意外と理解していないメソッドがたくさんあることに気づいた
JavaScriptでコーディング学習をしていたのですが、JavaScriptの代表的なメソッド（自分が勝手にそう思っている）mapやreduce、forEachなどはもちろんのこと、toStringやsplit、joinやspliceなどわかっていそうで深くは理解できていないメソッドがたくさんあることに気づきました。
ただLeetCodeで学習する分には、そんなにたくさんメソッドを理解しておく必要はありません。

### コーディングテストそのものに抵抗がなくなって来た。
お話をいただいたときは、まだ駆け出しだし自分に解くことができるのか？と半信半疑でしたが、ある程度の数をこなしたことでコーディングそのものに対して自信を持って解くことができるようになったと感じます。

## まとめ
ITエンジニアとして、今後グローバルな企業に挑戦したい方、アルゴリズム力を鍛えたい方にはおすすめの学習サイトです。私自身アルゴリズムを考えるにあたって仮説を立てる力が身についてきたと感じます。今後もエンジニアとしてスキルアップができるように学習を続けていきたいと思います。
【Dr.Sum Datalizer】作成済の集計定義のテーブル/ビューを変更したい（一括変換ツール）

#目標
Datalizer付属の一括変換ツールの存在を知り、使おう

#経緯
####あとからテーブル/ビューを変更すると設定がクリアされる
一度作成したDatalizer集計定義の･･･
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/3b397608-0eea-654b-efb6-9b89bdc8ef3f.png)
共通項目設定から、テーブル/ビューを変更すると･･･
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/4fedd176-d1b2-f313-9b72-bc4b50f687f5.png)
　　　　　　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/fdb6cce6-9b42-2c69-370a-7c0fcc671d2d.png)
頑張ってやった設定を失うという悲劇が起きます。
テーブル/ビュー名を変更したいときも同様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/0cbebe55-db43-c0a6-73f6-00d6600b4fb3.png)



#でもだいじょうぶ！手段はある！
付属の一括変換ツールがあります！

#一括置換ツールの使い方

Datalizerメニューで、テーブル/ビューを変更する集計定義を右クリック→バックアップしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/833e4188-213c-e16d-b004-84c88484a1c4.png)

####ブラウザで、管理者用のメニューにアクセス
（普通にインストールした場合、```http://サーバ名:8341/mngsrv/managerPage.do```）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/b5e91fd4-8e61-bdda-a6d1-a2148418a324.png)

Ver.4.2
　テナント管理→テナント管理者ページへログインボタン→ツール→定義一括編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/24718136-9bd6-5699-888a-b13996256f71.png)

Ver.5.0以降
　ログイン直後の左メニュー内にツール→定義一括編集 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/b41cdc5f-5c64-e90b-5178-3a020500e3b1.png)


####変換の手順
1：ラジオボタンで「バックアップファイルから取得」を選択する
2：参照ボタンを押下、先ほどバックアップしたファイルを選択
3：ワークデータ取得ボタンを押下（ちょっと時間かかります）
4：定義ID再設定ボタンを押下
　※絶対押そう、忘れるとDatalizerに戻す時に元の集計定義を上書きしてしまうよ！
5：置換ボタンを押下、変換元テーブル/ビューと変換先テーブル/ビューを指定する
6：エクスポートボタンを押下
7：エクスポート結果欄の一番上のダウンロードリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/9690d4c5-8be9-9ea8-bacc-4411e6789ef8.png)


8：7でダウンロードしたファイルをDatalizerにリストアする
集計定義をいれるフォルダを右クリック→リストア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278265/ee7b9b56-6ff4-4c84-4cf0-564af7581e78.png)

#つぶやき
このツールの存在を知らない頃は、それはもう何度も設定し直しが発生しました。
テーブルもビュー名もちゃんと命名ルールを決めておかないとね。
ほんとにできるかわからんけとりあえず作ってみよう、って適当な名前でやり出して、あとから「出来ちゃったけどこのビュー名は無いわ・・・やっちまった・・」ってなることがよくありました。

以上
fbxのAnimationEventをスクリプトから削除する

ほとんど情報が無かったのでメモです。

市販のアセットなどをインポートしてとりあえず使ってみると、実行中に突然「アニメーションイベントのコールバックが記述されていません」といったエラーが出て焦るアレです。
下記スクリプトはプロジェクト内で選択したfbxからアニメーションイベントを削除します。
使う場合はあらかじめバックアップを取るなどして検証してください。

```
public class AnimationEventKiller : Editor
{
    [MenuItem("Assets/Kill AnimationEvent")]
    static void Kill()
    {
        foreach (var item in Selection.objects)
        {
            string path = AssetDatabase.GetAssetPath(item);
            var importer = AssetImporter.GetAtPath(path) as ModelImporter;

            SerializedObject so = new SerializedObject(importer);
            SerializedProperty clips = so.FindProperty("m_ClipAnimations");

            for (int i = 0; i < importer.clipAnimations.Length; i++)
            {
                SerializedProperty serializedProperty = clips.GetArrayElementAtIndex(i).FindPropertyRelative("events");
                serializedProperty.ClearArray();
            }

            so.ApplyModifiedProperties();

            importer.SaveAndReimport();
        }
    }
}
```
SQL DBのバックアップ

SQLの勉強中ですが、自分の脳内整理や備忘録用に作成。
今回は、データベースをより安全に使うためのアレコレ。


<h2>データベースをより安全に使う</h2>

<b>●ACID特性とは</b>
　　・データを正確かつ安全に取り扱う為にシステムが備えるべき４つの特性のこと。

<b>４つの特性</b>
　　<b>①原子性(Atomicity)：処理が中断しても、中途半端な状態にならない。
　　　　⇒コミットやロールバック
　　②一貫性(Consistency)：データの内容が矛盾した状態にならない。
　　　　⇒あらかじめ指定した種類や条件に従った値だけを格納する
　　③分離性(Isolation)：複数の処理を同時実行しても副作用がない。
　　　　⇒同時に実行しているほかの人の処理から副作用を受けない。
　　④永続性(Durability)：記録した情報は消滅せず保持される。
　　　　⇒今回
</b>

---

<h3>バックアップの仕組み</h3>

・多くのDBMSは、万が一のデータ消失に備えて<b>バックアップ</b>の仕組みを備えている。

<b>○２つのバックアップ方式</b>
　　オフラインバックアップ：DBMSを停止して行うバックアップ
　　オンラインバックアップ：DBMSを稼動させながら行うバックアップ

<b>○ログファイルのバックアップ</b>
　　・バックアップを行うのは時間がかかる処理でもあり、あまり頻繁に行うわけにはいかない。
　　・しかし、1日1回だけだとその間に行った処理結果が<b>全て失われてしまう。</b>
　　このような事態を回避するため、重要な情報システムではもう一工夫する。データベースが出力する<b>ログファイルを10分周期や1時間周期といった高頻度でバックアップする</b>


<b>●２つのファイルをバックアップ
　　・データベース内容：低頻度(日時、週次、月次など)
　　・ログファイル内容：高頻度(数分ごと～数時間ごとなど)</b>

<b>※DBMSが出力するログファイルとは</b>
　　一般的なプログラムの稼働状況や、エラーメッセージなどが書き込まれており、分析や障害調査のためのファイル<b>ではなく</b>、データベースのログは<b>REDOログ(アーカイブログ)またはトランザクションログ</b>などとも呼ばれ、その内容は<b>「それまで実行した全てのSQL文」</b>である。


---

<h3>バックアップからのデータ復元方法</h3>

<b>①最後に取得したデータベースのバックアップを復元する</b>
<b>②ログに記録されているSQL文のうち、「最後のデータベースバックアップ以降に実行されたもの」を再実行する。</b>

　　※②の処理のことを、<b>ロールフォワード</b>という。ロールバックとは対照的な関係にありますが、混同しないように注意。

---

<h4>おまけ：ロールバックとロールフォワード</h4>
　　・ロールバック(実行した処理を取り消す)
　　　　データベース利用中に、SQLの実行失敗やデッドロックなどでたびたび発生する。

　　・ロールフォワード(まだ実行されていない処理を実行する)
　　　　障害復旧時に行われる処理であるため、めったに発生しない。
Python dictを一定量に分割して取り出す

listを一定区間、または一定数になるよう分割することは日常的にされているかと思いますが、辞書（dict）を一定量に区切る機会はあまりないかもしれません。

そんなニッチな辞書分割にも、いろいろな方法があります。ここでは、一番直感的でかんたんな方法（主観）をメモしておきます。

itertools.islice()を使います。

#isliceで辞書を分割する実装


```dict_slice.py
data = { i:i**2 for i in range(10) }
pprint.pprint(data, width=40, indent=4)
# {
#     0: 0,
#     1: 1,
#     2: 4,
#     3: 9,
#     4: 16,
#     5: 25,
#     6: 36,
#     7: 49,
#     8: 64,
#     9: 81
# }

from pprint import pprint
from itertools import islice

def dict_chunks(data, size):
    it = iter(data)
    for i in range(0, len(data), size):
        yield {k:data[k] for k in islice(it, size)}

chunks = dict_chunks(data, size=3)
count = 0
for c in chunks:
    print(f"chunk {count}: {c.keys()}")
    count += 1
# chunk 0: dict_keys([0, 1, 2])
# chunk 1: dict_keys([3, 4, 5])
# chunk 2: dict_keys([6, 7, 8])
# chunk 3: dict_keys([9])
```

より突っ込んだことを書くと長くなるので<a href="https://ssrv.net/tech/python-dict-slice/">記事にまとめています</a>。
How to forward email from AOL to Gmail?

複数のメールアカウントを同時に処理するのは難しい作業です。したがって、このような問題に直面している場合は、AOLからGmailにメールを転送する方法について説明するので正しいページにいます。 Gmailではプラットフォームに任意のメールアドレスを追加できるため、AOLメールアカウントをわずか数分で追加できます。この記事にとどまり、「AOLからGmailへのメールの転送」プロセスを完了するための手順を実行します。
<b>Steps to forwarding Email from AOL to Gmail</b>
You can easily link your AOL email account to Gmail by following the steps mentioned below:
1.First, log in to your Gmail account
2.Navigate to the gear icon on the upper right corner and click on it
3.Then, head to the “Account and Import” section
4.Now, you will get see a “Add an Email Account” option, click onemailsilshen, enter your email address in the box and click on the “Next” button
6.Now, check the email server details and enter your AOL password where prompted
7.If you wish to leave a copy of retrieved messages on the server to keep copies with AOL
8.Now, you need to click on the “Add Account” button to finish the process
9.Finally, your AOL Email address will be forwarded to Gmail
<b>Note:</b> 上記の手順を完了すると、AOLアドレスを使用してGmailプラットフォームからメールを送信できるようになemails、あなたは電子メールを送受信するためにAOL電子メールログインプロセスを通過する必要があります。 Gmailプラットフォームにログインすることでそれを行うことができます。
<b>Conclusion</b>
つまり、AOLからGmailにメールを転送する方法は簡単でシンプルです。あなたが正しい方法を知っているなら、あなたはあなたの指先でそれをすることができます。この記事では、GmailにAOLメールアカウントを追加する手順を説明します。
TableauCRM 外部コネクタ

#種類

#SFとHEROKU
- Salesforce コネクタ
- Salesforce 外部コネクタ
- Salesforce Marketing Cloud 連絡先コネクター
- Salesforce Marketing Cloud 連絡先 OAuth 2.0 コネクタ
- Heroku Postgres コネクタ

#Microsoft系
- Microsoft Dynamics CRM コネクタ
- Microsoft Azure SQL データベースコネクタ
- Microsoft Azure SQL データウェアハウスコネクタ

#google系
- Google BigQuery Connector
- Google BigQuery Standard SQL コネクタ
- Google アナリティクス
- Google Spanner コネクタ

#AMAZON系
- Amazon RDS PostgreSQL コネクタ
- Amazon RDS SQL Server コネクタ
- Amazon RDS MySQL コネクタ
- Amazon RDS MariaDB コネクタ
- Amazon RDS Aurora MySQL コネクタ
- Amazon RDS Aurora PostgreSQL コネクタ
- Redshift コネクタ(アマゾンのデータウェアハウス)
- Amazon S3 コネクタ

#その他
- SAP HANA コネクタ
- Snowflake コネクタ
- NetSuite コネクタ
- Oracle Eloqua コネクタ
- Marketo コネクタ

#参考文献

[Salesforce 組織外のリモートデータへの接続](https://help.salesforce.com/articleView?id=sf.bi_integrate_connectors_remote.htm&type=5)