MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Juliaコードの初回実行を高速化するためのPackageCompiler.jl入門


1から始める Juliaプログラミング

目次

  • 目次
  • はじめに
  • パッケージのロードをsysimageで高速化する
  • 関数の初期実行をsysimagesで高速化する
  • REPL用のデフォルトパッケージをロードしたsysimageを作る便利関数
  • 参考資料
  • MyEnigma Supporters

はじめに

これまでPythonでやってきたことを、

Juliaで置き換えようとすると、まず初めにぶつかるのが、

Juliaのコードにおけるライブラリのロードや、

初めて使う関数の計算が遅いなど、

いわゆる初回実行が遅い問題が気になってきます。

(英語ではこの問題をlatencyと呼んでいるそうです

github.com

)

 

Juliaは基本的に初回実行時にコードをJITコンパイルして実行するため、

動的言語でありながら、高速な実行を実現できているので、

myenigma.hatenablog.com

この初回実行が遅いのはある程度はしょうがないのかなと思います。

 

しかし、

毎回使うライブラリのロードや

変更が不要な関数が、

毎回遅いのはなんとかならないのかなと思っていました。

 

そこで、この問題の一つの解決策がPackageCompiler.jlです。

github.com

julialang.github.io

 

概要はこちらの動画を参照していただけるとわかると思いますが、

www.youtube.com

sysimageと呼ばれるJuliaのセッション保存機能を使って、

いつも利用するライブラリをロードした状態や、

関数のJITコンパイル結果を保存することにより、

そのsysimageを使って、juliaコードを実行したときに、

初回実行を高速化することができます。

(Julianのsysimageに関しては、こちらを参照ください

julialang.github.io)

 

今回の記事では、このPackageCompiler.jlとsysimagesを使うことで、

Juliaのコードの初回実行を高速化する方法を簡単に紹介したいと思います。

続きを読む

GitHubのOSSで最新のドキュメントを各コミット毎に簡単に確認できるようにする


SphinxでKindle本を作る

目次

  • 目次
  • はじめに
  • Circle CIでドキュメントをビルドするCIを作る
  • circleci-artifacts-redirectorを設定する
  • 参考資料
  • MyEnigma Supporters

はじめに

OSSにとってドキュメントは、

出来るだけ多くの人に使ってもらうために重要です。

 

近年のOSSでは、

ソースコードと同じgitリポジトリに

テキストベースでドキュメントの元のデータを管理し、

Sphinxや

www.sphinx-doc.org

Documenter,jl

github.com

のようなドキュメント作成ライブラリを使って、

htmlベースのドキュメントを自動生成し、

そのデータをインターネット上に公開するのが一般的です。

 

このようにドキュメントをgitで管理すると、

ドキュメントの改善を通常のコードと同様に

プルリクエストベース(PR)で、レビューして

改善することができます。

 

このような、

PRベースでドキュメントの変更をレビューするのは便利なのですが、

一つ面倒なのが、

他人のドキュメントのPRをレビューするときに、

そのPRのブランチを手元にチェックアウトし、

ドキュメントをビルドしないと、

最新のドキュメントの見た目などを確認できないことです。

 

また、レビューの結果を反映した、

各コミット毎にこの作業をしないといけないので

以前から非常に面倒だなと感じていました。

 

昔からこのフローを改善したいなと思っていたのですが、

最近開発に参加している、SciPyが非常に良い方法を利用しているのに気がつきました。

github.com

 

この方法では、

PRの各コミット毎にCIが回るので、

そのCIの一環として、最新のコードでドキュメントをビルドし、

そのドキュメントをそのままブラウザ上で確認出来るようになります。

 

もう少し具体的には、

下記のように、PRでコミットすると

GitHubのCIの画面に、

build_doc artifactという項目が表示され、

f:id:meison_amsl:20200725204409p:plain

 

この項目のDetailsをクリックすると、

下記のように、CIで生成された最新のドキュメントを

ブラウザ上で確認することができます。

f:id:meison_amsl:20200725204515p:plain

これを見ながら、

簡単に最新のドキュメントの結果をレビューすることができます。

 

今回の記事では、

こちらの設定方法について説明します。

続きを読む

SciPy 1.5.0がリリースされました


LAPACK利用の手引―行列計算パッケージ

目次

  • 目次
  • はじめに
  • Tweetまとめ
  • 参考資料
  • MyEnigma Supporters

