Hyperbolic function on Casio fx-991EX

There is no dedicated HYP key to call up cosh() or sinh() function in Casio fx-991EX.   This is a stern contrast to Casio fx-115ES keyboard.  It does not mean you cant use the hyperbolic funtction on fx-991EX

Hit “OPTNOption” key then select “Hyperbolic Func”

You need to be in “Calculate” mode to see this option, so for repeatability,

Hit menu, select 1.   Hit OPTNOption, select 1.

This calculator is obviously not RPN.  The calculator uses “natural notation” format.  It basically let you create equation and then evaluate the answer.  No concern on intermediate calculation.  Just answers, and it is really a wonder that you can get those devices for less than $20.

DM42

自分が使っている計算機はいまだにRPNである。 いまや科学技術計算はもとより、日ごろの営業計算もコンピューター上のエクセルで行ったほうがよっぽど早いので、専用の卓上計算機は 机上のアクセサリーであるとしか言えず、 たまに使うときも 製品単価のマージンをみるときぐらい。 そう %キー Δ%キーを押すほうがエクセル上で計算式をタイプするより簡単な時ぐらいである。 老後のマネービルディングを考えるのにも必要な機能は金融計算。 そういうことで、ビジネス計算機のHP-30bで事足りる。

ともあれ、Sine/Cosineをはじめとした三角関数 ルートやべき乗の関数。や数百ステップのプログラム機能を持った科学計算電卓というのはパソコン黎明期以前にエンジニアになった身としては特有な感慨がある。 これだけならばCasioのfx計算機を一台持っていればよいことになる(去年、Casio fx-991exという学校教材用の電卓をTargetというスーパーマーケットで15ドルで購入し、コスパの高さに驚愕した。)が、RPNという計算法を一度肌で覚えてしまうとどうしても計算機はHPがいいよね。ということになる。

専用のアルファキーがついているので、便利、この部分は完全に裏側に折りたためるので普通の計算機のように片手で持って操作していた。

自分として最初のHPはHP-28Sという、手帳のように折りたためるRPL機だったが、これはフレキシブルケーブルがダメになったか、アルファ側のキーが反応しなくなったので、その後、やはりRPLを実装した48Gを購入。48Gはいまだに動作するが、さすがに動作速度がおそく、Android AppのDroid48とかEmu48はグラフィックを一瞬で描画するが、元祖のほうの描画速度はとてつもなく遅い。 どちらにせよ、28にしても48にしても自分が必要とする機能は100パーセント以上満たしている。

これで終わっていればよかったのだが、 HPの計算機というのはコレクター意欲をそそる側面があるようで、その後 趣味の世界に突入し HP-33S,HP-35S、HP-12C, HP-15C LE、HP-30b とRPN機への散財が続くようになった。 さらに オタク化し、金融計算機のhp20-b/30bをフラッシュしなおしてwp-34sという科学計算機を”作成”して使用中。

WP34Sは自作するか、カスタムメードしてくれる個人からの購入になるが、マニュアルは製本されたものがAmazonで購入可能

このwp-34S 、キーに割り付けられた機能が多いわりには非常に使いやすいのだが、コンセプトのベースとなったのがHP-42sであり、42sを使いなれた人には操作でまごつくことはないはず、という但し書きがついている。

42sはHPのフラッグシップでNASAと一緒に宇宙まで行った41Cの後継機だが、、モジュールプラグインなどの拡張機能がないので41シリーズの影に隠れて存在感が薄い。 ただし、その後Free42というオープンソースプロジェクトにてアプリとして復活し、いまやWindowsはもちろん、スマホやタブレットなどでも使うことが可能。

Free42ですごいのはこれが単なるロムのエミューレーションではなく、一から書き直されているところ。そして、プログラムのロード・セーブがエミュレーターのプラットフォーム上でできるため、42sの弱点であった、プログラムライブラリーの利用が手入力でしかできないという欠点が解消されている。41cとは開示されている仕様内ではプログラム言語が上位互換なので、41C/41CV/41CXのプログラムライブラリーがほとんど使えるということだ。

で、そのFree42をArmコアでハードウエア化してしまったのが、SwissMicros社から発売されているDM42である。

