2022年6月20日月曜日

C++で常微分方程式を解く方法

私はラグランジュ方程式による二重振り子の計算(たぶん)という常微分方程式をPythonのscipyのsolve_ivpやodeintで解いていましたが、もう少し速度がほしいと考えました。

 

そのため、コンパイル型の言語で常微分方程式を解くことができるライブラリを探していました。

 

そこでC++でBoostのOdeintを用いました。

しかしながら、BoostのOdeintではダメでした。

そこで、ODE-Solverを探したところ、「heyoka」に出会いました。


heyoka


 テイラー展開を手法としては用いているようで、一般的に聞く、オイラーやルンゲクッタ法ではないようです。


このライブラリを使うのに個人的には苦労したので、インストールから実際にプログラムを書くまでを記しておこうかと思います。


  1. インストール

    実行環境は以下の通りとなります。
    • Linux:Pop!_OS 22.04LTS(Debian系Ubuntu派生ディストリビューション)
    • gcc:11.2.0
    • Boost:1.74
    • {fmt}:8.1.1
    • LLVM:12~14
    • spdlog:1.9.2
    • TBB:2021.5.0-7

    これらのインストールは
    「apt install libfmt-dev libspdlog-dev libtbb-dev libboost-serialization-dev clang-13 lldb-13 lld-13」
    としておけば、問題ないかと思われます。
    その後、「git clone https://github.com/bluescarni/heyoka.git」 を実行し、githubからリポジトリをクローンしましょう。
    そして、そのリポジトリのディレクトリに移動し、「cmake .」 を実行し、cmakeの準備をしましょう。
    そして、ライブラリとしてインストールするならば、「cmake --build . --target install」と実行しましょう。

  2. プログラムの実行

    適当にプログラムを書きましょう。
    以下は公式にあるサンプルです。(As a simple example, consider the ODE system corresponding to the pendulum)
    single_pendulum.cppと命名。

    #include <iostream>
    
    #include <heyoka/heyoka.hpp>
    
    using namespace heyoka;
    
    int main()
    {
        // Create the symbolic variables x and v.
        auto [x, v] = make_vars("x", "v");
    
        // Create the integrator object
        // in double precision.
        auto ta = taylor_adaptive <double> {// Definition of the ODE system:
                                          // x' = v
                                          // v' = -9.8 * sin(x)
                                          {prime(x) = v, prime(v) = -9.8 * sin(x)},
                                          // Initial conditions
                                          // for x and v.
                                          {0.05, 0.025}};
    
        // Integrate for 10 time units.
        ta.propagate_for(10.);
    
        // Print the state vector.
        std::cout << "x(10) = " << ta.get_state()[0] << '\n';
        std::cout << "v(10) = " << ta.get_state()[1] << '\n';
    }
      

    これを
    g++ simple_pendulum.cpp -o single_pendulum.out -lheyoka
    と実行。
    こうすると実行ファイルが生成されます。
     

    まとめ

    今日触ってみた限りでは、あまり高速だとは感じませんでしたし、Pythonとくらべても0.07sしか差がありませんでした。
    しかしながら、バッチ化やもっと正しい時間の進め方があるようなので、もっと高速になるかと思います。
    また、Boostのライブラリでは得られなかった正しい解を得ることができたので、満足です。

2022年6月5日日曜日

VS Code上のjupyter notebookでmatplotlibのアニメーションを再生する方法(How to play matplotlib's animation with jupyter notebook on VS Code)

こんにちは、WhiteTiger-21です。

タイトル通りの答えは(The answer of title is below)

from IPython.display import HTML
from matplotlib import animation, rc
from matplotlib import pyplot as plt

"""
animへアニメーション処理を行う
"""

HTML(anim.to_jshtml())

です。

細かい話を順に追って

matplotlibでアニメーションを表示する際に、普通は


from matplotlib import animation, rc
from matplotlib import pyplot as plt

def init():
	"""
    アニメーションの処理
    """

def animate(i):
	"""
    アニメーションの処理
    """

"""
ゴニョゴニョしたなにか
"""

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=Nt, interval=1000*(t[2]-t[1])*0.8, blit=True)

plt.show()


という感じで書きますよね。

ただ、jupyter notebookでは

 

from IPython.display import HTML
from matplotlib import animation, rc
from matplotlib import pyplot as plt

def init():
	"""
    アニメーションの処理
    """

def animate(i):
	"""
    アニメーションの処理
    """

"""
ゴニョゴニョしたなにか
"""

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=Nt, interval=1000*(t[2]-t[1])*0.8, blit=True)
HTML(anim.to_html5_video())

