2020/08/26

インドネシア語のチートシート Bahasa Indonesia Cheat Sheet vol.2 - 基本的な文型と英語と比較


  1. インドネシア語には、Be動詞がない。 ー> 飛ばせば良い
  2. 所有代名詞がない。
    I - my - me は無し。 saya だけ。
    he - his - him は無し。dia だけ。
  3. 動詞の時制がない。過去形・未来形がない。
凄い! なんか、色々簡単な感じ!!

2020/08/24

インドネシア語のチートシート Bahasa Indonesia Cheat Sheet vol.1 - 数字・曜日・月など

わけあって、インドネシア語を勉強する必要がありますので、トイレ・壁の貼り付け用のチートシートを作成します。
Vol1は、数字・曜日・月とかです。

2020/07/26

ボードゲーム:Catan dice game (カタン ダイス ゲーム)

大分前に買っていたけど、遊んでいなかったボードゲームというかサイコロゲーム。4連休で時間があったので、遊んでみた。遊び方は2通り。どちらも6個のサイコロを振り、出来るだけ高得点を取る(遊び方1)か、早く10点に到達する(遊び方2)を目指すゲーム。ボードゲームのCatanは、我が家では1時間〜1.5時間かかるけど、これは、30分ぐらいで終わるし、場所要らずで持ち運びも簡単なのは良い。専用の記録紙が必要なのは、ちょっと考えもの・・・。
私個人としては、ボードゲーム版の方が面白いと思う。妻は、サイコロの方が良いとのこと。
ボードゲーム版のCatanを知らなくてもプレイできると思うが、知ってた方が、理解が早いと思う。



文字列の組み合わせを作る itertools --- Python3

Goal: a,b,c の文字列の組み合わせを作りたい。例えば、abc, acb, bac, bca, cab, cba と6つ出したい。

How: itertools.permutations() モジュールを使う。


Result:



2020/07/24

GCP: GAE node.js standard 環境で、Facebook Messanger のBot を立ち上げるまで


  • Goal
    FacebookMessengerのBOTをGoogle App Engine Node.js Standard 環境上に立ち上げる。
    ・テキストメッセージながらオウム返し
    ・それ以外のメッセージなら「ああ、それな〜」と返す
  • How
    1. Facebook Developerでの作業
      (1)アプリの作成

      (2)Messangerプラットフォームの設定
      ・トークン作成で、PAGE_ACCESS_TOKENを作成


      ・Webhookとして、まずはmessages と、messaging_postbacksを有効にする。
      ・コールバックURLに、Google app engine のURLを入力
      ・トークン欄には、自分自身で決めた文字列を入力する。この値がFacebook側からGAEのWebhookに渡されるので、GAEのアプリケーション内のVERIFY_TOKENにセットする必要がある。
    2. GAE アプリケーションの作成
      (1)GCPプロジェクトを作成 (割愛)
      (2)GITからサンプルコードをPull
      git clone https://github.com/pumpkinpietea/facebookMessengerBot.git



      (3)Facebook Developerで発行したPAGE_ACCESS_TOKENと自身で決めたVERIFY_TOKENを貼り付ける

      (4)gcloud コマンドでDeploy
      $ gcloud init
               $ gcloud app deploy
    3. 完成

2020/06/07

MySQL Workbench から、SSH接続しようとすると”Access denied for 'none'. Authentication that can continue: publickey”エラーになる

  • Issue
    MySQL Workbench から、SSH接続しようとすると”Access denied for 'none'. Authentication that can continue: publickey”と言われる。。。
  • 原因
    SSHのKeyをmacで作成したために、Keyの形式が問題らしい。
    (参考)Thanks a lot!!
    WorkBenchでDBサーバーにSSH接続できないって?

  • Solution
    Windowsが、手元になかったので、macでのやり方をメモ
    1. putty をインストール
    2. puttygem で、.ppk ファイルを作成
    3. puttygem で、オプションprivate-openssh を指定して作成
    4. そのKeyをセットアップすると接続!



  • 編集後記
    MacでMySQL Workbenchを使う人は、少ないのかな?調べるのに時間かかってしまった。