値段は安くはない。今時卓上計算機に$200ドル以上払うのはコレクター以外にはいないんだろうと思えるのだが、(自分もその一人) 今回コロナウイルスの影響で一時解雇されていたわが身が職場復帰できたのを一人で勝手に祝って購入してみた機体のシリアル番号は6000番台である。 この計算機は2017年に発売開始だから、年間2000台は売れていることになる。

ちなみにSwiss Mailで配送され、北米のミシガン州にはオーダーしてから2週間以内で届いた。

 

使い勝手は非常に良い。 大きなメモリーグラフィック液晶の表示も見やすいし、ボタンのクリック感もCasioやシャープとは一線を画し、HPの計算機に近い感じ。 Youtubeを探すとすでに何件も動画があがっているようで参考にしてみてほしい。 動画の一部で言っているキーボードの不具合はすでに解決されていた。 USBを使ってのFirmWareの書き換えも可能。

Logan West氏によるHP-42SとDM42の比較動画

昨日、SwissMicrosからお知らせが来て、同じハードウエアで41xを発売開始したとある。こちらはオリジナルROMのイメージを使ったEmulatorなので、41Cシリーズとはマイクロコードレベルでの互換性がある。しかもExpansion Moduleはすべて格納済みだそうである。  コレクションにもう一台増えそうだな、と思っている。

coronavirusと生活への影響

自分の住んでいるミシガンも3月23日から緊急事態宣言が発令され、不要不急の用事を除いては外出をひかえるような指示が出ている。

その前の週から、勤めている会社ではすでに自主的に在宅勤務の指示が出ていたわけで、州知事からStay Home Directiveが発令されたときには家からテレコミュートしていた。。

1.飲食店は営業停止。ただし持ち帰りと出前は続行。
2.ガソリンスタンド、銀行、郵便局などは営業継続
3.スーパーや食料品店は営業継続
4.病院関係は通常通り

というわけで食料品などの買い出しに出ても、当初あったようなトイレットペーパーなどの品不足は解消されているように見える。

酒屋がオープンしていたのには笑った。必要不可欠な部類に入っているのだなあ。

ミシガン州での確認された患者数は3月30日の時点で 5486名。なくなった方は132人。

なくなった方は男性のほうが圧倒的に多い。

30歳以下は羅漢率も死亡率も低い。 死亡者の平均年齢が自分の歳と重なる、というのも嫌なものです。

 

 

Percentage of Cases by Age
  Age %
  0 to 19 years 1%
  20 to 29 years 9%
  30 to 39 years 13%
  40 to 49 years 17%
  50 to 59 years 20%
  60 to 69 years 19%
  70 to 79 years 14%
  80+ years 8%

 

Overall Percentage of Deceased by Sex

  Sex %
  Male 69%
  Female 30%
  Unknown 1%

 

 

Age Data of Overall Deceased
  Average Age 64.4 years
  Median Age 65 years
  Age Range 25-97 years

 

3月23日外出停止命令が出て1週間たった。 新規の患者の数が初めて減少に転じたようだが、外出停止の効果が出始めたのか、ただの天の気まぐれか。 どちらにしろこの傾向が続くことを祈るのみです。

 

 

Python Generator

>>> def make_counter(x):
	print('entering make_counter')
	while True:
		yield x
		print('incrementing x')
		x = x + 1

		
>>> counter = make_counter(2)
>>> counter

>>> next(counter)
entering make_counter
2
>>> next(counter)
incrementing x
3
>>> next(counter)
incrementing x
4
>>> next(counter)
incrementing x
5
>>> def fib(max):
	a,b = 0,1
	while a < max: yield a a,b = b, a + b >>> for n in fib(1000):
	print(n,end = ' ')

	
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 
>>> list(fib(1000))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
>>> 

Python Generator の話

K.Yairi のVintage Guitar

1981年の春ごろだと思うからもう40年近く前の話になる。 初めて米国の土を踏み、 2か月ほど働いて最初の給料が払われ、当時の金額で大枚500ドルを(為替レートが一ドル220円くらいでしたな)握りしめ真っ先に向かったのは前から目を付けていた町のギターショップだった。  あまり高くなくてもいいからMartinのDシリーズのボディーのギターを購入するつもりだった。  ところが店のマスターは「売らんでもないが、マーチンなんか買うな。」という  350ドルで勧められたのは日本製のギターの K.Yairi。 当時 S.Yairi と K.Yairi という二種類のYairiががあるというくらいは知っていたのだが、 日本にいたころはやはりMartinとかGibsonとかコンポジット材を使ったObationなんかが有名で、アメリカに行ったらアメリカ製を買うつもりだったのに、「悪いことは言わないから、値段も一回り安いし、この日本製を買いなさい。」と言われてしまったわけだ。