という感じで書きますよね。

 これでは画面に真っ黒なプレイヤーの画像が出るだけで再生されません。

これの原因は、VS Codeではビデオコーデックが入っていないからだそうです。

Cannot playback video clip in Jupyter within VSCode #7753 

その参照で、別のシステム(plotly)を使うことをおすすめされていますが、matplotlibで構築したシステムならば、こちらを使うほうが楽ですよね。

 

というわけで、

HTML(anim.to_jshtml())

を使うことがVS Code上でjupyter notebookを動かし、アニメーションを再生する方法として楽なものだと思います。

2022年1月22日土曜日

ZFSで沼にはまって、データ移行の際にデータをロスト仕掛けた話

こんにちは、白虎21です。

皆さんは ファイルサーバを立てているでしょうか?

ご自身の手でファイルサーバを建てるなら、OSの候補に上がるのがLinuxかBSDだと思います。

その中で私はdebianを選択しました。


1.ファイルシステムとRAIDシステムの選定

それではファイルシステム(FS)は何が良いでしょうか?

Linuxだとext2,3,4やXFS,BtrFS,etc...たくさんあります。

ファイルサーバとなるとRAID組みたくなりますよね?

ただ、RAIDと聞くと、私の中では、構築が難しそうだったり、復旧が難しそうだったりと思う点がありました。そして、システムに一貫性がないと感じました。

細かいRAIDの話はArchLinuxのwikiに任せるのが一番だと思いますので、おいておきます→RAID - ArchWiki


上の憂慮した点を解消してくれるのがBtrFSとZFSでした。

私がファイルサーバを構築した際にBtrFSは当時事情があり、

「ZFSはライセンスが扱いにくいが、個人が使う分には大きく気にしなくてもよいだろう、それよりもBtrFSの技術的に問題がある方が問題である」と感じ、ZFSを選定しました。

 

2.ZFSのメリット

ZFSは簡単にストレージ(?)を作れます。

ZFSではストレージプールといいます。

これは作るのが非常に簡単です。

例えばHDD1,HDD2をつないだとします。

そうすると、

sudo zpool create tank HDD1 HDD2

でRAID 0のプールが作成されます。

もしも、RAID 1で作成したいのであれば、

sudo zpool create tank mirror HDD1 HDD2

でRAID 1のプールが作成されます。

ただ、要注意すべき点として、 HDD1やHDD2の表記に/dev/sdaなどのSATA指した順で変わるような指定の仕方はマウントの失敗などを招くため推奨されません。

/dev/disk/by-id/ata-*などのデバイスIDでの指定をおすすめします。

その他知りたい情報があれば、ArchLinuxのwikiに任せるのが一番だと思いますので、おいておきます→ZFS -ArchWiki

 

また、snapshotを取ることができます。

その他のメリットとして、Oracleと富士通の資料が充実しています。普通に扱う分には困らないでしょう()→ OracleのZFSの資料

 

3.ZFSの落とし穴

ZFSをLinuxで使うにはzfs-fuseとzfsutils-linuxがあります。

ubuntuなどで後者を使いましょう。

zfs-fuseで書かれている資料を私は見た記憶がありません。

debianは安定性を重視するので、後述するOpenIndianaやubuntuにバージョンで遅れを取っています。

特にzfs-fuseは0.70と大きく遅れを取っています。

zfsutils-linuxはdebianでも最低限2.0になっています。

システム的に今後はzfsutils-linuxしか更新されないと思うので、こちらを今後は使うようにしましょう。

 

4.ZFSでのデータ移行の失敗

私は安直に既存のプールに新しいHDDをmirrorでattachしました。

これはRAID0に当たります。

私の環境下では、つけたものは外せません。

その次に、ゴニョゴニョいじって、新しいHDDだけにして、zpoolをcreateして、古いプールからimportしました。

もとのプールにはアクセスできなくなりました。古いHDDには前のzpoolの情報が残っています。

 

mirror -

    4TBのやつ

    4TBのやつ

mirror - 

    8TBのやつ

    8TBのやつ


という情報が。

このプールの状況が

mirror -     UNAVAIL

    4TBのやつ    ONLINE

    4TBのやつ    UNAVAIL

mirror -     UNAVAIL

    8TBのやつ    UNAVAIL

    8TBのやつ    UNAVAIL


でした。

debianの環境では詰みました。

高っかいリカバリソフトは諦めました。


5.どのように復旧したか

極論、ググりました。

このサイトを参考にしました→ Turbocharging ZFS Data Recovery