GCP: ローカルからGCLOUDコマンドを叩くと pyenv: python2: command not found エラー

  • Issue
    gcloud コマンドをローカルから使おうとしたら、pyenv: python2: command not found エラーとなる
  • 環境など
    Mac mojave 10.14.6
    pyenv 1.2.8-182  ※homebrew でインストールしていない。(これが原因かも)
  • 原因
    文字通りなのですが、gcloudの中で、"python2" コマンドが呼び出されるけど、python2 コマンドが見つからないと言われている。


  • Solution
    .zprofile に、export CLOUDSDK_PYTHON=/usr/bin/python を追記
    これを追記することで、呼び出すPython環境を明示できて、python2 を呼ばなくなる。
    (しらんけど。。。)


  • 編集後記
    これは、元々、エラーがでるけど普通に動く。多分、python2 コマンド使って、だめならpython コマンドって順番に呼び出しているのかと想像。
    前のMACだと出なかったんだけど。。。

2020/06/06

GCP: Google Compute Engine にVSCODD 越しに接続する

  • Goal
    • VSCODEから、GCEインスタンス(開発環境)に接続開発する
    • そのとき、一応SSHのポートも変更する
  • How
    1. gcloud SDK のインストール(詳細はカツアイ)
    2. GCE インスタンスを作成し、静的IPを割り当てる (詳細はカツアイ)
    3. ローカル端末で、Keyを作成する
      ssh-keygen -t rsa -b 4096 -C "testUser"
    4. GCEの設定画面で、Keyを貼り付け
    5. PORT:22での接続テスト
      gcloudコマンド (静的IPの割当が不要。インスタンス名で接続できる)
      gcloud compute ssh testUser@instance-1 --ssh-key-file ./test_rsa
    6. GCEのOS上でのsshdのポート変更
      5で接続した状態で、GCEの内部のsshd_configファイルの設定を変更する
      sudo vi /etc/ssh/sshd_config

      以下に、接続したいポート番号を追加
      #Port 22
      Port 22011
      #AddressFamily any


      そのあとに、サービスのRESTARTとSTATUSを確認
      sudo systemctl restart sshd
      sudo systemctl status sshd
      確認して問題なければ、一旦GCEから抜ける
    7. GCPのネットワークの設定でPORTの変更
      以下のケースでは、22から22011へ変更
    8. ローカルから、SSHでアクセステスト
      ssh testUser@34.67.184.203 -p 22011 -i ~/.ssh/test_rsa
    9. config の設定を加えるとVSCODEのからアクセスできる
  • 編集後記
    GCEインスタンスの開発なら、VSCODE+RemoteDevelopmentで開発して、Cloud Source Repositories へPushし、Cloud BuildでSTG環境と本番へデプロイが良いのでしょうか?
    でも、GAEなら、Cloud Shell で開発して、Cloud Source Repositories+Cloud Buildもできて、それならどこでも開発できるとも思ったりします。
    開発経験の少ない素人なので、良い方法が単純に知りたい・・・

2020/05/31

GCP: Cloud Source Repositories のソースを別プロジェクトにPUSH(コピー)する方法 on Cloud Shell

  • Goal
    類似アプリを作成する必要があり、Cloud Source Repositoriesのソースを別プロジェクトのレポジトリにコピーしたい。
    開発は、cloud shell 上で行っているので、そこでコピーする
  • How
    元のプロジェクト名: s001
    新しいプロジェクト名: s002 とする
    1. プロジェクトs002 に、新しいRepositoryを作成 --- GCPのコンソールで作成


    2. 以下、Cloud Shell上での作業

  • 参考情報
    レポへのリンクは以下から取れる
  • 編集後記
    Cloud ShellとCloud Source Repositories に、加えてCloud Buildで、色々できるようになりたいが、まだ、調べるのに時間がかかりすぎ。。。

2020/05/06

GCP: Bigquery 関数でGROUP BYしようとするとエラーがでる --- bq


  • Goal
    Bigqueryで、Timestamp のデータをdate(日付)にグループ化&集計し、日付の新しいもの順にソートをしたい
  • How
    例1) グループ化して集計は、OK
    SELECT date(timestamp),count(1)
    FROM xxxxxxxxxxx
    GROUP BY date(timestamp)

    例2) 日付の新しいもの順に並べようとしたら。。。
    SELECT date(timestamp),count(1)
    FROM xxxxxxxxxxx
    GROUP BY date(timestamp)
    ORDER BY date(timestamp) DESC

    実行すると、エラー。。。
    SELECT list expression references column timestamp which is neither grouped nor aggregated at [1:13]

    例3) 別名(alias)付けると、エラーはでない。
    SELECT date(timestamp) as TARGET_DATE, count(1)
    FROM xxxxxxxxxxx
    GROUP BY TARGET_DATE
    ORDER BY TARGET_DATE DESC
  • 編集後記
    しょうもない事で、時間を潰してしまったので、メモ。。。
    GROUP BYだけならOKで、ORDER BYを付けるとNG。
    これって結構常識なんでしょうか?しらんかった。

