Briswell Tech Blog

ブリスウェルのテックブログです

Pythonで降らせる流星群

4月23日は「4月こと座流星群」の極大でした。

明け方から活動ピークを迎えるということで、夜空を見上げましたが...
やはり都会の明るい夜では、星はかけらも見当たりません。ライブカメラの観測に切り替えました。

今年も数は少なかったですが、明るい流れ星もあり、楽しむことができました。あのキラッと流れるのも見た瞬間は心が躍ります。

さて、今回はその感動を分かち合いたく、満天の星空に流星群を降らせてみます。

GitHub - yu4u/shooting-star-generator: Generate synthetic shooting star images

こちらのコードを参考にさせていただきました。ありがとうございました。

1. 流れ星の形状決め

numpy.random.randint(min,max) # min〜maxの範囲の整数
numpy.random.rand() # 0.0以上、1.0未満

# 80〜180の範囲の整数値を取得する場合
length = 80 + np.random.randint(0,100)

# ランダムな角度を取得する場合
theta = 0.7 * pi * np.random.rand() + 0.2 * pi

NumPyのrandomモジュールを使用して、流れ星の表示時間、長さ、明るさ、ヘッドと尾の部分の大きさ、流す角度等を決める乱数値(ランダムな値)を取得します。

2. 流れ星の画像生成

cv2.line(image, start_point, end_point, color, thickness) # 対象画像、開始座標、終了座標、線の色、線の太さ

OpenCVのline関数を使用して、流れ星のヘッドと尾の線を引きます。

画像を繋げたもの(アニメーションGIF)がこちらになります。

Pythonの画像処理ライブラリPillowのsave関数を使うと、アニメーションGIFを作成することができます。

# 画像imに、画像リスト[im1, im2, ...]を追加してアニメーションGIFを作成する場合
im.save('anime.gif', save_all=True, append_images=[im1, im2, ...])

3. 流れ星を回転・移動

cv2.warpAffine(image, affine, (size_x, size_y)) # 対象画像、アフィン変換の行列、出力のサイズ

放射状に見える流星群のイメージに近づけるために、OpenCVのwarpAffine関数を使用して、流す角度や位置を変えます。

4. 背景を透過

# 黒色(R0 G0 B0)のαチャンネル(画素の不透明度)を0にする場合
image[:, :, 3] = np.where(np.all(image == 0, axis=-1), 0, 255)

満天の星空に降らすために、黒色の背景を透過します。

5. 満天の星空と合成

明日の朝、砂浜にほしのかけら落ちているかしら。

RDS for MySQL 5.6 → 5.7 でのアップデートエラー

RDS Aurora For Mysql 5.6 のサポートが来年2月に切れるとメールが入ったので、いくつかの案件で対応を始めました。
基本的にはコンソールから、バージョンを変更して適用すれば良いのかな、と思っていたのですが、1プロジェクトで、下記画像のエラーが出てしまい、躓きました。

f:id:Toshi_bw:20220331184431p:plain
Error


申し訳ありませんが、DBクラスター xxx を変更するリクエストが失敗しました。
Cannot modify engine version because Instance xxxxx has Performance Insights enabled and the new version doesn't support this feature.

はぁ...
Performance Insights が有効になっているので、更新できないよ。
と言われているのはわかってるのですが、RDSコンソール画面で Performance Insights の有効 / 無効の項目が出てない...


わからないので、AWS サポートに問い合わせを行ったところ、下記回答をいただきました。

調査した結果、お客様の場合は Performance Insights をサポートしていないインスタンスクラス(db.t3.small)をご利用いただいているため、マネジメントコンソール上に Performance Insights メニューが表示されないことが判明しました。恐らく DB インスタンスの変更メニューより何かを変更される際にも、以下のようなメッセージが表示されるかと存じます。 Performance Insights not supported for this configuration, please disable this feature. Performance Insights をサポートするインスタンスクラスで Performance Insights を有効にした状態で、インスタンスクラスを Performance Insights 非サポートのものに変更する場合に、同様な問題が発生することが報告されております。


迅速なご回答に感謝しつつ、 AWS CLI で対応してね、とのことだったので下記ドキュメントを参考しました。

docs.aws.amazon.com

AWS CLI 自体の設定はこちら

docs.aws.amazon.com