はじめに

本日、

自分が開発者のメンバーとして参加している

SciPyの新しいバージョン1.5.0がリリースされました🎉

github.com

 

今回は、1.5.0の新機能や特徴を、

連続ツイートでまとめてみたので、

そちらを、あとから参照しやすいように

記事としてまとめておきます。

続きを読む

ロボティクスにおける最近傍点探索のためのscipy.spatial.cKDTree入門


NumPy&SciPy数値計算実装ハンドブック (Pythonライブラリ定番セレクション)

目次

  • 目次
  • はじめに
  • kdtreeとは
  • scipy.spatial.cKDTreeの使い方
    • kdtreeの作成
    • 最近傍点の探索
    • ある点から一定範囲の点を探索
    • 2つのkd-tree同士のある一定距離範囲内の点の探索
    • 1つのkd-tree内のある一定距離範囲内の点の探索
    • 2つのkd-treeの各点の距離を計算する
  • 参考資料
  • MyEnigma Supporters

はじめに

ロボティクスにおいて、

最近傍点探索はよく使われる計算です。

例えば、衝突検知や、センサ情報の対応点探索などに

最近傍点探索は使われます。

 

最近傍点探索を使う時に、

一番よく問題になるのが、計算量です。

単純にbrute forceで最近傍点を探すと、

計算時間は探索する点の数に応じて増加してしまいます。

 

そこで、よく使われるのがkd-treeです。

en.wikipedia.org

このkd-treeを使うことで、大量のデータがあっても、

比較的、高速に最近傍点探索を計算することができます。

 

このkd-treeを使うには、

様々なライブラリがすでに存在しています.

例えば、以前紹介したFLANNも

kd-treeをデータ構造に利用しています。

myenigma.hatenablog.com

 

今回の記事では、

Pythonの科学技術計算のライブラリであるSciPyの中にある、

scipy.spatial.cKDTreeというモジュールの使い方を紹介したいと思います。

scipy.github.io

 

ちなみに、scipy.spatial.KDTreeというモジュールがありますが、

scipy.github.io

こちらは、純Pythonで実装されたkdtreeで、

cKDTreeがcythonで高速化されたバージョンのKDTreeです。

こちらのroadmapにある通り、将来的にはcKDTreeがKDTreeに

置き換えられる予定ですので、cKDTreeを紹介します。

scipy.github.io

 

現時点では、この移行のために、

KDTreeもcKDTreeもほぼ同じAPIをもっていますので、

現時点では、計算が高速なcKDTreeを使っておくのが良いと思います。

(また最近追加された機能はcKDTreeにしか追加されないようになっているため、

若干、cKDTreeのほうが多機能です。)

 

続きを読む

SpaceXの社員だけどなにか質問ある?


Spacex Tシャツ 半袖 メンズ ワンポイント カットソー 日常 マルネック 薄手 シンプル 防汗 伸縮性 通気

目次

  • 目次
  • はじめに
  • Twitterメモ
  • 参考資料
  • MyEnigma Supporters

はじめに

SpaceXのソフトウェアエンジニアの人たちがredditに降臨して、

すごく細かい内容について、色々答えていたので、

Twitterでメモしながら、呼んでみました。

そのメモ用記事です。

続きを読む

初心者のためのコンテナオーケストレーションツールKubernetes入門


しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

目次

  • 目次
  • はじめに
  • Kubernetesとは?
  • Kubernetesによる専門用語
    • Pod
    • Node
    • Cluster
  • Kubernetesの基本機能
    • 複数の物理サーバやVMでのコンテナ管理
    • コンテナのデプロイ
    • コンテナ間のネットワーク管理
    • コンテナの負荷分散
    • コンテナの監視と自動復旧
    • コンテナのアップデート
  • 参考資料
  • MyEnigma Supporters

はじめに

Dockerなどのコンテナシステムを管理するシステムとして、

myenigma.hatenablog.com

コンテナオーケストレーションシステムがあります。

 

このコンテナオーケストレーションツールの中で、

ほぼデファクトスタンダードなのが、Kubernetesです。

kubernetes.io

ja.wikipedia.org

  

今回の記事では、こちらの書籍を元に

自分が、k8sについて学んだ内容をまとめておきたいと思います。


しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

 

続きを読む

ロボティクスにおける幾何学処理のためのscipy.spatial.transform.Rotation入門