2020/05/03

ファイルのバックアップ時に、ファイル名に時間を追加する -- Linux, dateコマンド


  • GOAL
    Linuxでファイルのバックアップ取るときに、日付情報を追記する
  • HOW
    date コマンドを使う。
-> % ll
total 8
-rw-r--r--  1 toshi  staff    14B  5  3 00:49 testfile.txt

# Unix時間を追記する
-> % cp testfile.txt testfile.txt`date "+%s"`
-> % ll
total 16
-rw-r--r--  1 toshi  staff    14B  5  3 00:49 testfile.txt
-rw-r--r--  1 toshi  staff    14B  5  3 00:50 testfile.txt1588434625

# YYYYMMDDHHMMSSを追記する
-> % cp testfile.txt testfile.txt`date "+%Y%m%d%H%M%S"`
-> % ll
total 24
-rw-r--r--  1 toshi  staff    14B  5  3 00:49 testfile.txt
-rw-r--r--  1 toshi  staff    14B  5  3 00:50 testfile.txt1588434625
-rw-r--r--  1 toshi  staff    14B  5  3 00:51 testfile.txt20200503005117

# ハイフンでつなぐ -YYYY-MM-DDを追記する
-> % cp testfile.txt testfile.txt`date "+-%Y-%m-%d"`
-> % ll
total 48
-rw-r--r--  1 toshi  staff    14B  5  3 00:49 testfile.txt
-rw-r--r--  1 toshi  staff    14B  5  3 00:52 testfile.txt-2020-05-03
-rw-r--r--  1 toshi  staff    14B  5  3 00:50 testfile.txt1588434625
-rw-r--r--  1 toshi  staff    14B  5  3 00:51 testfile.txt20200503005117

2020/04/25

GCP: コンテナイメージから、GCEを立ち上げる方法 with Docker HUB -- GCP,GCE,docker


  • Goal
    • GCE(Google Compute Engine)に、コンテナイメージをDeployして立ち上げる。
    • Dockerのイメージは、DockerHUBから持ってくる。
  • How
    1. 準備:DockerHUBに、コンテナイメージを作成する。
      ①Github のrepositoryと、DockerHUBを連携させる
      ■連携の仕方
      https://docs.docker.com/docker-hub/builds/link-source/

      ドットインストールのPHP環境のテストをしたかったので、Docker fileなどを取得し、DockerHUBと連携させたGithubのrepositoryへpushする。すると、自動でDockerHUBにイメージが作成される!
      ■Githubのレポジトリ
      https://github.com/pumpkinpietea/dockerhub
      ■連携されたDockerhubのレポジトリ
      https://hub.docker.com/repository/docker/pumpkinpietea/github
    2. GCPのコンソールでGCEインスタンスをコンテナイメージを利用して立ち上げる。

      ■コンテナイメージ名に docker.io/アカウント名/レポ名 を入力する

    3. イメージを作成し、SSHでつないで見る。
      ~$ docker ps
      でコンテナIDを調べて
      ~$ docker exec -it コンテナ名 sh
      で、コンテナの中に入れる
  • Thanks!!
  • 編集後記
    • PHPの勉強をしようとして、ドットインストールさんの講座をみて進めようとしたが、Dockerをローカルmacには入れたくないと思い、GCPのf1-microインスタンスを使おうを思って取り組んだ。普通にインスタンス立ち上げて設定しようかとおもったが、少し調べてみたらコンテナイメージをDeployできるみたいなので試してみた。
    • GCE 1インスタンスで、 1コンテナとのこと。GKEの勉強しないと実業務には使えないかもしれないが、1インスタンスの開発環境の立ち上げとかには、。

2020/03/22

ロジスティクス4.0 物流の創造的革新 (日経文庫)  小野塚 征志 ー 本

メモ
1.ドローンーーーwalmartの在庫管理・ドローンで写真撮りチェック、無人遠隔運搬船
2.棚搬送型ロボット(Kiva:ドライブ、日立:ラックル)と協調型ロボット(ローカス・ボット)
3.求貨求車システム:トランコム、HACOBU、ハコベル、ララムーブ(香港)
  →水屋の減少