結果、実行したコマンドは
aws rds modify-db-instance --db-instance-identifier instance-name --no-enable-performance-insights --profile projectName


こちらで無事無効化を行えました。
その後、RDS コンソールから5.7 へのバージョンアップも無事行えました!!

対応期限にはまだ時間はあるものの、どういったところで躓くかわからないので、色々なプロジェクトに対し早め対応を行っていこうと思います!!

より良いシステム開発・運用を求めて...

Pythonで観る宇宙

桜が見頃になってきましたね!
ついこの間咲き始めたと思ったら、いつの間にやらもう満開。季節の巡りは早いものです。

今回は天体観測をします。
春の夜には早々と消えていきますが...
私の大好きなオリオン座の星雲を観てみます。

赤外線天文衛星「あかり」などの望遠鏡によって撮影された写真をいじってみたり - Qiita

こちらの記事を参考にさせていただきました。ありがとうございました。

Astroqueryというモジュールを使うことで、SkyViewの天文写真をPythonで取得することができます。望遠鏡を覗き込まずに、プログラムから天体観測ができるなんてとても素敵です。

では、いってみましょう。

1. モジュールのインポート

import numpy as np #数値計算用
import matplotlib.pyplot as plt #描画用
from astroquery.skyview import SkyView #天文写真取得用
from astropy import units as u #取得範囲設定用
from astropy.wcs import WCS #天球座標変換用
from astropy.visualization import ZScaleInterval,ImageNormalize #画像補正用

astropyは天文データ解析用のパッケージです。

2. 設定値

target = 'M42' #オリオン大星雲
survey = ['2MASS-K','2MASS-H','2MASS-J'] #近赤外線波長域での天文観測プロジェクト
radius = 30*u.arcmin #取得する写真の範囲
pixels = 600 #取得する写真の大きさ
figsize = [6,6] #画像表示エリアのサイズ

オリオン座の散光星雲を取得する場合は、targetに「NGC 2024」を設定します。

3. 天文写真取得

hdu = SkyView.get_images(target,survey=survey,radius=radius,pixels=pixels) #天文写真を取得
wcs = WCS(hdu[0][0].header) #WCS座標を取得
plt.figure(figsize=figsize).gca(projection=wcs,title=target) #取得した座標をプロットする
plt.imshow(np.stack([ImageNormalize(hdu[i][0].data,interval=ZScaleInterval())(hdu[i][0].data) for i in range(3)], axis=2)) #強調化・合成して画像を表示 
plt.savefig(target + '.jpg') #画像保存
plt.close() #クローズ

天体の天球上の位置は、WCS座標で表すことができます。

4. 結果

感動です。

Power Automate DesktopでCSVファイルをダウンロードしてSQL文を生成してみた

f:id:ri_86:20220322180109p:plain

こんにちは、「ラクして速く」がモットーの辻本です。

このWebサイトに月1でアップされるCSVファイルの情報を、DBに取り込んでください。

そのようなとき、みなさんどうしますか?

CSVファイルのデータ形式がDBと一致しており、新規追加のみであれば、何かツールを使ってDBに取り込むことができるでしょう。

ただ、データが分割されていたり、桁数やフォーマットが違っていたり、DB側で固定値が必要だったり... はたまた、INSERT(追加)ではなく、UPDATE(更新)またはDELETE(削除)の場合は、何かしら加工した上、SQL文を作成して実行する必要があります。

その際、手動でExcelにデータを貼り付けて、加工した上、ごりごりSQL文を作るのはちょっとスマートではないですね。時間もかかります。

そこで登場するのがRPAです。今回はPower Automate Desktopを使ってその作業を完全自動化してみましょう。



【1】フロー完成図

f:id:ri_86:20220317165237p:plain f:id:ri_86:20220317165240p:plain ▲作成するフローの完成図になります。


【2】WebサイトからCSVファイルをダウンロード

f:id:ri_86:20220317182702p:plain ▲今回は「レコーダ」を使用し、WEBサイトからCSVをダウンロードするフローを作成します。

f:id:ri_86:20220323123422p:plain ▲上図のようにWEBサイトのダウンロードボタンを押下する処理をレコーダーで追加します。

f:id:ri_86:20220316170659p:plain ▲ダウンロードしたCSVファイルの中身です。


【3】Excel の起動