ググった結果、ZFSの大元であるOracleのSolarisのOSS版のOpenSolarisの後継のOpenIndianaを用いて、最新のZFSが使える環境にして、ZFSが読み込めるか確かめました。

以下のコマンドはubuntuでは不可能でした、OpenIndianaを用いました。

zdb -dep /files -G datapool

→このコマンドで最後が「LOADED」になればOKです。

zpool import -f -d /files -o readonly=on datapool

→このコマンドで読み取りのみが可能になります。

 

 6.ZFSの移行方法

私が次、HDDの増設に失敗しないためのメモです。

ドキュメントから生成されているので必ずしも成功するとは限りません。

バックアップは取っておきましょう。

今回はnewHDD1とnewHDD2のRAID1へ移行します。

まず、新しいプールを作成します。

zpool create New_Pool mirror newHDD1 newHDD2

その後、そのプールにsend&receiveします。

zfs send Old_Pool|zfs recv New_Pool

その後、古いプールをepoxrtし、新しいものを好きな名前に変えます。

zpool export Old_Pool

zfs rename New_Pool What_You_Like_Name_Pool

 

7.その他参考資料

https://chibiegg.gitbooks.io/how-to-zfs/content/

https://ostanin.org/2013/06/14/importing-a-freebsd-zfs-pool-in-illumos/ 

2021年8月22日日曜日

ZIPで圧縮した画像をZIPで圧縮したまま、画像のリサイズするスクリプトを書きました

みなさん、お久しぶりです。白虎21です。

皆さんは「P1×1v Faиb0×」や「Faиt1a」、「Patre0и」などをご活用されていますでしょうか?

絵師さんをサポートしている場合、画像を見返りとして受け取ることが多いかと思います。

その場合、 画像をZIPで圧縮されたデータとして受け取ることがあるかと思います。

その圧縮されたデータをスマホで見ることがあるかと思いますが、画像サイズが大きくて読み込みに時間がかかったりすることがあるのではないかと思います。

そもそもにスマホでは画素数が多すぎても意味がないと思うところがあります。

そのため、ZIPで圧縮された画像を新たなファイルなどを生成することなく、画像のリサイズを行うことができるスクリプトを書きました。

https://github.com/WhiteTiger-21/python_resize_zip_images

このサイトの「zip.py」が上記の内容が可能なスクリプトです。

他のファイルは開発段階の副産物です。

 

利用方法は該当のZipファイルが存在するところでPowerShellやターミナルを開いて、pythonを実行できる状態にしてください。

そして、次のようなコマンドを入力します。

python zip.py 「任意のファイル」

 

具体例として、「Sample.zip」のイメージをリサイズしたい場合は、次のようになります。

python zip.py Sample.zip