4.デジタルフォワーダー:フレックスポート
5.DHLのロジスティクスマネジメントシステム:荷主向けの物流システムプラットフォーム。DHL以外の物流会社への委託も可能
6.物流機能会社の統合:家電→日通、三井倉庫へ統合、食品→味の素の物流会社へ統合、飲料→アサヒ、サッポロ、キリン、サントリーの共同物流、化学業界も同様
  ※荷主業界を核としたロジスティクスプラットフォーマー
7.荷物の輸送量・距離は、トラック1台あたりの積載量が変わらない限り、ドライバーの投入工数に準じる。自動運転トラック、ロボット、マッチングシステムはそれを変える可能性がある。
8.高速は、隊列走行(自動運転)して、インターチェンジからドライバーが運ぶ
9.DHLとシスコの「Internet of Things in Logistics」
10.物流サービスを仕組み化し、広く多くの荷主・荷物を取り扱うことに成功した一部の「ロジスティクスプラットフォーマー」のみが高収益を獲得し、あとは下請けとなる
11.物流業界内の再編の加速:日立物流と佐川のような
12.荷主による物流ビジネスの展開:アマゾン=世界最大の物流会社、ロジスティクスカンパニー
13.次世代WMS:ロボットの操作、自動化された設備のコントロール
14.NY5番街   1900年:馬車しかいない。 1913年:車しかない。


2020/02/11

GCP: gcloud コマンドラインで、GAEの全インスタンスを停止する --- GCP,GAE,shellscript,gcloud

・Goal
 テストで作成したGAEの全サービスの全インスタンスをコマンドラインから削除・停止する。バージョン名等を指定せずに、どんどんデプロイすると稼働中のインスタンスが増える。それをコマンドラインで一気に全停止する。コンソール画面からだと、サービス毎/バージョン毎にプチプチと停止する必要があり面倒だった。。。

・How
 これが基本形
 ~$ gcloud app instances delete [instance ID] -v [version] -s [service]

・Example
# step1  一覧で確認
~ $ gcloud app instances list
SERVICE  VERSION  ID                                      VM_STATUS  DEBUG_MODE
default  master   00XXXXXXX                               N/A
test1    master   00XXXXXX1                               N/A
test2    master   00686ff30                               N/A

