<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">

<channel>
<title>Fenrir&apos;s BLog</title>
<link>http://fenrir.naruoka.org/</link>
<description>fenrir&apos;s Site。</description>
<dc:language>ja</dc:language>
<dc:creator>fenrir.naru@gmail.com</dc:creator>
<dc:date>2026-06-07T00:05:55+09:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=2.661" />
<sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
<image>
  <title>Fenrir's BLog</title> 
  <url>http://fenrir.naruoka.org/images/banner.gif</url> 
  <link>http://fenrir.naruoka.org/</link> 
  <width>88</width> 
  <height>31</height> 
  <description>fenrir's Site。</description> 
</image>

<!--マクロ定義//-->





















<item>
<title>numru/fftw3とnumo/fftwをGithub actionsで使う</title>
<link>http://fenrir.naruoka.org/archives/000982.html</link>
<description>頭の体操を兼ねて、FFT(Fast Fourier Transform)の代表的なアルゴリズムであるCooley-Tukey(素因数分解して高速化)とBluestein(2のべき乗になるようゼロ埋め)をRubyのgemであるgps_pvtのFFT.hとして実装してみました。正しく実装が行われているか比較するためにFFTライブラリとして著名なFFTWとの比較をしようと思い、Rubyのnumru/fftw3(パッケージ名はruby-fftw3)、およびその近代化版であるnumo/fftw(同numo-fftw)と比較をしてみることにしました。Rspec上にてfft_spec.rbでFFT結果の比較をしてみています。 対応するGithub Actions用のCIスクリプトも作りました。テストをパスさせるうえでいくつか嵌った点があるので、ここに書き残しておこうと思います。 まずGithub Actions上でnumru/fftw3とnumo/fftwを標準的なRubyインストールアクションであるruby/setup-ruby@v1にてbundle installさせるために、少々ビルドを外から助けてあげる必要がありました。CIスクリプト上でBUNDLE_BUILD_XXXという環境変数を設定することで、共有ライブラリのパスやファイル名(-l:narray.soとすると標準(=libnarray.so)でないファイル名のライブラリにリンクできる、ldのmanの-lオプションに記載)、コンパイルオプション(narrayは古いのでgcc-15以降でもビルドするには-std=c17が必要)を教えてあげるようにしています。この環境変数はbundle config setでのビルド設定と同様の効果をもたらします。またこの環境変数の命名規則ですが、_(アンダースコア)が2個で.(ドット)に、_が3個で-(ハイフン)になるという仕様があり、ドキュメントに書いてある(Credentials For Gem Sourcesの最後のほう)ものの、気が付くのに時間がかかりました。 次の嵌りポイントはWindows環境におけるFFTWライブラリの調達です。pacmanを使っても良いのですが、最新版を追えてなさそうなのでvcpkgでセルフビルドするようにしました。ビルドを毎回しなくてよいよう、TAServers/vcpkg-cache@v3にてキャッシュも効かせてあります。 最後にWindowsでの嵌りポイントです。numru/fftw3はnarrayパッケージのnarray.soを、numo/fftwはnumo/narrayのnarray.soを参照します。同時に使おうとすると、共有ライブラリ(.so)の内部が違うにもかかわらず、同じ名前(Windowsではパス全体ではなくファイル名しか見てくれない)によりシンボル解決ができず、死にます。gdbで動きをおってみた(こちらのリンクにあるsls(Show Loader Snaps)のビットを立てると十分なログが取れる)ところ、下記のようなエラーがでていました。 warning: 144f4:b6b8 @ -1382925171 - LdrpNameToOrdinal - WARNING: Procedure &quot;na_data_type&quot; could not be located in DLL at base 0x00007FFFD1280000. warning: 144f4:b6b8 @ -1382925156...</description>
<content:encoded><![CDATA[<p>頭の体操を兼ねて、FFT(Fast Fourier Transform)の代表的なアルゴリズムである<a href="https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm">Cooley-Tukey(素因数分解して高速化)</a>と<a href="https://en.wikipedia.org/wiki/Chirp_Z-transform">Bluestein(2のべき乗になるようゼロ埋め)</a>をRubyのgemである<a href="https://github.com/fenrir-naru/gps_pvt/tree/sdr">gps_pvt</a>の<a href="https://github.com/fenrir-naru/gps_pvt/blob/sdr/ext/sdr/algorithm/fft.h">FFT.h</a>として実装してみました。正しく実装が行われているか比較するためにFFTライブラリとして著名な<a href="https://www.fftw.org/">FFTW</a>との比較をしようと思い、Rubyの<a href="https://rubygems.org/gems/ruby-fftw3/versions/1.0.2">numru/fftw3(パッケージ名はruby-fftw3)</a>、およびその近代化版である<a href="https://github.com/ruby-numo/numo-fftw">numo/fftw(同numo-fftw)</a>と比較をしてみることにしました。Rspec上にて<a href="https://github.com/fenrir-naru/gps_pvt/blob/sdr/spec/sdr/fft_spec.rb">fft_spec.rb</a>でFFT結果の比較をしてみています。</p>

<p>対応するGithub Actions用の<a href="https://github.com/fenrir-naru/gps_pvt/blob/sdr/.github/workflows/main.yml">CIスクリプト</a>も作りました。テストをパスさせるうえでいくつか嵌った点があるので、ここに書き残しておこうと思います。</p>

<p>まずGithub Actions上でnumru/fftw3とnumo/fftwを標準的なRubyインストールアクションであるruby/setup-ruby@v1にてbundle installさせるために、少々ビルドを外から助けてあげる必要がありました。<a href="https://github.com/fenrir-naru/gps_pvt/blob/f1256584fc534bf0c93604108e2d8ac28eb0ccbd/.github/workflows/main.yml#L49-L52">CIスクリプト上でBUNDLE_BUILD_XXXという環境変数を設定する</a>ことで、共有ライブラリのパスやファイル名(-l:narray.soとすると標準(=libnarray.so)でないファイル名のライブラリにリンクできる、<a href="https://linux.die.net/man/1/ld">ldのmanの-lオプションに記載</a>)、コンパイルオプション(narrayは古いのでgcc-15以降でもビルドするには-std=c17が必要)を教えてあげるようにしています。この環境変数は<a href="https://bundler.io/man/bundle-config.1.html#BUILD-OPTIONS">bundle config setでのビルド設定</a>と同様の効果をもたらします。またこの環境変数の命名規則ですが、_(アンダースコア)が2個で.(ドット)に、_が3個で-(ハイフン)になるという仕様があり、<a href="https://bundler.io/man/bundle-config.1.html#CREDENTIALS-FOR-GEM-SOURCES">ドキュメントに書いてある(Credentials For Gem Sourcesの最後のほう)</a>ものの、気が付くのに時間がかかりました。</p>

<p>次の嵌りポイントはWindows環境におけるFFTWライブラリの調達です。pacmanを使っても良いのですが、最新版を追えてなさそうなので<a href="https://github.com/fenrir-naru/gps_pvt/blob/f1256584fc534bf0c93604108e2d8ac28eb0ccbd/.github/workflows/main.yml#L39">vcpkg</a>でセルフビルドするようにしました。ビルドを毎回しなくてよいよう、<a herf="https://github.com/fenrir-naru/gps_pvt/blob/f1256584fc534bf0c93604108e2d8ac28eb0ccbd/.github/workflows/main.yml#L25">TAServers/vcpkg-cache@v3にてキャッシュ</a>も効かせてあります。</p>

<p>最後にWindowsでの嵌りポイントです。numru/fftw3は<a href="https://github.com/masa16/narray">narrayパッケージ</a>のnarray.soを、numo/fftwは<a href="https://github.com/ruby-numo/numo-narray">numo/narray</a>のnarray.soを参照します。同時に使おうとすると、共有ライブラリ(.so)の内部が違うにもかかわらず、同じ名前(Windowsではパス全体ではなくファイル名しか見てくれない)によりシンボル解決ができず、死にます。gdbで動きをおってみた(<a href="https://stackoverflow.com/a/62050457">こちらのリンクにあるsls(Show Loader Snaps)のビットを立てると十分なログが取れる</a>)ところ、下記のようなエラーがでていました。</p>

<p><div class="dot-boxed">warning: 144f4:b6b8 @ -1382925171 - LdrpNameToOrdinal - WARNING: Procedure "na_data_type" could not be located in DLL at base 0x00007FFFD1280000.<br />
warning: 144f4:b6b8 @ -1382925156 - LdrpReportError - ERROR: Locating export "na_data_type" for DLL "C:\Tools\Ruby\Ruby34-x64\lib\ruby\gems\3.4.0\bundler\gems\numo-fftw-d89821146b5c\lib\numo\fftw.so" failed with status: 0xc0000139.</div>
</p>

<p>仕方がないので、ライブラリごとにプロセスを分けて比較をします。といってもWindows環境にはforkがないので、<a href="https://github.com/fenrir-naru/gps_pvt/blob/0505a779fff4576a077621b98ead2b54f2b8bbe1/spec/sdr/fft_spec.rb#L109-L128">別プロセスをopen3(内部的にはspawn)で立ち上げて、drbで通信をしてFFTの結果だけ取り出す</a>ことにしました。</p>

<p>技術的に色々細かいこと(特にWindowsの共有ライブラリまわり)を知れたのが良かったです。</p>]]></content:encoded>
<guid isPermaLink="false">982@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2026-06-07T00:05:55+09:00</dc:date>
</item>
<item>
<title>Ruby 3.5のRactorでyield/takeを復活させる</title>
<link>http://fenrir.naruoka.org/archives/000981.html</link>
<description>Ruby 3.5(現時点では3.5-dev)で並列実行機構であるRactorの仕様が大きく変わりました。Ractor::Portという通信経路が定義され、別実行されるRactorの外から中への内向き通信経路がRactor#default_portでとりだせるRactor::Portで管理されるようになりました。従来からあるpush型の通信関数であるRactor#sendとRactor.receiveもdefault_portと紐づけられています。 一方、pull型通信であるRactor.yieldとRactor#take(3.4のドキュメントへのリンク)がなくなってしまいました。いちおうtakeは3.5でも残されているのですが、2025/8に除去します、と警告が表示され、また対になるyieldがないので並列実行途中(終了時ではなく)に出したメッセージを取得してくれません。 調べてみたところ、Ractor::Portの提案には3.5でも動くとされる代替策(Ractor.yield and Ractor#take with channel ractor)が記述されているのですが、これが実装ミスでうまく動きません。主な原因として、Ractorのインスタンス生成がinitializeを呼び出さずnewだけで定義されていることによるものと思われます。 そこでRactor.yieldとRactor#takeを3.5でも動くようにしてみました。newされるときに外向きの通信経路をRactor::Portで新たに追加してあげています。またRactor#monitorで終了を監視するようにしました。 上記で手元ではRuby 3.4までのコードをそのまま使うことができています。...</description>
<content:encoded><![CDATA[<p><a href="https://product.st.inc/entry/2025/06/24/110606">Ruby 3.5(現時点では3.5-dev)で並列実行機構であるRactorの仕様が大きく変わりました</a>。<a href="https://docs.ruby-lang.org/en/master/Ractor/Port.html">Ractor::Port</a>という通信経路が定義され、別実行されるRactorの外から中への内向き通信経路が<a href="https://docs.ruby-lang.org/en/master/Ractor.html#method-i-default_port">Ractor#default_port</a>でとりだせるRactor::Portで管理されるようになりました。従来からあるpush型の通信関数である<a href="https://github.com/ruby/ruby/blob/2a6345e957c01f4495323723c7a3d7ac0d4ac339/ractor.rb#L331">Ractor#send</a>と<a href="https://github.com/ruby/ruby/blob/2a6345e957c01f4495323723c7a3d7ac0d4ac339/ractor.rb#L321">Ractor.receive</a>もdefault_portと紐づけられています。</p>

<p>一方、pull型通信である<a href="https://docs.ruby-lang.org/en/3.4/Ractor.html#method-c-yield">Ractor.yield</a>と<a href="https://docs.ruby-lang.org/en/3.4/Ractor.html#method-i-take">Ractor#take</a>(3.4のドキュメントへのリンク)がなくなってしまいました。いちおうtakeは3.5でも残されているのですが、<a href="https://github.com/ruby/ruby/blob/2a6345e957c01f4495323723c7a3d7ac0d4ac339/ractor.rb#L580">2025/8に除去します、と警告</a>が表示され、また対になるyieldがないので並列実行途中(終了時ではなく)に出したメッセージを取得してくれません。</p>

<p>調べてみたところ、Ractor::Portの提案には3.5でも動くとされる<a href="https://bugs.ruby-lang.org/issues/21262#Ractoryield-and-Ractortake-with-channel-ractor">代替策(Ractor.yield and Ractor#take with channel ractor)</a>が記述されているのですが、これが実装ミスでうまく動きません。主な原因として、Ractorのインスタンス生成がinitializeを呼び出さず<a href="https://github.com/ruby/ruby/blob/2a6345e957c01f4495323723c7a3d7ac0d4ac339/ractor.rb#L231">newだけで定義されている</a>ことによるものと思われます。</p>

<p>そこでRactor.yieldとRactor#takeを3.5でも動くようにしてみました。newされるときに外向きの通信経路をRactor::Portで新たに追加してあげています。また<a href="https://docs.ruby-lang.org/en/master/Ractor.html#method-i-monitor">Ractor#monitor</a>で終了を監視するようにしました。</p>

<script src="https://gist.github.com/fenrir-naru/91d4224c14698df4ff527477f34ada93.js"></script>

<p>上記で手元ではRuby 3.4までのコードをそのまま使うことができています。</p>]]></content:encoded>
<guid isPermaLink="false">981@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2025-08-11T08:56:09+09:00</dc:date>
</item>
<item>
<title>RubyでRactor::Selectorを使う(C APIをRubyから呼び出す)</title>
<link>http://fenrir.naruoka.org/archives/000980.html</link>
<description>Rubyで並列処理をするにあたってRuby3から導入されたRactor(日本語のドキュメントが見つからなかったので英語版で…)を使ってみています。まだ試験的導入(Ractor入りのスクリプトを実行すると warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues.とでる)であるため、日々改良が重ねられているようですが、つーすを読んでみると隠し機能があることがわかりました。 Ractor間の通信があったことを補足するRactor::select(*ractors)という関数があるのですが、複数のRactorのメッセージを全て完了するのに、一つずつ減らしながらselectを何度も呼び出すのはオーバーヘッドが大きそうだということに気が付きました。内部的にはRuby 3.3, 3.4ではRactor::Selectorというクラスのインスタンスを生成して、そこにractorsを登録するような仕組みになっていますので、selectを呼ぶためにRactor::Selectorを作ります。もしRactor::Selectorが再利用できれば、オーバーヘッドを少しでも減らせそうです。 しかし残念ながらRactor::Selectorを直接RubyからいじるにはRubyをビルドする時にUSE_RACTOR_SELECTORをdefineする必要がありました。一方よく見てみると、rb_init_ractor_selector()というRactor::SelectorをRubyから見えるようにする関数も公開されていることがわかりました(Ruby 3.4では2567行目付近、3.3も同様の定義です)。 Rubyをビルドしなおすのも少々面倒なので、ここからはサブタイトルになっているRubyのC API(今回でいうとrb_init_ractor_selector)を呼び出すことを考えます。C関数を呼び出せるFFIまたはFiddleを使うことにしました。下記のコードで達成できます。Using Ruby&apos;s C API inside Rubyが参考になりました。 最後にもともとのRactor::selectの効率化ですがRactor::Selector#wait, #removeなどが定義されていますので、これを使って実現しました。...</description>
<content:encoded><![CDATA[<p>Rubyで並列処理をするにあたってRuby3から導入された<a href="https://docs.ruby-lang.org/en/3.4/Ractor.html">Ractor(日本語のドキュメントが見つからなかったので英語版で…)</a>を使ってみています。まだ試験的導入(Ractor入りのスクリプトを実行すると warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues.とでる)であるため、日々改良が重ねられているようですが、つーすを読んでみると隠し機能があることがわかりました。</p>

<p>Ractor間の通信があったことを補足するRactor::select(*ractors)という関数があるのですが、複数のRactorのメッセージを全て完了するのに、一つずつ減らしながらselectを何度も呼び出すのはオーバーヘッドが大きそうだということに気が付きました。内部的にはRuby <a href="https://github.com/ruby/ruby/blob/7fb19cf8035cb3e4209c93c70a224382e4c8ee6f/ractor.c#L1799-L1821">3.3</a>, <a href="https://github.com/ruby/ruby/blob/1e3d24a0f47e142270bfb6073feb77f6364af052/ractor.c#L1843-L1865">3.4</a>ではRactor::Selectorというクラスのインスタンスを生成して、そこにractorsを登録するような仕組みになっていますので、selectを呼ぶためにRactor::Selectorを作ります。もしRactor::Selectorが再利用できれば、オーバーヘッドを少しでも減らせそうです。</p>

<p>しかし残念ながらRactor::Selectorを直接RubyからいじるにはRubyをビルドする時にUSE_RACTOR_SELECTORをdefineする必要がありました。一方よく見てみると、rb_init_ractor_selector()というRactor::SelectorをRubyから見えるようにする関数も公開されていることがわかりました(<a href="https://github.com/ruby/ruby/blob/1e3d24a0f47e142270bfb6073feb77f6364af052/ractor.c#L2567-L2594">Ruby 3.4では2567行目付近</a>、3.3も同様の定義です)。</p>

<p>Rubyをビルドしなおすのも少々面倒なので、ここからはサブタイトルになっているRubyのC API(今回でいうとrb_init_ractor_selector)を呼び出すことを考えます。C関数を呼び出せるFFIまたはFiddleを使うことにしました。下記のコードで達成できます。<a href="https://www.leemeichin.com/posts/using-ruby-c-in-ruby.html">Using Ruby's C API inside Ruby</a>が参考になりました。</p>

<script src="https://gist.github.com/fenrir-naru/22fea70438da83bec92f7468bc5a4a67.js"></script>

<p>最後にもともとのRactor::selectの効率化ですがRactor::Selector<a href="https://github.com/ruby/ruby/blob/1e3d24a0f47e142270bfb6073feb77f6364af052/ractor.c#L1814">#wait</a>, <a href="https://github.com/ruby/ruby/blob/1e3d24a0f47e142270bfb6073feb77f6364af052/ractor.c#L1544">#remove</a>などが定義されていますので、これを使って実現しました。</p>]]></content:encoded>
<guid isPermaLink="false">980@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2025-07-14T00:33:08+09:00</dc:date>
</item>
<item>
<title>HDL-AAX2 シャットダウンスクリプト</title>
<link>http://fenrir.naruoka.org/archives/000979.html</link>
<description><![CDATA[自宅NASのIO-DATA HDL-AAX2ですが、リモートでシャットダウンする必要があり、方法を検討しました。少し古い機種のHDL2-Aのシャットダウンスクリプトが見つかったのですが、それをそのまま適用することはできなかったので、少し改造して使うことにしました。 出来上がったのが以下のRubyスクリプトです。 mechanizeというwebの自動巡回を可能とするgem(クローラ)を使うことで実現しています。少し古いRuby(&lt; 2.6.0)でも簡潔に書けるよう、Kernel#thenがない場合に備えて自己定義しています(古いRubyに最新の機能を入れ込むbackports gemのKernel#yield_selfのコードを参考にしました)。...]]></description>
<content:encoded><![CDATA[<p>自宅NASの<a href="https://www.iodata.jp/product/nas/personal/hdl-aax/">IO-DATA HDL-AAX2</a>ですが、リモートでシャットダウンする必要があり、方法を検討しました。少し古い機種の<a href="https://blog.akirayou.net/2013/06/lan-disk-hdl2-a.html">HDL2-Aのシャットダウンスクリプト</a>が見つかったのですが、それをそのまま適用することはできなかったので、少し改造して使うことにしました。</p>

<p>出来上がったのが以下のRubyスクリプトです。</p>

<script src="https://gist.github.com/fenrir-naru/86d60962e7b4e6463cf82f7e9dacf14f.js"></script>

<p><a href="https://rubygems.org/gems/mechanize">mechanize</a>というwebの自動巡回を可能とするgem(クローラ)を使うことで実現しています。少し古いRuby(&lt; 2.6.0)でも簡潔に書けるよう、Kernel#thenがない場合に備えて自己定義しています(古いRubyに最新の機能を入れ込む<a href="https://rubygems.org/gems/backports">backports gem</a>の<a href="https://github.com/marcandre/backports/blob/master/lib/backports/2.5.0/kernel/yield_self.rb">Kernel#yield_selfのコード</a>を参考にしました)。</p>]]></content:encoded>
<guid isPermaLink="false">979@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2024-07-24T00:12:05+09:00</dc:date>
</item>
<item>
<title>曜日を求める(8bit範囲で)</title>
<link>http://fenrir.naruoka.org/archives/000978.html</link>
<description><![CDATA[マイコンを使って年月日から曜日を求めたいケースがありました。普通の環境ならC言語を前提とすれば&lt;time.h&gt;にあるmktime関数とlocaltime関数を使うことで実現できます。 裏では曜日を求めるアルゴリズム(色々あります)のどれかを使って求めていると思います。 今回は対象がマイコンということもあり、機能を限定することでコンパクトなアルゴリズムに改変してみました。 sakamoto's methodを元にしました。日時範囲はGPS時刻を前提とすることで1980年以降とし、また2099年まで使えればよい割り切りをしています。すると、うるう年の計算が100で割り切れて400で割り切れない年を考慮する必要がなくなり、簡略化されました。また型を最小のunsigned charで統一してみました。 検証はRubyのRspecでやってみています。 上記CコードとRubyでのDate#wdayとの一致を見ています。なおテストの実装にあたっては、RubyInlineを使ってRubyの中でC言語コードを直接扱ってみました。...]]></description>
<content:encoded><![CDATA[<p>マイコンを使って年月日から曜日を求めたいケースがありました。普通の環境ならC言語を前提とすれば&lt;time.h&gt;にあるmktime関数とlocaltime関数を使うことで実現できます。<br />
<script src="https://gist.github.com/fenrir-naru/d78cd54fe2595deb4bd5e80efbf39881.js?file=dow_time_h.c"></script><br />
裏では<a href="https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#Mathematical_algorithms">曜日を求めるアルゴリズム(色々あります)</a>のどれかを使って求めていると思います。</p>

<p><br />
今回は対象がマイコンということもあり、機能を限定することでコンパクトなアルゴリズムに改変してみました。<br />
<script src="https://gist.github.com/fenrir-naru/d78cd54fe2595deb4bd5e80efbf39881.js?file=dow_u8.c"></script><br />
<a href="https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#Sakamoto's_methods">sakamoto's method</a>を元にしました。日時範囲はGPS時刻を前提とすることで1980年以降とし、また2099年まで使えればよい割り切りをしています。すると、うるう年の計算が100で割り切れて400で割り切れない年を考慮する必要がなくなり、簡略化されました。また型を最小のunsigned charで統一してみました。</p>

<p><br />
検証はRubyのRspecでやってみています。<br />
<script src="https://gist.github.com/fenrir-naru/d78cd54fe2595deb4bd5e80efbf39881.js?file=dow_spec.rb"></script><br />
上記CコードとRubyでの<a href="https://docs.ruby-lang.org/ja/latest/class/Date.html#I_WDAY">Date#wday</a>との一致を見ています。なおテストの実装にあたっては、<a href="https://rubygems.org/gems/RubyInline">RubyInline</a>を使ってRubyの中でC言語コードを直接扱ってみました。</p>]]></content:encoded>
<guid isPermaLink="false">978@http://fenrir.naruoka.org/</guid>
<dc:subject>Embedded System</dc:subject>
<dc:date>2024-07-04T11:40:56+09:00</dc:date>
</item>
<item>
<title>Assisted GPS (A-GPS)クライアントの実装</title>
<link>http://fenrir.naruoka.org/archives/000977.html</link>
<description>GPS関係の処理をRubyから使えるようにしたgps_pvt gemは色々なストリームやファイル、シリアルポート(GPSデバイス直結)から情報を読み込めるようにしてあります。このたびv0.10で初期測位を早めるためのAssisted GPS (A-GPS)に対応しました。単独測位をするのであればgemをインストール後に以下のコマンドで例えばAndroidなどて使われているGoogleのサーバから情報を取得してA-GPSを利用できます。 $ gps_pvt supl://supl.google.com/ (Ntrip等のリアルタイムストリームを指定) 生データに近い物が見たければ、以下のコマンドでJSON形式でエフェメリス等が得られます。 $ gps_get supl://supl.google.com/ エフェメリス(軌道情報)を読み込む程度なので実装は簡単かなと思って始めたのですが、結果的に色々調べる必要がありました。羅列ですが、調べたものを残しておこうと思います。 SUPLSecure user plane location。A-GPSの事実上の標準実装(という理解)。プロトコル名としてはUserPlane Location Protocol(ULP)。表面を覆っているのがULPで、中身のペイロードにはLPPやRRLPといった別のプロトコルが使われる。実装例が少ない中、tajuma/suplやgoogle/supl-clientが参考になった。LPP (TS 37.355)LTE Positioning Protocol。エフェメリスなどの定義がある。GPS以外の定義もしっかりされている。RRLP (TS 44.031) Radio Resource Location service Protocol。LPP同様エフェメリスなどの定義があるが古めの規格。プロトコルとしてはGPS以外も使えそうに見えるが、GoogleのSUPLサーバに問い合わせてもGPSのエフェメリスしかくれない模様。ASN.1 (X.680)Abstract Syntax Notation One。ULP, LPP, RRLPなどの文法は全てこれで書かれている。Rubyにも主にSSL証明書をパースする目的でOpenSSL::ASN1の実装があるが、機能が限定的で今回は使わなかった。代わりにRubyの構文解析ツールであるRaccを使う前提で文法asn1.yを定義し、asn.1形式の文法ファイルをパースできるようにした。asn.1をasn1.y(から作ったRubyコード)で事前にJSONに変換(upl.json.gz)して本番では利用している(rake upl.json)。Samayou Oharikuiの和文解説やGusztáv ADAMISさん(ERICSSON)のスライド(PDF)がとても参考になった。OSS NokalvaやObjective...</description>
<content:encoded><![CDATA[<p>GPS関係の処理をRubyから使えるようにした<a href="https://github.com/fenrir-naru/gps_pvt">gps_pvt gem</a>は色々なストリームやファイル、シリアルポート(GPSデバイス直結)から情報を読み込めるようにしてあります。このたびv0.10で初期測位を早めるための<strong>Assisted GPS (A-GPS)</strong>に対応しました。単独測位をするのであればgemをインストール後に以下のコマンドで例えばAndroidなどて使われているGoogleのサーバから情報を取得してA-GPSを利用できます。</p>

<p><div class="code">$ gps_pvt supl://supl.google.com/ (Ntrip等のリアルタイムストリームを指定)</div>
</p>

<p>生データに近い物が見たければ、以下のコマンドでJSON形式でエフェメリス等が得られます。</p>

<p><div class="code">$ gps_get supl://supl.google.com/</div>
</p>

<p>エフェメリス(軌道情報)を読み込む程度なので実装は簡単かなと思って始めたのですが、結果的に色々調べる必要がありました。羅列ですが、調べたものを残しておこうと思います。</p>

<p><dl><dt><a href="https://www.openmobilealliance.org/release/SUPL/">SUPL</a></dt><dd>Secure user plane location。A-GPSの事実上の標準実装(という理解)。プロトコル名としてはUserPlane Location Protocol(ULP)。表面を覆っているのがULPで、中身のペイロードにはLPPやRRLPといった別のプロトコルが使われる。実装例が少ない中、<a href="https://github.com/tajuma/supl">tajuma/supl</a>や<a href="https://github.com/google/supl-client">google/supl-client</a>が参考になった。</dd><dt><a href="https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=3710">LPP (TS 37.355)</a></dt><dd>LTE Positioning Protocol。エフェメリスなどの定義がある。GPS以外の定義もしっかりされている。</dd><dt><a href="https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=2688">RRLP (TS 44.031)</a></dt><dd> Radio Resource Location service Protocol。LPP同様エフェメリスなどの定義があるが古めの規格。プロトコルとしてはGPS以外も使えそうに見えるが、GoogleのSUPLサーバに問い合わせてもGPSのエフェメリスしかくれない模様。</dd><dt><a href="https://www.itu.int/rec/T-REC-X.680">ASN.1 (X.680)</a></dt><dd>Abstract Syntax Notation One。ULP, LPP, RRLPなどの文法は全てこれで書かれている。Rubyにも主にSSL証明書をパースする目的で<a href="https://docs.ruby-lang.org/ja/latest/class/OpenSSL=3a=3aASN1.html">OpenSSL::ASN1</a>の実装があるが、機能が限定的で今回は使わなかった。代わりにRubyの構文解析ツールである<a href="https://github.com/ruby/racc">Racc</a>を使う前提で文法<a href="https://github.com/fenrir-naru/gps_pvt/blob/master/lib/gps_pvt/asn1/asn1.y">asn1.y</a>を定義し、asn.1形式の文法ファイルをパースできるようにした。asn.1をasn1.y(から作ったRubyコード)で事前にJSONに変換(<a href="https://github.com/fenrir-naru/gps_pvt/blob/master/lib/gps_pvt/upl/upl.json.gz">upl.json.gz</a>)して本番では<a href="https://github.com/fenrir-naru/gps_pvt/blob/v0.10.2/lib/gps_pvt/upl/upl.rb#L10">利用</a>している(<a href="https://github.com/fenrir-naru/gps_pvt/blob/v0.10.2/Rakefile#L110">rake upl.json</a>)。<a href="https://www5d.biglobe.ne.jp/~stssk/asn1/index.html">Samayou Oharikuiの和文解説</a>や<a href="https://www.tmit.bme.hu/sites/default/files/ASN1_coding_AG_2015.pdf">Gusztáv ADAMISさん(ERICSSON)のスライド(PDF)</a>がとても参考になった。<a href="https://www.oss.com/asn1/resources/asn1-made-simple/introduction.html">OSS Nokalva</a>や<a href="https://obj-sys.com/asn1tutorial/node1.html">Objective Systems</a>も参考にした。</dd><dt><a href="https://www.itu.int/rec/T-REC-X.691">PER (X.691)</a></dt><dd>Packed Encoding Rules。SUPLではバイナリで情報がやり取りされるが、その時のエンコーディングルールにBasic Unaligned PERが指定されている。前述の参考資料にも解説あり。<a href="https://github.com/fenrir-naru/gps_pvt/blob/master/spec/gps_pvt/asn1/per_spec.rb">RSpecで(asn.1から変換した)JSONとPER間のテスト</a>を書いて検証した。</dd></dl></p>

<p>最後におまけとなりますが、SUPLサーバに対しては携帯のようにIMEIを渡すわけではなく、問い合わせホストの<a href="https://github.com/fenrir-naru/gps_pvt/blob/v0.10.2/lib/gps_pvt/supl.rb#L81">Global IP</a>を渡すようにしてみています。</p>]]></content:encoded>
<guid isPermaLink="false">977@http://fenrir.naruoka.org/</guid>
<dc:subject><![CDATA[Aero &amp; Astro]]></dc:subject>
<dc:date>2024-04-02T22:39:12+09:00</dc:date>
</item>
<item>
<title>HDL-AAX2の修理</title>
<link>http://fenrir.naruoka.org/archives/000976.html</link>
<description>自宅NASのIO-DATA HDL-AAX2から少し異音がしていたので確認してみたところ、ファンから異音が出ていました。そこで修理をしてみることにしました。 元々ついていたファンはSunonのHA40101V4-1Q01C-F99というファンでした。残念ながら全く同じ型番のファンを見つけることができませんでしたが、DC12Vで40mm角の10mm厚、回転パルス出力付きのものであれば交換可能だろうということで、違うものに変えてみました。選んだのはAINEX CFY-40SAです。 ぴったりはまりました。コネクタだけは加工する必要があって、秋月電子や千石電商などで買えるJST XHシリーズの3ピンコネクタ(ハウジング:XHP-3, コンタクト:SXH-001T-P0.6)に付け替えています。...</description>
<content:encoded><![CDATA[<p>自宅NASの<a href="https://www.iodata.jp/product/nas/personal/hdl-aax/">IO-DATA HDL-AAX2</a>から少し異音がしていたので確認してみたところ、ファンから異音が出ていました。そこで修理をしてみることにしました。</p>

<p><a href="http://fenrir.naruoka.org/archives/images/HDL-AAX_fan_before_Sunon.jpg"><img alt="HDL-AAX_fan_before_Sunon.jpg" src="http://fenrir.naruoka.org/archives/images/HDL-AAX_fan_before_Sunon-thumb.jpg" width="512" height="384" border="0" /></a></p>

<p>元々ついていたファンはSunonのHA40101V4-1Q01C-F99というファンでした。残念ながら全く同じ型番のファンを見つけることができませんでしたが、DC12Vで40mm角の10mm厚、回転パルス出力付きのものであれば交換可能だろうということで、違うものに変えてみました。選んだのは<a href="https://www.ainex.jp/products/cfy-40sa/">AINEX CFY-40SA</a>です。</p>

<p><a href="http://fenrir.naruoka.org/archives/images/HDL-AAX_fan_after_AINEX.jpg"><img alt="HDL-AAX_fan_after_AINEX.jpg" src="http://fenrir.naruoka.org/archives/images/HDL-AAX_fan_after_AINEX-thumb.jpg" width="512" height="384" border="0" /></a></p>

<p>ぴったりはまりました。コネクタだけは加工する必要があって、<a href="https://akizukidenshi.com/catalog/g/g112256/">秋月電子</a>や<a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=2AD6-ABMG#">千石電商</a>などで買える<a href="https://www.jst-mfg.com/product/index.php?series=277">JST XHシリーズ</a>の3ピンコネクタ(ハウジング:XHP-3, コンタクト:SXH-001T-P0.6)に付け替えています。</p>]]></content:encoded>
<guid isPermaLink="false">976@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2024-03-17T23:36:29+09:00</dc:date>
</item>
<item>
<title>ExcelでMarkdownの表を編集</title>
<link>http://fenrir.naruoka.org/archives/000975.html</link>
<description>先日boost::math::distributionsのRuby gemを公開しましたが、その時にboostのバージョンによって含まれている分布の違いの一覧表を作りました。Markdownで作ったのですが、編集は元情報のExcelでやって、そこに便利なExcelアドインCopyToMarkdownAddInでMarkdownの表形式にコピペ(エクスポート)をしていました。逆コピペ(Excelにインポート)もできる優れものです。便利なツールがあって助かりました。 またハイパーリンクを付けても機能するようにしたかっので、少し改修して使いました。現在PRしたので、もしかしたらそのうちまーどされるかもしれません。...</description>
<content:encoded><![CDATA[<p><a href="https://fenrir.naruoka.org/archives/000974.html">先日boost::math::distributionsのRuby gemを公開</a>しましたが、その時にboostのバージョンによって含まれている<a href="https://github.com/fenrir-naru/ruby-boost_distributions/blob/HEAD/boost_version_comparison.md">分布の違いの一覧表</a>を作りました。Markdownで作ったのですが、編集は元情報のExcelでやって、そこに便利なExcelアドイン<a href="https://www.nuits.jp/entry/copy-to-markdown-2-1-1-0">CopyToMarkdownAddIn</a>でMarkdownの表形式にコピペ(エクスポート)をしていました。逆コピペ(Excelにインポート)もできる優れものです。便利なツールがあって助かりました。<br />
またハイパーリンクを付けても機能するようにしたかっので、少し改修して使いました。現在<a href="https://github.com/nuitsjp/CopyToMarkdownAddIn/pull/19">PRした</a>ので、もしかしたらそのうちまーどされるかもしれません。</p>]]></content:encoded>
<guid isPermaLink="false">975@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2023-07-03T00:21:17+09:00</dc:date>
</item>
<item>
<title>Rubyで確率分布の性質を求めるgem</title>
<link>http://fenrir.naruoka.org/archives/000974.html</link>
<description>Rubyで確率分布の性質、例えば標準偏差が1、平均が0の正規分布において50%点はどこかというと0、といったことを求められるようにgemを作ってみました。boost_distributionsというgemで、名前が示す通りC++の標準的なライブラリであるboostの1パッケージとして確率分布を扱っているboost::math::distributionsを呼び出せるようにしてみました。 Githubのレポジトリでコードを公開しています。インストール方法(gemの前にboost本体のインストールが必要)や、使い方概要もそちらご参照ください。 実は2020年に書いていたコードがようやくgem化された形になります。gem化するにあたって、一緒にコンパイルするboostのバージョン依存性を吸収するなどの細工(ラッパーC++コードを生成するためのswigインターフェイスファイル BoostDistributions.i参照)をしています。...</description>
<content:encoded><![CDATA[<p>Rubyで確率分布の性質、例えば標準偏差が1、平均が0の正規分布において50%点はどこかというと0、といったことを求められるようにgemを作ってみました。<a href="https://rubygems.org/gems/boost_distributions">boost_distributions</a>というgemで、名前が示す通りC++の標準的なライブラリである<a href="https://www.boost.org/">boost</a>の1パッケージとして確率分布を扱っている<a href="https://www.boost.org/doc/libs/release/libs/math/doc/html/dist.html">boost::math::distributions</a>を呼び出せるようにしてみました。</p>

<p>Githubのレポジトリでコードを公開しています。インストール方法(gemの前にboost本体のインストールが必要)や、使い方概要もそちらご参照ください。</p>

<p><a href="https://github.com/fenrir-naru/ruby-boost_distributions"><img src="https://gh-card.dev/repos/fenrir-naru/ruby-boost_distributions.svg"></a></p>

<p>実は<a href="https://fenrir.naruoka.org/archives/000970.html">2020年に書いていたコード</a>がようやくgem化された形になります。gem化するにあたって、一緒にコンパイルするboostのバージョン依存性を吸収するなどの細工(ラッパーC++コードを生成するための<a href="https://github.com/fenrir-naru/ninja-scan-light/blob/HEAD/tool/swig/BoostDistributions.i">swigインターフェイスファイル BoostDistributions.i</a>参照)をしています。<br />
</p>]]></content:encoded>
<guid isPermaLink="false">974@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2023-06-24T00:25:05+09:00</dc:date>
</item>
<item>
<title>Windowsのcygwin/MSYS2/RでSSL証明書問題の解消</title>
<link>http://fenrir.naruoka.org/archives/000973.html</link>
<description>ネットワークの制限の関係で、中間者傍受を許容する設定での運用になっていたとします。そこでの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 &apos;https://cran.r-project.org/CRAN_mirrors.csv&apos;: status was &apos;SSL connect error&apos; という形でエラーが表示されることが気が付きました。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=&quot;wininet&quot;) 他にもダウンロード手段をcurlとし、オプション-kで証明書を無視する方法もあります。...</description>
<content:encoded><![CDATA[<p>ネットワークの制限の関係で、中間者傍受を許容する設定での運用になっていたとします。そこでのWindowsの設定は、いわゆるオレオレ証明書を<a href="https://knowledge.digicert.com/ja/jp/solution/SO23057.html">『信頼されたルート証明機関』に配置</a>をすることになります。Windowsと親和性が高いアプリでしたら、ほぼそれですべて解決するのですが、残念ながらそうでないものがいくつかありましたので、その解決方法をまとめておきたいと思います。</p>

<p><h3>Cygwin</h3><br />
wgetとかcurlをやっているときにSSLがどうたらというエラーを吐いて死ぬので気が付きます。<a href="https://stackoverflow.com/a/26590440">stack overflowに書いてあるやり方</a>でうまくいきます。</p>

<p><div class="code">$ cp ca.crt /etc/pki/ca-trust/source/anchors/ # オレオレ証明書を配置<br />$ update-ca-trust # 加えたオレオレ証明書の内容を証明書溜り(/etc/pki/ca-trust/extracted/openssl)に追加</div>
</p>

<p>もしupdate-ca-trustがなければ<a href="https://cygwin.com/cgi-bin2/package-grep.cgi?grep=update-ca-trust">ca-certificates</a>を導入しましょう。</p>

<p><h3>MSYS2</h3><br />
pacmanが文句を言ってくるところで気が付きました。解消方法はcygwinと同じです。<a href="https://www.msys2.org/docs/faq/">MSYS2のFAQ</a>にも解説があります。</p>

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

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

<p><div class="code">Sys.setenv(R_LIBCURL_SSL_REVOKE_BEST_EFFORT=TRUE)</div>
</p>

<p>とすれば動作するようになりました。毎回コマンドを打ち込むのは面倒なので、起動時に設定されるよう<a href="https://cran.r-project.org/doc/manuals/R-intro.html#Customizing-the-environment">.Rprofileの.Firstに書いておく</a>とよいと思います。</p>

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

<p><div class="code">options(download.file.method="wininet")</div>
</p>

<p><a href="https://stackoverflow.com/questions/72461239/ssl-certificates-installing-packages-in-r-4-2">他にもダウンロード手段をcurlとし、オプション-kで証明書を無視する方法</a>もあります。</p>]]></content:encoded>
<guid isPermaLink="false">973@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2023-05-23T22:48:28+09:00</dc:date>
</item>
<item>
<title>RubyでGPS姿勢推定</title>
<link>http://fenrir.naruoka.org/archives/000972.html</link>
<description>RubyでのGPS解析環境を充実させるへくgps_pvt gemを作っていますが、そのgemを応用して近接する複数アンテナを使った姿勢推定のプログラムを作ってみました。 Integer Ambiguityを全組み合わせで計算してしまうので、衛星がたくさん見えていると明らかに処理速度が落ちます。その部分を改善していきたいと思います。...</description>
<content:encoded><![CDATA[<p>RubyでのGPS解析環境を充実させるへく<a href="https://github.com/fenrir-naru/gps_pvt">gps_pvt gem</a>を作っていますが、そのgemを応用して近接する複数アンテナを使った姿勢推定のプログラムを作ってみました。</p>

<script src="https://gist.github.com/fenrir-naru/6bf38327d895e433fb6269b787e4c108.js"></script>

<p>Integer Ambiguityを全組み合わせで計算してしまうので、衛星がたくさん見えていると明らかに処理速度が落ちます。その部分を改善していきたいと思います。</p>]]></content:encoded>
<guid isPermaLink="false">972@http://fenrir.naruoka.org/</guid>
<dc:subject><![CDATA[Aero &amp; Astro]]></dc:subject>
<dc:date>2023-03-14T13:55:38+09:00</dc:date>
</item>
<item>
<title>RubyでGPS受信機</title>
<link>http://fenrir.naruoka.org/archives/000971.html</link>
<description>ちょっとすごいロガーのツールの一部を切り出して、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を最後に生成しています。...</description>
<content:encoded><![CDATA[<p><a href="https://github.com/fenrir-naru/ninja-scan-light">ちょっとすごいロガー</a>のツールの一部を切り出して、RubyでGPSの測位処理ができるようにしてみました。githubにコードを公開しています。</p>

<p><a href="https://github.com/fenrir-naru/gps_pvt"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/fenrir-naru/gps_pvt.png" width="460px"></a></p>

<p>Rubyのgemとしているので<br />
<div class="code">gem install gps_pvt</div>
<br />
で入れることができます。native extensionを含むgemなのでインストール中にコンパイルが走ります。Windowsの方はビルド環境(<a href="https://rubyinstaller.org/">Ruby installer for Windows</a>でいうところの<a href="https://rubyinstaller.org/downloads/">with Devkit版</a>でのRuby導入)が必要になります。</p>

<p>gemインストール後は<br />
<div class="code">gps_pvt RINEX_nav RINEX_obs</div>
<br />
とすると、測位結果がずらずらとCSVで出力されます。単独測位、スナップショットでの解なので、実用性はあまりないです。これをベースに何か発展的なことをしたいという人向けのツールです。詳しくは<a href="https://github.com/fenrir-naru/gps_pvt/blob/master/README.md">Readme</a>を見てください。</p>

<p>プログラム的な話をすると、native extensionを作るための<a href="https://github.com/fenrir-naru/gps_pvt/blob/master/ext/gps_pvt/extconf.rb">extconf.rb</a>が凝った作りになっています。shared libraryを複数生成する必要があるので、内部でMakefileを別名で複数生成し、それらを起動するMakefileを最後に生成しています。</p>]]></content:encoded>
<guid isPermaLink="false">971@http://fenrir.naruoka.org/</guid>
<dc:subject><![CDATA[Aero &amp; Astro]]></dc:subject>
<dc:date>2021-12-27T22:20:43+09:00</dc:date>
</item>
<item>
<title>boost::math::distributions</title>
<link>http://fenrir.naruoka.org/archives/000970.html</link>
<description>boost::math::distributions便利ですね。いろいろな確率分布があります。Rubyから使えるようにしたかったので、SWIGでラップしてみました。 Rubyからだと require &quot;BoostDistributions.so&quot; BoostDistributions::Normal::new.quantile(0.5) # =&gt; 0 のように使えます。RubyGemにしたいと思っています。 ※(2023/6/24追記)3年越しでgemになりました。boost_distributionsというgemです。...</description>
<content:encoded><![CDATA[<p><a href="https://www.boost.org/doc/libs/1_67_0/libs/math/doc/html/dist.html">boost::math::distributions</a>便利ですね。いろいろな確率分布があります。Rubyから使えるようにしたかったので、<a href="http://www.swig.org/">SWIG</a>でラップしてみました。</p>

<script src="https://gist.github.com/fenrir-naru/db8867fa7211e0e3e2f53398d1d71dea.js"></script>

<p>Rubyからだと</p>

<p><div class="code">require "BoostDistributions.so"<br />BoostDistributions::Normal::new.quantile(0.5) # => 0</div>
</p>

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

<p>※(2023/6/24追記)<a href="https://fenrir.naruoka.org/archives/000974.html">3年越しでgem</a>になりました。<a href="https://rubygems.org/gems/boost_distributions">boost_distributions</a>というgemです。</p>]]></content:encoded>
<guid isPermaLink="false">970@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2020-09-15T23:20:53+09:00</dc:date>
</item>
<item>
<title>E-MailRelay本体更新(ver 2.0)に伴う対応</title>
<link>http://fenrir.naruoka.org/archives/000969.html</link>
<description>随分昔の話ですが、E-MailRelayというSMTP Proxyを使って、自前のメールアドレスフィルタを作ったことがありました。随分更新をさぼっていて最近最新のものに置き換えてみたついでに、昔のスクリプトを改善してみました。 発端はshebangです。Windowsのバッチファイル(.bat)に他のスクリプト言語を埋めこめるなんて素敵! ということでやってみました。 E-MailRelayで実行するスクリプトには、ちょっとした癖があって、終了コードで動作を変えています。そのため上記参考にした記事のものだけでは不十分で2行目の exit /b &gt;%ERRORLEVEL%&gt; が肝となりました。こうすると、終了コードが正しくE-MailRelay本体に帰っていきます。...</description>
<content:encoded><![CDATA[<p>随分昔の話ですが、<a href="http://emailrelay.sourceforge.net/index.html">E-MailRelay</a>というSMTP Proxyを使って、<a href="https://fenrir.naruoka.org/archives/000950.html">自前のメールアドレスフィルタ</a>を作ったことがありました。随分更新をさぼっていて最近最新のものに置き換えてみたついでに、<a href="https://gist.github.com/fenrir-naru/63f71c5f9b1b7cb1fce4#file-check_address-rb">昔のスクリプト</a>を改善してみました。</p>

<p>発端は<strong>shebang</strong>です。<a href="https://qiita.com/snipsnipsnip/items/50e4ca88e3ce3f8cffda">Windowsのバッチファイル(.bat)に他のスクリプト言語を埋めこめるなんて素敵!</a> ということでやってみました。</p>

<script src="https://gist.github.com/fenrir-naru/63f71c5f9b1b7cb1fce4.js"></script>

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

<p><div class="code">exit /b <strong>%ERRORLEVEL%</strong></div>
</p>

<p>が肝となりました。こうすると、終了コードが正しくE-MailRelay本体に帰っていきます。</p>]]></content:encoded>
<guid isPermaLink="false">969@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2019-05-08T23:51:03+09:00</dc:date>
</item>
<item>
<title>RinRuby (Ruby gem for R)</title>
<link>http://fenrir.naruoka.org/archives/000968.html</link>
<description>プログラミング言語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-CIとAppVeyorでテストしていますが、色々なRubyのバージョン(2.3以降でテストしていますが、1.9以降でも動くと思います)やjRubyでも動いています。Windowsでもテストを通しています。またローカルではRuby on cygwinとWindows Rでも実績があります。 今後ですが、コードが肥大化しているので気が向いたらリファクタリングをするつもりです。その他にも問題等あるようであれば、githubのIssuesに残していただけると嬉しいです。...</description>
<content:encoded><![CDATA[<p>プログラミング言語<a herf="https://www.ruby-lang.org/">Ruby</a>と統計に強い<a href="https://www.r-project.org/">R</a>をブリッジさせるRuby gemの<a herf="https://github.com/clbustos/rinruby">RinRuby</a>というものがあるのですが、ここ数か月でかなり手を入れさせてもらいました。github上でコードが公開されているのでforkをして<a href="https://github.com/clbustos/rinruby/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Afenrir-naru">Pull requests</a>をして、ということをやっていましたが、fork元に取り込まれていない機能もあったりしますので、<a href="https://github.com/fenrir-naru/rinruby">僕のfork</a>もご参照いただければと思います。現在のところfork側にしかない機能は以下のとおりです。</p>

<ul class="block"><li>Complex型のサポート</li><li>多言語サポート(Windowsで文字コードがShift-JIS(MS932)になっていたりしても大丈夫です)</li></ul>

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

<p>もともと自分が使うためにかなり手を入れたのですが、Pure Rubyで動きインストールが簡単ですので、お奨めしてもよいかなと思い、記事を書きました。<a href="https://travis-ci.org/fenrir-naru/rinruby">Travis-CI</a>と<a href="https://ci.appveyor.com/project/fenrir-naru/rinruby/branch/dev-fenrir">AppVeyor</a>でテストしていますが、色々なRubyのバージョン(2.3以降でテストしていますが、1.9以降でも動くと思います)やjRubyでも動いています。Windowsでもテストを通しています。またローカルではRuby on cygwinとWindows Rでも実績があります。</p>

<p>今後ですが、コードが肥大化しているので気が向いたらリファクタリングをするつもりです。その他にも問題等あるようであれば、<a href="https://github.com/fenrir-naru/rinruby/issues">githubのIssues</a>に残していただけると嬉しいです。</p>]]></content:encoded>
<guid isPermaLink="false">968@http://fenrir.naruoka.org/</guid>
<dc:subject>Computer</dc:subject>
<dc:date>2018-11-29T23:28:48+09:00</dc:date>
</item>


</channel>
</rss>