ただし、このスクリプトが利用するにはいくつかの条件があります。

  1. 第一に実行環境である「python」と開発するにあたって使用したパッケージファイルが入っていること。
    pythonが入っていなければ、pythonをインストールする必要がありますが、ただ単にこのスクリプトをダウンロードして、実行したいだけであれば、マイクロソフトの「ストア」アプリから「python」をダウンロードしてください。
    マイクロソフトストアのPythonのダウンロードサイト

  2. MITライセンスに同意する。
    端的に言うと何が起こっても一切の責任を負いません。
    必ずバックアップを取ってください。
    そもそもスマホ向けに画像を圧縮するようなツールなので、劣化なしの元のデータをしっかり取っておいてください。

  3. gifファイルが含まれていないこと。
    gifファイルは連番によりアニメーションのようになっているものがあります。
    それに対する対処を行っていないためです。

  4. ディレクトリが入れ子構造になっていないこと
    具体的には以下のようなディレクトリ構造となっていることが好ましいです。
        
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    `-- 09.png
     
    入れ子であったとしても、二分木などではなく、完全なる入れ子、マトリョーシカ状態になっていれば、一番階層の深いところから、一番上に来るだけです。

    具体例として問題のない例は、以下のように、完全なマトリョーシカ状態。

    他、二分木の状態になっていても、ファイル名が異なる状態。
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    |-- 09.png
    `-- Inside01
        |-- INSIDE_01.png
        |-- INSIDE_02.png
        |-- INSIDE_03.png
        |-- INSIDE_04.png
        |-- INSIDE_05.png
        |-- INSIDE_06.png
        |-- INSIDE_07.png
        |-- INSIDE_08.png
        `-- INSIDE_09.png
     
    上記の2つ所状態に値するものは問題ありません。
    しかし、以下のように、二分木状態であり、なおかつ、ファイル名が同じ場合、ファイルの上書きがされ、Inside03の中身のみが残ります。
        
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    |-- 09.png
    |-- Inside01
    |   |-- 01.png
    |   |-- 02.png
    |   |-- 03.png
    |   |-- 04.png
    |   |-- 05.png
    |   |-- 06.png
    |   |-- 07.png
    |   |-- 08.png
    |   `-- 09.png
    |-- Inside02
    |   |-- 01.png
    |   |-- 02.png
    |   |-- 03.png
    |   |-- 04.png
    |   |-- 05.png
    |   |-- 06.png
    |   |-- 07.png
    |   |-- 08.png
    |   `-- 09.png
    `-- Inside03
        |-- 01.png
        |-- 02.png
        |-- 03.png
        |-- 04.png
        |-- 05.png
        |-- 06.png
        |-- 07.png
        |-- 08.png
        `-- 09.png
    
    
  5.  

以上が利用するにあたっての利用条件です。

 

今回の記事は以上となります。

皆さんのお役に立つスクリプトとなれば幸いです。

また、改善点がございましたら、githubのREADME.mdにも記載している通り、Twitterにまでご連絡ください。

2021年2月7日日曜日

Pine64のGPIO系の備忘録

まず、初めにPine64はRasberryPiと同じGPIOピンを持ったシングルボードコンピュータです。 

つまり、RasberryPiの互換品です。 

そのため、次のようなファイルのピンアサインをされています。

pine64ピンアサイン 

 

ピンアサインなどの細かい情報は次のサイトを参考にしました。

PINE64のGPIOでLEDを点灯させる 


私の場合、リレースイッチを使いたかったため以下のような配線とシェルスクリプトを書きました。

 


#!/bin/sh

cd /sys/class/gpio
echo 32 > export
cd gpio32
pwd
sleep 3
echo "out" > direction
echo Wake on Lan.
sleep 0.5
echo "in" > direction


リレーの参考にしたサイトは次のサイトです。

SODIALの送料込み143円の激安リレーユニットをRaspberry Piで利用成功(2016年の物欲その36)

 

2020年1月25日土曜日

Linuxでgoogle chrome remote desktop serviceを利用する備忘録

一言、私自身Linuxとwindowsを用いて開発を行うのですが、VNC入れるのはめんどくさいとかsshとかipをstaticにしてないからめんどいとかでchromeのリモートデスクトップを選びました、一部環境はうまく行かないと思います。

本題 

Compute Engine での Chrome リモート デスクトップのセットアップ

おわり

 

 では、忘れそうなので、詳細。
まず、google chromeをインストール。
地味に、googleのchromeでなければならない。
google以外のchromeってなんなのと言われると、おおよそは元のchromium。
chromiumはaptやsnap、zypperでインストールできるOSSのブラウザ。
以前インストールしたときはブラウザ単体の機能としては動くが、リモートデスクトップは駄目でした。
windowsで昔したときも同じく駄目でした、32bitしかない時代だったからかもしれない。
今は知らない。知りたい方は試してみてください。

google chromeはググれば出る。Google Chrome
しかしながら、全てターミナルから可能であり、Debianで行う際は
wget -c https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb

curl  -O 

https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb
とターミナルに打ち込み、カレントディレクトリにダウンロードする。
apt install ./
chrome-remote-desktop_current_amd64.deb &&
apt update
とchromeのインストールとアップデートを行う。
この際エラーが出たときは権限がないため、aptの前にsudoをつける、rootになるなど権限を与える。
依存関係によるエラーでは
apt install -f
 と入力する、同上に権限が必須。

chromeのインストールが終われば、ほぼおしまいです。
後はこのサイトにアクセスして、手順を進めるだけです。

注意としては.chrome-remote-desktopはあえて作らないほうが良いかもしれません。
また、Debian 10 LXQT環境下では表示のバグが有るため、xfceやcinnamon、mateが好ましいかと思います。

他にも記事が多くありましたが、私の環境下では駄目でした。

2020年1月6日月曜日

OPPO Reno Aを買いました

最近、前の機種で色々もたつくことが多くなって、ROM32GBでは心もとなく、買い替えました。
買い替えたことによる"OPPO Reno A"の良い点悪い点を書いていこうかと思います。
  1. OPPO Reno Aとは

  2. 公式サイト:いろいろと余裕のスマホ 6 GB RAM | 64 GB ストレージ | Snapdragon 710 | OPPO 日本
    スペック:公式サイト詳細
    画像:

    中国の会社であるOPPOが製造しているスマートフォンです。
    指原莉乃さんがCMをし、実際に使っています、そのメーカの機種を()
    性能は上記リンクより確認してください、使い心地などは次の項目で述べます。
  3. 使い勝手について

  4. 一言でいうと「良い」です。
    私自身の使い方が、普通に使う(?一般的にSNSとかブラウザとか動画見る普遍的な事)のに加えて、銀行系のアプリや3Dのゲームをしております。
    銀行系は大手のもので、指紋認証があることにより非常に安心して使えていますが、安全保護が微妙な気持ちにさせます、何しているのかがわからないので。
    ゲームは 「アイドルマスター シンデレラガールズ スターライトステージ」

    「アイドルマスター ミリオンライブ! シアターデイズ」

    「ドールズフロントライン」

    上記3つを普段しています。

    動作に関してなのですが、以前使っていたものよりもサクサク動きます。
    ColorOSはAndroidベースですし、AndroidはLinuxカーネルですし、どこかにswap、ページングしているのかと思いますが、その部分で容量拡大による恩恵とゲーム時にはゲームスペースのブーストがゲームの動作をよりよくするためにやっているのかなぁという印象があります。

    ColorOSの機能かどうかわかりませんが、ノッチと反対方向からスライドして戻るなど行うジャスチャー操作やスクリーンショットのジャスチャー、ゲーム内録画が簡単に行えるのは非常に良い点です。
    以前使っていた機種ではadbで録画していたので微妙だったんですよね。
    ゲームはゲームスペースという機能でゲームの体験をより良くしているように思います。
    ただ、ゲームはLINEではなく、Discordかmastdonなのでそこは変えたいですね。
    有機ELで発色がよく、狭額縁でほぼ画面いっぱいに表示できます。

    この機種はSnapdragon710でRAMが6GBなので、普通にゲームするには十分ではないかなぁと思います。
    動画制作のためにデレステのグランドライブで録画しましたが、特にカクつきなどはなく、ゲームの仕様でロードが変なのかなぁという印象を多少受けるくらいでした。
    5万円以下でイヤホン付き、前面に指紋認証、SDカードが外部ストレージとして使用可能なのはこの機種くらいかなぁと思います。
    ぶっちゃけ性能面でいうとxiaomiやlenovo以外は望めないのではないのかと思ったりしますし、それらは指紋がフロントでなかったり、SDカード非対応だったりします。
    一方で国内販売はHuawei、SHARP、motolora、ASUS以外売ってないに等しいですし、ちょっと性能が下がりますね。
    5万以下でゲーム性能ある程度重視で国内販売ならこれですね。HuaweiはSoCがSnapdragonではなくKirinでゲームに最適化されていないところがあります。
    最適化では
    Apple A>Qualcomm Snapdragon>HiSilicon Krin>MediaTek
    らしいですしね。
  5. Reno Aの惜しい点について

  6. 今までの機種ではどのアプリが、どれくらいデータの使用量があったのかわかっていたのですが、現在のものではわかりません。

    また、イヤホン端子がついているとは言え、ゲーム持ちでガッツリスピーカーが塞がるんですよね。  
     
    今までと比較すると微妙に電池持ちが悪く、充電も遅い気がします。
    これは前の機種がQuickChargeに対応していて早かったからかもしれませんが。
     
    後、一部省電力の影響で挙動がおかしいものもあるんですよね。
     
    ColorOS自体が使い勝手を高める反面、元のAndroidOSの安定性や信用を損ねている部分が少々あります。

まとめ 

ただ、ハードウェアとしては非常によく作られていますし、上記の惜しい点もソフトウェアで改善できる、データ使用量は元のAndroidを参考にすればいいですし、ゲーム中音がこもるというのは、通話スピーカーからも音を出すように設定すればいいですしね。
QCは無理な話ですが、大きな不満ではないですね、1000円か2000円の値上げで対応できるなら次に機種では期待してます。
微妙な話、海外旅行もするのでカメラは現地SIMに変わったらシャッター音はならないようになるとかだと助かりますね、写真がカシャカシャ行っていると正直取りにくい。
昔盗撮した人がいるからそんな事になっているとか言われますが。

5万円以下であれば、国内販売されているものでは非常にコスパが 良いと思います。
10万出せるならばiPhoneが一番ですが、5万円以下でiPhoneはなかなか厳しいですし、画面の綺麗さを考えると微妙なラインになってしまいます。


技適なども自身で色々調べることができて、海外輸入も余裕という話でなければ、
かなりおすすめできるスマートフォンです。

スクリーンショットを掲載したゲームのサイト
アイドルマスター シンデレラガールズ スターライトステージ(デレステ) | バンダイナムコエンターテインメント公式サイト
アイドルマスター ミリオンライブ! シアターデイズ | バンダイナムコエンターテインメント公式サイト