# step2 削除
~ $ gcloud app instances list | sed 1d | awk '{print $1, $2, $3}' | while read s v id; do gcloud app instances delete $id -v $v -s $s --quiet; done
Deleting the instance [default/master/00XXXXXXX].
Deleted [https://appengine.googleapis.com/v1/apps/---].
Deleting the instance [test1/master/00XXXXXX1].
Deleted [https://appengine.googleapis.com/v1/apps/---].
Deleting the instance [test2/master/00686ff30].
Deleted [https://appengine.googleapis.com/v1/apps/---].

# 説明
~ $ gcloud app instances list | \ # インスタンスのリストを出力
sed 1d | \ # 一行目をカット
awk '{print $1, $2, $3}' | \ # awk できれいにする。(この処理は不要・・・)
# 以下のハイライトの箇所で、順番に消していく。y/nを聞かれるので --quiet を追加
while read s v id; do gcloud app instances delete $id -v $v -s $s --quiet; done

2020/02/09

GCP: Cloud Tasksにおける queueの設定 (GAEの特定のserviceへリクエストを投げたい) -- GAE 2nd gen, Python3, gcloud

・背景
 GAEをタスクハンドラーとして使っている。
 GAE-py の2nd Genへの移行に伴い、従来のapp engine task queueは
 使えなくなり、Cloud Tasksへの移行が必要。
 それに伴い従来のqueue.yaml の設定も不要。
 今後は、コンソールからgcloudコマンドでqueueを作ることになるとのこと。
   https://cloud.google.com/tasks/docs/migrating?hl=ja

 そこで、試していたのだが、GAEのデフォルトじゃなくて、特定のサービスや、
 バージョンに対してのリクエストの投げ方が解らずハマる。。。
  http://[project ID].appspot.com/
  ではなくて例えば、
  http://[service]-dot-[project ID].appspot.com/
  にリクエストを投げたい。

・Goal
 GAEの特定のサービスに対するqueueを作成したい。

・How
 gcloud コマンドで、--routing-overrideを設定すればよい。

 [As-is]
XXX@cloudshell:~$ gcloud tasks queues describe queue-sample
name: projects/[project ID]/locations/us-central1/queues/queue-sample
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 1000
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s
state: RUNNING

 [変更]
XXX@cloudshell:~$ gcloud tasks queues update queue-sample --routing-override=service:test
WARNING: You are managing queues with gcloud, do not use queue.yaml or queue.xml in the future. More details at: https://cloud.google.com/tasks/docs/queue-yaml.
Updated queue [queue-sample].

 [To-be]
XXX@cloudshell:~$ gcloud tasks queues describe queue-sample
appEngineRoutingOverride:
  host: test.[project ID].appspot.com
name: projects/[project ID]/locations/us-central1/queues/queue-sample
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 1000
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s

state: RUNNING

・Thanks!!
https://cloud.google.com/sdk/gcloud/reference/tasks/queues/update#--routing-override

2019/08/04

GCP: GAE/Py から、ElasticSearch(GCE上で稼働)を呼び出す -- Python

  • GOAL: レコメンドエンジンとしてElasticSearchを立ち上げ&セットアップする。その後、Google App Engine(GAE)から、ElasticSearchAPIを呼び出して使う。
  • POINT
    1.GAE
    からの外部HTTPREST API)呼び出しは、POSTで行うこと! GETは使うな!!
    (GAE/Py27の環境で、requestsを利用して呼び出す場合)
    2.Logstash
    は、必ず「Ctrl+D」で終了させること!
    Ctrl+Z
    で終了させていたため、サービスが起動中となりハマりました。
  • HOW
    1.Martket Placeから、ELK(ElasticSearch+Logstash+Kibana)を起動
    2.Logstashを使って、CSVデータをElasticSearchにロード
    3.GAEから、ElasticSearchに検索クエリーを発行して結果を取得
    ----------------
    1.Martket Placeから、ELK(ElasticSearch+Logstash+Kibana)を起動
       ・Bitnamiの仮想マシンを選択
       ・手順に沿って、選択をしていくだけ


    2.Logstashを使って、CSVデータをElasticSearchにロード


    3.GAEから、ElasticSearchに検索クエリーを発行して結果を取得

2019/07/27

GCP: Iphoneから、端末位置情報をIoT分析環境に送信する -- python, GCP, IoTcore

Goal: 「IoTデータ分析環境立ち上げ on GCP」の環境に対して、Iphoneから位置情報データをPushするサンプル。Iphoneをエッジ端末として活用して、色々できそう。

How 

0. 前準備 Pythonista関連
   a)Pythonista のインストール
   https://apps.apple.com/jp/app/pythonista-3/id1085978097
   b)Gitを使いたかったら、stashをインストール
   https://github.com/ywangd/stash
   c)説明サイト ググったらたくさんあると思いますが、私は、以下のリンクを参照させていただきました。ありがとうございました。
   http://hitoriblog.com/?p=42145#Python-5




1. Pythonista を使って、端末の位置情報、スピード等を取得する
  a)Iphone上で、位置情報などを確認してみる




2. GCPのPub/Subにパブリッシュする。これの詳細は、前出のブログを参照

   a)GCP提供のサンプルプログラムをベースに追加加工する。

      https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/iot/api-client/mqtt_example
   をローカルPCにクローンして、Pythonの環境などをセットする。
   cloudiot_mqtt_example.pyをベースに変更を加えたものが以下。



 
   

2019/06/09

文字列内の検索  str.find() str.rfind() --- Python3

Goal: 文字列の中に、特定の文字列が含まれているか? 含まれている場合は、INDEXを取得する。

How: 文字列メソッド find() 、rfind() を使う。

例)
01234567890123456789012345678901
THIS IS A PEN. THIS IS AN APPLE.

に、文字列が含まれているかどうかを確認する。

1: 'IS' を前から探す →  2が返ってくる
2: 'THIS' を前から探す → 0が返ってくる
3: 'THIS' を後ろから探す → 15が返ってくる
4: 'PINEAPPLE' を探す → 無いから、-1が返ってくる

Source:



Result:

-> % python test.py
2
0
15
-1

2019/05/27