というわけで諭されてK.Yairi(Alvarez)を購入した。 時は過ぎ、結婚して子供ができ、その息子が大きくなってギターを弾きたいと言って地下室にしまってあったYairiをひっぱりだしてきた。10年くらいは触ってもいなかったわけで Tune UPに出すように言って、彼がGuitar Centerという最寄りのChain店に持って行った。 息子曰く、 Techが「お、Yairiだ」と言ってfHoleの中を望みこみ、 顔を見上げて、「兄ちゃんこのギターどこで手に入れた? これは掘り出しものだぜ」 と言ったそうな。

預かり証に書き込んてくれた時価評価額が3,900 USドル ずいぶんと中途半端な値段だが、これを聞いた親のほうが驚いた。 息子はホクホクものである。 ギターは初心者のはずだったが、さすがは鈴木チルドレン。 コードも難なく覚え、すでに自分より手練れの様子である。 さすがです。

 

 

React Revisited after version 16.8

React というのは DOMの内容を簡単に操作しようという JavaScriptのライブラリーの一つだが、Shadow DOMという概念を導入し、JQueryのようにコマンドごとの実行でDOMを書き換えることはせず、Shadow DOMにある程度書き込んでおいてから描画する直前にまとめてDOMに書き込む。なので軽快に動作する、というのが売り。

数年前に覚えようとしたのだが、 二点腑に落ちないところがあって、結局、Vue.jsという他のLibraryを愛用(溺愛)するに至った。

その二点というのが

1.JSXという新しい概念の導入。 一見するとHTMLなのだがHTMLではなく、XML書式をJavaScriptで理解できるようにしたプリプロセッサ。この一見HTMLというのがくせもので、class= はJSの予約用語ゆえに使えずclassName=にしなければならないなど、細かいところで違っていて気持ちがわるい。(これに比べてVueのTemplateはまごうことなきHTMLの拡張)

2.コンポーネントで操作できる変数(State)を使うためにはコンポーネントをClass表記してsetState()という関数を使って管理しなければならない。

というもの。

その後 「JSXは単なるJavaScriptの関数表現」という開発チームの解説をYoutubeでみて ストンと納得できるものがあったものの、 二つ目のJavaScriptにClassが必要というのがなんとも納得いかない(個人の意見です)身としては今いち手が出せずにいた。 Class表記をするあまり、 thisの多用を行い、しかもそのContextを明示するためにClass Constructorに this.function=this.function.bind(this) を書きまくるというのがなんとも切ない。

しかしながら、 Reactの勢いは侮りがたいものがある。 特にMicrosoftのOffice開発系の方たちは Office UI GraphicsのComponentに「Reactは正義!」という感じで使いまくっている。 SharePoinitの JavaScript Frame workも Reactびいきがすごい。

で、最近React-client-appというCLIでReactのScaffoldingが簡単にできます、という記事をよく見るので、実際どれくらい簡単なんだいと試してみたら、 生成されるScaffoldingのComponentがClass表記ではなくfunction表記になっている。 あれ、これって、Stateful Componentは Class表記しなければいけないんじゃなかったっけ、と思ったが、 実はReactも進化していた。

Version 16.8から Hooksという機能が追加されて Functional ComponentでもStateの管理ができるようになっていた。 そして今まで、 Functional Component = Stateless Component, Class Componnet=Stateful Componentとなっていたものが、 どちらを使ってもよいようになっている。 Reactのサイトにも将来の開発にはFunctional Componentを使うのがおすすめと書いてある。 なので、React-client-appもDefaultで生成するコードはクラスレスになっていたわけだ。

紹介ページ https://reactjs.org/docs/hooks-intro.html にあるコードをみれば一目瞭然だが、クラス表記のようなConstructorもなければ、this. でメンバー指定をすることもない。 非常に簡単。 ただ、このHookを使ったクラスレスのステートフルコンポーネントの作り方、オフィシャルサイト以外で解説しているサイトはまだ少ない。

