About this site
このサイトは、航空・宇宙コンピュータ電子工作といった時代の最先端のことから、登山といった文明生活から遥かにかけ離れたことまで、思うがままに書いてあります。写真も大好きです。
興味がある方にしかおもしろくないと思いますが、どうぞ楽しんでいってください。あと、MovableTypeのカスタマイズ情報を提供しています。

If you are interested in "Super Sylphide", an autopilot system for small UAVs, please visit this page.

Super Sylphide猫カメラGPSロガーXBee電力計


最後に、はてなアンテナやRSSリーダーで読む場合はこちらからどうぞ。
Entries @ recently

May 23, 2023

Windowsのcygwin/MSYS2/RでSSL証明書問題の解消

ネットワークの制限の関係で、中間者傍受を許容する設定での運用になっていたとします。そこでのWindowsの設定は、いわゆるオレオレ証明書を『信頼されたルート証明機関』に配置をすることになります。Windowsと親和性が高いアプリでしたら、ほぼそれですべて解決するのですが、残念ながらそうでないものがいくつかありましたので、その解決方法をまとめておきたいと思います。

Cygwin


wgetとかcurlをやっているときにSSLがどうたらというエラーを吐いて死ぬので気が付きます。stack overflowに書いてあるやり方でうまくいきます。

$ cp ca.crt /etc/pki/ca-trust/source/anchors/ # オレオレ証明書を配置
$ update_ca-trust # 加えたオレオレ証明書の内容を証明書溜り(/etc/pki/ca-trust/extracted/openssl)に追加

もしupdate_ca-trustがなければca-certificatesを導入しましょう。

MSYS2


pacmanが文句を言ってくるところで気が付きました。解消方法はcygwinと同じです。MSYS2のFAQにも解説があります。

R


新しいpackageを導入しようとしたところでミラーの選択をはじめに問われるのですが、そこでインターネットが不通になっている旨 URL 'https://cran.r-project.org/CRAN_mirrors.csv': status was 'SSL connect error' という形でエラーが表示されることが気が付きました。R-3.6からR-4.2に切り替えたところでこのようなエラーが出始めて大変困っていました。これはデフォルトのダウンロード方法()であったwininetが非推奨になり、libcurlへと変わったために起きたようです。

回避方法としてはlibcurlにおとなしくなってもらいます。download.file()関数のヘルプのSecure URLsの項目に詳しい説明がありました(l最新版へのリンクなのでそのうち内容が変わってしまうかもです)。結果的にはibcurlの動作モード(libcurlVersion()で取得できる)がSchannel(OS提供の証明書情報を参照)で動いていたので本来なら問題は生じないはずなのですが、オレオレ証明書が失効リストに引っかかってしまってたようで、curlを--ssl-no-revokeで動かす必要があることがわかりました。結果、Rとしては環境変数の設定として

Sys.setenv(R_LIBCURL_SSL_REVOKE_BEST_EFFORT=TRUE)

とすれば動作するようになりました。毎回コマンドを打ち込むのは面倒なので、起動時に設定されるよう.Rprofileの.Firstに書いておくとよいと思います。

また、あまり良い方法ではないですが、非推奨のwininetに戻すこともできます。

options(download.file.method="wininet")

他にもダウンロード手段をcurlとし、オプション-kで証明書を無視する方法もあります。

22:48 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/956

March 14, 2023

RubyでGPS姿勢推定

RubyでのGPS解析環境を充実させるへくgps_pvt gemを作っていますが、そのgemを応用して近接する複数アンテナを使った姿勢推定のプログラムを作ってみました。

Integer Ambiguityを全組み合わせで計算してしまうので、衛星がたくさん見えていると明らかに処理速度が落ちます。その部分を改善していきたいと思います。

13:55 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/955

December 27, 2021

RubyでGPS受信機

ちょっとすごいロガーのツールの一部を切り出して、RubyでGPSの測位処理ができるようにしてみました。githubにコードを公開しています。

Rubyのgemとしているので

gem install gps_pvt

で入れることができます。native extensionを含むgemなのでインストール中にコンパイルが走ります。Windowsの方はビルド環境(Ruby installer for Windowsでいうところのwith Devkit版でのRuby導入)が必要になります。

gemインストール後は

gps_pvt RINEX_nav RINEX_obs

とすると、測位結果がずらずらとCSVで出力されます。単独測位、スナップショットでの解なので、実用性はあまりないです。これをベースに何か発展的なことをしたいという人向けのツールです。詳しくはReadmeを見てください。

プログラム的な話をすると、native extensionを作るためのextconf.rbが凝った作りになっています。shared libraryを複数生成する必要があるので、内部でMakefileを別名で複数生成し、それらを起動するMakefileを最後に生成しています。

22:20 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/954

September 15, 2020

boost::math::distributions