3次元回転: パラメータ計算とリー代数による最適化

目次

  • 目次
  • はじめに
  • scipy.spatial.transform.Rotationにおける三次元回転の表現方法
  • 三次元点の回転
  • 回転の掛け合わせ
  • 逆回転
  • 参考資料
  • MyEnigma Supporters

はじめに

ロボティクスにおいて、幾何学処理、

特に三次元の回転は基本的な処理です。

myenigma.hatenablog.com

 

上記の記事で、ROSのtfを使った場合の三次元回転処理や、

C++のEigenを使った場合の三次元回転処理を紹介しましたが、

Pythonで三次元回転を扱う場合には、

scipy.spatial.transform.Rotationを使うのが便利です。

scipy.github.io

 

今回の記事では、

このscipy.spatial.transform.Rotationの使い方について

簡単に紹介したいと思います。

 

続きを読む

各プログラミング言語における変数名と変数の値を簡単に出力する方法まとめ


情熱プログラマー ソフトウェア開発者の幸せな生き方

目次

  • 目次
  • はじめに
  • Python
  • Julia
  • Shell script
  • C++
  • Java
  • IDEの機能を使う
  • 参考資料
  • MyEnigma Supporters

はじめに

先日の記事で、

Pythonにおけるロギングの方法を紹介しましたが、

myenigma.hatenablog.com

ロギングで一番よく実施するのが、

ある変数名と変数値を出力することです。

 

例えばPythonで、

あるxという変数があり、その変数の値が100である場合、

通常のprint関数を使うと、

100

と表示されます。

しかし、そのときにはその表示された値がxのものであることを覚えているため、

問題ありませんが、後日アプリケーションのデバックをするときには、

その出力がどの変数であるかはおそらく覚えていないので、

最低では、ログや標準出力には

x = 100

と表示させておきたくなります。

 

上記のような処理は、プログラミング中には大量にコーディングすることになるので、

できるだけ、簡単にコーディングしたいものです。

 

そこで、今回は自分がよく使用しているプログラミング言語において、

上記の内容を簡単に実施する方法をまとめておきたいと思います。

 

続きを読む

初心者のためのPythonにおけるlogging入門


The Python 3 Standard Library by Example: Pyth 3 Stan Libr Exam _2 (Developer's Library) (English Edition)

目次

  • 目次
  • はじめに
  • loggingモジュールの基本的な使い方
  • コマンドラインからログのレベル変更
  • モジュール毎のロガー設定とロギングレベルの変更
  • loggingのhandler
    • loggingで使えるhandler
  • loggingのfilter
  • 設定ファイルによるロガーの設定
  • 参考資料
  • MyEnigma Supporters

はじめに

自分以外の人に使用されるソフトウェアを開発している場合、

自分の手元では発生しない問題や、

たまにしか発生しない問題に悩まされることが多いと思います。

 

そんな場合は、手元で再現することができないので、

ソフトウェアにロガーを埋め込み、

その問題が発生した時のログファイルを元に

問題解決することになります。

 

そんな時に重要なのが、

元のソフトウェアを変更することなく、

必要な情報を得るためのロギング機能を実装することです。

 

今回の記事では、Pythonの標準ライブラリの一つである

ロギング機能用モジュールloggingの基本的な使い方や、

ユースケースに基づく、逆引きメモを紹介したいと思います。

docs.python.org

 

続きを読む

Pythonにおける型ヒント入門


Advanced Python Development: Using Powerful Language Features in Real-World Applications

目次

  • 目次
  • はじめに
  • Pythonの型ヒント
  • 型アノテーションの書き方
  • 静的型チェッカー mypy
    • インストール方法
    • ターミナル上での使い方
    • mypy.iniの作り方
  • PyCharm
    • PyCharmでの型入力
    • PyCharmでの型チェック
  • CI上でチェックする
  • 参考資料
  • MyEnigma Supporters

はじめに

Pythonは動的言語で、

型を指定する必要は無いのですが、

それが原因で、意図しない入力が関数が入力されたりして、

バグの温床になりがちです。

 

そこで、Python3.5あたりから、

型ヒント(型アノテーション)という機能が追加されました。

docs.python.org

これにより、変数や、関数の入出力に型情報を追加することができ、

意図しないコードの使用や状態を事前に検知することができます。

 

今回の記事では、

このPythonの型ヒントの概要について説明したいと思います。

 

続きを読む