f:id:ri_86:20220317142915p:plainExcelカテゴリの中にあるExcel の起動」アクションを追加します。

f:id:ri_86:20220317150759p:plain「ドキュメントパス」は【2】でダウンロードしたCSVを指定してください。


【4】Excel ワークシートから最初の空の列や行を取得

f:id:ri_86:20220317144031p:plainExcelカテゴリの中にあるExcel ワークシートから最初の空の列や行を取得」アクションを追加します。

f:id:ri_86:20220317151059p:plainExcelインスタンスは【3】で作成された変数「ExcelInstance」を指定します。

Excel ワークシートから最初の空の列や行を取得」についてですが、
取得したCSVのデータのある最後の行数・列数の+1を取得するアクションです。
今回の場合、下記のように取得できます。
FirstFreeColumn = E すなわち 5
FirstFreeRow = 6

f:id:ri_86:20220317154104p:plain


【5】Loop処理を追加

f:id:ri_86:20220317170630p:plain「ループ」カテゴリの中にある「Loop」アクションを追加します。
「End」アクションは「Loop」アクションを追加すると自動で追加されます。

f:id:ri_86:20220317160536p:plain ▲「終了」についてですがFirstFreeRow = 6 なので
6 - 1 = 5 となり、5回ループすることになります。


【6】Excel ワークシートに書き込み

f:id:ri_86:20220317170624p:plainExcelカテゴリの中にあるExcel ワークシートに書き込み」アクションを追加します。

ループの中にこのアクションを設定することにより、Excel ワークシートに書き込み」アクションをループさせることができます。

f:id:ri_86:20220317160527p:plain

Excelインスタンスは【3】で作成された変数「ExcelInstance」を指定します。

「書き込む値」についてですが、作成するSQLクエリやDBの構成によって変更してください。 今回はエクセルの参照機能を使用し、INSERT文を作成しています。
また文字列の中に「%LoopIndex%」を使用することでループのたびに1,2,3,4,5と値を設定することができます。

「書き込みモード」は「指定したセル上」

「列」「行」は書き込みたいセルを設定する箇所になります。
今回は F 列の1行目、F 列の2行目...と書き込みたいので
「列」= 「F」
「行」= 「%LoopIndex%」
と指定しています。

書き込みイメージ

Loop1回目

="INSERT INTO user (id, login_id, user_name, user_type)VALUES('"&A1&"','"B1&"','"&C1&"','"D1"');"
Loop2回目
="INSERT INTO user (id, login_id, user_name, user_type)VALUES('"&A2&"','"B2&"','"&C2&"','"D2"');"
...

Excel書き込み後の文字列イメージ

Loop1回目

INSERT INTO user (id, login_id, user_name, user_type)VALUES('1','satou','佐藤','2');
Loop2回目
INSERT INTO user (id, login_id, user_name, user_type)VALUES('2','suzuki','鈴木','2');
...


【7】Excel ワークシートから読み取り

f:id:ri_86:20220317170641p:plainExcelカテゴリの中にあるExcel ワークシートから読み取り」アクションを追加します。

f:id:ri_86:20220317175914p:plain Excelインスタンスは【3】で作成された変数「ExcelInstance」を指定します。

「取得」は「単一セルの値」

「先頭列」「先頭行」は読み取りたいセルを設定する箇所になります。
【6】と同じように F 列の1行目、F 列の2行目...と書き込みたいので
「先頭列」= 「F」
「先頭行」= 「%LoopIndex%」
と指定しています。

読み取りイメージ

Loop1回目

INSERT INTO user (id, login_id, user_name, user_type)VALUES('1','satou','佐藤','2');
Loop2回目
INSERT INTO user (id, login_id, user_name, user_type)VALUES('2','suzuki','鈴木','2');
...

【8】テキストをファイルに書き込みます

f:id:ri_86:20220317170647p:plain「ファイル」カテゴリの中にある「テキストをファイルに書き込みます」アクションを追加します。
f:id:ri_86:20220317160546p:plain「ファイルパス」は作成したい場所に追加してください。
※ファイルパス先にファイルが無い場合は新規でファイルが作成されます。

「書き込むテキスト」は【7】で作成された変数「%ExcelData%」を指定します。

「ファイルが存在する場合」は「内容を追加する」にします。