2次元配列を複数のKeyでソートする --- Python3


  • Goal
    2次元配列を複数のKeyでソートしたい
  • How
    itemgetterを使う。
  • Example
    入力)
    Udon 500 大阪店
    Udon 700 東京店
    Ramen 1000 大阪店
    Ramen 1200 大阪店
    Udon 500 福岡店
    Apple 100 福岡店

    これを、メニュー(ABC順)→値段(高いものから)並べたい。
  • Source


  • Result
    % python sort_itemgetter.py
    Udon 500 大阪店
    Udon 700 東京店
    Ramen 1000 大阪店
    Ramen 1200 大阪店
    Udon 500 福岡店
    Apple 100 福岡店
    Before Sort
    [['Udon', 500, '大阪店'], ['Udon', 700, '東京店'], ['Ramen', 1000, '大阪店'], ['Ramen', 1200, '大阪店'], ['Udon', 500, '福岡店'], ['Apple', 100, '福岡店']]

    Sort by Price
    [['Ramen', 1200, '大阪店'], ['Ramen', 1000, '大阪店'], ['Udon', 700, '東京店'], ['Udon', 500, '大阪店'], ['Udon', 500, '福岡店'], ['Apple', 100, '福岡店']]

    Then sort by menu
    [['Apple', 100, '福岡店'], ['Ramen', 1200, '大阪店'], ['Ramen', 1000, '大阪店'], ['Udon', 700, '東京店'], ['Udon', 500, '大阪店'], ['Udon', 500, '福岡店']]

2019/05/12

素因数分解 (試し割り法) の根本理解  - Python3

競技プログラミングサイトで遊んでいると、素因数分解の知識が必要となり、再勉強をした。

1.素因数分解を思い出す。
小さい素数から、割り算を繰り返して、これ以上どの数字でも割れないとなったら終了という理解。(以下の画像のイメージ)

これを、試し割り法というとの事。

2.試し割り法のアルゴリズムの理解を深める。
以下のサイトを参考にさせて頂いて、試し割り法のアルゴリズムを見た。
Thanks!!
Pythonで素因数分解する
素数と仲良しになる3つのプログラム

が、素人の為、正直良くわからない部分があり、1行づつ理解を深めて見た。

私の理解としては。。。

ある数(素数候補)として、初期値を2とする。

①”ある数(素数候補)”で割り切れるかどうかを見る?
②入力数字を”ある数”で実際に割り、商に置き換える。

①と②を割りきれなくなるまで繰り返す。

割り切れなくなったら、
③次に、”ある数”を1つ大きくして、①と②を繰り返す。

で、④残りの数を、”ある数”で割った商が、”ある数”よりも小さくなったら終わり。
何故なら、2から初めて、1づつ”ある数”を大きくしながらで割っていくので、
これより先、割り切れる事はない。(割り切れるなら、この段階にくるまでに割り切れているはず。)

。。。。ということで、説明は上手くないが、以下を実行して、腹落ちした。



以下、上記プログラムの実行結果。360を素因数分解している。

-> % python factorization.py
360
360の素因数分解をする。

CP1: 2で割り切れるかどうか調べる。
CP2: 2で割り切れたから、2を出力する。
この時点の商:180
この時点の出力予定:[2]
まだ、2で割り切れるかどうかを確認する。

CP2: 2で割り切れたから、2を出力する。
この時点の商:90
この時点の出力予定:[2, 2]
まだ、2で割り切れるかどうかを確認する。

CP2: 2で割り切れたから、2を出力する。
この時点の商:45
この時点の出力予定:[2, 2, 2]
まだ、2で割り切れるかどうかを確認する。

CP3: 2では、もう割り切れなくなったので、
次は、3で割り切れるかどうかを試す。

CP1: 3で割り切れるかどうか調べる。
CP2: 3で割り切れたから、3を出力する。
この時点の商:15
この時点の出力予定:[2, 2, 2, 3]
まだ、3で割り切れるかどうかを確認する。

CP2: 3で割り切れたから、3を出力する。
この時点の商:5
この時点の出力予定:[2, 2, 2, 3, 3]
まだ、3で割り切れるかどうかを確認する。

CP3: 3では、もう割り切れなくなったので、
次は、4で割り切れるかどうかを試す。

CP4: 5を4で、割ったとしても、商は4より小さくなるので、これ以上は検討不要。
残っている数を、最後の約数として追加する。ただし、1の場合は、無視する。
5を出力して計算終了。

output----
[2, 2, 2, 3, 3, 5]