この

const [ var1, setVar1]=useState('this is variable one');

で気をつけなければいけないのは Var1が複数メンバーから構成されるオブジェクトだった場合、

const [obj1,setObj1]=useState({member1:"this is member 1", member2:"this is member 2"})

のように Obj1を宣言したときに、

setObj1({member2:"this is member 2 modified"})

とやってもsetState()と違って、オブジェクトの他のメンバー(Key)とマージしてくれない。上の例ではmember1が消えてしまう。

セット関数には元のstateがパラメータとして渡されているのを利用して、

setObj1(s=>({ ...s, member2:"this is member 2 modified"}))

とスプレッド表記を使ってマージしてあげる必要がある。(上のサイトにはObject.createを使うのも可と書いてある)

また、いわゆる ComponentWillMountなどのLife Cycle hookの代わりには描画毎に発火するuseEffect()を使えと書いてある。 このHookは発火を限定するために二つ目のパラメータ―で発火する条件を指定できる。 ファイルデータを読み込むなど、あるいはイベントリスナーを設定するなど、一回だけ発火させたい場合、 このパラメーターを空のアレイで渡してあげることで実現できる。(なんとなくハックっぽいが)

useEffect(()=>{Data を読み込む云々}, [])

他にも何種類かのHooksが用意されているが、 演習用にアプリを書いてみると、上の二つのHookだけで、それなりのものができる。

すでにJSXへのアレルギーはなくなっているので、クラスを使わなくてよいReactという選択は結構魅力的です。

すべてにVue.jsを使いたいのはやまやまなれど、SharePoint関連においてMicroSoft が Reactありきの開発を推しているというのはやはり大きい。

Using Vue with WebPack

I wanted to transfer my existing script to WebPack bundle.  The application is a simple page that uses  Vue.js.   Note that I only read Introduction part of Vue and started using it.  At that time, I did not even know the concept of Vue component files .  Thus my application was entirely in one JavaScript file.

I rewrote it using typescript.   WebPack bundling was necessary to make it work.

I had to decipher minor (but important) detail on NPM’s Vue  module that should be used along with WebPack. 

If I were to use a Vue package from node_modules/ and bundle it with WebPack, then the default module that will be used is Runtime-only ES module build (vue.runtime.esm.js.)

Now this verbiage is coming from VueJs.org V2 guide
https://vuejs.org/v2/guide/installation.html#Terms


” If you need to compile templates on the client (e.g. passing a string to the template option, or mounting to an element using its in-DOM HTML as the template), you will need the compiler and thus the full build:”

This applies to ‘getting started example’ code where  you use template directly on target html file, such as 

<div id="app"> {{message}} </div>

According to Vue documentation, runtime only module is 30% lighter and when I write my code in such a way that it utilize component file (*.vue), then  using vue-loader will precompile all the templates into render function (for those within component file)  so the default settings wil be not an issue.   Issue is when I create a new instance  of the view . 
Again, according to the guide

// this requires the compiler
new Vue({
template: '{{ hi }}'
})

// this does not
new Vue({
render (h) {
return h('div', this.hi)
}
})


If I use the first method but did not configure webpack to use full version of Vue module, resulting bundle file  is missing template compiler and I will be staring at the blank page.  In this situation,  looking into  source with F12 looks something like this

<body><!-- function(a,b,c,d) {.......} --></body>


Then how do I configure Webpack  so that it knows to bundle the full version of vue module instead of runtime-only module?  It was spelled right in the guide above.