【9】Excel を閉じる

f:id:ri_86:20220317170636p:plainExcelカテゴリの中にあるExcel を閉じる」アクションを追加します。

f:id:ri_86:20220317160011p:plain ▲ドキュメントパスは【3】で作成された変数「ExcelInstance」を指定します。


【10】作成されたSQLファイルを確認

f:id:ri_86:20220317155803p:plain ▲完成したSQLファイルです。
問題なくクエリが作成されていますね。


【11】最後に

最後まで読んでいただきありがとうございました。
重要なことに時間をかけて、その他のことはできるだけ自動化していきましょう。

その作業、自動化しませんか?

人工衛星軌道アニメーション

週末から暖かい日が続いています。春が近づいていますね!

今回は、「PyEphem」という天文分野のPythonライブラリを使用して、人工衛星軌道をシミュレートし、アニメーション表示してみます。

pyEphemの使い方 〜Pythonで人工衛星軌道をシミュレートする〜 | korintje.com

こちらの記事を参考にさせていただきました。ありがとうございました。

記事の中で

readtleメソッドを使えば、2行軌道要素形式(TLE)のパラメータを読み込むことも出来ます。

との情報もありましたので、TLEパラメータを使用してみます。

LIVE REAL TIME SATELLITE TRACKING AND PREDICTIONS

こちらのサイトで公開されている準天頂衛星システム「みちびき」4号機のTLE情報をパラメータに設定します。

1. モジュールのインポート

import ephem
import matplotlib.pyplot as plt
import os
from datetime import datetime as dt
from datetime import timedelta as td
from matplotlib.animation import ArtistAnimation #アニメーション作成用
from mpl_toolkits.basemap import Basemap #世界地図描画用

matplotlibの「ArtistAnimation」を使うことで、複数の図からアニメーションを作成することができます。

2. TLEパラメータを設定

line1 = 'QZS-4 (MICHIBIKI-4)'
line2 = '1 42965U 17062A   22057.72757807 -.00000328  00000-0  00000-0 0  9995'
line3 = '2 42965  40.7914   3.5343 0749421 269.5117 284.1873  1.00283299 16058'

TLE情報の「42965U」の「U」は、未分類(Unclassified)を意味し、公開されているTLEに付いています。

3. 時刻データを作成

epoch_date = "22057.72757807" 
year = int(epoch_date[:2])
year += 2000
datetime = float(epoch_date[2:])
decimal_time = dt(year, 1, 1) + td(datetime - 1)
time_list = [(decimal_time + td(hours=i/60)).strftime("%Y/%m/%d %H:%M:%S") for i in range(0,3600)]

TLE情報の一つの観測時刻をフォーマット変換します。また、その時刻を起点として3600個の時刻データを作成します。

4. 人工衛星のプロット画像をアニメーション化

images = [] #画像リスト用
fig = plt.figure() #描画領域を作成

m = Basemap() #世界地図を表示
m.drawcoastlines() #海岸線を表示

for time in time_list:
    image = []
    satellite = ephem.readtle(line1, line2, line3) #TLEパラメータを読み込む
    satellite.compute(time) #指定時刻で実行
    latitude = satellite.sublat / ephem.degree #緯度を取得
    longitude = satellite.sublong / ephem.degree #経度を取得
    x,y = m(longitude, latitude) #XY座標を取得
    image += m.plot(x, y, 'bo', markersize=7) #青丸でプロット
    images.append(image) #画像リストに追加

save_dir = "./" #動画の格納先
ani = ArtistAnimation(fig, images, interval=10, repeat=False) #10ミリ秒毎に図を切り替える
ani.save(os.path.join(save_dir,'orbit.mp4')) #動画を格納

5. 作成されたアニメーション

f:id:KenjiU:20220228205224g:plain

「みちびき」の特徴的な軌道である8の字を描いてますね!

【GPU】【YOLO】CUDA cuDNN TensorFlow をWindows10へインストールしてYOLOを動かす

AIチームの大澤です.

AIモデルの学習をする上でGPU環境は欠かせないものですが,構築する上ではCUDA cuDNN Tensorflowなどを環境に合わせて適切なバージョンを入れないと動かなかったりするので大変です.

