2020年3月14日土曜日

今日はホワイトデーなので (?)、久しぶりにHP Primeのコード

まずは、こちらのtweetを御参照

cf,
https://twitter.com/RR_Inyo/status/1217489174128758784

z' = cos(Z) の繰り返しで、こんなグラフィクスが描けるそうで、HP PRIMEでもやってみましたヨ。
まだ、実機を持っていないので、今回もSIMで作業ですが、以下のコードを御利用下さい。

// title : iter_cos.ppl - iterative complex cosine graph for HP Prime
// begin : 2020-02-16 20:37:33 

//
pixVal(z, c)
BEGIN
  LOCAL  cnt := 0;

  //  この判断式がミソです
  //  Mandelobrot, julia setでは、abs(z)<4 .0="" br="">  //  このグラフィクスのバヤイはこんな風でした
  WHILE (ABS(z) <= 50) AND (cnt < 20) DO
    // modify this form to enjoy
    z := COS(z);
    cnt := cnt+1;
  END;

  //  color value : 0 for black, 16777215 for white
  RETURN RGB(1*cnt/20*255, 0.75*cnt/20*255, 0.25*cnt/20*255);

END;

EXPORT itercos()
BEGIN
  // Clean the screen (G0):RECT();

  LOCAL dx, dy, z, xp, yp; 
  LOCAL xmin, xmax, ymin, ymax;
  LOCAL pixStat;

  //  screen range
  xmin := -10;
  xmax :=  10;
  ymin :=  -5;
  ymax :=   5;

  dx := (xmax-xmin)/320;
  dy := (ymax-ymin)/240;

  // we loop over each pixel
  // Of the HP Ptime screen 
  FOR yp FROM 0 TO 239 DO
    FOR xp FROM 0 TO 319 DO
      z := (xmin+xp*dx, ymax-yp*dy);
      pixStat := pixVal(z, Z0);
      PIXON_P(xp, yp, pixStat);

    END;
  END;

  //  key wait loop
  REPEAT UNTIL GETKEY() == -1;
  FREEZE;

END;



Numworks, mandelbrotのコードを改変したとの事で、単純に式を置き換えたのですが、それだけでは、こうしたグラフィクスにはなりませんでした。
色々といじくり回し、最終的に繰り返しの判断部分をいじる事で、Tweetの様なグラフィクスを得た次第。

最近、HP Prime G2の価格が大分下落してきております。

cf.
https://www.amazon.co.jp/gp/offer-listing/B07HF6RXGG/ref=dp_olp_new?ie=UTF8&condition=new

G1との価格差も狭まってきました。Sentaro様曰く、G2は動作軽快でメモリ増量。ウーム。

一方、G2は、新しいファームがあるそうです。

cf. HP Prime Beta Software
https://www.hpcalc.org/prime/beta/

ハードウェアの違いがあるので、ファームも更新されたらしい。

そういや、こうしたコードを挙げておきながら、HP Prime実機への転送方式、気にした事がありませんでした。どなたか、ご教示ただけると幸いです。やはり、HP Conn-Kitしかないのかなァ ?

15 件のコメント:

Sentaro さんのコメント...

akatuki様、こんにちは!
思いっきり出遅れてしまってすみません!m(_ _)m

>z' = cos(Z) の繰り返しで、こんなグラフィクスが描けるそうで、HP PRIMEでもやってみましたヨ。
>まだ、実機を持っていないので、今回もSIMで作業ですが、以下のコードを御利用下さい。

実機での実行時間は、こんな感じでした。
G1 4m41s
G2 1m43s