module.exports = {
          // ...
          resolve: 
                {
                   //.....,
               alias: {'vue$': 'vue/dist/vue.esm.js' }
               //.......
      }

I needed to add  ‘alias’ clause to  the ‘resolve’ section of module.exports.  (for webpack v2 and above)
WebPack will then bundle full version of Vue module(vue.esm.js). 

Since I didn’t use .vue files for this project and put everything in a single html file, I did not  need to use ‘vue-loader’ either.
So this is a minimal requirement for Vue to work with WebPack.

Vue.js has a very detailed documentation which is good. All I needed was to read it through and understand the meaning of it (lol).  

By the way, another way to make it work is not tell WebPack about Vue at all.

  1. add script tag in your HTML writeup pointing to Vue CDN
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>


    2. Then tell Typescript  that ‘Vue’ is a global object

declare let Vue:any

Yes, use the bundler but not bundle the module. It sounds strange but it works

String.replaceで知らなかった件

User がノート欄にやたら長いリンク先をそのまま張り付けて、SharePointのリストの表示が著しく損なわれるという現象が自分の管理するサイトコレクションで何件か発生している。 ユーザー教育を行ってリンクの説明を別途短文入力してください、というのは簡単だが、だまって従ってくれるような従業員ばかりではない。 そこで長いリンクを見つけたら強制的に短い文字列に置き換えてしまう、という仕掛けをJavaScriptで書いてしまえばよいのだと思いつき、 試してみた。 結果、以下のような関数を記述し、これを描画時に呼び出す形で解決した。

function shortenAnchor(text) {

    if (text===null) {
        return "";
    }
    let testPattern = /(<a.*?href=.+?>)(.*?)(<\/a?>)/g;

    function replacer(match, p1, p2, p3) {
        if((p2.length)>30) {
            p2 = p2.slice(0, 25) + '...';
        }
        return [p1, p2, p3].join('');
    }

    return text.replace(testPattern, replacer);
}

このコードで何をやっているか。 まずtestPatternを正規表現(RegExp)で記述する。 RegExpで a tag elements をグローバルにトラップする。トラップしたエレメントはタグの前の部分、中身のテキスト部分、タグの後ろの部分にグループわけされ、それぞれの文字列は$1,$2,$3として利用可能になる。( a tag element 全体のマッチは$&)。 そして、あとは String.replaceを使ってマジックをおこすわけだが、Implementationを試行錯誤している最中に 二つ目のパラメーターが実は関数でもよいのだ、というのを本日初めて知ったわけで、それを使ってうまく書くことができた。 ここに関数を使うと、以下の引数が この順番で使えるようになる。 まずは TestPatternそのもののマッチ $&, それぞれグループ分けした部分のマッチ $1,$2,$3。 よって match,p1,p2,p3として利用可能にしておく。実はこの後ろにIndexなどのパラメーターも続くのが、今回は必要がないので無視。 
この replacer という関数ではこの中身の文字列$2(p2)の長さが30文字以上あった場合、最初の25文字以下を切り捨て点三つ…を最後に追加するというもの。 この関数自体を二つ目の引数として使う。 Testしてみたら一発で完動したので感動(おやじギャグです)

普通はString.replaceというと

"this is a pen".replace("this","that") //=>"that is a pen"

という簡単な使い方は知っていたし、 最初のパラメーターを正規表現にすれば $& $1 etc., などのパラメーターを使ってかなり柔軟な置き換えなどができることも知っていて使ってはいたのだが、まさか関数まで使えるとは思っていなかった。 これは素晴らしい、と思った次第

TypeScript その2

年末の休暇を利用してtypeScriptの演習を続行中。 現在まで理解できたところをとりあえず列挙。
nodejs が導入されている必要あり。

npm install typescript -g

これで tscコマンドが使えるようになる。

tsc example.ts

そして、これでexample.ts から example.jsがトランスパイルされる。

プロジェクトフォルダー内で

 tsc init

とやると、コンパイラー設定用のtsconfig.jsonが作成され規定値が設定される。例えば、出力のJavaScriptのレベルが

<pre>”target”:”es5″</pre>

などと記述されている。またコードをトランスパイルしたときのエラーの出力設定などもできる。今のところ全く変更の必要のないレベルでトライアル中。

TypeScript は 基本的には JavaScriptのsuper setなのだが、 ’let’, ‘const’, ‘arrow function ()=>’, ‘ … spread operator’,’Template strings’ などes2015の書式が既にサポートされている。 なのでexample.tsではこれらの言語機能を使ってプログラムを書き、tscでトランスパイルすると、これらの表記をまだサポートしていない現行のブラウザでも動くようなJavaScriptに書き換えてくれる。上のConfig例ではes5レベルのコードに置き換わる。 つまりBabelと同じような使い方ができる、。

type safeなので 異なったタイプの変数へのアサインは論外としてもその可能性が生じそうなコードにはエラー表示が鬼のようにでる。例外処理とか、Interface定義を記述して対処すると満足して何も言わなくなってくれるので、バグの可能性のあるコードを書く可能性が低くなる。