boost::math::distributions便利ですね。いろいろな確率分布があります。Rubyから使えるようにしたかったので、SWIGでラップしてみました。

Rubyからだと

require "BoostDistributions.so"
BoostDistributions::Normal::new.quantile(0.5) # => 0

のように使えます。RubyGemにしたいと思っています。

23:20 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/953

May 08, 2019

E-MailRelay本体更新(ver 2.0)に伴う対応

随分昔の話ですが、E-MailRelayというSMTP Proxyを使って、自前のメールアドレスフィルタを作ったことがありました。随分更新をさぼっていて最近最新のものに置き換えてみたついでに、昔のスクリプトを改善してみました。

発端はshebangです。Windowsのバッチファイル(.bat)に他のスクリプト言語を埋めこめるなんて素敵! ということでやってみました。

E-MailRelayで実行するスクリプトには、ちょっとした癖があって、終了コードで動作を変えています。そのため上記参考にした記事のものだけでは不十分で2行目の

exit /b %ERRORLEVEL%

が肝となりました。こうすると、終了コードが正しくE-MailRelay本体に帰っていきます。

23:51 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/952

November 29, 2018

RinRuby (Ruby gem for R)

プログラミング言語Rubyと統計に強いRをブリッジさせるRuby gemのRinRubyというものがあるのですが、ここ数か月でかなり手を入れさせてもらいました。github上でコードが公開されているのでforkをしてPull requestsをして、ということをやっていましたが、fork元に取り込まれていない機能もあったりしますので、僕のforkもご参照いただければと思います。現在のところfork側にしかない機能は以下のとおりです。

  • Complex型のサポート
  • 多言語サポート(Windowsで文字コードがShift-JIS(MS932)になっていたりしても大丈夫です)

# fork版をインストールするには以下のコマンドで…
gem install specific_install # 初回だけ必要
gem specific_install https://github.com/fenrir-naru/rinruby.git dev-fenrir

もともと自分が使うためにかなり手を入れたのですが、Pure Rubyで動きインストールが簡単ですので、お奨めしてもよいかなと思い、記事を書きました。Travis-CIAppVeyorでテストしていますが、色々なRubyのバージョン(2.3以降でテストしていますが、1.9以降でも動くと思います)やjRubyでも動いています。Windowsでもテストを通しています。またローカルではRuby on cygwinとWindows Rでも実績があります。

今後ですが、コードが肥大化しているので気が向いたらリファクタリングをするつもりです。その他にも問題等あるようであれば、githubのIssuesに残していただけると嬉しいです。

23:28 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/951

August 18, 2018

RSpecでのexample間共用のインスタンス生成

Rubyのコードをいじっていて、とうとうRSpec(テスト)を書く羽目になったのですが、そこでのメモです。
テスト対象になるインスタンスが、ソケットを生成していろいろ下準備をしてはじめて使えるようになるものだったので、テストを高速化するためにも、テストケース(RSpecではexampleと呼ぶらしい)間でインスタンスを永続化させて共通にできるところは共通にしたい、ということがありました。

こういうときは、全テスト前に実行されるbefore(:all)(←before(:context)のエイリアス)ブロックでインスタンスを生成すれば事なきを得そうですが、さらに事情が複雑で、インスタンスの生成方法を共通化したいというのがありました。常套手段としてはRSpecの外でFactory patternでも作ってそれを中で使えばよいのでしょう。だがしかし、未定義変数アクセス時に遅延評価によって変数内容を生成するRSpecの機能のlet(あるいはそのエイリアスのsubject==let(:subject))を利用してみることにしました。

そういうことで、いろいろ試してみました(別タブで見たほうが良いかも)。

spec/target_spec.rb にケースが6つ書いてあります(左側のアイコンを操作するとファイルを切り替えられます)。それぞれこんな感じです。

  1. よくある、テストケースごとに生成する場合。subject(let)使えばOK
  2. たまにみるインスンタス共通化方法(A)。一度だけ作成してインスンタス変数に保持。
  3. たまにみるインスンタス共通化方法(B)。テスト始める前にインスンタス作成してインスンタス変数に保持。
  4. 今回の想定。思った通り動作しない。それぞれのテストケースでインスタンスが作られてしまう。
  5. 今回の想定。エラー。
  6. 今回の想定。思った通りの動作

上の実行ボタンを押してみてください。特に[4]が意外で、インスタンス変数に代入しようとすると before(:all)で作ったものと、それぞれのテストケースの前で実行されるbeforeとで、違うものを見てしまっているようです。[5]もbefore(:all)とはスコープがことなるようで、一時変数にアクセスした際に怒られています。

[6]を使うと回避できました。インスタンス変数そのものではなく、中身についての変更でごまかしてあります。ということで[6]で目的を達成しました。おそらくバッドマウハウでしょうが…。

11:58 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント ←ここから投稿できます!! | トラックバック (0)
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/950