また,他にもちょっとしたことでインストールが上手く行かなかったりGPUを認識してくれなかったりすることがあるのも厄介なところです. 今回は新しいPCでYOLO v3を動かすためのGPU環境を構築したため,その手順を残しておきたいと思います.

0. まずはじめに

CUDA cuDNN TensorFlowをそれぞれどのバージョンの組み合わせにするのが良いかということですが,それに関しては以下のページに早見表が載っているので,この組み合わせでインストールをするのが良いとのことです.

www.tensorflow.org

今回は以下の組み合わせで導入し,YOLO v3を動かすところまで行いました. またpython環境が整っていないまっさらな状態なので,pythonもインストールしていきます.

  • tensorflow-2.2.0
  • CUDA 10.1
  • cuDNN 7.6
  • Python 3.8

その他情報

  • OS: Windows10 pro
  • GPU: RTX2070 super *1

やることはこちらのとおりです.

  1. NVIDIAドライバをインストール
  2. CUDAをインストール
  3. cuDNNをダウンロード
  4. pythonをインストール
  5. 仮想環境(venv)を作成
  6. tensorflowをインストール
  7. YOLO v3を動かす

1.NVIDIAドライバをインストールする

インストールの前に,次のソフトウェアが入っている場合はアンインストールします.

大体のGPUマシンはゲーミングPC扱いになっており,ゲームに最適な設定でGPUを動かすためにGeForce Experienceというツールが入っているようです.こちらが入っていると,CUDAのインストールが上手く行かない場合があるとのこと. (参考:https://webbigdata.jp/study/post-9499)

ちなみに私の場合はNVIDIA FrameView SDKが見当たらなかったので,それ以外の2つをアンインストールしました.

それではNVIDIAのドライバをダウンロードしてきます.

www.nvidia.co.jp

自身の環境にあったドライバを選択します.私の場合は以下です. ダウンロードタイプはStudioドライバーで良いかと思います.

f:id:kyoshi0000:20220225203019p:plain

f:id:kyoshi0000:20220225203213j:plain

ダウンロードができたら無心でインストールをします.

2.CUDAをインストールする

CUDAをダウンロードします.

developer.nvidia.com

組み合わせ早見表によると10.1を入れる必要があるとのことなので,「CUDA Toolkit 10.1」をクリックします.

「Select Target Platform」は画像のようにしました.

f:id:kyoshi0000:20220225203355j:plain

こちらもダウンロードができたら無心でインストールをします.

3.cuDNNのダウンロード

cuDNNをダウンロードしていきます.今までの中で一番面倒です. というのも,メンバーシップ登録をしないとダウンロードさせてくれないからです.

developer.nvidia.com

Download cuDNN → Join now でメールアドレスを登録をしましょう.

無事にメンバーシップ登録が終わったらログインをし,cuDNNをダウンロードします. 早見表によるとcuDNNは7.6を入れる必要があります.そして今回CUDAは10.1なので, 「Download cuDNN v7.6.0 (May 20, 2019), for CUDA 10.1」をダウンロードしました.

zipファイルになっていると思うので,解凍をします.

解凍されたcudaフォルダには後ほどパスを通すので,参照しやすいところに置いておきたいです.Cドライブ直下にtoolsというフォルダを作り,その中に入れることにします.

f:id:kyoshi0000:20220225203752j:plain

パスの設定

ここでパスの設定を行います.以下の4行を環境変数に追加します.

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
C:\tools\cuda\bin

f:id:kyoshi0000:20220225203958j:plain

4.Pythonのインストール

以下のURLからpythonをインストールします. 早見表ではPython3.8が対応しているとのことなので,今回はPython 3.8.8をインストールしました.

http://
https://www.python.org/downloads/

インストールができたら確認のため,コマンドプロンプトpython -Vを実行してみます.
Pythonのバージョンが表示されるはずですが,私は表示されませんでした.

Pathが通ってなさそうなので,以下の2つをシステム環境変数へ追加します.


C:\Users\ユーザー名\AppData\Local\Programs\Python\Python38
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python38\Scripts

f:id:kyoshi0000:20220225204414j:plain

PC再起動後,コマンドプロンプトで再びpython -Vのコマンドを実行.
python 3.8.8と表示されました.これでPythonのインストールは完了です.

5.仮想環境を作成(venv)

python機械学習を行う際には様々なライブラリを使用しますが,そのライブラリのバージョンもプロジェクトによって異なる場合がよくあります.

プロジェクトAはver.1.0で動くけど,プロジェクトBはver.2.0じゃないと動かない」となるのは面倒です. なのでプロジェクト毎に仮想環境を作り,プロジェクトAの仮想環境にはver.1.0を,プロジェクトBの仮想環境にはver.2.0のライブラリを入れてあげればいいよねということで,仮想環境を作成していきます.

公式でサポートされているので簡単です. まず,プロジェクト用のフォルダを作成します.今回はデスクトップにProjectフォルダを作り,その中にYOLOフォルダを作成しました.このYOLOフォルダ内に仮想環境を作成し,今後はその中で作業していきます.

デスクトップ
 └─ Project
    └─ YOLO

コマンドプロンプトを開き,cdコマンドでYOLOフォルダに移動します.

cd C:¥Users¥<ユーザー名>¥Desktop¥Project¥YOLO

ここでpython -m venv envを実行します. YOLOフォルダ内に「env」というフォルダが作成されればOKです.

引き続きコマンドプロンプトenv¥Scripts¥activateを実行すると仮想環境をアクティベートすることができます.deactivateで仮想環境から抜けます.

これでYOLOフォルダ内に仮想環境を作成できました.

再度env¥Scripts¥activateで仮想環境をアクティベートしたらtensorflowを入れていきます.

これ以降は仮想環境を立ち上げた状態で進めていきます.

6.tensorflow v2.2.0をインストール

ではpip install tensorflow==2.2.0でインストールします.

終了したらtensorflowがGPUを認識するか確認をします.

コマンドプロンプトpythonと入力し,対話モードでpythonを実行します. 次に以下の2行を入力します.

import tensorflow as tf
tf.test.is_gpu_available()

出力にTrueと出れば認識できているので,exit()と入力して対話モードを終了します.(参考:https://www.dan-myblog.com/post/52/)

最後にYOLOv3(GPU)の設定を行います.

7.YOLO v3を動かす

ソースファイルのダウンロード

YOLOv3をダウンロードします.git cloneでもzipファイルをダウンロードでもどちらでも構いません.

github.com

ダウンロードしたyolov3-tf2-masterフォルダ以下のファイル群を,上で作成した仮想環境内に配置する.


フォルダ構成
YOLO(仮想環境)
  ├── envフォルダ
  ├── yolov3-tf2-masterの中身一式
  ︙

モデルのダウンロード

こちらからモデルをダウンロードし,dataフォルダに配置します. https://pjreddie.com/media/files/yolov3.weights

以下のコマンドでconvert.pyを実行します.*2


python convert.py --weights ./data/yolov3.weights --output ./checkpoints/yolov3.tf


モデルの変換ができたらYOLOを実行してみます. webカメラで検出を行いたいので,以下のコマンドを入力します.

python detect_video.py --video 0

うまくいっていればこれでYOLOが実行できているはずです. 私もかなり調べながら環境を構築しましたが,もう同じことはしたくないので備忘録も兼ねてこちらに残しておきます.

お疲れさまでした.

*1:ちなみにRTX30*系だとCUDA 11.系しか対応していないそうです.[参考:https://teratail.com/questions/331673]

*2:以下のページのReadMeにコマンドの説明が書いてありますhttps://github.com/zzh8829/yolov3-tf2

座標変換

物事の考え方や捉え方を変えてみると、新しい発想や解決法が得られることがあります。

  • 別の立場の人の視点に立って物事を考えてみる。
  • 他の人のいつもと違う考えや価値観に触れて、別の視点に気付く。

等、ビジネスを取り巻く環境が大きく変化する今日この頃、多様な視点を持つことはとても大事ですね。

さて、今回を視点を変えるということで...
画像の座標変換という手法を試してみます。

世界地図と地球儀で、大陸や島の大きさがそれぞれで違うと感じたことはないでしょうか?
メルカトル図法の地図は、楕円体である地球を円筒で表現している(緯線はすべて赤道と同じ長さになる)ので、北極や南極に近づくほど実際の面積よりも大きく表示されてしまいます。

matplotlibとMayaviでNASAの画像を『地球儀』にしてみた。 - プログラム日記φ(..)

こちらの記事でご紹介されているように

 x = r \sinθ \cosφ
 y = r \sinθ \sinφ
 z = r \cosθ

球面座標 (動径r, 緯度θ, 経度φ)

直交直線座標 (x, y, z)
へ変換することで、地図の各緯度経度の値を球面にマッピングし、地球儀を作成することができます。

ついでに
mplot3d API — Matplotlib 2.0.2 documentation

view_init(elev=None, azim=None)
# elev: z軸方向から見た仰角
# azim: x, y軸方向の方位角

この関数を使用し、azimの値を0〜360の間で変化させて、地球儀を回転させてみます。 f:id:KenjiU:20220130235421g:plain 地図ではなく、写真を球面にマッピングすると以下のようになります。 f:id:KenjiU:20220130235447g:plain 目が回りそうです。
座標変換ですが、AIで画像解析する際の前処理の一つとして使うこともあります。また別の機会にご紹介しますね。

簿記3級必勝法

こんにちは、ブリスウェル新入社員の辻本です。

財務諸表を読み解いて企業分析ができるようになりたい。

会計周りのシステム構築業務にも活かせる。

...ということもあり、簿記3級を受験しました。

独学の場合、取得するには100時間かかると言われていますが、
この度、50時間ほどで取得できたので、勉強方法を共有させていただきます。


1. Youtubeで全体像把握

【簿記系YouTuber?】ふくしままさゆき

【ゼロから簿記3級(全24回)】基礎18回+じっくり復習6回(テキスト不要!)

まずこの方の再生リストを2周視聴しました。

勘定科目、資産・負債・資本・費用・収益などの用語の理解、
簿記3級試験が3つの大問で分かれていること等、全体像の把握ができました。

このYoutube動画は基礎から噛み砕いて丁寧に説明してくれるので、お勧めです。


2. 模試をひたすら行う

全体像の把握ができたら模試をひたすら行いました。

教育機関において、日商簿記検定試験の予想問題が公開されているので、
参考にしてください。

より多くの問題(丁寧な解説付き)を解いて、ネット試験に挑みたい方にはこの本をお勧めします。

私はブリスウェルの上司(Tさん)に借りたのですが、
問題が本試験にかなり近く、模試数もかなりあるのでお勧めです。

この本の模試で90点以上を安定して取れるようになれば試験に望んでも問題ないかと思います。


3. 簿記3級試験 体験談・注意点

実は私、簿記3級試験に2度落ちています。

<1度目の挑戦>

得点:55点(不合格)
敗因:
・大問③(決算書類作成問題)の書き方があまり分かっていなかった。
・模試で大問②(補助簿・勘定・決算仕訳・会計用語)について満点が取れたことがなかった。

リカバリー内容>

・大問③(決算書類作成問題)の書き方をほぼマスター。
・大問②は、T字勘定以外は解けるようにした。
・模試の点数は80点を安定して取れるようにした。

<2度目の挑戦>

得点:63点(不合格)
敗因:
・大問②でT字勘定が出てきた。
・大問③(決算書類作成問題)で模試には出なかった決算仕訳が出てきた。

リカバリー内容>

・本に載っている模試を全て2周行い、YoutubeでT字勘定、決算仕訳に関する動画をひたすら見ました。
・模試の点数は90点を安定して取れるようになり、100点も取れるようになった。

<3度目の挑戦>

得点:79点(合格)

このように模試のレベルと本試験のレベルは明確に違うので、
必ず90点以上を安定して取れるようになってから試験に臨みましょう。


まとめ

簿記3級を取得したことにより、会計業務を簿記の視点から見ることができるようになりました。次の目標は簿記2級の取得です。
工業簿記も対象になり、難易度は3級と比較し格段に高くなります。
お客様に対してより深いコンサルティングができるようにするため、頑張って勉強します。
弊社には私以外にも簿記に精通している方がいるので、
会計周りのシステムの構築であれば弊社にお任せください。

公転軌道アニメーション

2021年も大詰めとなりました。一息ついて良いお年をお迎えください。

冬の星空はとても綺麗ですね。子供のころ、寒いベランダでずっとオリオン座を眺めてました。星の方からも誰かが同じように地球を眺めているのではないかとわくわくしていた記憶があります。

今回は、Pythonのグラフ描画ライブラリ「matplotlib」のアニメーションを使用して、地球の公転運動を表示してみます。

Pythonアニメーションによるケプラー運動(楕円軌道)の表示 | 地学教材 | 高津科学

こちらのサイトを参考にさせていただきました。ケプラー方程式の実装と、アニメーション方法について大変勉強になりました。ありがとうございました。

その時代の常識を疑い、観察と推測によりケプラーの法則を導き出したケプラーさんには、ただただ敬服するばかりです。江戸時代の日本の天文学者麻田剛立」もケプラーの第3法則を独自に発見したと言われています。

  • 道長半径(周回する天体がとる楕円軌道の長半径): 1(天文単位
  • 離心率(二次曲線の特徴を示す数値で1より小さければ楕円): 0.0167

として、地球の公転運動をアニメーションしてみましょう。

f:id:KenjiU:20211231214442g:plain

1年間があっという間ですね。

子供のように「ときめき」と「わくわく」が溢れていると、時間の感覚が長く感じるようです。「楽しんで◯◯をする事」を大切にして、前へ踏み出していきましょう。

では、来年もどうぞよろしくお願いいたします。

Exif情報を知る

久しぶりの投稿になります
新入社員も入ってきて駆け出し社員ではなくなりつつある中堅社員(?)kobaです。
今年も残り少しですね。。。年々早く時間が過ぎていくような気がしています。

ある案件で写真をアップロード時、Exif情報を画面上に出してほしいとの要望がありました。

エグジフ?イグジフ?Exif情報って??

Exif情報ってなんだろうと思い調べてみると
カメラの機種や撮影時の条件情報を画像に埋め込んでいる情報のことを指しており
デジタル機器のカメラで撮影した写真には
ほとんどExif情報が自動付与されているみたいです

Exif情報の例としては

撮影日時、位置情報、撮影機器名、画像の解像度、フラッシュ使用の有無

などがあります。
フラッシュの有無までわかるとはすごいですね(実用性あるかはわかりませんが笑)

iPhoneで撮影した写真をアップロードしてもExif情報読み取ってくれない?

今回はアップロードした写真を表示する他に
アップロードした写真のExif情報(撮影日時、位置情報)を読み取って
Exif情報あれば撮影日時、位置情報のテキストリンクを表示する要件でした。

f:id:briswellyuki:20211202180813p:plain
Androidでアップロード時の状態

ただiPhoneで撮影した写真をアップロードすると
何故かExif情報読み取ってくれません。
AndroidだとExif情報表示されるのに....

f:id:briswellyuki:20211203111545p:plain
iPhoneでアップロード時の状態

iPhoneの写真がExif情報読み取ってくれない原因?

調べてみるとiPhoneから
SNSへのアップロード時やメッセージへの添付の際に
Exif情報が削除される仕様になっている旨の記載がありました。
上記の仕様で読み取ってくれないのだろうかと考えました。
参照Wiki

解決法

いくつか解決法が記載してあるサイトあったので試してみました。
参照サイト

①メールの添付画像をアップロード
1.該当画像をメールで自分に送信

2.メール添付画像を保存

3.保存した画像をアップロード

上記の方法を試しましたところ、表示されました!
f:id:briswellyuki:20211203122731p:plain

iPhoneカメラ設定変更
1.iPhoneの設定で[カメラ]選択
f:id:briswellyuki:20211203122328p:plain

2.[フォーマット]選択
f:id:briswellyuki:20211203122400p:plain

3.[互換性優先]選択
f:id:briswellyuki:20211203122414p:plain

上記の方法で撮影した写真をアップロードしたところ
表示されました!
上記3の写真でわかりますが、
iPhoneはデフォルトでフォーマットの設定が[高効率]になっています。
[高効率]では画像形式がHEIFで保存されてしまうので
Exifの対応画像形式ではなかったことによることが
Exif情報読み取れない原因だったようです

まとめ

Exif情報は個人情報が特定できる恐れがあるので
気軽にSNSにアップロードできてしまうスマホから
アップロードするときには注意が必要です。
iPhoneSNSへのアップロード時やメッセージへの添付の際に
Exif情報が削除される仕様はある意味優しいかもしれませんね
(今回のような要望がある場合には少し手間がかかりますが....)



「業務のアイカタであり続けたい」
中小企業様向けERPソリューション
ai-cata.com