CG50のPythonがドットを打てるようになったので、こっちでも試そうと思ったら、複素数の三角関数が未対応でした。(^^;
C.Basic for CGの方では約5分弱というところで、G1並?という感じです。


>最近、HP Prime G2の価格が大分下落してきております。

最初からするとリーズナブルになってきてますが、あと少し、2万以下まで下がってきて欲しいところですね。


>そういや、こうしたコードを挙げておきながら、HP Prime実機への転送方式、気にした事がありませんでした。どなたか、ご教示ただけると幸いです。やはり、HP Conn-Kitしかないのかなァ ?

コネクトキットに接続すると自動でアップデートされるようになってますが、
アップデートファイルから直にアップデートも出来るはずです。(^^)

akatuki さんのコメント...

Sentaro 様、コメント多謝であります !

> 実機での実行時間は、こんな感じでした。
> G1 4m41s
> G2 1m43s

これは有り難く !
G1も、この手のプログラムとしては頑張っているのですけれど、G2、早い ... 。

> CG50のPythonがドットを打てるようになったので、こっちでも試そうと思ったら、複素数の三角関数が未対応でした。(^^;

アレッ、そうだったのですか !
Numworksの様ですが、元々、CG50にはCASIO BASIC、そしてC.Basicがありますネ。

> C.Basic for CGの方では約5分弱というところで、G1並?という感じです。

乾電池で動くCG50は、C.Basicのパワーで十分な速度を実現できるというのは、素晴らしい成果であると思います !

> 最初からするとリーズナブルになってきてますが、あと少し、2万以下まで下がってきて欲しいところですね。

仰る通りであります。
しかし、業者さんも、利益を載っけておるので、これくらいが仕方のない所なのか ... 。

> コネクトキットに接続すると自動でアップデートされるようになってますが、
> アップデートファイルから直にアップデートも出来るはずです。(^^)

simに入れたPPLコードが、ConnKit経由で実機Primeへ転送できる、という具合ですネ。
fx-CG50だと、Mass Storage classデバイスっていうんですか、USB Flashメモリっぽい感じでmount出来るとかで、PCからtext fileを送り込んでやれる。そういう簡単な方法で、PPLコードを実機に送りたい所です。

Sentaro さんのコメント...

akatuki様、皆様、こんにちは!

>これは有り難く !
>G1も、この手のプログラムとしては頑張っているのですけれど、G2、早い ... 。

G1登場時は爆速と言われましたけど、PCのエミュが相対的にさらに爆速なので、
それなりに重いアプリだと、G1でも、さらにはG2でも遅いという感じになってきますね。(^^;


>アレッ、そうだったのですか !
>Numworksの様ですが、元々、CG50にはCASIO BASIC、そしてC.Basicがありますネ。

Pythonで実数演算版に書き換えて実行したところ、約13分弱と若干遅めとなりました。(^^;
ちなみに同じプログラムをC.Basicで実行すると複素数版とさほど差がない結果になりました。

----------------------------------------
from math import *
from casioplot import *

clear_screen()

def itercos():
 xmin = -10
 xmax = 10
 ymin = -5
 ymax = 5
 dx = (xmax-xmin)/384
 dy = (ymax-ymin)/192
 for yp in range(192):
  for xp in range(384):
   s = xmax+(xp*dx)
   t = ymax-(yp*dy)
   cnt = 0
   while (sqrt(s**2+t**2)<= 50 ) and ( cnt < 20 ):
    z = cos(s)*cosh(t)
    t = -sin(s)*sinh(t)
    s = z
    cnt = cnt+1
   rgb = int(cnt*255/20)
   col = (int(rgb),int(rgb*0.75),int(rgb*0.25))
   set_pixel(xp,yp,col)
  show_screen()

itercos()
----------------------------------------
まだPythonの最適化がよくわかってないので、高速化の余地があるかもしれません。


>fx-CG50だと、Mass Storage classデバイスっていうんですか、USB Flashメモリっぽい感じでmount出来るとかで、PCからtext fileを送り込んでやれる。そういう簡単な方法で、PPLコードを実機に送りたい所です。

CASIO機はモノクロのfx-9860GIII/9750GIIIもすべてUSBマスストレージ対応に進化しました。
HP Primeではハッキング対策で自在にコードを送り込めないように制限しているのかもしれませんね。(^^;

akatuki さんのコメント...

Sentaro 様、早々のレスポンス、恐れ入ります !

> G1登場時は爆速と言われましたけど、PCのエミュが相対的にさらに爆速なので、
> それなりに重いアプリだと、G1でも、さらにはG2でも遅いという感じになってきますね。(^^;

そこは、ARMプロセッサになったといっても、32 bitベースでしたネ。
昔のポケコンの事を考えると、かなり早い動作であるには違いありません。

> Pythonで実数演算版に書き換えて実行したところ、約13分弱と若干遅めとなりました。(^^;
> ちなみに同じプログラムをC.Basicで実行すると複素数版とさほど差がない結果になりました。

コレは ! もう、ここまでの機能が盛り込まれて居ったのですね、CASIO micro python !
fx-CG50のスクリーン、HP Prime, NumworksのQVGAよりも大きい (384x192)ので、時間が掛かるのは仕方のないところです。また、BCD演算なので、オーバヘッドはやむを得ないのか (そこがCASIO micro pythonのいいところ)。
それでも、乾電池動作するカラー液晶のデバイスで、ここまでの事が出来るというのは、やはり驚異的だと思うのです。

> CASIO機はモノクロのfx-9860GIII/9750GIIIもすべてUSBマスストレージ対応に進化しました。
> HP Primeではハッキング対策で自在にコードを送り込めないように制限しているのかもしれませんね。(^^;

ウーム、苦しいなァ。
そこにbinaryの余地が ... ? なんてネ。
PPLもpythonも、内部でPコードっぽい仮想バイナリで動いているとか何とか。
十分高速動作なので、binaryはヤリたがらないのか ? TIもunhackableな電卓を出しているそうですから、暫くはこの流れなのかも。

Sentaro さんのコメント...

akatuki様、皆様、こんにちは!

>昔のポケコンの事を考えると、かなり早い動作であるには違いありません。

おっしゃるとおりです。
ポケコンからすれば桁違いの速度なのですが、慣れとは恐ろしいもので、それでもまだまだ遅いとか贅沢なことになってしまってます。(^^;
たまにはポケコンも引っ張り出して、そのまったりとした実行速度を堪能しないとダメですね。


>コレは ! もう、ここまでの機能が盛り込まれて居ったのですね、CASIO micro python !
>fx-CG50のスクリーン、HP Prime, NumworksのQVGAよりも大きい (384x192)ので、時間が掛かるのは仕方のないところです。

320x240=76800
384x192=73728
なので、今回の描画ではQVGAの方が微妙に大きいです。(^^;

実際には
384x216=82944
までは簡単に描画範囲を広げられるのですが、純正Pythonでは384x192までが描画範囲となっているようです。
描画機能といえどもシンプルに点を打つ程度のみですが、CasioBasicに比較すれば動作速度が爆速レベルなので、それなりにあれこれと出来てしまいそうです。


>また、BCD演算なので、オーバヘッドはやむを得ないのか (そこがCASIO micro pythonのいいところ)。

んと、実装されているMicroPython 1.94は普通に2進演算の模様です。(^^;
tan(355/226)では
-7497258.179141784
を返します。
これは、C.Basicでtan(355/226)を実行させた結果と15桁まで一致するので、
ルネサスの浮動小数点ライブラリを使っているのは間違いなさそうです。


>それでも、乾電池動作するカラー液晶のデバイスで、ここまでの事が出来るというのは、やはり驚異的だと思うのです。

TIもHPもカラーになってからは充電池ですが、CASIOだけは乾電池動作を維持しているので貴重ですね。(^^)


>PPLもpythonも、内部でPコードっぽい仮想バイナリで動いているとか何とか。

そのようですね。
メモリがふんだんに使える今どきのスクリプト言語の定石というかセミコンパイルタイプの言語ですね。(^^)


>十分高速動作なので、binaryはヤリたがらないのか ? TIもunhackableな電卓を出しているそうですから、暫くはこの流れなのかも。

TIも従来比2.5倍早いCX2になって強固なハッキング対策されたようですし、
教育現場に売り込む以上はバイナリが簡単に扱えるとNGということなんでしょうね。(^^;

akatuki さんのコメント...

Sentaro 様、コメント有り難く !

> ポケコンからすれば桁違いの速度なのですが、慣れとは恐ろしいもので、それでもまだまだ遅いとか贅沢なことになってしまってます。(^^;
> たまにはポケコンも引っ張り出して、そのまったりとした実行速度を堪能しないとダメですね。

いや、これは。
最近、pythonのお勉強でPCを使う事が多く、電卓の方は疎かになってをり。
当方「古いヤツほど新しいモノを...」というクチなので、エラそうなことは言えません。
仰る通り、昔のプロ電とかに較べれば、処理能力が絶大になっているのですが、それに応じたアプリケーションなりを要求してしまう今日の状況、なかなか難しいものであります。

> 320x240=76800
> 384x192=73728
> なので、今回の描画ではQVGAの方が微妙に大きいです。(^^;

アレッー、やってしまった ... 。
そういや、192ではなくて240でしたネ、QVGA。

> 実際には
> 384x216=82944
> までは簡単に描画範囲を広げられるのですが、純正Pythonでは384x192までが描画範囲となっているようです。
> 描画機能といえどもシンプルに点を打つ程度のみですが、CasioBasicに比較すれば動作速度が爆速レベルなので、それなりにあれこれと出来てしまいそうです。

確か、CASIO BASICではRGB値を指定しての点打ちが出来ない様な ? C.BASICでは独自の拡張があるのだと思うのですが。
RGB値の点打ち、Numworks電卓を意識しているのかなぁ ?

> んと、実装されているMicroPython 1.94は普通に2進演算の模様です。(^^;

ありゃ、そうでしたか !
確か、前のCASIO micro pythonのプログラムの紹介では、0.1を10回加算して、1.0になる、いうネタがあった様に思ったのですが ... 。

> tan(355/226)では
> -7497258.179141784
> を返します。
> これは、C.Basicでtan(355/226)を実行させた結果と15桁まで一致するので、
> ルネサスの浮動小数点ライブラリを使っているのは間違いなさそうです。

確か、pythonもdouble floatで計算しているらしく、この実装はまっとうな所なのかも。
教育関係者から愁訴が来たのかナ ?

> TIもHPもカラーになってからは充電池ですが、CASIOだけは乾電池動作を維持しているので貴重ですね。(^^)

仰る通りです !
乾電池使用は、電卓の様な製品では欠かせないものであります。
やす親分の話では、fx-9850GIIIでしたか、モノクロ版が再び登場するとの事でしたが、
まだまだ乾電池で動作する電卓製品の発展が、何より心強いのです、ハイ。

> TIも従来比2.5倍早いCX2になって強固なハッキング対策されたようですし、
> 教育現場に売り込む以上はバイナリが簡単に扱えるとNGということなんでしょうね。(^^;

ガッコでbinaryゲームされては授業にならない、という所もありましょうが、
やはり教育向け・Examモード搭載というのが、必須になっておるのか ?
なかなか悩ましい。

やす(Krtyski) さんのコメント...

sentaro様

先ほど fx-CG50 の OS3.40 を導入し、Pythonでのグラフ機能を試そうを思って、先ずはsentaro様のプログラムを入力しています。

で、clear_screen() 関数が見つからなくて...

OSアップデートの前に 画面消去が無いと思っていたのですが、clear_screen()を使っているプログラム(上記)をみて、これで Casio micro python も使い道が広がると世路コンテイます。

で、clear_screen() は、ひょっとしてユーザー関数なのでしょうか?

Sentaro さんのコメント...

akatuki様、やす様、皆様、こんにちは!

akatuki様、
>ガッコでbinaryゲームされては授業にならない、という所もありましょうが、
>やはり教育向け・Examモード搭載というのが、必須になっておるのか ?
>なかなか悩ましい。

TI-84シリーズの最新のOSではついにアセンブラというかマシン語アプリを動作させる機能が完全に削除されたっぽいです。
これでTIは完全に外部アプリを遮断する方向になってしまいましたが、
CASIOがどうなるかというのが気がかりです。(^^;



やす様、
>先ほど fx-CG50 の OS3.40 を導入し、Pythonでのグラフ機能を試そうを思って、先ずはsentaro様のプログラムを入力しています。

お、ついにPythonグラフィックスですね。

>で、clear_screen() 関数が見つからなくて...

>OSアップデートの前に 画面消去が無いと思っていたのですが、clear_screen()を使っているプログラム(上記)をみて、これで Casio micro python も使い道が広がると世路コンテイます。

>で、clear_screen() は、ひょっとしてユーザー関数なのでしょうか?

私もよく分かってないのですが、(^^;
Planet-Casioの方でPythonを使ったグラフィックスコンテストがあって、
そこで使われているので初めて知った次第です。

グラフィックスジュール自体はかなりシンプルな感じなので、
画面消去、
ドットの描画、および検出、
画面転送
ぐらいしか機能は無いのですが、
6万色描画が可能なので、
マンデルブロート系のグラフィックスプログラムが可能になりますね。(^^)

やす(Krtyski) さんのコメント...

sentaro様


clear_screen() の入力は、どうされました?

カタログには見当たらないもので...

やす(Krtyski) さんのコメント...

sentaro様

そういえは、CG50 の OS3.40 では、積分の内部ロジックが少し変更されたようです。
9860GIII や 9750GIII の OS3.21 も同様にロジックが変更されたようです。

私のブログで、●●の概要シリーズで、GC50 と 9860GIII の記事にある周期関数の積分のタイムアウトの条件について、修正しておきました。

Sentaro さんのコメント...

やす様、こんにちは!

>clear_screen() の入力は、どうされました?

>カタログには見当たらないもので...

今の所、電卓上だと一文字ずつ入力するしか無いと思うのですが、
PCからテキストファイルで転送だと簡単ですね。(^^)


>そういえは、CG50 の OS3.40 では、積分の内部ロジックが少し変更されたようです。
>9860GIII や 9750GIII の OS3.21 も同様にロジックが変更されたようです。
>私のブログで、●●の概要シリーズで、GC50 と 9860GIII の記事にある周期関数の積分のタイムアウトの条件について、修正しておきました。

んと、どこが変わった感じでしょう?

やす(Krtyski) さんのコメント...

sentaro様

周期関数の積分について、以前からの情報に間違いがあったことが、上記のコメントをしたあと、気がつきました。そこで、●●の概要の記事を、全て修正しました。OSバージョンとは関係無かったというのが、結論です。

なお、「fx-9750GIII の概要」をアップしました。

sentaro様が作って下さったLCD応答テストプログラムを走らせた動画(YouTube)も見られるようにしています。

ところで、Casio Basic の処理速度ですが、fx-9750GIII は fx-9860GII よりも微妙ですが確実に速い結果になって、その理由が分からずにいます。記事には「理由は分からない」と書いておくしかありません。

何か、お気づきならばアチラでご教示ください。


clear_screen() はキー入力で良いのですね!
チョット遊んでみます。ありがとうございます。



akatuki さんのコメント...

やす親分、Sentaro様

イイなぁ、新しいCASIO micro python ... 。
clear_screen() いうのは、undocumented,「隠し機能」いうコトですかね。

やす(Krtyski) さんのコメント...

akatuki様

すこし前に仕事で、海外から入手した製品を国内用に最適化しようと思って、人が書いた組込み Python のスクリプトをチョコッと触ることがありました。制御構造を変えるようなことではなくで、定数を変更するだけだったので、まぁなんとかできたのですが、それがPythonとの初めての出会いでした。

その製品のメーカーとは長くお付き合いすることになり、そのメーカーの製品は、殆ど組込Pythonが使われているので、ある程度Pythonを使えるようになったほうが良さそう、という感じになっております。

一方で、Casio Python を眺めてみると、使える関数やメソッドがとても少なくて、Casio Basic のように意外に使いこなせるかも知れないな、と感じました。

最近では、Pythonが結構メジャーな言語だと言いますでしょう?
ならば、Basic よりも Python 勉強するのも悪くないと、まぁそんな感覚にもなりました。
そして自分の必要性も考え、それならば e-Gadget で Casio Python 入門をやるのも悪くないと思っていました。

で、早速ゴゾゴゾやっていたのですが、今回のマンデルブロの描画で、sentaro様がPythonに移植され、それを自分で写経して動かしてみたら、ちゃんと動いたのが、私のお尻を押してくれました。

以前 ここで フラクタルでシダの葉を描画するお題がありましたよね。sentaro様がPythonに移植したら結構速いと書かれていたので、私もさっそく移植してみました。今回はマンデルブロの写経の後に自分でやってみました。

いや本当に速いのに驚きました。そのあたりをe-Gadgetで記事にしました。
https://egadget.blog.fc2.com/blog-entry-723.html

この記事を前書きとして、これから Casio Python入門を始めようと思った次第。

全て akatuki様のお題がきっかけです。ありがとうございます。
お陰様で趣味と実益を兼ねた楽しそうな企画になりそうです。


そうそう、clear_screen() は隠し機能なんです。どうやら Python ではおなじみのものらしいです。なので、知っている方なら、チョット試してみようと思って、使ってみたら機能した、なんて感じのものかも知れません。

akatuki さんのコメント...

やす(Krtyski) 様
遅うなり、申し訳ない。

> すこし前に仕事で、海外から入手した製品を国内用に最適化しようと思って、人が書いた組込み Python のスクリプトをチョコッと触ることがありました。制御構造を変えるようなことではなくで、定数を変更するだけだったので、まぁなんとかできたのですが、それがPythonとの初めての出会いでした。
> その製品のメーカーとは長くお付き合いすることになり、そのメーカーの製品は、殆ど組込Pythonが使われているので、ある程度Pythonを使えるようになったほうが良さそう、という感じになっております。

既に色々とやっておりますのですね、流石は親分 !

> 一方で、Casio Python を眺めてみると、使える関数やメソッドがとても少なくて、Casio Basic のように意外に使いこなせるかも知れないな、と感じました。

仰るように、PCのpythonと比較して機能不足の感は否めないながらも、
ソコは電卓製品に採用されるmicro pythonの「強み」だと思うのであります。
それは、手近な電卓製品で、そのデバイスに応じたpythonプログラミングによって、電卓製品の機能を十分に引き出せる、そういうものなのだろうと。

> 最近では、Pythonが結構メジャーな言語だと言いますでしょう?
> ならば、Basic よりも Python 勉強するのも悪くないと、まぁそんな感覚にもなりました。
> そして自分の必要性も考え、それならば e-Gadget で Casio Python 入門をやるのも悪くないと思っていました。

オッ、イイですネ !
CASIO BASICも十分言及された所で、新しい沃野・pythonに、というのは、CASIO電卓製品と軌を一にする所であり、喜ばしいものだと思うのであります !

> で、早速ゴゾゴゾやっていたのですが、今回のマンデルブロの描画で、sentaro様がPythonに移植され、それを自分で写経して動かしてみたら、ちゃんと動いたのが、私のお尻を押してくれました。

「写経」ですか ! pythonプログラミングの「面白さ」を体験し、それが親分の文書の愉快さにつながっていくのだと思うのです。

> 以前 ここで フラクタルでシダの葉を描画するお題がありましたよね。sentaro様がPythonに移植したら結構速いと書かれていたので、私もさっそく移植してみました。今回はマンデルブロの写経の後に自分でやってみました。
> いや本当に速いのに驚きました。そのあたりをe-Gadgetで記事にしました。
> https://egadget.blog.fc2.com/blog-entry-723.html
> この記事を前書きとして、これから Casio Python入門を始めようと思った次第。

早速、読みました。イイですネ !
速度もある、というのが、実に羨ましい。

> そうそう、clear_screen() は隠し機能なんです。どうやら Python ではおなじみのものらしいです。なので、知っている方なら、チョット試してみようと思って、使ってみたら機能した、なんて感じのものかも知れません。

そうでしたか !
となると、まだまだ、他にも隠し機能がありそう ... ?