<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://www.tylor.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Webmaster</id>
	<title>Memorandum - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://www.tylor.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Webmaster"/>
	<link rel="alternate" type="text/html" href="https://www.tylor.jp/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Webmaster"/>
	<updated>2026-04-21T12:02:29Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.tylor.jp/index.php?title=Window%E3%81%AE%E5%BA%A7%E6%A8%99%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B&amp;diff=6835</id>
		<title>Windowの座標を表示する</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=Window%E3%81%AE%E5%BA%A7%E6%A8%99%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B&amp;diff=6835"/>
		<updated>2026-04-19T09:12:46Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KDE 6でWindowの座標を表示させるには:&lt;br /&gt;
# [https://gitlab.com/Worldblender/kwin-scripts 公式GitHub]からソースコードのアーカイブファイルをダウンロードする&lt;br /&gt;
# アーカイブファイルを解凍するとKDEとKDE 6でディレクトリが分かれている。KDE 6のディレクトリに移動する&lt;br /&gt;
# コマンドラインでインストールする&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;gt; kpackagetool6 --type=KWin/Script -i ~/Download/kwin-scripts-master/windowgeometryinfo6/&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=Debian_GNU/Linux_Customize_Tips&amp;diff=6833</id>
		<title>Debian GNU/Linux Customize Tips</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=Debian_GNU/Linux_Customize_Tips&amp;diff=6833"/>
		<updated>2026-04-18T05:39:12Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;サーバにしろクライアントにしろ、自宅で常用するPCにインストイールするOSを、莫迦みたいに高価な割にセキュリティが脆弱で過負荷に弱く異常に使い難い[https://www.microsoft.com/ja-jp/windows Microsoft Windowsシリーズ]から、無償であることが信じられないほど堅牢で使い易い[https://www.debian.org/ Debian GNU/Linux]に置き換えて、かれこれ20年以上経つ。&lt;br /&gt;
&lt;br /&gt;
そのお蔭か、会社より支給されるWindows PCのセッティングには苦労するが、検索すれば先達による様々な情報が公開されており、一通り終えるまでの時間はそこまで掛からない。PC用OSのシェアが寡占状態であることに加え、「なんでこんなことまでMicrosoftに強制されなけりゃならんのだ。どうにかして回避したい」というユーザの欲求が、ネット上に有益な情報を増やしているようだ。&lt;br /&gt;
&lt;br /&gt;
翻って、PC用OSのシェアが全世界で2%前後の、DebianをはじめとするLinuxは、まだまだ情報が少ない。根気よく調べれば必要な情報に辿り着けるのだが、いかんせん、そこに行くまで異常に時間が掛かる。&lt;br /&gt;
&lt;br /&gt;
下記は、管理人にとって必須である、Debianの設定に関するTipsである。&lt;br /&gt;
&lt;br /&gt;
=目次=&lt;br /&gt;
*[[KDE Plasma Transparent]]&lt;br /&gt;
*[[DebianでFcitx5を使用してSKKを設定する]]&lt;br /&gt;
*[[GNU EmacsとWanderlustでOAuth2を使用してGmailを送受信する]]&lt;br /&gt;
*[[Windowの座標を表示する]]&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=Casio_fx-10&amp;diff=6832</id>
		<title>Casio fx-10</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=Casio_fx-10&amp;diff=6832"/>
		<updated>2026-03-20T00:45:28Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1974年5月にカシオ計算機が定価24,800円で販売した&#039;&#039;&#039;日本初の&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;可搬型&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ポケット&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;関数電卓&#039;&#039;&#039;である。&lt;br /&gt;
&lt;br /&gt;
[[Casio_CASIO-MINI_CM-605|CASIO-MINI CM-605]]でも記載した通り、この時期にカシオ計算機は中置記法へ移行したため、本機も中置記法である。働き出してRPN電卓ユーザとなった現在の管理人には中置記法の電卓が使えなくなる能力が身に付いてしまい使い難いことこの上ないが、このWebサイトでも何度か触れているように、当時の日米間に厳然と存在した技術格差を比較するため、番外として記載する。&lt;br /&gt;
&lt;br /&gt;
===後発なのに低スペック===&lt;br /&gt;
本機発売時に競合していたHP製RPN関数電卓は1973年3月1日発売の[[HP-45/HP-46|HP-45]]だが&amp;lt;ref name=&amp;quot;hp65&amp;quot; /&amp;gt;、これの元となった[[HP-35]]もまだ併売されていた。よって、本機はこれら2機種より後発なのだが、本機はこれら2機種より低スペックだ。&lt;br /&gt;
&lt;br /&gt;
まず、本機のマニュアル1ページから転載した規格を確認してみる。&lt;br /&gt;
----&lt;br /&gt;
;型式&lt;br /&gt;
:fx-10&lt;br /&gt;
;基本計算機能&lt;br /&gt;
:加減乗除計算、連乗連除計算、定数計算、小数点付計算および混合計算&lt;br /&gt;
;特殊計算機能&lt;br /&gt;
:三角関数(&amp;lt;math&amp;gt;\sin, \cos, \tan&amp;lt;/math&amp;gt;)、対数関数(&amp;lt;math&amp;gt;\log, \ln&amp;lt;/math&amp;gt;)、指数関数(&amp;lt;math&amp;gt;a^n, e^x&amp;lt;/math&amp;gt;)、その他(&amp;lt;math&amp;gt;\sqrt{\vphantom{h}\quad}&amp;lt;/math&amp;gt;、&amp;lt;math&amp;gt;\tfrac{1}{x}&amp;lt;/math&amp;gt;、分秒→度数、&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;)&lt;br /&gt;
;計算桁数&lt;br /&gt;
:置数および加減乗除……8桁(&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;および負数は7桁)&amp;lt;br&amp;gt;三角関数(&amp;lt;math&amp;gt;\sin \cdot \cos \cdot \tan&amp;lt;/math&amp;gt;)……答6桁(最大誤差 最下位桁で±1)&amp;amp;emsp;被演算数 &amp;lt;math&amp;gt;-360^\circ \leqq x \leqq 360^\circ&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;対数関数(&amp;lt;math&amp;gt;\log \cdot \ln&amp;lt;/math&amp;gt;)……6桁(最大誤差 最下位桁で±1)&amp;amp;emsp;&amp;lt;math&amp;gt;0 &amp;lt; x &amp;lt; 10^8&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;指数関数(&amp;lt;math&amp;gt;a^n&amp;lt;/math&amp;gt;)……8桁&amp;amp;emsp;&amp;lt;math&amp;gt;-10^7 &amp;lt; a &amp;lt; 10^8,\quad 0 \leqq n \leqq 9&amp;lt;/math&amp;gt;&amp;amp;nbsp;の整数&amp;lt;br&amp;gt;指数関数(&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;)……6桁(最大誤差 最下位桁で±1)&amp;amp;emsp;&amp;lt;math&amp;gt;-10 &amp;lt; x &amp;lt; 10&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;開平(&amp;lt;math&amp;gt;\sqrt{x}&amp;lt;/math&amp;gt;)……7桁&amp;amp;emsp;&amp;lt;math&amp;gt;0 \leqq x &amp;lt; 10^8&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;逆数(&amp;lt;math&amp;gt;\tfrac{1}{x}&amp;lt;/math&amp;gt;)……8桁&amp;amp;emsp;&amp;lt;math&amp;gt;-10^7 &amp;lt; x &amp;lt; 10^8&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;分、秒→度数(&amp;lt;math&amp;gt;\,^\circ\,&#039;\, &#039;&#039;&amp;lt;/math&amp;gt;)……8桁&amp;amp;emsp;&amp;lt;math&amp;gt;0 &amp;lt; x &amp;lt; 10^8&amp;lt;/math&amp;gt;&lt;br /&gt;
;計算方式&lt;br /&gt;
:四則算は完全数式通り、関数はワンタッチ&lt;br /&gt;
;小数点方式&lt;br /&gt;
:完全浮動小数点方式(整数部優先アンダーフロー)&lt;br /&gt;
;負数表示&lt;br /&gt;
:フローティングマイナスの真数表示&lt;br /&gt;
;オーバーフローチェック方式&lt;br /&gt;
:全桁0表示後演算停止&lt;br /&gt;
;表示&lt;br /&gt;
:緑の蛍光表示管使用、8桁ゼロサプレス方式&lt;br /&gt;
;主要素子&lt;br /&gt;
:ワンチップLSI&lt;br /&gt;
;電源&lt;br /&gt;
:2電源方式&lt;br /&gt;
::AC：100V±10V(専用ACアダプター使用による)&lt;br /&gt;
::DC：単3型乾電池4本使用&lt;br /&gt;
:DCの場合の連続使用時間(表示&amp;lt;code&amp;gt;8888&amp;lt;/code&amp;gt; 温度約20℃にて)&lt;br /&gt;
::高性能マンガン乾電池&amp;amp;emsp;約8時間&lt;br /&gt;
::アルカル乾電池&amp;amp;emsp;約17時間&lt;br /&gt;
;消費電力&lt;br /&gt;
:0.45W&lt;br /&gt;
;使用温度&lt;br /&gt;
:0℃〜40℃&lt;br /&gt;
;寸法・重さ&lt;br /&gt;
:幅95×奥行150×厚さ33mm&lt;br /&gt;
:330g(本体230g・電池100g)&lt;br /&gt;
;付属品&lt;br /&gt;
:専用ACアダプター(MODEL AD-4145)、単3型アルカリ乾電池4本、携帯用ケース&lt;br /&gt;
----&lt;br /&gt;
上記で判るように、円周率&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を入力するための独立キーが設けられ、実装された関数が度数法での三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\ln&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;a^n&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;(&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;は1桁の正の整数のみ)、開平&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{\vphantom{x}\quad}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、逆数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、分秒→度数変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\,^\circ\,&#039;\, &#039;&#039;&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の10個というのは、冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;a^n&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の羃指数&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;の制限と分秒→度数変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\,^\circ\,&#039;\, &#039;&#039;&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;機能を除くと[[HP-35]]とまったく同じである。つまり、当時のカシオ計算機は本機の開発にあたり[[HP-35]]を大いに参考にしたと推定される。&lt;br /&gt;
&lt;br /&gt;
では、演算性能も[[HP-35]]とまったく同じかというと、そうではない。[[HP-35]]は内部での演算はすべて14桁で実行するため、内蔵している関数を演算しても最長10桁の演算結果をそのまま表示するが、本機で演算できる桁数は開平が7桁、三角関数/対数関数/自然対数の逆関数が6桁までなので、それら関数の内部での演算は8桁や7桁で実行しているのだろう。つまり、本機の演算できる桁数は[[HP-35]]の約半分となる。やはり[[HP-35]]を参考にワンチップLSIで開発したかったと推定される[[National Semiconductor 4510]]と同じ結果だ。&lt;br /&gt;
&lt;br /&gt;
本機が発売された時点では、[[HP-35]]のソフトウェア(ROM)だけ差し替えた[[HP-45/HP-46|HP-45]]が395ドル(1974年5月の対アメリカドル為替レート279円で計算すると約110,200円)、[[HP-45/HP-46|HP-45]]が発売されたことで100ドル値下げされた[[HP-35]]が295ドル(同じレートで約82,300円)で、ぞれぞれ販売されていた。このとき日本でポケット関数電卓の購入を考えていた層には、この2機種に本機が加わったことになるが、単純に価格だけ比較すれば本機はこれらの&amp;amp;frac14;以下や&amp;amp;frac13;以下になるとはいえ、その代償は余りに大きいと感じただろう。本機が発売された[https://nenji-toukei.com/n/kiji/10023 1974年の平均月給は115,200円]だったそうだが、もし管理人がリアルタイムでこの選択を迫られたなら、間髪入れず[[HP-45/HP-46|HP-45]]を選定して月給1ヶ月分を注ぎ込むだろう。無理数を連綿と演算するために存在する関数電卓という製品の性質からして、月給の約22%を突っ込まねばならない割に本機のスペックがショボ過ぎる(スペック差と価格差がバランスしていない)からだ。&lt;br /&gt;
&lt;br /&gt;
===「可搬型＝ワンチップ」という呪縛？===&lt;br /&gt;
日本初の可搬型関数電卓である本機が、なぜこのような残念な仕上りになってしまったのか…管理人は「『可搬型とする』ことと『価格と消費電力を下げる』ことから、演算部をワンチップで実装することに拘ったからではないか？」と愚考している。&lt;br /&gt;
&lt;br /&gt;
即ち、どこへでも持ち運べるよう小型化するためにも、バッテリだけで駆動できるようにするためにも、最終的な販売価格に直結するチップ数を抑えるためにも、関数電卓をワンチップLSIで実装することに挑戦したところ、当時のLSI製造技術の集積度でワンチップ化できる回路規模と、そのチップの単価、そして実装したい関数や機能を横睨みしたら、結果的に、このような仕上がりになってしまったのではないだろうか。&lt;br /&gt;
&lt;br /&gt;
ありていに言えば、当時の日本の半導体ベンダ(本機ではNEC)がpMOSプロセスでLSIを製造したものの、1チップあたりの集積度をあまり上げることができず、また消費電力もそれほど抑えられなかったのだろう。しかも、先述の通り、本機のパンフレットには「ワンチップLSI」と記載されているものの、本機を実際に開腹してみると[http://www.johnwolff.id.au/calculators/Casio/CasioFX10-1388-PCB-IMG_5751-5.jpg 3チップで実装]されていることが判る。事実は不明だが、巷では本機の演算はNEC製の2チップ([http://www.calcuseum.com/SCRAPBOOK/BONUS/20935/1.htm μPD179C]と[http://www.calcuseum.com/SCRAPBOOK/BONUS/20934/1.htm μPD175C])が担っていると推定されている&amp;lt;ref name=&amp;quot;chip&amp;quot; /&amp;gt;。もしこの推定が正しいとすると、カシオ計算機とNECは本機のワンチップ化にも失敗したことになってしまい、残念さに拍車が掛かる。&lt;br /&gt;
&lt;br /&gt;
消費電力はどうか。3チップで実装された本機は「単3高性能マンガン乾電池4本で8時間」と謳われ、消費電力は「0.45W」とある。翻って、[[HP-35]]は4チップ、[[HP-45/HP-46|HP-45]]は5チップで実装されているが、両機とも、実態は単3ニッカド充電池が3本直列されたバッテリパックをフル充電して「3〜5時間」と謳われ、消費電力は「3.75V, 500mW」とある。バッテリのみでの使用時間はバッテリ容量に依存するため一概には比較できないが、消費電力は、HPでは4チップも5チップも使用しているのに、3チップで実装された本機の消費電力と較べて50mWしか増えていない。これはLSIを製造した半導体ベンダによる1チップあたりの集積度と消費電力の差による影響が大きいと思われる。裏を返せば、カシオ計算機の「ワンチップ化による消費電力の削減」という目論見も失敗した&amp;lt;ref name=&amp;quot;w&amp;quot; /&amp;gt;と言えるのかもしれない。ますます残念である。&lt;br /&gt;
&lt;br /&gt;
もし当時のカシオ計算機が本機に実装するLSIの製造を、HPと同じくMostekやAMIに発注していれば、正真正銘の1チップに収められて消費電力が下げられたり、1チップに詰め込む機能を追加したり、演算性能を[[HP-35]]並みに引き上げたりしたかもしれない。尤も、もしMostekやAMIに本機のLSIの製造を依頼したら、製造単価が、NECでのそれより跳ね上がる可能性が否定できない。&lt;br /&gt;
&lt;br /&gt;
それにしても、本機に実装する10関数を選別する過程で「分秒→度数変換」が生き残った理由は何だろうか。これまで記載した通り、[[HP-45/HP-46|HP-45]]は[[HP-35]]のソフトウェア(ROM)だけを差し替えた改良版だが、ここでも「分秒⇔度数 相互変換」が追加されている。可搬型の関数電卓は屋外での使用が想定されるため建築や測量の現場を考慮した&amp;lt;ref name=&amp;quot;survey&amp;quot; /&amp;gt;のだろうが、だとしても、三角関数で弧度法を使用できるようにすることのほうが高優先だと思うのだが…？&lt;br /&gt;
&lt;br /&gt;
===どうしてこうなった===&lt;br /&gt;
演算できる桁数が少なくても、機能や演算精度が良ければ、関数電卓としての存在意義はある。しかし、残念ながら、本機の機能や演算精度が良いとは言えない。&lt;br /&gt;
&lt;br /&gt;
有名なのは&#039;&#039;&#039;内蔵10関数の演算結果に誤差が大きく乗る(場合がある)&#039;&#039;&#039;というのがある。例えば&amp;amp;nbsp;&amp;lt;math&amp;gt;\sin 30^\circ = \cos 60^\circ&amp;lt;/math&amp;gt;&amp;amp;nbsp;の演算には2秒ほど掛かり、その結果として&amp;lt;code&amp;gt;0.49999&amp;lt;/code&amp;gt;を出力する。当然、正解は&amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt;なので、高校1年生以下の演算能力である。本機は逆三角関数が演算できないため手探りしたところ、&amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt;となるのは&amp;amp;nbsp;&amp;lt;math&amp;gt;\sin 30.0001^\circ = \cos 59.9999^\circ&amp;lt;/math&amp;gt;&amp;amp;nbsp;であった。度数法で変数を扱う際に&amp;lt;math&amp;gt;0.0001^\circ&amp;lt;/math&amp;gt;だけ何かしら誤りがあるのだろう。その割には&amp;amp;nbsp;&amp;lt;math&amp;gt;\sin 90^\circ = \cos 0^\circ = \tan 45^\circ&amp;lt;/math&amp;gt;&amp;amp;nbsp;の演算結果は正解である&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;を出力するのは謎である。&lt;br /&gt;
&lt;br /&gt;
逆数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を2度実行して元の値に戻す演算でも誤差が乗る。例えば本機で&amp;lt;math&amp;gt;6&amp;lt;/math&amp;gt;に対して&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると&amp;lt;code&amp;gt;0.1666666&amp;lt;/code&amp;gt;を出力、この結果に再度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると&amp;lt;code&amp;gt;6.000002&amp;lt;/code&amp;gt;という1桁削られた誤差を含む演算結果を出力するが、演算桁数を8桁に設定した[[HP-45/HP-46|HP-45]]では&amp;lt;code&amp;gt;0.1666667&amp;lt;/code&amp;gt;のち&amp;lt;code&amp;gt;6.0000000&amp;lt;/code&amp;gt;と正解を出力する。同じ演算を&amp;lt;math&amp;gt;13&amp;lt;/math&amp;gt;に対して実行しても、[[HP-45/HP-46|HP-45]]では&amp;lt;code&amp;gt;0.0769231&amp;lt;/code&amp;gt;のち&amp;lt;code&amp;gt;13.0000000&amp;lt;/code&amp;gt;と正解を出力するが、本機では&amp;lt;code&amp;gt;0.076923&amp;lt;/code&amp;gt;のち&amp;lt;code&amp;gt;13.00001&amp;lt;/code&amp;gt;と、やはり1桁削られた誤差を含む結果を出力する。&lt;br /&gt;
&lt;br /&gt;
開平&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{\vphantom{x}\quad}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の演算結果を2乗して元の値に戻す演算でも同様だ。例えば本機で&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;に対して&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{\vphantom{x}\quad}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると&amp;lt;code&amp;gt;1.414213&amp;lt;/code&amp;gt;を出力、この結果に&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下しても&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;a^n&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下しても&amp;lt;code&amp;gt;1.9999984&amp;lt;/code&amp;gt;と誤差を含む演算結果を出力するが、演算桁数を8桁に設定した[[HP-45/HP-46|HP-45]]では&amp;lt;code&amp;gt;1.4142136&amp;lt;/code&amp;gt;のち&amp;lt;code&amp;gt;2.0000000&amp;lt;/code&amp;gt;と正解を出力する。同じ演算を&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;に対して実行しても、[[HP-45/HP-46|HP-45]]では&amp;lt;code&amp;gt;2.2360680&amp;lt;/code&amp;gt;のち&amp;lt;code&amp;gt;5.0000000&amp;lt;/code&amp;gt;と正解を出力するが、本機では&amp;lt;code&amp;gt;2.236067&amp;lt;/code&amp;gt;のち&amp;lt;code&amp;gt;4.9999956&amp;lt;/code&amp;gt;と誤差を含む結果を出力する。&lt;br /&gt;
&lt;br /&gt;
この差は演算回路の実装から来ているとしか言い様がない。ワンチップLSIに収めるべく演算精度を妥協した結果だろうか。当然、カシオ計算機もデバッグ時にこういった事象の発生を確認しただろう。にもかかわらず、後発機種の本機でも、この誤差で良しとした理由は何だろうか。&lt;br /&gt;
&lt;br /&gt;
[https://www.kahaku.go.jp 国立科学博物館][https://sts.kahaku.go.jp 産業技術史資料情報センター]主任調査員の瀬尾悠紀雄氏がまとめた[https://sts.kahaku.go.jp/diversity/document/system/pdf/021.pdf 「電子式卓上計算機技術発展の系統化調査」](国立科学博物館 技術の系統化調査報告 第6集 2006年3月)には、本機について下記の記述がある。&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;しかし関数電卓の出始めの頃は次のようなエピソードもあった。それは「sin30度は数表では0.5なのに0.499999…99となる、これでは困る」といった指摘がユーザから寄せられ、以後回路設計で解決したいきさつがある。&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
筆者の瀬尾氏はカシオ計算機出身だそうなので、この記述内容の確度は高いと判断しているが、この記述から推定するに、当時のカシオ計算機は「この程度の誤差であれば、ユーザは受容してくれる」と考えていたようにも思える。ただ、やはりというか当然というか、ユーザからクレームが挙がり、改修するに至ったようだ。&lt;br /&gt;
&lt;br /&gt;
なお、この事象を「回路設計で解決した」と明記しているのは、この報告書が初見である。「回路設計で解決した」ということは、この事象の原因が「回路の設計」即ち「ハードウェア」にあり、それを改修して解決したという意味であろうことから、初期のカシオ計算機の関数電卓では、少なくとも三角関数の演算をワイヤードロジックのみ(恐らく[https://en.wikipedia.org/wiki/CORDIC CORDIC])で実行していたと推定している。よって、ここでいう「回路設計で解決」とは、次期LSIで「CORDICによる演算結果の[https://en.wikipedia.org/wiki/Rounding 丸め]の方法を変更した」か「内部での演算桁数を増やして誤差を目立たぬようにした」か…これらはいずれも「回路の設計」即ち「ハードウェア」の話であるため「回路設計で解決」できるが、この報告書では解決方法にまで言及しておらず不明である。&lt;br /&gt;
&lt;br /&gt;
===実態は「[[丸善 対数表 七桁|数表]]を内蔵した[[Casio CASIO-MINI CM-605|カシオミニ]]」===&lt;br /&gt;
また、現代の関数電卓からすれば信じられないが、本機は&#039;&#039;&#039;内蔵関数を使用して演算すると、その前に実行した演算結果を忘れる&#039;&#039;&#039;。例えば&amp;amp;nbsp;&amp;lt;math&amp;gt;5+\sin 30^\circ&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算すべく&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とキーインしても&amp;lt;code&amp;gt;5.49999&amp;lt;/code&amp;gt;ではなく&amp;amp;nbsp;&amp;lt;math&amp;gt;\sin 30^\circ&amp;lt;/math&amp;gt;&amp;amp;nbsp;だけを演算した結果である&amp;lt;code&amp;gt;0.49999&amp;lt;/code&amp;gt;を出力し、&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;を加えない。この場合は&amp;amp;nbsp;&amp;lt;math&amp;gt;\sin 30^\circ +5&amp;lt;/math&amp;gt;&amp;amp;nbsp;と項を入れ替えて演算する必要がある。&lt;br /&gt;
&lt;br /&gt;
その理由は、本機の内蔵関数のうち三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;・常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;・自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\ln&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を使用する&amp;lt;ref name=&amp;quot;functions&amp;quot; /&amp;gt;と、その&#039;&#039;&#039;前に実行した演算結果&#039;&#039;&#039;(上記の例で言えば&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;)&#039;&#039;&#039;を格納しているレジスタを、これら内蔵関数を内部で演算する際のワーキングレジスタとして使用するため上書きしてしまう仕様&#039;&#039;&#039;だからだ。しかも本機には&#039;&#039;&#039;メモリが実装されてない&#039;&#039;&#039;ので、これら内蔵関数を使用する前に、直前の演算結果をメモリに退避(記憶)させることもできない。八方塞がりである。&lt;br /&gt;
&lt;br /&gt;
これら「ワンチップ化に拘ったことでワーキングレジスタやメモリを十分用意できなかったのではないか？」と悪態のひとつも吐きたくなる仕様が、本機に致命傷を負わせた。関数電卓ユーザがふつうに希望するであろう&#039;&#039;&#039;内蔵関数を使用しての連続演算ができない&#039;&#039;&#039;からだ。&lt;br /&gt;
&lt;br /&gt;
例えば、本機にも[[HP-45/HP-46|HP-45]]にも内蔵関数として実装されてない[https://en.wikipedia.org/wiki/Hyperbolic_functions 双曲線関数]である&amp;amp;nbsp;&amp;lt;math&amp;gt;\sinh 0.5&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算してみる。&amp;lt;math&amp;gt;\sinh x&amp;lt;/math&amp;gt;&amp;amp;nbsp;は&amp;amp;nbsp;&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;&amp;amp;nbsp;を用いて&amp;amp;nbsp;&amp;lt;math&amp;gt;\sinh x = \frac{e^x - e^{-x}}{2}&amp;lt;/math&amp;gt;&amp;amp;nbsp;と定義されるので&amp;amp;nbsp;&amp;lt;math&amp;gt;\sinh 0.5 = \frac{e^{0.5} - e^{-0.5}}{2}&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算することになるが、本機で右辺を演算するには紙とペンが必要だ。先述したように、本機に実装された自然対数の逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は前の演算結果を格納したレジスタをワーキングレジスタとして使用するため上書きしてしまうので、その前の演算結果が残されない。よって手順は&lt;br /&gt;
&lt;br /&gt;
#&amp;amp;nbsp;&amp;lt;math&amp;gt;e^{0.5}&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算し&amp;lt;code&amp;gt;1.64872&amp;lt;/code&amp;gt;を得るので、&#039;&#039;&#039;この結果をメモする&#039;&#039;&#039;&lt;br /&gt;
#&amp;amp;nbsp;&amp;lt;math&amp;gt;e^{-0.5}&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算&amp;lt;ref name=&amp;quot;chs&amp;quot; /&amp;gt;し&amp;lt;code&amp;gt;0.60653&amp;lt;/code&amp;gt;を得るので、&#039;&#039;&#039;この結果をメモする&#039;&#039;&#039;&lt;br /&gt;
#定義式に&#039;&#039;&#039;メモした結果を代入して四則演算する&#039;&#039;&#039;。即ち&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{AC}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下してオールクリア後に&amp;amp;nbsp;&amp;lt;math&amp;gt;\frac{1.64872 - 0.60653}{2}&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算することで、最終結果の&amp;lt;code&amp;gt;0.521095&amp;lt;/code&amp;gt;を得る&lt;br /&gt;
&lt;br /&gt;
となる。関数電卓で演算しているはずが、途中で結果をメモしなければならず、それを手で再入力して四則演算していることに、なんとも不思議な気持ちになる。&lt;br /&gt;
&lt;br /&gt;
同じ演算を、演算桁数を8桁に設定した[[HP-45/HP-46|HP-45]]で実行しても、そんな気持ちにはならない。手順も[[RPN電卓/序説#動作|通常のRPN関数電卓と同じ]]だ。&lt;br /&gt;
&lt;br /&gt;
#{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とキーインして&amp;amp;nbsp;&amp;lt;math&amp;gt;e^{0.5}&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算、結果である&amp;lt;code&amp;gt;1.64872127&amp;lt;/code&amp;gt;がスタックXにプッシュされることで表示される&lt;br /&gt;
#続けて&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{CHS}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とキーインして&amp;amp;nbsp;&amp;lt;math&amp;gt;e^{-0.5}&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算、結果である&amp;lt;code&amp;gt;0.60653066&amp;lt;/code&amp;gt;がスタックXにプッシュされることで表示されると同時に、先ほどの演算結果(&amp;lt;code&amp;gt;1.64872127&amp;lt;/code&amp;gt;)がスタックYにプッシュされる&lt;br /&gt;
#{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下することでスタックYとスタックXがポップされ「スタックYからスタックXの差」を演算、&amp;lt;code&amp;gt;1.04219061&amp;lt;/code&amp;gt;が得られると同時にこの結果がスタックXにプッシュされることで表示され、スタックYは空になる&lt;br /&gt;
#{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下することでスタックXに&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;がプッシュされ、先ほどの演算結果(&amp;lt;code&amp;gt;1.04219061&amp;lt;/code&amp;gt;)がスタックYにプッシュされる&lt;br /&gt;
#{{keypress|&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下することでスタックYとスタックXがポップされ「スタックYをスタックXで除した商」を演算、最終結果である&amp;lt;code&amp;gt;0.52109531&amp;lt;/code&amp;gt;がスタックXにプッシュされることで表示され、スタックYは空になる&lt;br /&gt;
&lt;br /&gt;
当たり前だが、途中で結果のメモなど不要で、定義式を読み下す順にキーインすれば良い。RPNの面目躍如である。&lt;br /&gt;
&lt;br /&gt;
念のため双曲線関数を単体で内蔵している[[HP-10C/HP-11C/HP-15C|HP-15C]]と[[HP-48SX]]で検算する&amp;lt;ref name=&amp;quot;sinh&amp;quot; /&amp;gt;と、両機とも&amp;lt;code&amp;gt;0.521095306&amp;lt;/code&amp;gt;を出力する。故に、本機と[[HP-45/HP-46|HP-45]]による&amp;amp;nbsp;&amp;lt;math&amp;gt;\sinh 0.5&amp;lt;/math&amp;gt;&amp;amp;nbsp;の演算結果は正しいのだが、このように操作体系を比較してみると「果たして本機を『関数電卓』と言って良いのか？」という疑念が湧く。&lt;br /&gt;
&lt;br /&gt;
なぜなら、&#039;&#039;&#039;内蔵関数を使用して演算すると、その前に実行した演算結果を忘れる仕様だと、その内蔵関数は[[丸善 対数表 七桁|数表]]代わりにしか使えない&#039;&#039;&#039;ことに気付くからだ。&lt;br /&gt;
&lt;br /&gt;
たとえ内蔵関数が基礎的なものだけの関数電卓であっても、それらを使用して連続演算ができるのであれば、何の問題もない。一連の演算が関数電卓だけで完結するからだ。双曲線関数の例を出すまでもなく、高度な関数は基礎的な関数で定義・表現されることが多い。HP製関数電卓もそうだが、現代の関数電卓でも高度な関数の演算は基礎的な関数を連続演算して近似値を求めている。よって、基礎的な関数が誤差を少なく演算できて、かつ、それらの演算結果を順次使用して連続した演算ができるならば、その関数電卓を使う意味は大いに有る。あとは岩波書店の数学公式集[https://www.iwanami.co.jp/book/b257964.html &amp;amp;#8544;][https://www.iwanami.co.jp/book/b257965.html &amp;amp;#8545;][https://www.iwanami.co.jp/book/b257966.html &amp;amp;#8546;]が手許にあれば万全だ。現在販売されているエントリーモデルの関数電卓を使用する際と同じ考えである。&lt;br /&gt;
&lt;br /&gt;
しかし本機のように、内蔵関数を使用した演算を実行すると直前の演算結果(を格納したレジスタ)をクリアしてしまう仕様だと、それらを使用して連続演算ができなので、一連の演算が関数電卓だけで完結しない。&#039;&#039;&#039;1つ1つの値を[[丸善 対数表 七桁|数表]]から引いて手入力するのと同じように、1回1回の演算結果をメモして手入力しなければならないなら、本機を使おうが使わなかろうが、演算完了までに必要な手数が変わらないので、本機を使う意味が見出せない&#039;&#039;&#039;のだ。これが〝なんとも不思議な気持ちになる〟正体である。本機のパンフレットにある「関数はワンタッチ」は「関数キーを押下すれば、本機に内蔵している数表のページを捲って、該当する値を呼び出しますよ」という内容だと理解したほうが合点がいく。しかも本機は先述した通り、基礎的な関数の演算ですら大きな誤差を含む結果を出力してしまうほど演算精度が悪い——これなら最初から使い慣れている[[丸善 対数表 七桁|数表]]を頼りに演算したほうが確実である。&lt;br /&gt;
&lt;br /&gt;
以上から、本機を何日か使用した管理人の感想は&#039;&#039;&#039;「関数電卓を関数電卓たらしめる、これらの内蔵関数を使用しての連続演算ができない時点で、本機は関数電卓ではない。『[[丸善 対数表 七桁|数表]]を内蔵した[[Casio CASIO-MINI CM-605|カシオミニ]]』だな」&#039;&#039;&#039;に落ち着いてしまった。管理人が所有しているカシオミニが、本機発売の1ヶ月前に発売された完全浮動小数点演算が可能な[[Casio CASIO-MINI CM-605|CASIO-MINI CM-605]]であることも相俟って、[[Casio CASIO-MINI CM-605|CASIO-MINI CM-605]]に数表を内蔵することで本機のイメージが出来上がってしまった。尤も、[[Casio CASIO-MINI CM-605|CASIO-MINI CM-605]]の乗除算は最大12桁まで実行できるので、加減乗除算のいずれも8桁までしか実行できない本機のほうが演算可能桁数は狭い。&lt;br /&gt;
&lt;br /&gt;
なお、[[HP-35]]も三角関数を演算する際は最上位のスタックTをワーキングレジスタとして使用するため上書きする仕様だが、それ以外のスタックX・Y・Zには影響が無いため、ここまで酷い状況とはならない。スタックの段数に気をつけていれば、内蔵している関数を使用しての連続演算も可能だ。先述の&amp;amp;nbsp;&amp;lt;math&amp;gt;\sinh 0.5&amp;lt;/math&amp;gt;&amp;amp;nbsp;の演算もスタックXとスタックYの2段しか使わないため[[HP-45/HP-46|HP-45]]での手順がそのまま適用でき、正解である&amp;lt;code&amp;gt;.5210953055&amp;lt;/code&amp;gt;を出力する。そしてこの仕様は、次期機種である[[HP-45/HP-46|HP-45]]では即改善され、以降のすべてのHP製RPN関数電卓では、どの内蔵関数を使用して演算してもすべてのスタックの内容を維持できるようになっている。&lt;br /&gt;
&lt;br /&gt;
寧ろ本機と同じ仕様なのは[[RPN電卓/歴史と現在|1975年に旧ソ連で初めて開発されたポケット関数電卓]]の[http://www.музейкомпьютеров.рф/museum/show_calc.php?n=34 Электроника Б3-18 (Electronika B3-18)]である。旧ソ連は自国の歴史を正確に公表しているとは限らないため、発売時期については眉に唾を塗りたくって評価しなければならないものの、[http://www.музейкомпьютеров.рф/museum/show_calc.php?n=34 Электроника Б3-18 (Electronika B3-18)]の存在自体は[https://www.calculator.org/calculators/Elektronika_B3-18.html 複数の][http://www.calcuseum.com/SCRAPBOOK/BONUS/08333/1.htm Webサイトで][https://ru.wikipedia.org/wiki/Электроника_Б3-18 確認できる]ことと、これらWebサイトでも「概ね1975年に発売された」とされていることから、同時期の日本のポケット関数電卓は旧ソ連製のそれと同等の機能と演算性能であったと言えそうではある&amp;lt;ref name=&amp;quot;ru&amp;quot; /&amp;gt;。この点を考慮すると、少なくとも1970年代前半の日米間には、半導体製造技術やコンピュータ(演算回路)実装技術に関する格差と、関数電卓に対する製品戦略やマーケティングの能力差について、相当な開きがあったと言わざるを得ない。&lt;br /&gt;
&lt;br /&gt;
===ある意味で貴重な遺産===&lt;br /&gt;
現代から本機を冷静に俯瞰すると、これら一連の仕様や演算精度の悪さは、当時のLSI製造技術で叶えられる集積度で、関数電卓をワンチップで実装した(ことを目指した)ゆえに起きた悲劇にしか見えず、結果として、当時のHP製RPN関数電卓が如何に先進的だったかを更に浮き彫りにさせる「引き立て役」を演じさせられているが、当時のカシオ計算機の開発陣は恐らくそんなことは考えておらず、「次期LSIでどう改修しようか」という挑戦の真っ只中だっただろう。関数電卓で採用する規模のLSIでも、日を追う毎に目に見えて進歩する半導体技術の恩恵が得られた時代が産み落とした、日本製ポケット関数電卓黎明期の貴重な遺産である。&lt;br /&gt;
&lt;br /&gt;
ただ、残念ながら、機能からも演算精度からも、本機を現代で常用するのは無理である。管理人が入手した本機は、キーボードの保護フィルムが貼られたままの、コンデョションが極めて良好な機体である。後世に残すため、モスボール化して大切に保存しておく。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= \tan\left (\frac{355}{226}\times\frac{180}{\pi}\right )\mbox{ [deg]}= \tan 90.00002^\circ = 00000000\, \text{(Out of operational range)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 : \text{Can not calculate (under-digit number)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;hp65&amp;quot;&amp;gt;厳密には1974年1月19日に発売された[[HP-65]]も存在したが、これは世界初の可搬型&#039;&#039;&#039;プログラマブル&#039;&#039;&#039;関数電卓であり、プログラム機能が無い本機と直接競合しないため、比較対象外とした。尤も、[[HP-65]]も[[HP-45/HP-46|HP-45]]や[[HP-35]]と同じClassicアーキテクチャなので、本機と比較しても結果は同じである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;chip&amp;quot;&amp;gt;[http://www.calcuseum.com/SCRAPBOOK/BONUS/20935/1.htm μPD179C]がマイクロプロセッサ機能と演算ロジック(ソフトウェア)の格納を、[http://www.calcuseum.com/SCRAPBOOK/BONUS/20934/1.htm μPD175C]がキーボードからの入力やVFD(蛍光表示管)への出力等を、それぞれ担当していると推定されているが、詳細は不明だ。中央に鎮座する東芝製の10ピンのメタルキャンパッケージICである[http://www.calcuseum.com/SCRAPBOOK/BONUS/201790/1.htm T3086D]に至っては何も判らない。机上設置型である[https://funkygoods.com/calc/121_u/121_u.htm CASIO 121-U]にも実装されており、本機では後に[http://keikato.cocolog-nifty.com/blog/2015/06/fx-11fx-10-3d26.html T3184にリプレース]されたようだが、T3184は[http://boombox7.web.fc2.com/162-F/162F_01.htm CASIO-162F]でも実装されているので、カシオ計算機の電卓のアーキテクチャでは共通して使い回せるIC(機能)ということになる。しかし、T3184についても何の情報も得られないため、何も判らないことに変わりはない。ネットは広大だが、まだまだ所々で千切れているようだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;w&amp;quot;&amp;gt;この時期の日本製電卓の表示部はなぜか、電池の電圧だけで点灯できるLED(発光ダイオード)ではなく、駆動方式にも依るものの点灯させるにはDCで12〜25Vほど印加する必要がある＝ポケット電卓であれば内部に昇圧回路(DC-DCコンバータ)を別途設けなければならないVFD(蛍光表示管)を採用し続けた。輸出されたものを含む当時の日本製電卓の特長であり、「表示部がVFDの電卓＝日本製」と判断しても差し支え無いぐらいなのだが、これも消費電力を押し上げる一因である。日本製電卓でLEDを採用したのは、1971年に「世界初のワンチップ電卓」として発売された日本ビジコン製の[http://www.vintagecalculators.com/html/busicom_le-120a_-_le-120s.html Busicom LE-120A]など一部に留まる。消費電力を考えればLEDに分があることは判り切っていたはずだが、当時はLEDよりVFDのほうが部品としても低価格で技術的に熟れていたのだろう。1973年6月にシャープは「世界初のLCD(液晶ディスプレイ)電卓」である[https://jp.sharp/products/lcd/tech/dentaku/story.html EL-805]を発売したが、日本製電卓がLEDを経由せず一足飛びにLCDへ移行するのは、液晶の品質が安定し価格が下がった後の話である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;survey&amp;quot;&amp;gt;管理人は建築や測量の分野にはまったく不案内だが、少なくとも国土交通省国土地理院が所管する国家資格試験たる[https://www.gsi.go.jp/LAW/SHIKEN/past.html 測量士・測量士補試験]において、角度の単位には、度数法も弧度法も出題されている。しかも、小さな角度を記述する際、度数法では六十進法による分秒表記を、弧度法では十進法による小数点表記を、それぞれ使用するようだ。よって、「分秒⇔度数 相互変換」関数の実装は、測量分野からの強い要請(即ち需要)からだと思われる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;functions&amp;quot;&amp;gt;本機マニュアル11ページ「混合計算および応用計算」には『関数キーのうち&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;a^n&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、{{keypress|&amp;lt;math&amp;gt;\sqrt{\vphantom{x}\quad}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は混合計算の一部分として計算できます。』とある。言い換えれば、それ以外の関数である三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;・常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;・自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\ln&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は混合計算(連続演算)に使用できないことになる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;chs&amp;quot;&amp;gt;本機には「置数の正負を反転させる」機能(HP製RPN電卓でいう&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{CHS}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キー、カシオ計算機製電卓でいう&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;(\,-\,)&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーや&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{+} \!\!\! \diagup \!\!\! _{-}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キー)も実装されてないので、&amp;lt;math&amp;gt;0 - 0.5 = -0.5&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算させて羃指数を「作る」必要がある。しかも本機は、整数部がゼロの小数を入力する際は整数部のゼロも必ずキーインする必要があり、HP製RPN電卓のように整数部のゼロの入力を省略できない。よって、本機で&amp;amp;nbsp;&amp;lt;math&amp;gt;e^{-0.5}&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算するには&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{AC}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とキーインすることになる。地味に面倒だ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sinh&amp;quot;&amp;gt;第三世代(Voyager)と第四世代(Saturn)で差があるか確認するため両機で検算した。&amp;lt;br&amp;gt;なお、第三世代(Nut)である[[HP-41CX]]は単体だと双曲線関数を直接演算できないが、HP-41シリーズ用数学・統計拡張モジュールである[[HP 5061-7287]]を装着すれば双曲線関数を演算できる。このモジュールのマニュアルに依ると&amp;amp;nbsp;&amp;lt;math&amp;gt;\sinh x = \frac{1}{2} \left [ e^x -1 + \frac{e^x - 1}{e^x}\right ]&amp;lt;/math&amp;gt;&amp;amp;nbsp;で演算しているそうだ。右辺は通分して整理すれば&amp;amp;nbsp;&amp;lt;math&amp;gt;\frac{e^{2x} - 1}{2e^x}&amp;lt;/math&amp;gt;&amp;amp;nbsp;となるため定義式のひとつに戻せるのだが、ここまでして&amp;amp;nbsp;&amp;lt;math&amp;gt;e^x-1&amp;lt;/math&amp;gt;&amp;amp;nbsp;を共通因数として括り出している理由は不明だ。HP-41シリーズで&amp;amp;nbsp;&amp;lt;math&amp;gt;e^x-1&amp;lt;/math&amp;gt;&amp;amp;nbsp;の演算に時間が掛かる訳でもなく、この演算をサブルーチン化してこのモジュールに含まれる他の関数でも流用している訳でもなく、それよりなにより&amp;amp;nbsp;&amp;lt;math&amp;gt;\cosh x&amp;lt;/math&amp;gt;&amp;amp;nbsp;は本来の定義式と同じ&amp;amp;nbsp;&amp;lt;math&amp;gt;\cosh x = \frac{e^x + e^{-x}}{2}&amp;lt;/math&amp;gt;&amp;amp;nbsp;で演算しているので尚更である。尤も、定義式と合っているため、本モジュールを使用した双曲線関数の演算結果は正しい。本文で記載した&amp;amp;nbsp;&amp;lt;math&amp;gt;\sinh 0.5&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算しても[[HP-10C/HP-11C/HP-15C|HP-15C]]と[[HP-48SX]]で検算したのと同じ&amp;lt;code&amp;gt;0.521095306&amp;lt;/code&amp;gt;を出力する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ru&amp;quot;&amp;gt;当然、これらWebサイトが旧ソ連の政権寄りの市民により作成・公開されていて、そのとき本国からの指示や意図を混入させている可能性は否定はできないのだが、それを言い始めると切りがないので、ひとまず掲載されている内容を援用することにした。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=Casio_CASIO-MINI_CM-605&amp;diff=6831</id>
		<title>Casio CASIO-MINI CM-605</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=Casio_CASIO-MINI_CM-605&amp;diff=6831"/>
		<updated>2026-03-20T00:36:48Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1974年4月にカシオ計算機が定価8,900円で販売した中置記法の四則演算電卓で、かの有名な[https://ja.wikipedia.org/wiki/カシオミニ カシオミニ]の6代目である。&lt;br /&gt;
&lt;br /&gt;
本機は中置記法の電卓なので、働き出してRPN電卓ユーザとなった現在の管理人には中置記法の電卓が使えなくなる能力が身に付いてしまい使い難いことこの上ないが、このWebサイトでは再三指摘している通り、電卓という製品に触れる際は避けて通れない歴史的名機であるため、番外として記載する。&lt;br /&gt;
&lt;br /&gt;
四則演算に何の問題も無い。ただし、演算結果が表示されるまでタイムラグがある。加減算はほぼ無いが、乗除算はたとえ乗数や除数が&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;であっても全桁の蛍光表示管が0.2〜0.3秒ほど点滅した後となる。消費電力を抑えるためにワンチップLSIのクロック周波数を切り下げた&amp;lt;ref name=&amp;quot;clock&amp;quot; /&amp;gt;が故の挙動で、現代の四則演算のみの電卓では見られないが旧い電卓では間々見られたもので、管理人は懐かしく思い出した。&lt;br /&gt;
__TOC__&lt;br /&gt;
===電卓戦争が産み出した化け物===&lt;br /&gt;
1960年代後半から1970年代中盤にかけて、日本国内では電卓の開発・製造・販売が最盛期を迎えた。1991年7月28日にNHK総合テレビで放送された[https://www.nhk.or.jp/archives/chronicle/detail/?crnid=A199107282100001300100 『電子立国 日本の自叙伝 第4回 電卓戦争』]に依れば、大・中・小・零細合わせて、一時は50社を越える企業が参入していたという。&lt;br /&gt;
&lt;br /&gt;
コモディティ化した製品に関する資本主義経済下での企業間競争は、最終的に「価格」で勝敗が決まる——50社も参入したことで売り場に溢れた四則演算のみの電卓は瞬く間にコモディティ化してしまい、やがて猛烈な値下げ競争に突入した。後に&#039;&#039;&#039;電卓戦争&#039;&#039;&#039;と呼ばれるこの競争は、技術力と資本力が尽きた企業から順に電卓市場から強制退場させられると同時に膨大な額の負債を手にすることになる。先の番組でも[http://www.dentaku-museum.com/calc/calc/17-teal/teal/teal.html 東京電子応用研究所]社長だった小平均氏が「電卓戦争の敗者は悲惨でした」と語っている。&lt;br /&gt;
&lt;br /&gt;
この戦争が産み出した化け物がカシオミニである。&lt;br /&gt;
&lt;br /&gt;
生きるか死ぬかの二者択一しかない戦場で勝ち残るべく、四則演算のみの電卓を企業(エンタープライズ)ではなく個人(コンシューマ)にまで普及させる〝電卓のパーソナル化〟戦略を採ったカシオ計算機は「電卓を『個人』に買ってもらうには、1台の価格は1万円だ」と考え、&#039;&#039;&#039;販売価格からスペックを逆算&#039;&#039;&#039;した電卓の開発を決める。初代の開発に着手した1971年時点でのLSI実装技術も鑑みて、&lt;br /&gt;
&lt;br /&gt;
*6桁の加減算、最大12桁の乗除算&lt;br /&gt;
*小数点の演算なし&lt;br /&gt;
*ワンチップMOS LSIで実装&lt;br /&gt;
*パネルスイッチの採用&lt;br /&gt;
*単3電池で10時間連続使用可能&lt;br /&gt;
*想定原価は4,500円程度&lt;br /&gt;
&lt;br /&gt;
と、これまで当たり前のように「四則演算のみの電卓＝小数点付き8桁」だったスペックを覆し、徹底的に低価格化を志向した。その後のカシオミニシリーズでは小数点の演算は実装されるようになったものの、原価と連続使用時間以外はこのスペックを踏襲した。先述の通り本機は6代目にあたるが、マニュアルに依ると、単3電池での連続使用時間がマンガン電池で25時間、アルカリ電池で50時間まで伸びている。これは演算回路の性能とpMOS LSI実装技術の向上がもたらしたものだ。&lt;br /&gt;
&lt;br /&gt;
さりとて、マニュアルや本体背面の銘版によれば、本機の消費電力は0.18Wとある。専用ACアダプタの出力電圧は4.5Vなので、消費電流は蛍光表示管を含む全体で40mAとなるが、現代から観ると電池だけで駆動させるのが不安になるほど大電流である。電卓専用に洗練し切った演算回路を極小のLSIに焼き付け、液晶ディスプレイを採用することで、100mm&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;程度の太陽電池だけで駆動できる現代の四則演算のみの電卓は、外部からは計測不能なほど消費電力が少ない(μWオーダ)ので、まさに雲泥の差である。&lt;br /&gt;
&lt;br /&gt;
===加算器方式から中置記法へ===&lt;br /&gt;
カシオミニの影響で触れなければならないことに「中置記法の普及」がある。&lt;br /&gt;
&lt;br /&gt;
[[RPN電卓/序説|序説]]でも記載したように、カシオミニも初代と2代目は加算器方式だったが、〝電卓のパーソナル化〟を目指したカシオ計算機は中置記法への移行を決断、3代目から中置記法へ移行している。6代目である本機も当然ながら中置記法で、マニュアルにわざわざ『数式通りの操作ができる』と記載していることから、当時はまだ加算器方式と中置記法の電卓が家庭内でも混在していたことと、中置記法を採用したこと自体がアピールポイントになっていることが判る。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
本機はある日、管理人が何とはなしに国内のオークションサイトを眺めていたところ、日焼けもなく手垢も付いてない、ほぼ新品の完動品が、化粧箱・マニュアル・保証書(無記名)・携帯用ビニルケース(未使用)の一式がすべて揃い、かつ、当時は別売だった専用ACアダプタ(AD-4145)も附属しているにもかかわらず、非常に低価格で出品されていたのを発見したため、その場で落札した。&lt;br /&gt;
&lt;br /&gt;
どうやら前のオーナは本機に1度も電池を入れずACアダプタだけで使用していたらしく、電池ボックスが蓋も含め極めて綺麗で、接点には腐食どころか電池を出し入れすれば必ず付くはずの擦過痕すら無い。本機が発売された[https://nenji-toukei.com/n/kiji/10023 1974年の平均月給は115,200円]だそうなので、本機の定価が8,900円だったことを考えると、大切に使用するためにこのような選択をしたようだ。[[HP-25]]のようにACアダプタだけで使用すると必ず故障してしまう訳ではなく、マニュアルにもACアダプタだけで使用できることは明記されているため、この選択は正しい。この選択が、製造から40年以上経過した本機のコンディションを良好な状態に維持させたのだろう。大概は碌なものしか出品されない国内のオークションサイトでも極く稀にこのような掘り出し物に巡り合うため、なかなか侮れない。&lt;br /&gt;
&lt;br /&gt;
なお、本機について[https://kaden.watch.impress.co.jp/docs/readers/memories/643957.html 「&amp;lt;math&amp;gt;0 \div 0 = 123456\dots&amp;lt;/math&amp;gt;と表示する」]という情報があるが、管理人の手許にある機体(シリアル番号:5126124)では、被除数が&amp;amp;nbsp;&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&amp;amp;nbsp;を含むすべてのゼロ除算で、最初の6桁は&amp;lt;code&amp;gt;000000&amp;lt;/code&amp;gt;が、下位桁呼び戻しキー&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\blacktriangleright&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下し続けると、被除数を左詰めで表示し最下位桁から1ずつ加算する&amp;lt;ref name=&amp;quot;zerodiv&amp;quot; /&amp;gt;様子が表示されるため、本機の製造途中でワンチップLSIが更新されている可能性がある。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
下記に本機のマニュアル1ページから規格を転載する。一部に誤記がある(…と：が混在している)が、そのままとしている。&lt;br /&gt;
----&lt;br /&gt;
;型式&lt;br /&gt;
:ミニ CM-605&lt;br /&gt;
;計算機能&lt;br /&gt;
:加減算、乗算、除算、連乗連除算、小数点付計算、自動定数計算(四則)、負数計算および混合計算&lt;br /&gt;
;計算桁数&lt;br /&gt;
:表示6桁、加減算6桁±6桁＝整数部最大7桁、小数部含み最大12桁、乗算6桁×6桁＝最大12桁、除算6桁÷6桁＝有効数字6桁&lt;br /&gt;
;計算方式&lt;br /&gt;
:数式通りの操作ができる&amp;lt;br&amp;gt;整数部優先アンダーフロー方式&lt;br /&gt;
;小数点方式&lt;br /&gt;
:完全浮動小数点方式&lt;br /&gt;
;負数表示&lt;br /&gt;
:最上桁または最下桁にマイナスサイン付の真数表示&lt;br /&gt;
;オーバーフローチェック方式&lt;br /&gt;
:答え表示後 演算停止&lt;br /&gt;
;表示&lt;br /&gt;
:緑の蛍光表示管使用&lt;br /&gt;
;主要素子&lt;br /&gt;
:ワンチップLSI&lt;br /&gt;
;電源&lt;br /&gt;
:AC…専用ACアダプター使用 100V±10V&amp;lt;br&amp;gt;DC：単3型乾電池4本 連続使用時間 高性能マンガン乾電池で約25時間 アルカル乾電池で約50時間(ただし、表示8888、温度約20℃にて)&lt;br /&gt;
;消費電力&lt;br /&gt;
:0.18W&lt;br /&gt;
;使用温度&lt;br /&gt;
:0℃〜40℃&lt;br /&gt;
;外型寸法&lt;br /&gt;
:幅147×奥行72×高さ30mm&lt;br /&gt;
;重さ&lt;br /&gt;
:222g(本体162g・電池60g)&lt;br /&gt;
;付属品&lt;br /&gt;
:携帯用ケース、高性能マンガン乾電池4本&lt;br /&gt;
;別売品&lt;br /&gt;
:専用ACアダプター AD-4145(価格1,200円)&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;clock&amp;quot;&amp;gt;恐らく10kHz近辺だと思われる&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;zerodiv&amp;quot;&amp;gt;たとえば円周率&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;の概数をゼロ除算させるべく&amp;amp;nbsp;&amp;lt;math&amp;gt;3.14 \div 0&amp;lt;/math&amp;gt;&amp;amp;nbsp;を本機で演算すると、最初の6桁は&amp;lt;code&amp;gt;000000&amp;lt;/code&amp;gt;が、{{keypress|&amp;lt;math&amp;gt;\blacktriangleright&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下し続けると被除数から小数点を省いた&amp;lt;math&amp;gt;314&amp;lt;/math&amp;gt;を左詰めで嵌め込んだ&amp;lt;code&amp;gt;314000&amp;lt;/code&amp;gt;に対して高速で1ずつ加算している様子が、それぞれ表示される。この挙動を止めるにはオールクリアキー&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {AC}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下せねばならず、裏を返せば、{{keypress|&amp;lt;math&amp;gt;\text {AC}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下するまで延々と1加算を続けるため、意図なくゼロ除算を実行したまま本機を放置するとバッテリを無駄に消費することになる。&amp;lt;br&amp;gt;よって、ゼロのゼロ除算である&amp;amp;nbsp;&amp;lt;math&amp;gt;0 \div 0&amp;lt;/math&amp;gt;&amp;amp;nbsp;を本機で演算すると、最初の6桁は&amp;lt;code&amp;gt;000000&amp;lt;/code&amp;gt;が、&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\blacktriangleright&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下し続けると&amp;lt;code&amp;gt;000000&amp;lt;/code&amp;gt;に対して高速で1ずつ加算している様子が、それぞれ表示されることになる。&amp;lt;br&amp;gt;試しに、本機の除算できる範囲の上限値をゼロ除算する、即ち&amp;amp;nbsp;&amp;lt;math&amp;gt;999999 \div 0&amp;lt;/math&amp;gt;&amp;amp;nbsp;を本機で演算すると、最初の6桁は&amp;lt;code&amp;gt;000001&amp;lt;/code&amp;gt;が、&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\blacktriangleright&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下し続けると&amp;lt;code&amp;gt;000000&amp;lt;/code&amp;gt;に対して高速で1ずつ加算している様子が、それぞれ表示される。これは、冒頭のゼロ除算例から容易に推定できる通り、&amp;lt;math&amp;gt;999999&amp;lt;/math&amp;gt;&amp;amp;nbsp;に対して1ずつ加算するため、すぐ繰り上がり&amp;amp;nbsp;&amp;lt;math&amp;gt;1000000&amp;lt;/math&amp;gt;&amp;amp;nbsp;となることから、最初の6桁を表示する時点で&amp;lt;code&amp;gt;000001&amp;lt;/code&amp;gt;を表示することになるからだ。&amp;lt;br&amp;gt;なお、なぜゼロ除算時にこのような挙動となるか、その理由は不明である。除算は減算の繰り返しなので、百歩譲って「1ずつ減算し続ける」なら、納得できるかは別として、理解はできそうなのだが。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=RPN%E9%9B%BB%E5%8D%93/%E6%AD%B4%E5%8F%B2%E3%81%A8%E7%8F%BE%E5%9C%A8&amp;diff=6830</id>
		<title>RPN電卓/歴史と現在</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=RPN%E9%9B%BB%E5%8D%93/%E6%AD%B4%E5%8F%B2%E3%81%A8%E7%8F%BE%E5%9C%A8&amp;diff=6830"/>
		<updated>2026-03-19T23:38:35Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|frame=1}}&lt;br /&gt;
&lt;br /&gt;
RPN電卓を継続して開発・製造しているのが[https://en.wikipedia.org/wiki/Hewlett-Packard Hewlett-Packard Company](以降HPと略す)だけである以上、RPN電卓の歴史は、HPによる電卓の歴史とほぼ同じとなる。&lt;br /&gt;
&lt;br /&gt;
とはいえ、RPN電卓はHPの専売特許ではなく、事例は非常に少ないものの、HP以外の企業も開発・販売していた。特に有名なのが[https://ru.wikipedia.org/wiki/Военно-промышленный_комплекс_СССР 旧ソ連の軍産複合体]で製造された[https://ru.wikipedia.org/wiki/Электроника_(торговая_марка) Электроникаシリーズ]だろう。理由は不明だが、旧ソ連は、当時の衛星国であった[https://en.wikipedia.org/wiki/East_Germany 旧東ドイツ(ドイツ民主共和国)]からわざわざエンジニアを招聘してまで多機種のRPN関数電卓を開発・製造・販売していた。インターネットのお陰で通販の商圏がグローバルとなった現在では、どこで埃を被っていたのか、そのとき製造されたデッドストックの新品が旧東欧諸国から捨て値同然の価格で売り出されており、管理人もいくつか購入した。&lt;br /&gt;
&lt;br /&gt;
以下では、HPの電卓の歴史と、謎が多い旧ソ連の電卓の歴史について、その概略を述べる。&lt;br /&gt;
__TOC__&lt;br /&gt;
==HPの電卓の歴史==&lt;br /&gt;
電卓が発明された直後から黎明期には様々なメーカから様々な記法で生産・販売されたものの、半導体が未成熟で高価だった初期は加算器方式が、熟れて価格が下がってからは中置記法が大勢を占めており、グローバルな視点からもRPNは普及しなかった&amp;lt;ref name=&amp;quot;war&amp;quot; /&amp;gt;。[[RPN電卓/序説|先述]]したとおり、RPNでは必ずスタック用にメモリを多数実装しなければならないが、半導体にしろ磁性体にしろ、電卓黎明期のハードウェア製造技術では部品としてのメモリが非常に高価だったため、メモリの実装数に比例して製品の販売価格が吊り上がることになるからだ。そのため、黎明期の電卓にはメモリそのものが無く、その後も加算器方式や中置記法の電卓でも必要最低限しか実装されなかった。&lt;br /&gt;
&lt;br /&gt;
そんな情勢であるにもかかわらず、1968年にHPから発売された世界初の関数電卓である[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]はRPNを採用した。販売価格が4,900ドル(当時の為替相場で1,764,000円。以降同じ)と非常に高価である&amp;lt;ref name=&amp;quot;9100a&amp;quot; /&amp;gt;から許されたのかもしれないが、HPは「RPNが合理的だ」と判断したのだ。&lt;br /&gt;
&lt;br /&gt;
それには理由がある。[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]の開発に当たりHPが目指したのは、当時高価だった「ミニコンピュータの小型化・低廉化」だからだ。具体的には、ミニと言ってもその大きさが「フルハイトの19インチラックが数本」という規模のミニコンピュータを「開発を指揮したHPの創業者である[https://en.wikipedia.org/wiki/Bill_Hewlett Bill&amp;amp;nbsp;Hewlett]の秘書が使用しているL字型の机のタイプライタ置き場&amp;lt;ref name=&amp;quot;desk&amp;quot; /&amp;gt;に置ける程度」に収め、「販売価格は5,000ドル程度」とすることが目標とされた。そのためには、演算アーキテクチャと各関数の演算アルゴリズムの規模を極限まで簡素化しつつも、演算精度はミニコンピュータと同等以上を維持するのが絶対条件となるが、1960年代後半のHPの開発陣が、その時代に存在した技術力とハードウェア(部品)の価格を冷静に俯瞰し、あらゆるコストを勘案した結果、[[RPN電卓/序説|序説]]でも触れた「中置記法→RPN変換」等の余計な機能を全て排し、ハード・ソフト両方の規模を極小化する＝開発と製造に掛かるコストを極小化するために、[https://en.wikipedia.org/wiki/Computer_engineering 計算機工学]で最も基本的な実装であり動作原理である&#039;&#039;&#039;RPNを採用せざるを得ない&#039;&#039;&#039;という結論に至ったのである。間違ってもHPが&#039;&#039;&#039;好んでRPNを採用した訳ではない&#039;&#039;&#039;ことは強調しておかねばならない。&lt;br /&gt;
&lt;br /&gt;
それは[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]のマニュアルを読むだけでも強く感じる。HP 9100A Operating and Programming Manualは、販売価格に見合うとは思えぬ、表紙を含めてもたった34ページしかないパンフレット然とした小冊子だが、ここではRPNを採用した利点はおろか、操作体系がRPNであることの説明&amp;lt;ref name=&amp;quot;description&amp;quot; /&amp;gt;はもちろん、RPNやスタック&amp;lt;ref name=&amp;quot;stack&amp;quot; /&amp;gt;という単語も一切記載しておらず、「関数電卓の操作は、こういうものなんです」と然も当たり前のようにスタックの概念とRPNの操作をさらっと5ページで説明し、それ以降はレジスタ(スタック)と内蔵関数の使い方とプログラミングの説明と技法に終始する、という内容である。それ故、中置記法の電卓を使用した経験がある購入者がこのマニュアルを読むと、操作体系が異なることについて何の説明も無いため、妙な読後感を抱くことになる。なぜなら、演算する式を分解する役割が人間であることを購入者が気付かぬように、言い換えると、RPNを採用していることが購入者に露呈しないよう、用意周到に書かれた不自然な文章の塊だからだ。尤も、計算機工学を学んだ購入者なら文章の意図に気付く書き方はしており、初めて関数電卓に触れる購入者なら先入観なしに「関数電卓ってのは、こう操作するものなんだな」とRPNの概念と操作を学ぶ書き方ではあるのだが、どちらにしろ最終的には、電卓はRPNしか使えない体にされてしまったであろうことは想像に難くない。なお、[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]が「世界初の関数電卓」とカテゴライズされるようになったのは、実装された機能と関数から定義付けされた、後付けの結果論である。&lt;br /&gt;
&lt;br /&gt;
こうした事情で世に出た『RPN電卓』というマイノリティが現在まで一部で熱狂的な支持を受け生き長らえた一因は、[[RPN電卓/序説|序説]]でも述べた通り「RPNという概念が元来持つポテンシャル」であることを否定できる者は居ないだろう。ただ、世間一般の大半は数式の読解を中置記法で学んでいるので、技術的・価格的制約が原因とはいえRPNだけを押し付けるのは気が引ける…そんなHPのジレンマが、[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]が成功した後、机上設置型関数電卓の第二世代として1971年に発売した[https://www.hpmuseum.org/hp9810.htm HP 9810A]では引き続きRPNを採用したにもかかわらず、その後、1972年に発売した[https://www.hpmuseum.org/hp9820.htm HP 9820A]と1973年に発売した[https://www.hpmuseum.org/hp9805.htm HP 9805A]では立て続けに中置記法を採用したことからも透けて見える&amp;lt;ref name=&amp;quot;hp35&amp;quot; /&amp;gt;。「ハード・ソフト両面で技術的・価格的制約が緩くなってきた今のうちなら、関数電卓の操作方法を、他社と同じ中置記法へ移行できるのではないか？」。しかし、HPはRPNを切り捨てられなかった。1976年に発売した第三世代である[https://www.hpmuseum.org/hp9815.htm HP 9815A]で再びRPNに戻したのだ。「RPNを切り捨てて中置記法へ移る好機を読み誤った」と言ってしまえばそれまでで、その正確な理由は外部に漏れ伝わってないものの、[https://www.hpmuseum.org/hp9815.htm HP 9815A]のスペックが、その間にHPから販売され大成功を収めた[[HP-35]]や[https://www.hpmuseum.org/hp29.htm HP-29C]等のポケットRPN関数電卓の操作方法と使用感を統一すべく、演算ロジック(ソフトウェア)を3段スタックから4段スタックへ、キーボードの配置をポケットRPN関数電卓に似せたものへ、それぞれ変更していることからも、関数電卓の先駆者となってしまったHP自身ですら、苦肉の策で採用したRPNの虜になっていく過程が窺えて興味深い。[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]を販売して8年という歳月は、RPN中毒に冒された関数電卓ユーザを市中に増殖させるには十分過ぎる時間であり、新規開発が可搬型のみとなった後のHPにも、中置記法の関数電卓と並行してRPN関数電卓を新規開発・販売させた原動力は、こういった〝RPNの魔力〟にあったと管理人は考えている。&lt;br /&gt;
&lt;br /&gt;
ちなみに、HPでは現在に至るまで一貫して、関数電卓の正式名称を「Calculator:カリキュレータ」としている。即ち、入力方式がRPNだろうと中置記法だろうと加算器方式だろうと、[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]から始まる机上設置型関数電卓は「デスクトップ・カリキュレータ」、[[HP-35]]から始まる可搬型関数電卓は「ポケット・カリキュレータ」である。その理由は、「世界初の関数電卓」である[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]を発売する際、Bill&amp;amp;nbsp;Hewlettが[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html そう決めた]からである。&lt;br /&gt;
 &#039;&#039;&#039;&#039;&#039;&amp;quot;If we had called it a computer, it would have been rejected by our customer&#039;s computer gurus because it didn&#039;t look like an IBM,&amp;quot; Bill Hewlett once remarked. &amp;quot;We, therefore, decided to call it a calculator and all such nonsense disappeared.&amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(「もし我々がそれを『コンピュータ』と呼んだら、それはIBMのコンピュータと同じようには見えないので、お客様のコンピュータ担当者に拒否されたでしょう」とBill&amp;amp;nbsp;Hewlettはかつて述べた。「そこで我々はそれを『カリキュレータ』と呼ぶことにして、そういった難癖を付けられないようにしたのです。」)&#039;&#039;&lt;br /&gt;
しかし、当時のHPの本業は「電気・電子計測機の製造・販売」であったため、HP自身は「カリキュレータ」というカテゴリの製品群を、自社の主力製品である高精度な電気・電子計測機で得られた結果を基に高精度な演算結果を科学者やエンジニアに提供するための付属品と考えていたようだ。そもそもHPが1966年に初めて顧客へ販売したミニコンピュータ・[http://hpmuseum.net/display_item.php?hw=95 HP 2116A]は[https://www.hpe.com/us/en/about/history/innovation-gallery/001-product.html 自社製の電気・電子計測機を遠隔操作して計測結果を収集し、それらの値からユーザが組んだFORTRANプログラムに従って演算後、その結果を出力する]ために開発・製造されたものであったり、Bill&amp;amp;nbsp;Hewlettが[[HP-35]]を開発させた直接の動機が「[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]が胸ポケットに入れば、HP社内で使うのに便利だ」というものだったことにも、その思考が表れている。「社内で製品開発するのに、ミニコンピュータと同等の高精度な演算がその場でできれば嬉しいだろ？」という意図での発言だろう。つまり、HPとしては、自社の主力製品である電気・電子計測機で顧客が得た計測値がそのまま利用される場面は少なく、その計測値に対して顧客が何等らかの演算を実行して得た値を使用していることに着目し、「だったら、その演算も正確に実行できる『&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;追加装備&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;オプションパーツ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;』として、コンピュータやカリキュレータも自社で用意すれば良い」と考えたに過ぎず、あくまで電気・電子計測が主、そこから発生する演算は従だったのだが、そんなHPの思惑とは無関係に、ミニコンピュータを出自としているが故の高精度な演算が功を奏してHPのカリキュレータは評判となり、必ずしも自社の主力製品である電気・電子計測機のユーザに追加装備として売れただけではなく、それ以外の科学者やエンジニアに「関数電卓」という単体の製品として多数売れることになる。オプションパーツが主力製品へ化けたのだ。&lt;br /&gt;
&lt;br /&gt;
これを受け、HPは電卓事業への本格参入を決断するのだが、その事業戦略は、当時の他の電卓メーカとは一線を画したものであった。即ち、「他社との競争に打ち勝つべく、無闇矢鱈に多機種を粗製濫造する」のではなく、「ある程度絞った用途に向けた少量機種を、ハードウェアもソフトウェアも自社で開発・製造し、販売価格に見合う性能と品質を担保する」という、1960年代後半〜1970年代前半のアメリカ的生活様式を前提とした大量生産・大量消費から距離を置いた、地に足がついたものであった。そのため、HPのRPN関数電卓は製品寿命が長く、1機種を最短でも2〜3年間、最長では40年以上継続して製造・販売している。また、予想だにしなかった[[HP-35]]の大成功を教訓に、今後起きるであろう電卓の可搬化を見据え、いずれ価格勝負となるのが必定の四則演算のみの電卓には見向きもせず、従来からの自社の強みでありブランド化にも成功した、高精度・高機能演算が売りの机上設置型RPN関数電卓をいち早く可搬型へ換骨奪胎することで、電卓市場のうち「高精度・高機能関数電卓の分野でデファクトスタンダードの地位を確保する」ことを目指したのだ。事実、電卓事業からいったん撤退する2001年末までのHPは、四則演算のみの電卓を自社開発・製造していない&amp;lt;ref name=&amp;quot;simple&amp;quot; /&amp;gt;。四則演算のみの電卓をターゲットにした電卓戦争を勝手に起こして勝手に雌雄を決するつもりだった同時期の日本メーカとは、電卓市場に対する視座がまったく異なっていた&amp;lt;ref name=&amp;quot;viewpoint&amp;quot; /&amp;gt;ことになるが、電卓が主力製品である電卓専業メーカのように薄利多売を競わねばならない理由が皆無であるが故の「醒めた戦略」とも言える。&lt;br /&gt;
&lt;br /&gt;
電卓戦争中も終戦後も、日本を含め世界中のメーカから関数電卓は発売されたが、「RPNでは販売価格が高価になる」という状況は、半導体メモリが低廉化する2000年代まで変わらなかった。故に、他社は押し並べて中置記法を採用、HPも中置記法の関数電卓を開発・製造したものの、それでもRPN関数電卓を継続して開発・製造するのはHPのみとなり、RPNは電卓界でマイノリティと化してしまう。&lt;br /&gt;
&lt;br /&gt;
2001年末、このときHPの最高経営責任者に就任したのが、極端な人員削減と先見性も脈絡も皆無の事業戦略を乱発、その内容を検証された後年に「企業を衰退させる経営の典型例」とまで断言された、悪名高い&lt;br /&gt;
[https://en.wikipedia.org/wiki/Carly_Fiorina Carly&amp;amp;nbsp;Fiorina]だった。彼女はまるで当然のように電卓事業からの撤退を決定。しかも撤退方法が「電卓事業の他社への譲渡または売却」ではなく「事業部門まるごと閉鎖、従業員は全員解雇」という極端な内容だったことに世界は驚き、33年の歴史を強制的に終幕してしまった。もし成立していればHPにも多少なりとも実入りがあったと思われるが、なぜ電卓事業を他社へ譲渡もしくは売却しなかったのかは今も謎である。&lt;br /&gt;
&lt;br /&gt;
しかし、このニュースへの反響とRPN電卓を熱望するユーザの声はあまりに大きく、HPは2003年に電卓事業に再参入する羽目になり、現在も細々とではあるが電卓事業を運営している。なぜ細々となのかは後述する。&lt;br /&gt;
&lt;br /&gt;
==旧ソ連の電卓の歴史==&lt;br /&gt;
電卓の黎明期である1960〜1970年代に理学や工学の分野を圧倒的にリードしていたのはアメリカとソ連だが、両国の有り様は正反対であった。民主主義・資本主義のアメリカは、基本的に、税金が投入された国家的プロジェクトは成否関わらず広く自国民を含む世界中に公開しており、現在でも(資料が散逸していなければ)時系列に沿って閲覧できるが、社会主義・共産主義のソ連は悉く逆を行った。新聞・ラジオ・テレビを含む全ての報道機関はソ連共産党の管制下に置かれ、自国民はもちろん、連邦国や衛星国、仮想敵国である資本主義国を含む諸外国には、慎重かつ厳重に検閲された内容が公式見解として“広告”されるに留まった。存在が噂される国家プロジェクトや組織は存在自体を否定するのが通例で、もし成功したとしても、それが「自国と連邦国と衛星国の国民の士気を鼓舞し、社会主義・共産主義の勝利を世界中に喧伝できる」ものでなければ非公開とされた。その好例が、月探査をはじめとする[https://en.wikipedia.org/wiki/Space_Race 宇宙開発競争]と、核弾頭と搭載した大陸間弾道弾による先制攻撃を主目的とする[https://en.wikipedia.org/wiki/Arms_race 軍備開発競争]だが、この2例ですら、華々しい成功だけが都合良く改竄されたうえで“広告”され、失敗や都合の悪い点は全て[https://en.wikipedia.org/wiki/Iron_Curtain 鉄のカーテン]の裏に隠されていたのはご存知の通りだ。&lt;br /&gt;
&lt;br /&gt;
そのソ連も1991年12月25日に[https://ru.wikipedia.org/wiki/Распад_СССР 崩壊]した。当時のソ連共産党書記長であった[https://ru.wikipedia.org/wiki/Горбачёв,_Михаил_Сергеевич &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Михаил&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ミハイル&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Горбачёв&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ゴルバチョフ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]が実施した[https://ru.wikipedia.org/wiki/Перестройка &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Перестройка&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ペレストロイカ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;(再構築)]と[https://ru.wikipedia.org/wiki/Гласность &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Гласность&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;グラスノスチ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;(情報公開)]による民主主義化が引き金となったのだが、殊に&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Гласность&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;グラスノスチ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;が資本主義諸国の理学・工学の分野に与えた影響は大きかった。当然、あらゆる事項が全て正確に公開されたと認識するのは早計だが、そういった事情を差っ引いても、ソ連崩壊後に分離・独立した元連邦国や衛星国から自然と漏れ出す、それらの国々の間に厳然とあった理学・工学に関する想像以上の格差は、アメリカや日本を含む資本主義諸国に強烈なカルチャーショックを与えた。片やソ連では、[https://ru.wikipedia.org/wiki/Союз_(космический_корабль) 有人宇宙船]と[https://ru.wikipedia.org/wiki/Союз_(ракета-носитель) 打上ロケット]の総称である&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;(連帯)や、[https://ru.m.wikipedia.org/wiki/Ядерное_оружие 核兵器]を開発する能力を持っていたにもかかわらず、片や有力な衛星国だった東ドイツでは、国営企業が製造していた小型乗用車[https://de.wikipedia.org/wiki/Trabant_(Pkw) &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Trabant&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;トラバント&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]が、1958年に空冷2気筒2ストロークエンジンにFRP製ボディという、中型バイクに屋根と座席を強引に載せた玩具のような構造で登場して以降、1度もモデルチェンジされることなく、[https://de.wikipedia.org/wiki/Berliner_Mauer#Mauerfall ベルリンの壁が崩壊]し西ドイツに吸収される1990年まで当たり前のように生産され続けていたりした。即ち、軍事(に直結する)技術の開発には、社会主義・共産主義国家としての威信と矜持を賭けて死に物狂いで資本主義諸国に伍する結果を出すべく総力を注ぎ込むものの、国民の生活で使われる日常必需品には、事実上の鎖国状態となった時点で保有していた技術から進歩するどころか退化していたり、嗜好品に至っては製造すらされなかったことが白日の下に晒されたからだ。市場に競争が無く、情報に格差が有ると、一事が万事、進化は止まりサイロ化する&amp;amp;#x2E3A;勝手に巻き込まれた社会主義諸国の一般国民からすれば堪ったものではないが、約50年に及ぶ「社会主義・共産主義による国家運営」という壮大な社会実験は盛大に失敗したと結論付けて良いだろう。&lt;br /&gt;
&lt;br /&gt;
そんな旧ソ連のコンピュータや電卓に関する情報や実機が、数は圧倒的に少ない(誰もそんな情報を求めてないからだろう)ものの、現在では調査・入手できるようになった。閲覧性が高い情報源として[https://elektronika.su elektronika.su]あたりが挙がるが、ccTLDが[https://en.wikipedia.org/wiki/.su .su]&amp;lt;ref name=&amp;quot;su&amp;quot; /&amp;gt;であるため、記載内容の信憑性という意味では鵜呑みにするのは危険で、複数サイトを比較・検討する必要がある。&lt;br /&gt;
&lt;br /&gt;
1950年1月から機能し始めた[https://en.wikipedia.org/wiki/Coordinating_Committee_for_Multilateral_Export_Controls COCOM(対共産圏輸出統制委員会)]の枠組により、[https://en.wikipedia.org/wiki/NATO NATO(北大西洋条約機構)]加盟国と日本とオーストラリアは、1985年以降、ソ連をはじめとする共産圏諸国へ『16ビット以上の高性能CPU』の輸出を禁止した。これを食らったソ連は、1983年に成立した「『8ビットCPU』によるホビー用PC規格」である[https://ja.wikipedia.org/wiki/MSX MSX]を日本から大量に購入し徹底的に使い倒すことにした。8ビットCPUはCOCOM規制対象外だからある。しかし、当時のソ連共産党が決めた使用目的は「学校教育」や「宇宙開発」であったため、一般国民にMSXを販売する訳も無く&amp;lt;ref name=&amp;quot;from_russia&amp;quot; /&amp;gt;、もし何らかの非合法的手段で入手できたとしても一般国民が手を出せるような価格では無かったであろうことは容易に想像できる。そんな社会情勢下に置かれたソ連の一般国民が、どうにか自力で購入・所有できる最新鋭のコンピュータは関数電卓であった。&lt;br /&gt;
&lt;br /&gt;
ソ連で四則演算のみの机上設置型電卓の「設計が完了した」のは1961年の[https://ru.wikipedia.org/wiki/Санкт-Петербургский_государственный_университет レニングラード大学(現サンクトペテルブルク大学)]である。EKVM(Электронная Клавиатура Вычислительная Машинаの頭文字をキリル文字からラテン文字へ翻字したもの。英訳するとElectronic Keyboard Computing Machine)と呼ばれ、スイッチング素子として半導体とフェライトコアが採用されたようだが、これは世界初の電卓と謂われているイギリス企業・Bell Punch社が[http://www.vintagecalculators.com/html/sumlock_anita.html Anita Mk8]を発売した1962年より早い。しかもAnita Mk8がスイッチング素子として[https://en.wikipedia.org/wiki/Dekatron 計数放電管]を実装していた頃に半導体を使うことを想定していたようだ。&lt;br /&gt;
&lt;br /&gt;
その「設計が完了した」机上設置型電卓が実際に「量産」され「配布」されたのは1964年で、名前は[https://ru.wikipedia.org/wiki/Вега_(калькулятор) Вега](英語でVega、日本語で「こと座α星(織女星)」)。その3年後である1967年に三角関数を演算できるEDVM(Электронная Десятью клавишами Вычислительная Машинаの頭文字をキリル文字からラテン文字へ翻字したもの。英訳するとElectronic Ten-Key Computing Machine)が、EDVM-11という型名で「軍の地政部門に引き渡された(一般国民は購入できなかった)」が、これが恐らくソ連初の机上設置型関数電卓である。&lt;br /&gt;
&lt;br /&gt;
ちなみに、これら電卓にはЭлектроника(キリル文字からラテン文字へ翻字するとElectronika、英語でElectronics、日本語で「電子工学」)というブランド名が付けられることになる。これは旧ソ連では当たり前に存在した[https://ru.wikipedia.org/wiki/Военно-промышленный_комплекс 軍産複合体]である[https://ru.wikipedia.org/wiki/Министерство_электронной_промышленности_СССР ソヴィエト連邦電子産業省]の配下にあった工場が生産した電子部品に使われたブランド名だが、その後、その電子部品を使って製造された家電製品にも付けられるようになったようで、以後一貫して付与され続けている。&lt;br /&gt;
&lt;br /&gt;
如何なソ連でも電卓を可搬化する流れはあったようで、1974年5月に四則演算のみのポケット電卓・[http://www.xn--b1afaglgkercjnyg6l6a.xn--p1ai/museum/show_calc.php?n=26 Электроника Б3-04 (Electronika B3-04)]が「州委員会に引き渡され」、その後は一般国民にも発売している。表示部には液晶ディスプレイを、入力方式には加算器方式を、それぞれ採用し、電源は単3電池1本としている。なお、型名にあるБはロシア語で家電製品を意味するБытовая техникаの頭文字で、Б3はポケット電卓を指す共通型番となる。それ以外だとБ2は机上設置型電卓、Б5は電子時計だったそうだ。Б3-04である本機は「ポケット電卓第4号」とでも訳すのだろうが、ソ連共産党が電卓を家電製品と区分けしていた&amp;lt;ref name=&amp;quot;ce&amp;quot; /&amp;gt;のは興味深い。&lt;br /&gt;
&lt;br /&gt;
最初のポケット関数電卓の開発が完了したのは1975年末。翌1976年に[http://www.xn--b1afaglgkercjnyg6l6a.xn--p1ai/museum/show_calc.php?n=34 Электроника Б3-18 (Electronika B3-18)]として220ルーブルで発売されている。学校を卒えたばかりのエンジニアの月給が120ルーブルだったので、相当高価な家電製品である。とはいえ、実装されたマイクロプロセッサK145IP7はレジスタの使い方の詰めが甘かったらしく、[https://en.wikipedia.org/wiki/Taylor_series テイラー展開]が必要な関数を演算させる際は要注意だった。例えば&amp;lt;math&amp;gt;5+\sin 30^\circ&amp;lt;/math&amp;gt;がそのまま演算できない。&amp;lt;math&amp;gt;\sin 30^\circ&amp;lt;/math&amp;gt;の近似値をテイラー展開で演算する際、先に&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;を記憶させていたレジスタをテイラー展開時の作業レジスタとして上書きしてしまうからだ。つまり、ユーザがマイクロプロセッサの動作仕様を理解したうえで演算させる順番を入れ替えなければ求解できない代物で、この場合は&amp;lt;math&amp;gt;\sin 30^\circ+5&amp;lt;/math&amp;gt;とキーインする必要があった。月給以上をつぎ込んで買った家電製品がこの有様では、資本主義諸国であれば「欠陥品だ！」というクレームの嵐とともに返品されるだろうが、社会主義・共産主義諸国ではどうだったのだろうか。なお、Б3-18は中置記法である。&lt;br /&gt;
&lt;br /&gt;
Б3-18から2年後、1978年に発売された[http://www.xn--b1afaglgkercjnyg6l6a.xn--p1ai/museum/show_calc.php?n=37 Электроника Б3-19М (Electronika B3-19M)]が、ソ連初のRPN関数電卓である。3段スタックで、表示部は12桁あるものの演算有効桁数は8桁しかなく、プログラミングもできないというプリミティブなポケットタイプだが、ソ連としては、関数電卓に初めてRPNを採用したことよりも、浮動小数点による表示と演算が可能となったことのほうが大きかったようだ。Б3-19Мの開発に当たり、ソ連は、衛星国である東ドイツからエンジニアを参加させているが、なぜそこまでしてソ連が関数電卓にRPNを導入し、その後も断続的にRPN関数電卓を製造したのか、その理由は不明である。この1978年には5機の&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;([https://ru.wikipedia.org/wiki/Союз-27 27号]・[https://ru.wikipedia.org/wiki/Союз-28 28号]・[https://ru.wikipedia.org/wiki/Союз-29 29号]・[https://ru.wikipedia.org/wiki/Союз-30 30号]・[https://ru.wikipedia.org/wiki/Союз-31 31号])が成功裏に宇宙に上がっており、これらミッションで本機が使用されたのかもしれないが、公式な記録は確認できない。ひょっとすると核開発で使われていたのだろうか。&lt;br /&gt;
&lt;br /&gt;
電卓が最初に製品化されたのはイギリス、その後の大量生産と価格下落は日本が担っていた事実と、貴重な外貨を費やしてまで電卓を日本から輸入する余裕は無かったからなのか、はたまた連邦国や衛星国や資本主義諸国への見栄と技術力や指導力の誇示のためなのか、旧ソ連の軍産複合体による電卓の国内製造は続いた。独自に開発した機種もあれば、明らかに資本主義諸国の製品を真似た機種もあったようで、その総計は100機種程度と謂われているが、主な輸出先であろう連邦国や衛星国の人口を考えると少ない。1980年代に入ると衛星国である東ドイツ・ブルガリア・ルーマニア・ハンガリー・ポーランドでも[http://www.dentaku-museum.com/calc/calc/60-east/east/east.html 独自に電卓を製造]するようになっていたことと、[https://en.wikipedia.org/wiki/Great_Grain_Robbery 自国の経済悪化が定着]してしまったことで旧ソ連国民に電卓を買う余裕は無かったであろうことから、旧ソ連の電卓製造量はもともと多くなかったと推定される。しかし、1991年12月25日に旧ソ連が[https://ru.wikipedia.org/wiki/Распад_СССР 崩壊]すると軍産複合体が機能しなくなったため製造は完全に停止、ちょうど30年で旧ソ連の電卓の歴史は終幕となった。現在、ロシア国内で販売されている電卓は全て外国からの輸入品である。&lt;br /&gt;
&lt;br /&gt;
==現在==&lt;br /&gt;
では、再参入後のHP電卓の現状はどうか。ハッキリ言えば「残念」の一言である。&lt;br /&gt;
&lt;br /&gt;
これは、2001年の部門閉鎖と従業員解雇が仇となり、自社単独で電卓を開発・製造する技術力とノウハウが復旧できないことを悟ったHPが採った再参入戦略が「開発・製造を台湾[http://www.kinpo.com.tw/English/index.html Kinpo Electronics, Inc.]に[https://www.hpcalc.org/goodbyeaco.php 丸投げ]&amp;lt;ref name=&amp;quot;outsource&amp;quot; /&amp;gt;する」としたからだ。その結果、至極当然の成り行きではあるが、「再参入後に発売している『HPブランド』の電卓は2001年以前の製品とはまったく別モノ！ 低品質過ぎる！」と罵詈雑言が飛び交うほどソフトウェアのバグやハードウェアの造りに問題が散見される事態となった。しかも再参入の一因だった[https://store.hp.com/us/en/cv/accessories-filters?cat=Hfz5e RPN電卓の現行機種]も徐々に減り、2021年6月時点では[[HP-12C]]のみとなってしまったが、この現行品の[[HP-12C]]も70ドルという価格に見合わぬほど壊れ易いと聞く。「外装や基板の剛性が下がった」とか「ARMにVoyagerプロセッサをソフトウェアエミュレーションさせて動作させるのは無理がある」とか、要因は様々あるようだ。&lt;br /&gt;
&lt;br /&gt;
このような惨状から、管理人は、現行製品の購入はお勧めしない。RPN電卓とはどのようなものか、その使用感を確かめる程度ならば現行製品でも構わないが、RPN電卓を気に入り、使い込むことを考えたなら、2001年以前製造の新古品や中古品&amp;lt;ref name=&amp;quot;outlet&amp;quot; /&amp;gt;か、2001年以前の製品からソフトウェアを吸い出してPCやスマートフォンで動かせるようにしたエミュレータの使用を強くお勧めする。幸いなことに、世界中のRPN電卓マニアによるエミュレータは山ほど出回っており、シェアウェアであっても現行製品はもとより2001年以前製造の新古品や中古品より低価格なのも利点である。管理人もAndroidスマートフォンでは[[HP-41CX]]のシェアウェアエミュレータである[https://play.google.com/store/apps/details?id=o2s.emul.hp41cx&amp;amp;hl=ja go41cx]を購入、複数の拡張モジュールのソフトウェアイメージともどもインストールしており、実機を持ってない外出先では便利に使用している。&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;war&amp;quot;&amp;gt;当初の主戦場は国内だけだったが、やがて輸出向けにも広まった[http://www.infonet.co.jp/ueyama/ip/history/calculator.html 電卓戦争]の真っ最中だった国内メーカでも、RPN電卓を輸出向けに生産していた。残っている実機として、1976年に立石電機株式会社(現・オムロン株式会社)が輸出専用機種として生産した[[OMRON 12SR]]と、三洋電機株式会社が生産した[http://www.taschenrechner-sammlung.de/Calculators/Sanyo-CZ-2901/Contents.htm Sanyo CZ-2901]が確認されている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;9100a&amp;quot;&amp;gt;日本国内向けには横河・ヒューレット・パッカード株式会社(YHP)から1970年に1,694,000円で[http://www.dentaku-museum.com/calc/calc/51-hp/hp/hp.html 発売された]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;desk&amp;quot;&amp;gt;完成した[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]を開発陣がBill&amp;amp;nbsp;Hewlettへ報告がてらデモする直前、その大きさが、設定された目標である「Bill&amp;amp;nbsp;Hewlettの秘書が使用しているL字型の机の右側にあるタイプライタ置き場」に僅かに収まらないことが判明した。そこで開発陣は「形や色など外観はまったく同じで、大きさだけ、[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]を載せても違和感が無い程度に拡げた机」を地元の家具屋に発注、休日にこっそり差し替えてからデモに臨んだ。そのお陰でデモは首尾良く成功、Bill&amp;amp;nbsp;Hewlettは机が差し替えられたことに気付かず、&#039;&#039;You see! I knew you could do it! (ほら見ろ！ 君ならできると思ってたんだ！)&#039;&#039; と[https://www.hpmuseum.org/hp9100.htm 褒めた]逸話が残されている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;stack&amp;quot;&amp;gt;以降の機種ではスタックと呼んでいるX・Y・Zを含む19個すべてのメモリを、[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]ではレジスタと呼んでいる。X (KEYBOARD)・Y (ACCUMULATOR)・Z (TEMPORARY)の3レジスタは表示専用、0〜9・a・b・c・dの14レジスタはプログラムまたはデータ用、e・fの2レジスタはデータ専用である。これらは内蔵する[https://en.wikipedia.org/wiki/Magnetic-core_memory 磁気コアメモリ]に格納されるが、磁気コアメモリはその性質上、演算終了後や電源をOFFにしても残留磁気により内容がクリアされない可能性があるため、マニュアルに記載された全ての入力例では、レジスタに数値を入力する前に必ず&amp;amp;nbsp;{{keypress|CLEAR}}&amp;amp;nbsp;を押下してレジスタの内容をクリアする手順となっている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;description&amp;quot;&amp;gt;[[HP-35]]のマニュアルでようやく&#039;&#039;The operational stack and the reverse &amp;quot;Polish&amp;quot; (Lukasiewicz) notation used in the HP-35 are the most efficient way known to computer science for evaluating mathematical expressions. (HP-35で使用している演算スタックと逆「ポーランド」(ウカシェヴィチ) 記法は、計算機工学で知られている最も効率的な、数式を評価するための方法です。)&#039;&#039; と1行だけ触れられている。恐らく[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]以降に発売された他社の関数電卓が中置記法を採用しており、それらとの操作方法の違いを説明する必要があったのだろう。3年後に発売された[[HP-25]]のマニュアルには&#039;&#039;With this system, you enter numbers using a parenthesis-free, unambiguous method called RPN (Reverse Polish Notation). (このシステムでは、RPN(逆ポーランド記法)と呼ばれる、括弧が無い、明瞭な方法で数値を入力します。)&#039;&#039; の一文で始まる、RPNの利点を説くページが設けられていることから、既にこの頃からRPNがマイノリティである自覚はあったようだ。なお、Lukasiewiczの正しい綴りはポーランド語の&#039;&#039;&#039;Ł&#039;&#039;&#039;ukasiewiczだが、ここではマニュアルの記述に従った。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;hp35&amp;quot;&amp;gt;そういう意味では、1972年に発売した世界初の可搬型関数電卓である[[HP-35]]がRPNを採用したのは、[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP 9100A]の新規開発時と同様、筐体の大きさと部品価格、そして可搬型では特に重要な消費電力を勘案した結果、技術的・価格的制約から已むを得ず…と捉えるべきであろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;simple&amp;quot;&amp;gt;2001年末での撤退までで唯一の例外は[[HP-10]]であった。2003年の再参入後はその殆どを[http://www.kinpo.com.tw/English/index.html Kinpo Electronics, Inc.]の[https://en.wikipedia.org/wiki/Original_design_manufacturer ODM]製品としたためか、四則演算のみの中置記法の電卓を2機種販売している。[https://support.hp.com/us-en/product/hp-quick-calc/3732601 HP Quick Calc]は2008年8月から、[https://support.hp.com/us-en/product/hp-easycalc-100/3891887 HP EasyCalc 100]は2009年4月から、いずれも現行品である。噂では「関数電卓が持ち込み不可、四則演算のみの電卓だけ持ち込み可の試験で使用するために、HP製電卓のキーボードのキータッチを好むユーザが購入する」ために販売しているらしい…なんとニッチな需要であることよ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;su&amp;quot;&amp;gt;1990年9月19日に旧ソ連に付与されたものだが、約1年後である1991年12月25日に旧ソ連は崩壊したため、ドメイン情報を管轄する[https://www.icann.org/ ICANN]により廃止されるべきだったところ、のらりくらりと生き続け、現在ではロシアの親プーチン青少年組織やウクライナ東部の親ロシア武装反乱組織など、いかにも旧ソ連といった趣の、組織の出自が怪しいWebサイトでしか使われていない。通常であれば1994年4月7日にロシアに付与された[https://en.wikipedia.org/wiki/.ru .ru]が使われるはずである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;viewpoint&amp;quot;&amp;gt;これは、日本をはじめとする電卓メーカの開発動機が「[https://ja.wikipedia.org/wiki/そろばん 算盤]や手回し式計算機または電動計算機といった[https://en.wikipedia.org/wiki/Mechanical_calculator 機械式計算機]を使用した演算業務を、まずは静粛に、そしてできれば高速にできるようにするため」であることも大きい。即ち、出自も狙っている市場もHPとはまったく異なり、電卓メーカは凡そ四則演算が発生する場所全て(マス)だが、HPは科学者やエンジニアなどの専門職(ニッチ)であった。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ce&amp;quot;&amp;gt;このカテゴライズは各国でも分かれるようだ。日本では家電製品ではなく文房具として扱われていることが多い。特にカシオが電卓の販路として全国津々浦々の文房具店を開拓したこともあって、電卓が文房具店で購入できることに違和感が無い。そもそも電卓は算盤からの置換を狙った製品なので、算盤を売っている文房具店で扱われていても不思議ではないからだろう。現代では家電量販店で扱っているが、いわゆる街の電器店で電卓を扱っていた記憶は、少なくとも管理人には無い。&amp;lt;br&amp;gt;アメリカでは文房具もしくは日用品として扱われているようで、文房具店や電器店はもとより、ディスカウントストアでも関数電卓が購入できる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;from_russia&amp;quot;&amp;gt;1985年の日本がソ連から輸入したのは[https://www.customs.go.jp/toukei/download/past/gpkh/1985/03/imknhzenkm031985120008.pdf 海産物・木材・鉄鉱石]などの食糧や資源という季節変動が大きな品目が大半で、安定的な外貨収入が見込めないため、国民の趣味のために貴重な外貨を流出させる理由が無い。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;outsource&amp;quot;&amp;gt;HPから見れば不採算事業であったかもしれない電卓事業を、これまで築いた〝HPブランド〟を利用して、外部に開発・製造を丸投げすることで採算を合わせるために、わざと、こういう対応をしたと思われる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;outlet&amp;quot;&amp;gt;中古品はそうでもないが、稀に出て来るデッドストックな新古品は非常に高価である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-65&amp;diff=6829</id>
		<title>HP-65</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-65&amp;diff=6829"/>
		<updated>2026-03-19T23:33:07Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1974年1月19日〜1977年1月3日に販売された、&#039;&#039;&#039;世界初&#039;&#039;&#039;の&#039;&#039;&#039;可搬型&#039;&#039;&#039;で&#039;&#039;&#039;プログラマブル&#039;&#039;&#039;なRPN関数電卓。Classicシリーズでは最上位機種に当たり、当時のHPの期待を一身に背負った機種だからか、コードネームはSuperstar (巨星)とされた。&lt;br /&gt;
__TOC__&lt;br /&gt;
===可搬型でもプログラミングを！===&lt;br /&gt;
実装された関数と演算精度は[[HP-45/HP-46]]と同等だが、本機の最大の特長は、それらを駆使したプログラムが作成・実行可能なことである。尤も、その実装は極めてプリミティブなラベルアドレッシング形式で、​レジスタはR&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;〜R&amp;lt;sub&amp;gt;9&amp;lt;/sub&amp;gt;の9個、各命令ワードは6ビット長、三角関数や比較命令を実行する際はR&amp;lt;sub&amp;gt;9&amp;lt;/sub&amp;gt;レジスタがワーキングレジスタとして使用されるため内容が上書きされるという貧弱極まりない仕様だ。ユーザが入力したソースコードが、キーインした順に「物理キーの座標(位置)」が羅列される形式&amp;lt;ref name=&amp;quot;code&amp;quot; /&amp;gt;なのは百歩譲って良しとしても、行番号が振られないうえ、1行前のソースコードに移動する&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {BST}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーが実装されていない&amp;lt;ref name=&amp;quot;bst&amp;quot; /&amp;gt;ことから、ソースコードの保守性は皆無と言ってよい。&lt;br /&gt;
&lt;br /&gt;
しかし、これら数多くの制約を乗り越えたユーザは、本機に内蔵している64種の演算を組み合わせたプログラムを作成・実行できる。プログラミングできるコンピュータや関数電卓＝複数人で共有する机上設置型が常識だった当時、個人が所有することが前提の、電池で駆動する可搬型の関数電卓で、プログラミングできる本機が登場すると、エンジニアや科学者に一大旋風を巻き起こした。&lt;br /&gt;
&lt;br /&gt;
本機を開発した当時は半導体不揮発メモリがまだ高価だったため採用は見送られており、そのまま電源を切れば、ユーザが作成し本機に保存したプログラムは消失してしまう。その代わりとしてHPは、可搬型電卓に内蔵できる超小型の磁気カードリーダライタを開発、それ経由で磁気カードにプログラムを保存することにした&amp;lt;ref name=&amp;quot;r/w&amp;quot; /&amp;gt;。本機および磁気カード1枚に保存できるプログラムは100行&amp;lt;ref name=&amp;quot;card&amp;quot; /&amp;gt;。本機の筐体は[[HP-35]]や[[HP-45/HP-46|HP-45]]でも使用した35個の物理キーを実装したもので、各キーに最大4つの機能を割り当てるべくシフトキーは&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f^{-1}}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|{{Font color|black|DeepSkyBlue|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{g}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;の3段構えだが、{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f^{-1}}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;は&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;の[https://en.wikipedia.org/wiki/Inverse_function 逆関数]であることが直感的に解る&amp;lt;ref name=&amp;quot;inverse&amp;quot; /&amp;gt;のと同時に、機体表面に印刷する関数キーの説明から逆関数の分を省けたことで、表面のキーの説明をスッキリさせることに成功している。磁気カードリーダライタを内蔵するため、長さを4mm、厚みを2mm大きくし、質量は70g増えている。本機には標準ソフトウェアである19本のプログラム入り磁気カード、20本のブランク磁気カード、1本のヘッドクリーニングカードを1セットにした〝Standard Pac〟(0065-67008)&amp;lt;ref name=&amp;quot;standard&amp;quot; /&amp;gt;が附属したが、それ以外にもHPから本機専用の各種プログラムが磁気カードに記録したソフトウェアとして別売された。ここまで高機能だと「もはや関数電卓という範疇を超えている」と判断したのか、HPは自社で発行していた技術評論誌である[https://www.hpl.hp.com/hpjournal/pdfs/IssuePDFs/hpjindex.html The HP Journal]の[https://www.hpl.hp.com/hpjournal/pdfs/IssuePDFs/1974-05.pdf 1974年5月号]で本機を&#039;&#039;&#039;&#039;&#039;The &amp;quot;Personal Computer&amp;quot;: A Fully Programmable Pocket Calculator&#039;&#039;&#039;&#039;&#039;と紹介している。本機は非常に高価だったことでも有名で、定価は795ドル(約236,900円)とされた。1974年のアメリカでは上位50％の平均年収が約50,000ドルだったとはいえ、誰も彼もホイホイ購入できる代物ではなく、購入者に依っては販売店に月賦を申し込んだようだ。&lt;br /&gt;
&lt;br /&gt;
ちなみに、その後もHPは磁気カードリーダライタを内蔵もしくはオプションパーツとして別売したRPN関数電卓として[[HP-67/HP-97]]と[[HP-41CX]]を含む[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]を販売したが、本機でプログラムを書き込んだ磁気カードはこれら他機種で読み込めない。先述した通り、本機を含む第一世代＝Classicシリーズでは各命令ワードが6ビット長なのに対し、第二世代以降では8ビット長に拡張されたことで、互換性を失ったからだ&amp;lt;ref name=&amp;quot;compatibility&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
===宇宙で大国の命運を握った電卓===&lt;br /&gt;
この画期的な可搬型プログラミング関数電卓をエンジニアや学者が放っておくはずもなく、Appleの共同設立者である[http://woz.org/ Steve Wozniak]は本機の熱心なユーザだったが[https://en.wikipedia.org/wiki/Apple_I Apple I]開発費用捻出のため500ドルで泣く泣く手放していたり、当時[https://www.lanl.gov/ ロスアラモス国立研究所]に所属していた数理物理学者である[https://en.wikipedia.org/wiki/Mitchell_Feigenbaum Mitchell Feigenbaum]は研究所から支給された本機を使用して、[https://en.wikipedia.org/wiki/Period-doubling_bifurcation 周期倍分岐]が連続して起こる値の差の比が &amp;lt;math&amp;gt;\delta_2\!=\!\lim_{n \to \infty} \frac{a_{n}\,-\,a_{n-1}}{a_{n+1}\,-\,a_{n}}\!=\!4.669201609102990671853203820466\dots&amp;lt;/math&amp;gt; に収束するのを発見したりしている。この収束比は[https://en.wikipedia.org/wiki/Feigenbaum_constants Feigenbaum定数]として知られている。&lt;br /&gt;
&lt;br /&gt;
特に、HPの関数電卓と本機の名声を著しく上げた出来事として、NASAに〝本格的に〟採用されたことが挙げられる。世界で初めて宇宙空間に飛び出した関数電卓は[[HP-35]]だが、それはあくまで動作試験等が目的で、ミッションの中核を担うようなものではなかった。これまでのNASAによる宇宙飛行では、軌道決定の基となる軌道要素や宇宙機の回転量等を、表とフローチャートを使って宇宙飛行士が筆算&amp;lt;ref name=&amp;quot;pen&amp;quot; /&amp;gt;しており、例えばその様子は映画[https://en.wikipedia.org/wiki/Apollo_13_(film) Apollo 13]で[https://www.nasa.gov/sites/default/files/atoms/files/lovell_james_0.pdf Jim Lovell]役の[https://en.wikipedia.org/wiki/Tom_Hanks Tom Hanks]により活写されているが、本機はこれらを単体で実行するという大役を仰せ付かったのだ。&lt;br /&gt;
&lt;br /&gt;
アメリカと旧ソ連による熾烈な宇宙開発競争も凡その決着を見た1972年5月、両国が初めて有人宇宙機を共同飛行する宇宙計画に調印、約3年後の1975年7月5日に実施された[https://www.nasa.gov/mission_pages/apollo-soyuz/index.html ASTP (アポロ・ソユーズ テスト計画)]においてアメリカが打上げたApollo&amp;lt;ref name=&amp;quot;apollo&amp;quot; /&amp;gt;には、本機が2台、NASAが作成した1,000行に及ぶプログラムを保存した磁気カード10枚組が4セット、予備バッテリが6個、それぞれ持ち込まれていた。その目的は、Apolloが内蔵する[https://en.wikipedia.org/wiki/Apollo_Guidance_Computer 誘導コンピュータ]が故障した際のバックアップである。&lt;br /&gt;
&lt;br /&gt;
アメリカでは、[https://www.nasa.gov/mission_pages/apollo/missions/apollo11.html アポロ11号]が「国家目標を達成」したことで国民が宇宙開発競争に対して急速に興味を失ったことと、[https://www.nasa.gov/mission_pages/apollo/missions/apollo13.html アポロ13号]で起きた「成功した失敗」を理由に、宇宙開発に依る国家予算の圧迫に批判が集まるようになった結果、1970年8月末、NASAは「[https://www.nasa.gov/mission_pages/apollo/index.html アポロ計画]は17号も以て終了。18号・19号・20号の計画は廃棄する」ことを正式決定せざるを得ない事態に追い込まれた。一方の旧ソ連では、ソ連共産党中央委員会第一書記である[https://ru.wikipedia.org/wiki/Хрущёв,_Никита_Сергеевич &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Никита&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ニキータ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Хрущёв&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;フルシチョフ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]と[https://ru.wikipedia.org/wiki/Брежнев,_Леонид_Ильич &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Леонид&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;レオニード&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Брежнев&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ブレジネフ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]が実行した農業政策が大失敗したところに凶作と旱魃が重なった結果、社会主義経済では貴重な虎の子である、石油を輸出して稼いだ外貨が、敵国たるアメリカ・フランス・カナダ・オーストラリア等から自国民の食糧用に穀物を輸入する費用として流出していた。特に1973年の旧ソ連による国際穀物市場での買付量は[https://en.wikipedia.org/wiki/1973_United_States–Soviet_Union_wheat_deal 大穀物強盗]と呼ばれるほど大規模化すると同時に国庫が空に近付き、宇宙開発を進めたくとも進められない事態に陥った。&lt;br /&gt;
&lt;br /&gt;
即ち、米ソ両国とも、自国の経済を理由に宇宙開発競争を止めたがっており、それには外交面からどこかで両国揃って全世界に向けて公式に「これまでのような宇宙開発競争は止めます」と宣言する好機を窺っていたのだが、それをASTPという形にしたのだ。よって、ASTPのミッションは、公式には「アメリカ・旧ソ連 両国の宇宙機のドッキングシステムの研究」とされているものの、実態は「『宇宙開発競争の終焉』を全世界にアピールすること」であった。いわゆる[https://en.wikipedia.org/wiki/Détente デタント]である。&lt;br /&gt;
&lt;br /&gt;
この思惑により、ASTPの飛行計画は、両国の有人宇宙機を同日に打上げ、地球周回軌道上で[https://en.wikipedia.org/wiki/Space_rendezvous ランデブー]、44時間にわたってドッキングし続けた後、再度分離して別々に地球へ帰還するという、異国の宇宙機同士としては世界初の挑戦となったうえ、44時間のドッキング中には両国の宇宙飛行士が両宇宙機を相互に表敬訪問・旗の交換・食事会・宣言書への署名などなど、「ドッキングシステムの研究」はどこへやら、両国の緊張緩和を世界に印象付けるためのセレモニーが目白押しとなる内容に仕上がってしまった。つまり、「ドッキングシステムの研究」という御題目は両国の政権政党にデタントのための外交アピールを宇宙空間で行うことを認めさせる大義名分&amp;lt;ref name=&amp;quot;apas-75&amp;quot; /&amp;gt;に過ぎず、それどころか、ASTP全体が「両国の宇宙機のドッキング成功ありき」ですべての予定が組まれたことから、ドッキングで使用するApolloの誘導コンピュータの故障によるドッキング失敗がASTPの失敗どころかデタントの失敗を意味することに“変質”してしまったのだ。ASTPの失敗は両国間で政治問題に発展しかねない緊張感をも帯びることになり、そのような事態の発生をなんとしても避けるべく、NASAは本機を採用したのだ。&lt;br /&gt;
&lt;br /&gt;
[[Электроника МК-52]]で触れたように、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;を含む旧ソ連の歴代の有人宇宙機は、打上げ機から切り離された後の航行と制御が「宇宙機に内蔵された航法支援装置による完全自動」が基本で、搭乗している宇宙飛行士に手動操縦の余地が殆ど無い。したがって、両宇宙機がドッキングするには、能動的飛行体として手動操縦の余地が十分あるApolloから、受動的飛行体であるСоюзに近づく必要がある。本機に与えられた役割は、ApolloがСоюзとドッキングする直前にApolloが2回実施する[https://en.wikipedia.org/wiki/Orbital_maneuver 軌道修正機動]のための演算である。具体的には、「ターミナルフェーズ」と呼ばれる、ランデブー前の飛行を開始して12分後に両宇宙機が約100マイル以内に近づいた後、両宇宙機を同一軌道に乗せる共楕円軌道&amp;lt;ref name=&amp;quot;co&amp;quot; /&amp;gt;の演算と、その10分後(即ちランデブー2分前)、両宇宙機が約22マイルのまで近づいたときに実行する軌道修正機動のための演算である。&lt;br /&gt;
&lt;br /&gt;
これらいずれも、これまで17回実行されたApollo計画の搭乗員には存在しない肩書でASTP専用に誂えた、ドッキングに関するすべてを担当する&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Docking module pilot&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ドッキング装置操縦士&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;として乗り込んだ、当時史上最年長の宇宙飛行士である[https://www.nasa.gov/sites/default/files/atoms/files/slayton_donald.pdf Deke Slayton]が、Apolloに持ち込まれた本機に磁気カードを読み込ませてNASAが作成したプログラムをロードして演算、それで得られた結果と、Apolloが内蔵する誘導コンピュータの演算結果を比較、合致していることを確認することでドッキングが必ず成功するよう万全を期したが、もしこのときApolloの誘導コンピュータが故障したら、[https://www.nasa.gov/sites/default/files/atoms/files/slayton_donald.pdf Deke Slayton]は本機の演算結果だけで軌道修正機動を実行する手順になっていたのだ。&lt;br /&gt;
&lt;br /&gt;
「汎用の民生品が有人宇宙機の軌道決定に使用される快挙を成し遂げた」とも取れるが、「一般市民でも購入できる関数電卓がアメリカと旧ソ連のその後の命運の一端を握った」とも取れる、世界的にも衝撃的な出来事であった。特に旧ソ連をはじめとする社会主義諸国には「資本主義諸国では、市販されている関数電卓ですら、宇宙開発で要求される演算精度を持っているのか！」と脅威に映ったことだろう。この出来事から13年後の1988年11月26日、旧ソ連はСоюзに自国の可搬型プログラマブルRPN関数電卓である[[Электроника МК-52]]をほぼ同じ理由&amp;lt;ref name=&amp;quot;reason&amp;quot; /&amp;gt;で持ち込んでいるが、裏を返せば、1975年時点で既に、旧ソ連とアメリカで民生品の技術格差が13年分以上存在したことを示している。&lt;br /&gt;
&lt;br /&gt;
尤も、ASTPではApolloの誘導コンピュータは故障せず、本機の演算結果だけで軌道修正機動を実行する場面は無かった。なお、本機は、軌道修正機動以外にも、Apolloの高利得アンテナを軌道上の中継衛星へ正確に対向させる演算も担当していた。&lt;br /&gt;
&lt;br /&gt;
また、本機の登場により、HP製RPN関数電卓のファンクラブ兼ハッキングクラブが結成されていることも重要である。HP-65 Users Clubと命名されたこのクラブは[https://www.youtube.com/watch?v=DHRmOU4s9wE Richard J. Nelson]が設立し、新しい電卓に関する情報交換の場としてスタートしたものの、PPC (Personal Programming Center)と改名後は活動も活発化、最終的にはHP-41シリーズ向けに同人モジュールの[[PPC ROM]]を発売するに至るなど、HP製RPN関数電卓に触れる際は外せないほど影響力を持った組織であった。&lt;br /&gt;
&lt;br /&gt;
現代において完動品のHP-65を入手するのはかなり難しい。eBayをはじめとするオークションサイトへの出品は比較的多いほうだが、動作する美品は極めて少ない。発売から45年以上経過しているため仕方無いのだが、状態が良好で完動品となると1,000ドルを超えることも珍しくなく、手を出したくとも出せないことが多い。また、磁気カードリーダライタは〝故障してるのが当たり前〟&amp;lt;ref name=&amp;quot;failure&amp;quot; /&amp;gt;で、RPN電卓マニアが売っているDIYキットを購入して自分で修理するか、有償で請け負うRPN電卓マニアに修理を依頼するかの二択となる。管理人は比較的美麗で磁気カードリーダライタも完動品な4台を所有している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7}518796.992\ \; (\varepsilon\!_R=2.87\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 42.99999997&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||200kHz (Classic)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||HP 82001A/B (3.6V 450mAh/900mAh 充電池:中身は単3形Ni-Cd充電池×3個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1974年〜1977年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||アメリカ → シンガポール&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1974年発売当時の定価||795ドル (約236,900円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;code&amp;quot;&amp;gt;例えば、上から2行目・左から3個目の&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {LBL}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーを押下しソースコードに記述すると、ディスプレイには&amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt;が表示される。ディスプレイが7セグメントLEDである以上、表示できる字種が数字のみなので已むを得まい。この制約は本機の後継機種である[[HP-67/HP-97]]でも同じだ。&amp;lt;br&amp;gt;尤も、HPはこの状況を打開すべく研究を続けており、それはやがて、[[HP-41CX]]をはじめとする[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]向けに、アルファベットと若干の記号を表示できる[https://en.wikipedia.org/wiki/Fourteen-segment_display 14セグメント方式]を自社で独自開発させるに至った。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;bst&amp;quot;&amp;gt;1行後ろに移動する&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {SST}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーしか実装されていない。当然「操作を誤り、編集すべき行を行き過ぎた場合はどうする？」となるが、本機はソースコードをループして表示する(ソースコードの最終行に到達した後に&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {SST}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーを押下すれば1行目に戻る)仕様なので、そこから再度、編集したい行まで&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {SST}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーを1行ずつ押下して移動することになる。数十行に渡るソースコードを編集する際は非常に面倒くさくクレームも多かったのだろう、後継機種である[[HP-67/HP-97]]では&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {BST}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーが実装され、行番号も振られるようになった。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;r/w&amp;quot;&amp;gt;HPでは、世界初の関数電卓である[https://www.hpmuseum.org/hp9100.htm HP 9100A/B]やその後継機となる[https://www.hpmuseum.org/hp9810.htm HP 9810A]に名刺サイズの磁気カードにプログラムを記録する磁気カードリーダライタを標準装備しており、それを可搬型にも適用したことになる。本機を含む可搬型向けに開発した超小型磁気カードリーダライタで採用した、磁気カードにデータを記録する磁気ヘッドは、1965年に[https://www.philips.com フィリップス]が互換性厳守を条件に基本特許を無償公開したため世界中の電機メーカに採用されたことでデファクトスタンダートとなり急速に普及し部品価格が下落した[https://en.wikipedia.org/wiki/Cassette_tape コンパクトカセット]用のそれと[https://www.keesvandersanden.nl/calculators/images/HP67_cardreader_06.jpg 外見が酷似]している。幅11.5mmの磁気カードで天地に2行ずつ計4行記録でき、可搬型電卓に内蔵するには持って来いの大きさである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;card&amp;quot;&amp;gt;磁気カードリーダライタの仕様上は、磁気カードの天地を返すことで、1枚に100行＋100行の計200行を保存できる。しかしマニュアルでは&#039;&#039;&#039;&#039;&#039;The motor roller is over the second track. Over a period of time, it may not read properly.&#039;&#039;&#039;&#039;&#039;を理由に、1枚に片方のみ100行だけ保存する運用を強く推奨している。尤も、この推奨は本機のみで、[[HP-67/HP-97]]では「1枚に113行＋113行の計226行が記録できる」、[[HP-41CX]]を含むHP-41シリーズ向けオプションである[[HP 82104A]]では「1枚に1トラックで16レジスタずつ、計32レジスタが記録できる」ことが謳われており、天地双方に保存しても支障は無い。なお、磁気カードリーダライタは消費電力が大きいため、バッテリの残量電力が少ないと、電力不足で磁気カードリーダライタが起動できずエラーとなる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;inverse&amp;quot;&amp;gt;日本であれば高校数学(管理人が学んだ旧課程では[https://ja.wikipedia.org/wiki/数学I 数学&amp;amp;#8544;]/[https://ja.wikipedia.org/wiki/代数・幾何 代数・幾何]/[https://ja.wikipedia.org/wiki/基礎解析 基礎解析]/[https://ja.wikipedia.org/wiki/微分・積分 微分・積分]、現行課程では理系大学受験を前提に履修する[https://ja.wikipedia.org/wiki/数学III 数学&amp;amp;#8546;])で、ある関数 &amp;lt;math&amp;gt;y\!=\!f(x)&amp;lt;/math&amp;gt; の逆関数(逆写像)を &amp;lt;math&amp;gt;x\!=\!f^{-1}(y)&amp;lt;/math&amp;gt; と表記することを学ぶため、例えば度数法による正弦 &amp;lt;math&amp;gt;\sin 30^\circ\!=\!0.5&amp;lt;/math&amp;gt; を演算するには&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とキーインすることを知れば、[https://en.wikipedia.org/wiki/Inverse_function 逆関数]である余割(逆正弦) &amp;lt;math&amp;gt;\text {cosec}\;0.5\!=\!\sin^{-1}0.5\!=\!30^\circ&amp;lt;/math&amp;gt;を演算するには&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f^{-1}}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}} とキーインすれば良いことが、ある数の平方根(2の羃根: &amp;lt;math&amp;gt;\sqrt x = x^{\frac{1}{2}}&amp;lt;/math&amp;gt;)を演算するには&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt x&amp;lt;/math&amp;gt;}} とキーインすることを知れば、逆関数である平方(2の羃乗: &amp;lt;math&amp;gt;x^2&amp;lt;/math&amp;gt;)を演算するには&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f^{-1}}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とキーインすれば良いことが、それぞれマニュアルを読まずとも推測でき、その操作で合っている。これにより本体上面から逆三角関数と平方のキー説明を省略している。調べた範囲では、逆関数の数式表記方法は世界共通なので、このキーアサインは現代でも通じる秀逸さがある。尤も、ユーザからの需要とライバルメーカとのスペック競争を理由に内蔵する関数が肥大化するにつれ、表面積が狭いポケット関数電卓で逆関数を指定するためだけに独立したキーを配置する場所を確保できなくなり、HPは[[HP-67/HP-97|HP-67]]や[[HP-34C]]で採用した「独立した3段構え」のシフトキーへ移ることになる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;standard&amp;quot;&amp;gt;磁気カードリーダライタで読み込ませることで、以下の機能や関数を拡張する。​&lt;br /&gt;
*個人投資&lt;br /&gt;
*平均・標準偏差・標準誤差&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Great-circle_navigation 大圏航路計算]&lt;br /&gt;
*整数の基数変換&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Body_surface_area 体表面積]&lt;br /&gt;
*&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;型回路網のインピーダンス整合&lt;br /&gt;
*既知の&amp;lt;math&amp;gt;\Delta&amp;lt;/math&amp;gt;標高に基く光波測距 (EDM)&lt;br /&gt;
*温度単位相互変換 (摂氏・華氏・蘭氏・ケルビン)&lt;br /&gt;
*重量単位相互変換 (キログラム・ポンド・オンス・スラグ)&lt;br /&gt;
*体積単位相互変換 (USガロン・UKガロン・リットル・平方インチ)&lt;br /&gt;
*複利計算&lt;br /&gt;
*借入金返済計画&lt;br /&gt;
*照合勘定調整&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Iterative_method 反復法]による&amp;lt;math&amp;gt;f(x)=0&amp;lt;/math&amp;gt;の演算と求根&lt;br /&gt;
*二次方程式&lt;br /&gt;
*円・楕円・四角形・三角形の面積&lt;br /&gt;
*ゲーム[https://en.wikipedia.org/wiki/Nim 「ニム」]&lt;br /&gt;
*HP-65故障診断 (その1・その2)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;compatibility&amp;quot;&amp;gt;マイクロプロセッサのアーキテクチャで採用している各命令ワード長に従い、本機で磁気カードに書き込むデータは6ビットで、[[HP-67/HP-97]]と[[HP-41CX]]を含むHP-41シリーズ向けオプションである[[HP 82104A]]で磁気カードに書き込むデータは8ビットで、それぞれエンコードされているため、互いに読み取りようがない。&amp;lt;br&amp;gt;本機と、本機の直接の後継機種である[[HP-67/HP-97]]の間には、開発開始時期に2年の差があるが、その間に半導体技術は長足の進歩を遂げ集積度が急速に上昇、それを貪欲に取り込むことで、今後は同等サイズのシリコンチップに詰め込める機能や関数を大幅に増やせる目処が立ったことと、このマイクロプロセッサを電卓だけではなく、現代でいう組込機器にも応用することとしたため、内蔵する関数や機能を増やす(即ち「未来のために拡張性を持たせる」)ことを前提に、内部処理で使用する命令ワード長を2ビット拡張したのだ。この命令ワード長の拡張が正しかったことは、1979年7月1日に発売開始となったHP-41シリーズ向けに膨大なソフトウェアモジュールや周辺機器が登場する形で、端的に証明された。この第二世代アーキテクチャは、その後もなんだかんだと凡そ15年間も生き続け、1990年3月16日に発売された第四世代＝Saturnシリーズである[[HP-48SX]]で漸く世代交代することになる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pen&amp;quot;&amp;gt;このとき宇宙飛行士が使用するのは[https://en.wikipedia.org/wiki/Space_Pen スペースペン]である。通常のボールペンを重力がある地球上で使用するとインクは重力で勝手にペン先へ送り出されるが、無重力である宇宙機内で使用するとペン先にインクを送り出す力が無くなるため、(重力圏に対して)水平より上向きにすると徐々にインクが出なくなり、完全に上向きにするとインクが出ず筆記できない。またこのときインクタンク内に入った空気が気泡として残ってしまい悪循環となる。スペースペンは、インクタンクの上部から高圧の窒素ガスを加え、その圧力でペン先にインクを送り出す構造であるため、無重力でどのような姿勢をとってもインクが出続けるので筆記可能となり、インクタンク内には気泡が生成されない。&amp;lt;br&amp;gt;よくあるジョークに「アメリカはわざわざ手間暇と大金をかけてスペースペンを開発した。一方、ロシア(旧ソ連)は鉛筆で済ませた」があるが、これは完全なる都市伝説である。NASAでも当初は有人宇宙機内で鉛筆を使っていたものの、鉛筆の芯に使われるグラファイト(黒鉛)の導電性と潤滑性、軸に使われる木材の可燃性が、いずれも宇宙機内では危険因子となり得ることを認識しており、代替品を模索していた。その最中である1965年に[https://en.wikipedia.org/wiki/Paul_C._Fisher Paul Fisher]という実業家がスペースペンを独自に発明、自らNASAに売り込み、NASAによる様々な試験の結果、アポロ計画での採用が決定した。このとき1本6ドルで400本をNASAに納品している。したがって、スペースペンはNASAから開発を依頼されて製造されたものではなく、ましてやその開発に対してアメリカ政府から融資を受けていたということもない。なお、旧ソ連でも、鉛筆に対してはアメリカと同様の問題を認識しており、1969年には有人宇宙機に持ち込む筆記用具を鉛筆からスペースペンに置き換えている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;apollo&amp;quot;&amp;gt;稀にASTPで飛行したApolloを「18号」と呼ぶ人が居るが、これは誤りである。アポロ計画にASTPが含まれないことと、NASAの大幅な予算削減および打上げ機である[https://en.wikipedia.org/wiki/Saturn_V サターンVシリーズ]の生産が打ち切られたことで、20号まで存在したアポロ計画そのものが17号で強制終了、18〜20号の計画は正式に廃棄されたからである。なお、ASTPで使用されたApolloが、アポロ計画と[https://www.nasa.gov/mission_pages/skylab スカイラブ計画]で運用された一連のApollo宇宙機で最後に宇宙空間に出た完成機であり、19号・20号向けに製造されたApolloは未完成のまま放棄された。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;apas-75&amp;quot;&amp;gt;事実、この御題目に関しては、ドッキング機構技術に一日の長があった旧ソ連の[https://ru.wikipedia.org/wiki/Сыромятников,_Владимир_Сергеевич &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Владимир&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ウラジーミル&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Сыромятников&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;シロミャトニコフ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]が主導し、両国で共同開発された、ASTP専用の[https://en.wikipedia.org/wiki/Androgynous_Peripheral_Attach_System アンドロジナスドッキング機構 APAS-75]の、宇宙での動作を確認しただけである。当然、APAS-75の開発では両国のエンジニアが直接面会したり手紙でやりとりしたり綿密に擦り合せて設計しており、1972年6月には&amp;amp;#8534;サイズで、1973年10月には実物大で、それぞれ現物を製作し、地上での動作確認も成功裏に終えていたため、わざわざ宇宙空間で動作確認する意義は殆ど無い。ドッキング機構からの空気漏れの有無も、通常の有人宇宙機開発の常套手段である「水を張ったプールに浮かべる」ことで判断可能なので尚更である(空気が漏れ出るような間隙が有れば、そこから水が浸入し、宇宙機は水没する)。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;co&amp;quot;&amp;gt;同一平面上にあり、焦点が一致する2つの軌道を指し、Coelliptic orbitという。同一平面上にある2機の宇宙機の相対的な基準となる。軌道内のどこに宇宙機が位置していても、整列した半径ベクトルの大きさの差がほぼ同じになる特性から、宇宙機をランデブーする際は頻繁に使われる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;reason&amp;quot;&amp;gt;あるいは、アメリカがASTPでHP-65による軌道決定の場面を見た旧ソ連が真似したのかもしれないが、いくら地球周回軌道という比較的近傍であるが故に演算桁数もそこまで求められない状況とはいえ、HP-65と[[Электроника МК-52]]の演算精度と造作を比較すれば、後者が段違いでレベルが低く、「もし本当に&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;の航法支援装置が故障したとき、バックアップとして使い物になるか？」というと甚だ疑問である。有人宇宙機の打上げ中止後に使用できることになっていた緊急脱出装置が実用に堪えない代物(正常に起動はするが、起動させれば宇宙飛行士の生命が危ういものばかり)だったことと同様、旧ソ連の宇宙飛行士に対して士気向上や安心感を提供するためのポーズだったのかもしれない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;failure&amp;quot;&amp;gt;「磁気カードを取り込まない」症状を指す。原因は、磁気カードを挟んで取り込むためにモータの回転軸へ装着している樹脂プラスティック製の「押さえ」が、経年により[https://en.wikipedia.org/wiki/Hydrolysis 加水分解]して元の形状を失い、粘着質を帯びた樹脂塊と化すことで、モータの回転を阻害するため。磁気カードリーダライタを分解して樹脂塊を剥ぎ取り洗浄後、護謨製の[https://en.wikipedia.org/wiki/O-ring オーリング]2個もしくは[https://en.wikipedia.org/wiki/Hose チューブ]に交換すれば復旧する。なお、まったく同じ故障が、磁気カードリーダライタ内蔵機種では[[HP-67/HP-97]]、周辺機器ではHP-41シリーズ用磁気カードリーダライタの[[HP 82104A]]でも発生する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-45/HP-46&amp;diff=6828</id>
		<title>HP-45/HP-46</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-45/HP-46&amp;diff=6828"/>
		<updated>2026-03-19T23:17:39Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1973年5月1日〜1976年1月15日に販売されたClassicシリーズの科学・数学向けRPN関数電卓で、[[HP-35]]の改良版に当たる。HP-45は可搬型、HP-46は机上設置型だが、マイクロプロセッサと実装された関数はまったく同じ&amp;lt;ref name=&amp;quot;rom&amp;quot; /&amp;gt;だ。&lt;br /&gt;
&lt;br /&gt;
[[HP-35]]の爆発的なヒットから電卓市場への本格参入を決断したHPは、多機種を同時並行で開発するに際し、それらを社内で識別するコードネームを付与するようになり、HP-45/HP-46は[https://dictionary.cambridge.org/us/dictionary/english/wizard Wizard (魔法使い)]とされた。この伝統はHPが2001年末に電卓市場から撤退するまで続く。&lt;br /&gt;
__TOC__&lt;br /&gt;
===シフトキーによる機能倍増===&lt;br /&gt;
HP-45/HP-46は、初めて関数電卓にシフトキー&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\color{Dandelion}\blacksquare&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を実装することで各キーに割り当てる機能を倍増させ、[[HP-35]]ではROMの容量から見送られたもののユーザから要望が多かった機能や関数を追加した。三角関数や逆三角関数で弧度法&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{RAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;やグラード(フランス度)&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{GRD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が使用できるようになり、数値の表示に科学表示(いわゆる〝SCIモード〟)が追加され、表示する桁数も選択できるようになった。以降のHP製RPN関数電卓ではすべて実装されている、最後にスタックXに積まれた数値を呼び出す&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{LAST} x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;も実装された。関数としては、[https://en.wikipedia.org/wiki/Cartesian_coordinate_system 直交座標系]⇔[https://en.wikipedia.org/wiki/Polar_coordinate_system 極座標系]の変換&amp;amp;nbsp;{{keypress|&amp;amp;#129094;R}}&amp;amp;nbsp;{{keypress|&amp;amp;#129094;P}}&amp;amp;nbsp;、10進法での[https://en.wikipedia.org/wiki/Degree_(angle) 度]⇔[https://en.wikipedia.org/wiki/Minute_and_second_of_arc#Symbols_and_abbreviations 分秒]の変換&amp;amp;nbsp;{{keypress|&amp;amp;#129094;D.MS}}&amp;amp;nbsp;{{keypress|D.MS&amp;amp;#129094;}}&amp;amp;nbsp;、10の羃乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;10^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、階乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;n!&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、百分率&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\%&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、百分率変化率&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\Delta\%&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、総和&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\Sigma +&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;から平均と標準偏差&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\bar x,\text{s}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;といった関数が追加された。10の羃乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;10^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が実装されたことで、冪乗は&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;に改められた。オマケ機能として度量衡換算関数が実装されており、キログラム⇔ポントの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {kg/lb}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、センチメートル⇔インチの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {cm/in}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、リットル⇔ガロンの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {lit/gal}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;も演算できる。プログラミング機能は無く、スタックやRAMに記憶した内容は電源OFFで全て消失する。実装したRAMは10スタック分＝560ビット＝70バイトしか無い。&lt;br /&gt;
&lt;br /&gt;
可搬型のHP-45は[[HP-35]]と較べると機能は大幅に改良されているが、外形は[[HP-35]]の金型を流用しているため殆ど変わらない。キーの配色は指垢による汚れが目立たなぬよう青色系から灰色系に変更されたものの、キーの数は35個で同じ、専用充電池とACアダプタは[[HP-35]]と共通なのでユーザやセラーが別売で購入する保守部材としての型番も変わらない。即ち、変わったのはROMだけで、そういう意味でもHP-45を解析する理由はほぼ無い。強いて言えば、マニュアルには未記載だがユーザが発見した、試作のROMから削除し忘れそのまま出荷されたことで[https://en.wikipedia.org/wiki/Easter_egg_(media)#In_computing イースターエッグ]扱いとなっている「タイマー機能」&amp;lt;ref name=&amp;quot;timer&amp;quot; /&amp;gt;は面白いが、HP-45は水晶発振子等による正確なクロック源を実装していない&amp;lt;ref name=&amp;quot;crystal&amp;quot; /&amp;gt;ため精確な計時は期待できない。ただ、タイマー機能がユーザに好評だったことを知ったHPが、Classicシリーズの最後の機種である[[HP-55]]でクロック源として水晶発振子を実装して正式な機能として売り出す切っ掛けにはなり、その後の機種でも「タイマー(とカレンダー)」は標準機能として実装されるようになる。なお、本機向けの演算事例集「[https://literature.hpcalc.org/items/937 HP-45 applications book]」が10ドルで別売されており、数学・統計・金融・技術・航法支援の事例が掲載されている。&lt;br /&gt;
&lt;br /&gt;
HP-45はeBayをはじめとするオークションサイトへの出品も少なく、管理人は後述するHP-46と比較するためだけに1台所有しているに過ぎない。&lt;br /&gt;
&lt;br /&gt;
===唯一の変態機種===&lt;br /&gt;
ここで仔細に採り上げるべきは、机上設置型のHP-46である。先述した通り、実装された機能や関数はHP-45とまったく同じ&amp;lt;ref name=&amp;quot;rom&amp;quot; /&amp;gt;だが、そんなことは差し措いて、HP-46の特長として真っ先に挙げねばならないのが、&#039;&#039;&#039;数値の表示が機械式プリンタによる普通ロール紙への2色印字による出力のみ&#039;&#039;&#039;で&#039;&#039;&#039;7セグLEDによる数値の表示が別売の純正ドーターボードによる有償オプション&#039;&#039;&#039;だったことだ。このような形態のHP製電卓は、HP-46と、世界初の金融・財務向けRPNポケット関数電卓である[http://www.hp-collection.org/calculators/80a.html HP-80]の機能と関数を強化した机上設置型である[http://www.hp-collection.org/calculators/81a.html HP-81]が唯一である。&lt;br /&gt;
&lt;br /&gt;
それまでHPが販売してきた関数電卓は、可搬型だろうと机上設置型だろうと「7セグLEDによる数値の表示」は至極当然の機能として一律に実装しており、現代の感覚で考えても、敢えて外す理由が見つからない。なぜこのような机上設置型のHP-46(とHP-81)を開発・製造したのだろうか？&lt;br /&gt;
&lt;br /&gt;
その理由は、「関数電卓が[https://en.wikipedia.org/wiki/Diffusion_of_innovations イノベータ]から[https://en.wikipedia.org/wiki/Early_adopter アーリーアダプタ]に普及し始めたこと」と「HP-46の発売が1973年であること」、そして「HP-46が机上設置型であること」から想像できる。&lt;br /&gt;
&lt;br /&gt;
HP-46(とHP-81)が発売された1973年5月は、一般市民が個人で気軽にコンピュータを所有できる時代では無く、ましてや、演算過程や結果をコンピュータから直接紙に打ち出して検算することなど不可能であった。また、机上設置型電卓の一般的な使用形態は、個人が専有するものではなく、複数人で共有するものであった。&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;[[HP-35]]の予想だにしなかった売れ行きから、高精度な演算結果が得られる科学・数学向け関数電卓に大きな需要があるのは確かだ。&amp;lt;br&amp;gt;また、これまでの販売実績と市場調査から、複数人で共有されることが多い机上設置型では「演算過程も演算結果もすべて印刷する」という使い方が圧倒的多数なのも確かだ。&amp;lt;br&amp;gt;ならば、机上設置型からは7セグLEDを省いて良いのでは？ 製品価格も抑えられるし妙案かもしれない！&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#x2E3A;恐らくこのような思考過程から産まれたのがHP-46(とHP-81)である。&lt;br /&gt;
&lt;br /&gt;
しかもこのときHPが採用したプリンタは、同じ1973年にキヤノンが発売した金融機関向け加算器方式電卓・MP1215&amp;lt;ref name=canon /&amp;gt;で採用し、その後のHPでも主流となる、感熱紙に熱転写ヘッドを押し当てて印字する[https://en.wikipedia.org/wiki/Thermal_printing サーマルプリンタ]ではなく、普通紙に金属製の活字をインクリボンの上から叩き付けて印字するタイプライタと同様の[https://en.wikipedia.org/wiki/Printer_(computing)#Typewriter-derived_printers 機械式プリンタ]ある。&lt;br /&gt;
&lt;br /&gt;
HP-46(とHP-81)の開発に着手した時点では既に商用に耐える程度には実用化されていた、小型化と軽量化と省電力に勝るサーマルプリンタ&amp;lt;ref name=&amp;quot;thermal&amp;quot; /&amp;gt;を敢えて避け、大きく重く電力を食うことを承知で機械式プリンタをわざわざ採用したのは、サーマルプリンタと較べて機械式プリンタが唯一勝る「印字結果が明瞭で、経時劣化による印字内容の消失が無い」ことを優先したからだろう。先述したように机上設置型電卓は複数人で共有する使用形態が多く、個人が自席に戻り演算過程や結果を確認するまでに時間が開いたり複数回確認する場面があることが容易に想定できるため、「印字後に放置すると印字内容が消える」という致命的な欠点を持つサーマルプリンタの採用を見送ったと想像される。&lt;br /&gt;
&lt;br /&gt;
なお、HP-46(とHP-81)で採用した機械式プリンタは日本製である。信州精器(現セイコーエプソン)が製造・納入した[https://www.schlepptops.de/wiki/index.php?title=Shinshu_Seiki_Model_102 Model-102]がそれで、印字する字種を絞り小型化するため、活版活字は金属製のドラムに巻き付けられ、それをモータで回転させて印字する活字を選択、上からアームで叩きつける形式としだが、それでも質量の肥大化は避けられず、この機械式プリンタ部だけで1.48kgある。本体全体で5.98kgなので、機械式プリンタ部だけで全質量の25%を占めている。なお、この機械式プリンタの同機種やマイナーチェンジした変種は他の電卓メーカでも採用されており、当時は比較的良く見掛けるものではあった。このこともあってか、HP製RPN電卓では珍しく、消耗品である普通ロール紙(2インチ&amp;amp;frac14;幅)と2色インクリボンに「HP純正品だけを使え」といった指定が無い。マニュアルでは、普通ロール紙は「HP純正品でも良いけど、汎用の2インチ&amp;amp;frac14;幅の加算器電卓用ロール紙が使えます」と説明、2色インクリボンはHP純正品を云々という記載すらなく「『General Ribbon社製E200シリーズ』もしくは『Columbia Ribbon社製43シリーズ』の汎用2色インクリボンが使えます」と事務用品ベンダが販売する互換品を紹介するに至り、それぞれ交換手順とともに図示されている。管理人は、現在でも入手できるGeneral Ribbon社の[https://www.amazon.com/dp/B07MG5NPTW E201-BR]をアメリカから購入している&amp;lt;ref name=&amp;quot;consumables&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
尤も、「数値の表示が『機械式プリンタへの印字のみ』というのは流石に…」と営業部門やマーケティング部門からクレームでも入ったのか、純正オプションとして、数値を7セグLEDにも表示する「A5ドーターボード(00046-69541)」、通称『OPTION 001』が用意され、100ドル(約26,500円)で同時に別売された。『OPTION 001』はHP-45に実装した7セグLEDモジュール/アノードドライバIC/カソードドライバICを流用して設計されているが、7セグLEDモジュールの左側には赤色LEDが1個実装されている。このLEDはBUSY(処理中)のときだけ概ね1〜2秒点灯する。『OPTION 001』を購入しない場合、そのスロットにはBUSY赤色LEDを1個だけ実装した「A4ファザーボード(00046-69540)」を装着して納品した&amp;lt;ref name=&amp;quot;board&amp;quot; /&amp;gt;。本体価格が695ドル(約184,200円)なので結構割高なオプションとなるが、理由と時期は不明なものの、本体価格が715ドルに値上げされた記録も残されているため、『OPTION 001』はさほど売れなかったのかもしれない。ただ、HP-46には電源がONであることを示すパイロットランプが無いため、『OPTION 001』を購入しないと、パッと見でHP-46の電源が入れっ放しか否かが解らず不便なのは確かだ。その代わり、HP-46は電源を入れると機械式プリンタの活字ドラムが常時回転し続けるため、その回転音が結構耳につく。管理人もこの音は想定外だったが、気になるユーザは居ると思われる。「『OPTION 001』が無くても、電源が入っていることは、活字ドラムの回転音で判るだろう」ということなのだろうか。それとて、機械式プリンタ部だけ電源を切る&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{PRT OFF}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すれば止まるのだが…。&lt;br /&gt;
&lt;br /&gt;
HP-45と同様、本機向けの演算事例集「[https://literature.hpcalc.org/items/945 HP-46 sample applications]」も5ドルで別売されており、電子工学・機械工学・構造工学・医学・測量について掲載されている。HP-45向け演算事例集で採用しているのが数学・統計・金融・航法支援であることを考えると、それぞれの機種でHPが想定している使用場面として、HP-46は屋内で落ち着いて演算、その結果を共有するものを、HP-45は外出先で演算し、その結果は個人で使用するものを、それぞれ選別していることが判る。&lt;br /&gt;
&lt;br /&gt;
管理人が所有するHP-46は、ただでさえeBayをはじめとするオークションサイトへの出品数が極めて少ないなかで初めて見た、『OPTION 001』を装着した完動品が1台だけである。メカニカルキーボードの打鍵感が素晴しく、印字に際して如何に少ない文字種で関数を表現するかに腐心した痕跡が見て取れるうえ、負数はわざわざ赤インクで印字するという配慮も心憎い。演算精度も現在の凡百な関数電卓と較べて遜色無く常用に十分堪えるため、個人的には[[HP-41CX]]に次いで使用頻度が高い。メカニカルな動作を含め、非常に面白い機種である。&lt;br /&gt;
&lt;br /&gt;
[[File:printout.jpg|link=|thumb|200px|HP-46による[[所有するRPN電卓本体|ベンチマークと蛇足]]の演算過程と結果の印字出力例]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7}518796.992\ \; (\varepsilon\!_R=2.87\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 42.99999997&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|200kHz (Classic)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-45&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|HP 82001A/B (3.6V 450mAh/900mAh 充電池:中身は単3形Ni-Cd充電池×3個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-46&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|なし (商用電力で駆動)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|1973年〜1976年&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-45&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|アメリカ → シンガポール&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-46&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|アメリカ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1973年発売当時の定価&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-45&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|395ドル (約104,700円)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-46&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|本 体&lt;br /&gt;
|695ドル (約184,200円)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|OPTION 001&lt;br /&gt;
|100ドル (約26,500円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rom&amp;quot;&amp;gt;基板に実装したROM(ソフトウェア)の中身としては、HP-45ではイースターエッグ扱いの「タイマー機能」を削除し、それで空けた容量に、HP-46では最重要の「プリンタ機能」を実装しているという差分はあるが、HP-45の「タイマー機能」はマニュアル未記載であるため、マニュアルに記載した(HPが公式に使用を認めた)機能や関数はまったく同じである。なお、マイクロプロセッサは、科学・数学向けの[[HP-35]]/HP-45/HP-46/[[HP-55]]の4機種、金融・財務向けの[http://www.hp-collection.org/calculators/70a.html HP-70]/[http://www.hp-collection.org/calculators/80a.html HP-80]/[http://www.hp-collection.org/calculators/81a.html HP-81]の3機種、計7機種に足掛け5年間、まったく同じものが実装され続けた。マイクロプロセッサとしての基本的なアーキテクチャが優れていたこともあるのだろうが、この場合は「ROM(ソフトウェア)さえ差し替えれば、関数電卓の機能を向上させたり、まったく別物に変えることができる好例」と捉えるべきだろう。尤も、この考えを社外にも広く公開することでパーソナルコンピュータ界の覇権を握れたのがIntelで、社内での流用に留めたために一時的とはいえ電卓事業からの撤退を強いられたのがHPとも言えるのだが。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;timer&amp;quot;&amp;gt;{{keypress|&amp;lt;math&amp;gt;\text{RCL}&amp;lt;/math&amp;gt;}} 押下後&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{CHS}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;7&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;8&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を同時に押下することで「タイマー機能」が起動する。{{keypress|&amp;lt;math&amp;gt;\text{CHS}&amp;lt;/math&amp;gt;}} を押下する度に計時の開始と停止を繰り返す。計時中に&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;〜&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;9&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると、押下した時点の経過時間(スプリットタイム)を記憶、計時停止後に&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;〜&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;9&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると経過時間(スプリットタイム)を呼び出せる。{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると「タイマー機能」が終了し、7セグLEDには時間が表示されたままとなる。{{keypress|enter}}&amp;amp;nbsp;を押下しても「タイマー機能」は終了するが、7セグLEDの表示はクリアされる。&amp;lt;br&amp;gt;[[HP-55]]では動作モード選択スイッチを[TIMER]に倒すと「タイマー機能」が起動、{{keypress|&amp;lt;math&amp;gt;\text{R/S}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下する度に計時を開始/停止する。計時中に&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;〜&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;9&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると、押下した時点の経過時間(スプリットタイム)を記憶、計時停止後に&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;〜&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;9&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると経過時間(スプリットタイム)を呼び出せのるは同じだが、10進法での度⇔分秒の変換&amp;amp;nbsp;{{keypress|&amp;amp;#129094;D.MS}}&amp;amp;nbsp;{{keypress|D.MS&amp;amp;#129094;}}&amp;amp;nbsp;を噛ますことでスプリットタイム同士の加減算も実行できる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;crystal&amp;quot;&amp;gt;HP-45を開腹し、[https://www.hpmuseum.org/45crys.htm 基板の然るべき箇所に784kHzの水晶発振子を半田付けする]ことで、タイマーを精確にするハックが出回っている。eBayをはじめとするオークションサイトにも、この改造を施したものが出品されることがある。電卓も歴としたコンピュータだが、関数電卓程度の回路規模とクロック周波数であれば、一般的に、正確な周波数を発振できて高価な水晶発振子が実装されることは無く、製造過程に依り発振する周波数が上下するものの安価なクロックドライバICやマイクロプロセッサ自身に内蔵されたクロック発振回路がクロックパルスを発振し周辺チップを同期駆動させている。ClassicシリーズではクロックドライバIC(パーツ番号はHP-45では1820-1128、HP-46では1820-1127)が実装されている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=canon&amp;gt;ちなみにこの型番は現行機種でも使われるほど息が長い。2024年現在は[https://personal.canon.jp/product/business-tool/calc/printer/mp1215d MP1215-D VII]だそうで、入力が加算器方式なのは変わらないが、プリンタは2色インクリボンによる機械式に差し替えられている。印字後に放置すると印字内容が消え判読できなるくなるサーマルプリンタを、金勘定で使う電卓が吐き出す[https://ja.wikipedia.org/wiki/ジャーナル_(会計) ジャーナル]として採用するのは、やはり無理があったのだろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;thermal&amp;quot;&amp;gt;世界で初めて電卓の回路をフルIC化したのはテキサス・インスツルメンツ(TI)だが、同時に、世界で初めて表示部にサーマルプリンタを発明・採用した。1965年9月、当時のTIの社長である[https://en.wikipedia.org/wiki/Patrick_E._Haggerty Patrick Haggerty]は、TIの半導体研究部門のトップでICを発明した[https://en.wikipedia.org/wiki/Jack_Kilby Jack Kilby]に「電池で動き、ポケットに入る電卓の開発」を社長権限で命じ、Kilbyは自身が最も信頼していた[https://en.wikipedia.org/wiki/Jerry_Merryman Jerry Merryman]に設計を委ね、開発チームを組織した。1年半後の1967年3月29日に完成した[https://americanhistory.si.edu/collections/search/object/nmah_1329686 試作機“Cal Tech”]は小型化のため必然的にフルIC電卓となったが、ここで試作したICはバイポーラ型で、かつ、集積度が低く(直径1インチ(約25.4mm)の円形ウェハにバイポーラトランジスタを384個作り込むのが限界)、それを入力/記憶/演算/印字で4個も使用するため、演算時はもとより待機時も消費電力が大きく、充電式バッテリをすぐ空にすることが判る。そのため、表示部には待機時も使用(表示)時も可能な限り電力を消費しないものが希求され、結果として、印字時しか電力を消費しないサーマルプリンタが発明されることになる。実装したサーマルプリンタは幅&amp;amp;frac12;インチ(約6.4mm)程度の感熱ロール紙へ印字する超小型のもので、プリンタヘッドが消費する電力も極限まで下げている。このとき開発された同型のサーマルプリンタは1970年に[http://www.dentaku-museum.com/calc/calc/3-canon/2-pktr/pocketronic.html キヤノンがポケット電卓で採用]している。ちなみに、MOS型ICと7セグLEDが製品化され市場に流通するのは1970年代に入ってからである。&amp;lt;br&amp;gt;しかし、この試作機が改修され世に出ることはなかった。幅4インチ¼(約108mm)・奥行6インチ⅛(約156mm)・高さ1インチ¾(約44.5mm)・重さ45オンス(約1.28kg)と、可搬ではあるもののポケットには入らない大きさに仕上がった試作機を見たHaggertyから「これじゃポケットに入らん！ もっと小さくしろ！」と怒られたこともあったが、それ以前に、TIのマーケティング部門がHaggertyに対し、自社で実施した電卓に関する市場調査結果から「アメリカでは『ポケット電卓』なんて誰も求めてない」ことを忠言したからである。その忠言を無視したHaggertyが「とにかくポケット型電卓を作れ！」とKilbyに命じた結果がこの試作機なのだが…このあたりの顛末は1991年7月28日にNHK総合テレビで放送された[https://www.nhk.or.jp/archives/chronicle/detail/?crnid=A199107282100001300100 『電子立国 日本の自叙伝 第4回 電卓戦争』]で試作機の現物ともども紹介されている。&amp;lt;br&amp;gt;なお、Kilbyは[https://www.nobelprize.org/prizes/physics/2000/9731-the-nobel-prize-in-physics-2000/ 「IC(集積回路)の発明」で2000年にノーベル物理学賞を受賞]したことでも有名だが、それ以前から、いわゆる[https://patents.google.com/patent/US3138743 Kilby patent]による論争や訴訟を含め、生涯で60余の特許を取得したことで著名である。この試作機が完成後にも「サーマルプリンタ」と「電卓」で、共同発明者のひとりとしてアメリカで特許を出願し取得している(「サーマルプリンタ」は[https://patents.google.com/patent/US3496333 1968年9月26日に出願し1970年2月17日に取得]、「電卓」は[https://patents.google.com/patent/US3819921 1972年12月21日に出願し1974年6月25日に取得])。また、試作機(とアメリカ合衆国特許商標庁に提出した特許出願書類)から、入力方式が加算器方式であることが判る。IC化するにあたり演算回路のフットプリントを極限まで小さくするには加算器方式が最適だったからだろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;consumables&amp;quot;&amp;gt;同種と互換性があると推定される普通ロール紙と2色インクリボンはカシオも販売している(普通ロール紙は[https://www.casio.com/jp/electronic-registers/options/product.RP-5860-TW/ RP-5860-TW]、2色インクリボンは[https://www.casio.com/jp/basic-calculators/options/product.RB-02-A/ RB-02-A])が、ある程度まとめて購入すると、輸送費込みでもアメリカから購入するほうが安い。これは単純に現在の日米での需要の差によるもので、日本ではほぼ需要が無くなりつつあるものの、アメリカではサラリーマンであっても納税は個人で確定申告せねばならず、その際に税務当局へ提出する証憑として、時間が経っても印字内容が消えない機械式プリンタには根強い人気があるからだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;board&amp;quot;&amp;gt;『OPTION 001』は後からでも購入できたようで、HPのフィールドエンジニア向けドキュメントである「MODEL 46 AND 81 CALCULATOR SERVICE MANUAL (00046-90031)」では、「A4ファザーボード(00046-69540)」を「A5ドーターボード(00046-69541)」と交換できる旨の記載がある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-35&amp;diff=6826</id>
		<title>HP-35</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-35&amp;diff=6826"/>
		<updated>2026-03-19T23:07:34Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1972年2月1日〜1975年11月30日に発売された[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0023/0023history.html 世界初の&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;可搬型&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ポケット&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;関数電卓にして、HP初のポケットRPN電卓]。当時のポケット電卓は四則演算しか行えず&amp;lt;ref name=&amp;quot;pocket&amp;quot; /&amp;gt;、関数電卓は&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;机上設置型&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;デスクトップ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ref name=&amp;quot;desktop&amp;quot; /&amp;gt;しか無かったところに、&#039;&#039;&#039;ポケット&#039;&#039;&#039;の&#039;&#039;&#039;関数&#039;&#039;&#039;電卓が登場したことは驚きと賞賛を以て迎えられ、395ドル(121,660円)と高価格&amp;lt;ref name=&amp;quot;price&amp;quot; /&amp;gt;ながらも、初年度だけで事前に予測した販売台数の10倍である100,000台、販売終了となった1975年11月末までの約3年半で総計300,000台以上と爆発的に売れ、エンジニアや科学者の机上と胸ポケットから計算尺を駆逐した。まさに&#039;&#039;&#039;現在のパーソナルコンピュータの礎の1つである&#039;&#039;&#039;本機は、2009年に[http://www8.hp.com/us/en/hp-news/press-release.html?id=169661 IEEEマイルストーン]に[http://ethw.org/Milestones:Development_of_the_HP-35,_the_First_Handheld_Scientific_Calculator,_1972 認定]されている。&lt;br /&gt;
__TOC__&lt;br /&gt;
===目指すは“計算尺からの置き換え”===&lt;br /&gt;
非常に有名な本機は、電卓マニアによってアーキテクチャがハックされ続けているが、[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0023/other/0023hpjournal01.pdf HPも自ら公開]している。ハードウェアは5個のMOS LSI、3個のバイポーラIC、3個の5桁7セグメント赤色LEDモジュールで構成され、MOS LSIとバイポーラICの論理設計、および、バイポーラICと5桁7セグメント赤色LEDモジュールの製造は自社のカリフォルニア州サンタクララにあった事業部(HP Santa Clara Division)が、MOS LSIの製造は[https://en.wikipedia.org/wiki/Mostek Mostek]と[https://en.wikipedia.org/wiki/Onsemi American Microsystems (AMI、現在のOnsemi)]が、それぞれ担当した。MOS LSIは演算回路(Arithmetic and Register circuit: A&amp;amp;R)が1個、制御回路(Control and Timing circuit: C&amp;amp;T)が1個、演算アルゴリズムと演算ロジックを含むソフトウェアを格納したROMが3個(1個の記録容量は2,560ビット、1命令に10ビット割り当てられているため、1個で256命令。それを3個実装したため合計で最大768命令)、バイポーラICは二相クロックドライバ、LEDアノードドライバ兼クロックジェネレータ、LEDカソードドライバが、それぞれ1個ずつ実装されている。数値の表示は7セグメント赤色LED&amp;lt;ref name=&amp;quot;led&amp;quot; /&amp;gt;を採用したが、演算回路や制御回路と較べてLEDは消費電力が大きいため、少しでもLEDによる消費電力を低減すべく、発光面積を減らすために各桁に拡大レンズを載せるという涙ぐましい奇策も繰り出しており、それを5桁で1モジュール化した本機専用の5桁7セグメント赤色LEDモジュールをわざわざ自社開発した。&lt;br /&gt;
&lt;br /&gt;
各半導体間の配線を極限まで簡素化するため、A&amp;amp;Rは、その後のHP製RPN電卓で主流となる方式と異なり、14桁の56ビット長BCDを、1クロックで1ビットずつ処理する「1ビットシリアルプロセッサ」として設計された。14桁の割り当てはその後に主流となる方式と同じで「1桁が仮数部正負符号」「10桁が仮数部」「1桁が指数部正負符号」「2桁が指数部」である。スタックはその後に主流となる方式と同じ3+1段が用意されているものの、スタック用に割り当てられたRAMは揮発性なので、電源を切ると全てのスタックの内容は消失する。また、本機特有の仕様として、本機で三角関数を演算する際は最上位スタック(スタックT)を作業用レジスタとして使用するため、それまでスタックTに格納していた数値は強制的に上書きされ消失する。プログラミングもできない本機の附属操作マニュアルは至って簡素で、「(主な購買層である)エンジニアや科学者が一読して理解できれば良いだろ」と言わんばかりの、本体と同じ大きさの、RPNの概念と操作方法と仕様を簡単明瞭に記述した中綴じ36ページのパンフレット&amp;lt;ref name=&amp;quot;pamphlet&amp;quot; /&amp;gt;が1部だけである。&lt;br /&gt;
&lt;br /&gt;
実装した関数は、四則演算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の他に、度数法での三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\mbox {arc}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\ln&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、逆数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、開平&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{x}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;lt;ref name=&amp;quot;exp&amp;quot; /&amp;gt;、円周率&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;だが、これらをたった767命令で実行・演算していることに驚く。先述した通り、本機のROMは最大で768命令しか実装できない。そのため開発陣は、この限られた命令数から逆算し、どのような命令を作成すれば、それらを最大限駆使することで、実装した関数の演算結果にどこまで精確さを持たせられるか、演算アルゴリズムと演算ロジックの精査を強いられた&amp;lt;ref name=&amp;quot;cochran&amp;quot; /&amp;gt;。最終的な販売価格と演算結果の精確さを見極めた結果、「冪乗の演算は対数で実行するため誤差が出る」ことをマニュアルで明記&amp;lt;ref name=&amp;quot;power&amp;quot; /&amp;gt;し、現代の関数電卓では当たり前に実行できる「弧度法での三角関数/逆三角関数の演算」は諦めることにした&amp;lt;ref name=&amp;quot;slide&amp;quot; /&amp;gt;。こういった判断は、本機に実装した関数が、当時の科学者やエンジニアが無理数の概数を得るために個人が購入できる計算用具であった[https://en.wikipedia.org/wiki/Slide_rule 計算尺]が対象としていた関数であることに由来し、計算尺を使い熟すには相当な訓練が必要&amp;lt;ref name=&amp;quot;sr&amp;quot; /&amp;gt;であることから、本機の開発を指示したHP創業者の1人であるBill&amp;amp;nbsp;Hewlettは明確に「計算尺からの置き換えを狙って本機を開発させた」と推定される&amp;lt;ref name=&amp;quot;foreword&amp;quot; /&amp;gt;。尤も、Bill&amp;amp;nbsp;Hewlettは本機を「デスクトップRPN関数電卓の[https://www.hpmuseum.org/hp9100.htm HP 9100A/B]がポケットに入れば、HP社内で需要はあるだろう」と読んで開発させたようで、当初は社内向けを含め50,000台程度の販売を見込んでいたのだが、当時は一部分野で競合関係にあったライバル企業の[https://en.wikipedia.org/wiki/General_Electric General Electric]から20,000台を受注する等、本機の生産台数は大幅に上積みされることになる。管理人が所有しているのは全てアメリカ製だが、想像以上に売れたためか、日本を含むアメリカ国外で販売する分はシンガポールで製造するようになった。&lt;br /&gt;
&lt;br /&gt;
1972年の半導体製造技術ではMOS LSI&amp;lt;ref name=&amp;quot;mos&amp;quot; /&amp;gt;もLEDも消費電力が大きかったため、本機は基本的に純正ACアダプタ(HP 82002A/B/C)で給電しての使用を前提にしているが、電池ボックスに装着する形で内蔵する純正充電池(HP 82001A/B)を満充電することで最長3時間はコードレスで使用できる。HP 82001A/Bは遥か昔に販売を終了しているため、現代で本機を使用するにはHP 82002A/B/Cが必須だが、HP 82001A/Bの実態は「単3形Ni-Cd充電池を3本直列にして簡単なプラスティックの枠に納めたもの」なので、枠を慎重に殻割りして新品の単3形充電池&amp;lt;ref name=&amp;quot;battery /&amp;gt;と入れ替えることで復旧できる他、その外形故、様々なベンダからHP 82001A/Bの代替となる充電池が販売されており、充電池の入手には困らない。&lt;br /&gt;
&lt;br /&gt;
===様々な逸話===&lt;br /&gt;
世界初のモノを開発するときは、様々な逸話ができる。ご多分に漏れず、世界初のポケット関数電卓である本機の周辺も様々なネタが転がっている。&lt;br /&gt;
&lt;br /&gt;
:*Bill&amp;amp;nbsp;Hewlettは開発陣に「私のシャツの胸ポケットに入る大きさにせよ」と条件を出した。本機の外形は最終的に幅82mm×奥行145mm×高さ25mmと大振りに仕上がってしまったが、彼が長身で大きなシャツを着ていたことに開発陣は救われた。これに肖ったのか、本機附属マニュアルの序文は&#039;&#039;&#039;SHIRT POCKET POWER&#039;&#039;&#039;というタイトルが付されている。&lt;br /&gt;
:*実装した演算アルゴリズムの正確性を検証するため、当初は大型コンピュータである[https://ja.wikipedia.org/wiki/バロース_B5000 バロース B5500]の演算結果と比較していたが、精度が足りず続行不可。已むを得ずIBMのメインフレームに切り替えたものの、やはり精度が足りず中止された。これは、ポケット関数電卓である本機に実装した演算アルゴリズムが当時最新鋭のメインフレームと同等以上の精度がある&amp;lt;ref name=&amp;quot;japan&amp;quot; /&amp;gt;ことを意味していた。&lt;br /&gt;
:*本機は1972年に世界で初めてNASAにより宇宙に出た関数電卓である。1973年5月〜1974年2月にはNASAの初代宇宙ステーションである[https://www.nasa.gov/mission_pages/skylab Skylab]でも使用された。&lt;br /&gt;
:*発売当初、本機には型番や名称を付与しておらず、単に&#039;&#039;&#039;The Calculator&#039;&#039;&#039;と呼んでおり、本体正面に貼付されたラベルも&#039;&#039;&#039;HEWLETT・PACKARD&#039;&#039;&#039;と社名だけ書かれたものだったが、本機の物理キーが35個あることから、Bill&amp;amp;nbsp;HewlettがHP-35と&#039;&#039;&#039;後付けで型番を付与&#039;&#039;&#039;した。これを受け、後述のバグ対策ROMを載せたVer.3から、本体正面のラベルも型番が追記された&#039;&#039;&#039;HEWLETT・PACKARD 35&#039;&#039;&#039;に差し替えられた。&lt;br /&gt;
:*本機が既に25,000台ほど売れた後、現在では夙に有名なバグが摘出された。Ver.1とVer.2のROMでは&amp;amp;nbsp;&amp;lt;math&amp;gt;e^{\ln{2.02}}=2.02&amp;lt;/math&amp;gt;&amp;amp;nbsp;であるべきが&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;と[https://archived.hpcalc.org/laporte/HP35%20bug.htm 誤算してしまう]のだ。この件にどう対応するか、HP社内では侃々諤々の議論が交わされたが、最も簡単であろう「バグの存在を握り潰す」のではなく「顧客へ正直に報告し、バグ対策したROMへの&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;無償修理&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;リコール&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;を実施する」ことに決定、その旨がアナウンスされた。当時の本機ユーザはHPの実直かつ誠実な対応に感動し(またはこのバグを内在した機体のほうが後々価値が出ると考えて)、大半のユーザはバグを承知で未対策品を使い続けることを選択、無償修理を申し出たのは約&amp;amp;#x2155;の5,000台程度に留まった。なお、本機は[https://www.keesvandersanden.nl/calculators/hp35.php 約3年半で4回改修]されている。&lt;br /&gt;
:*このバグを教訓に、1974年、HPはカナダの数学者で計算機科学者の[https://en.wikipedia.org/wiki/William_Kahan William&amp;amp;nbsp;Kahan]をコンサルタントとして招聘、共同で演算アルゴリズムを大幅に改良した。Kahanはその後、[[HP-12C]]/[[HP-10C/HP-11C/HP-15C]]/[[HP-16C]]などHP-10Cシリーズの演算アルゴリズム設計とマニュアル執筆にも関わることになる。&lt;br /&gt;
:*本機開発当時はこれ以外の選択肢が無かったとはいえ、表示部にLEDを採用したことは本機の消費電力を吊り上げる要因であり、充電池による稼動時間を短くしている。よって、充電池による稼働時間を少しでも延ばしたいなら、演算時のみ電源ONにする等、頻繁に電源スイッチをOFF/ONすることになるが、本機の電源スイッチは機械式スライドスイッチなので、OFF/ONを頻繁に繰り返すとスライドスイッチの摺動部が摩耗し、やがて電源スイッチだけが故障することが考えられる…このジレンマに対し、ユーザの間では、電源はONだが演算しない時は小数点&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を1回以上押下して、表示部に点灯させるLEDを小数点&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;だけとするライフハック(というかバッドノウハウ)が流行した。これは、本機では電源ON直後やメモリクリア&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {CLR}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;もしくはスタックXクリア&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {CL}x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;押下後に&amp;lt;code&amp;gt;0.&amp;lt;/code&amp;gt;と表示させた後に小数点&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を1回以上押下すると&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;のみが表示されるという動作仕様を利用して、&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;を表示させる分の消費電力を削減する、という意図に依る。[[HP製RPN電卓の特長|特長]]でも記した通り、キーボードの元になる基板には金メッキが施されているため、機械式スライドスイッチより摩耗に強い造りであり、また、発光するLEDも大幅に減るため、この流行は理に適っている。&lt;br /&gt;
:*本機の開発期間は2年、従事した開発陣は20名、開発費は約100万ドルだったが、本機は300,000台以上売れたため、単純計算でも投下した開発費の100倍以上の収入を得られたことになり、HPにとっても空前の大成功を収めた製品となった。これによりHPは(関数)電卓事業への本格参入を決断する。&lt;br /&gt;
&lt;br /&gt;
本機を入手すること自体は比較的容易で、Ver.3とVer.4はeBayをはじめとする中古市場やオークションサイトに結構な頻度で出品されるものの、約50年前の製品なので、表面に印刷された文字が擦れて消えていたり、HP 82002A/B/Cが附属してなかったり、HP 82001A/Bが容量抜けしていたり(これは先述の手順で復旧可能)、7セグメント赤色LEDの輝度が落ちて数字が正常に表示できなかったりと、美品や完動品は希少になりつつある。Ver.2が出品されるのは非常に稀で、完動品であれば2020年現在で500ドル以上の売値が付けられる。Ver.1が出品されることは皆無に等しく、管理人は3度しか見たことが無いが、3,000〜4,000ドルの売値が付けられたにもかかわらず数日で売れている(勿論、管理人には手が出ない)。管理人が所有しているのは経年に比して美品かつ完動品のVer.2〜4だが、この希少性故、Ver.3とVer.4は複数台所有しているものの、Ver.2は1台しか所有していない&amp;lt;ref name=&amp;quot;buggy&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= \tan\left (\frac{355}{226}\times\frac{180}{\pi}\right )\mbox{ [deg]}= {\color{Red}-7}462686.567\ \; (\varepsilon\!_R=4.61\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 43.00000001&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||200kHz (Classic)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||HP 82001A/B (3.6V 450mAh/900mAh 充電池:中身は単3形Ni-Cd充電池×3個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1972年〜1975年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||アメリカ、シンガポール&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1972年発売当時の定価||395ドル (約120,000円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pocket&amp;quot;&amp;gt;世界初の1チップポケット電卓(四則演算のみ)は1971年6月に定価89,800円で発売された[[Nut/Saturnプロセッサファミリ#cite_note-busicom-1|ビシコン]]の[http://sts.kahaku.go.jp/sts/detail.php?no=900990151035 Busicom LE-120A]である。つまり、世界初の1チップポケット電卓が発売された8ヶ月後に世界初のポケット関数電卓である本機が発売されたことになるが、[http://sts.kahaku.go.jp/sts/detail.php?no=900990151035 Busicom LE-120A]も[http://www.dentaku-museum.com/1-exb/special/rikadai/rikadai.html#5 1970年に開発を開始した]ので、[[Nut/Saturnプロセッサファミリ#cite_note-busicom-1|ビシコン]]とHPはほぼ同時にポケット電卓の開発を開始したことになる。しかも核となるMOS LSIによるマイクロプロセッサの製造元は同じMostekである。当時Mostekがこの事実に何を思ったかは知る由もないが、技術的難易度からすれば関数電卓のほうが高度であるの言うまでもなく、1970年代初頭の日米間には技術力とマーケティング力に歴然とした差が有ったと断言して問題無かろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;desktop&amp;quot;&amp;gt;電卓の正式名称は電子式&#039;&#039;&#039;卓上&#039;&#039;&#039;計算機なので、ある意味では正しい。HP製RPN電卓でいえば[https://www.hpmuseum.org/hp9100.htm HP 9100A/B]や[https://www.hpmuseum.org/hp9810.htm HP 9810A]等が該当する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;price&amp;quot;&amp;gt;日本では横河・ヒューレット・パッカード株式会社(YHP)から99,500円で販売。[https://nenji-toukei.com/n/kiji/10021 1972年の大卒初任給が52,700円]だったので相当高価である。ただ、1971年12月18日〜1973年4月18日は[https://en.wikipedia.org/wiki/Smithsonian_Agreement スミソニアン協定]により1ドル＝308円の固定相場制だったことを考慮すると、日本国内向けの価格は約2割引されてはいる。ちなみに、[http://www.codex99.com/design/the-hp35.html 当時の日本がアメリカへ輸出していた四則演算のみの電卓が100ドル、計算尺が20ドル]だったようだ。なお、本国では、発売から3年後の1975年2月に195ドルへ値下げされているが、これは同時期に本機の後継機種である[https://www.hpmuseum.org/hp21.htm HP-21]を125ドルで発売したからである。HP-21は本機よりROMが2,560ビット拡大されたことで、弧度法での三角関数および逆三角関数が直接演算できたり、10の冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;10^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が内蔵関数として実装されたりと大幅に改善されているため、先発機種である本機より高価に設定するのが自然だと思うが、演算できる有効桁数が本機より2桁少ない10桁(指数表記では仮数部8桁、指数部2桁)であるため、無理数を扱うことが殆どの関数電卓では有効桁数が多ければ多いほど数学的な正解に近い演算結果が得られるという商品の性格から、後発のHP-21を安価に設定したようだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;led&amp;quot;&amp;gt;現代なら目に眩しい赤色が採用されることは無いだろうが、HPは1971年以降に開発・発売した第二世代のRPN電卓でも表示部に赤色LEDを採用している。本機が発売された1972年は緑色LEDが発明された年だが、緑色LEDを採用しようにも発明されたばかりで技術的にも価格的にも熟れてないうえ、一般にLEDは点灯させる光の波長が短いほど高電圧が必要であるにもかかわらず消費電流は同じなので、緑色(495〜570nm)は赤色(620〜750nm)より短波長＝赤色より高電圧(実測で約1.5倍)が必要＝赤色より消費電力が(約1.5倍)増えることになり、充電池で駆動する電卓の表示部に緑色LEDを採用する理由が無い。コストや自社が持つノウハウなどからも、1962年に発明された赤色LEDしか選択肢が無かったと思われる。なお、HPがRPN電卓に液晶ディスプレイを初めて採用したのは、1979年7月1日発売の[http://www.hp-collection.org/calculators/41c.html HP-41C]である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;exp&amp;quot;&amp;gt;歴代のHP製RPN関数電卓で本機だけ、冪乗のスタック配置が逆である。例えば&amp;amp;nbsp;&amp;lt;math&amp;gt;2^3&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算させる場合、他機種のように&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;であれば&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とRPNらしく素直に入力できるが、本機では&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と羃指数を先に入力する必要がある。これは、本機の命令数の制約から常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の逆関数である10の冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;10^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の実装が見送られたため、スタックXの真数を演算する際にキーイン数が最小となる&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で済むよう、敢えて入れ替えたといわれている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cochran&amp;quot;&amp;gt;[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP-9100A]と本機のソフトウェアを担当した[https://www.hpmemoryproject.org/news/leibson/interview_page_00.htm David S. Cochran]がHP Journalの1972年6月号で[https://en.wikipedia.org/wiki/CORDIC CORDIC]とともに[https://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0023/other/0023hpjournal03.pdf 概説]しており、2010年6月に実施されたインタビューでも「単純な&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;や&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;さえ、まず&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;ルーチンを使用し、その後、[https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Pythagorean_identities 三角関数の恒等式]から算出していました。このような手間のかかる処理は、本機のROMの容量を(3チップで)750ワードに制限するために、固有のプログラム数とプログラムステップ数を最小限に抑えるうえで不可欠だったのです」と[https://www.hpmemoryproject.org/wb_pages/d_cochran_01.htm 述懐]している。&amp;lt;br&amp;gt;[[HP製RPN電卓の特長#演算アーキテクチャ|演算アーキテクチャ]]でも記載した通り、HP製RPN電卓に実装されている4ビットCPUは[https://en.wikipedia.org/wiki/Adder_(electronics) 加算器]のみで構成されているので、現実的な演算速度で三角関数を含む[https://en.wikipedia.org/wiki/Transcendental_function 超越関数]の高精度な値を得るには、[https://en.wikipedia.org/wiki/Binary_multiplier 乗算器]を使用せず加算と減算だけで演算する[https://en.wikipedia.org/wiki/CORDIC CORDIC]を採用するのは至極当然である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;power&amp;quot;&amp;gt;マニュアル9ページ下部に&#039;&#039;The HP-35 performs &amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt; with an internal program using logarithms and the answers are not always exact to the last decimal place. For example, &amp;lt;math&amp;gt;\it 8^{2/3}=4\,&amp;lt;/math&amp;gt;, but if you key&#039;&#039; {{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;8&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}} &#039;&#039;you get &amp;lt;math&amp;gt;\it 3.999999999\,&amp;lt;/math&amp;gt;. Call it 4; the error is .000000001, or only one billionth!&#039;&#039; とある。いくら10億分の1の誤差とはいえ中学生以下の演算結果なのだが、勿論ここで引用されている例はHPが提示した最も誤差が小さい(都合が良い)もので、&amp;lt;math&amp;gt;2^3&amp;lt;/math&amp;gt;&amp;amp;nbsp;や&amp;amp;nbsp;&amp;lt;math&amp;gt;3^2&amp;lt;/math&amp;gt;&amp;amp;nbsp;といった単純な演算でも、本機の内蔵関数である冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;ではそれぞれ&amp;lt;code&amp;gt;8.000000002&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;9.000000006&amp;lt;/code&amp;gt;と、誤差を含んだ結果を出力する。手入力であれば問題無く、{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;、{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は&amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;と、それぞれ正解を出力するが、裏を返せば、羃指数が無理数であったり他の演算で得られたスタックの値であったり等、手入力できない値であるため已むを得ず内蔵関数の冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で演算させた結果は、現代の関数電卓と較べるまでもなく、心許無いということになる。概数しか得られない計算尺よりは精確な結果が得られるため良しとしたのだろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;slide&amp;quot;&amp;gt;計算尺では、弧度法で三角関数と逆三角関数を直接使用できず、[https://nikomat.org/priv/unplugged/slide-rule3/index.html 別尺で度数法⇔弧度法を変換]してから概数を得る。本機であれば、弧度法の定義に従って、弧度に&amp;lt;math&amp;gt;\tfrac{180}{\pi}&amp;lt;/math&amp;gt;を乗じて度数に、度数に&amp;lt;math&amp;gt;\tfrac{\pi}{180}&amp;lt;/math&amp;gt;を乗じて弧度に、それぞれ変換して演算させれば良い。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sr&amp;quot;&amp;gt;それまでの旧制学制では算盤の使用方法のみが教授されており、1947年(昭和22年)の学習指導要領では旧制中学3年で[https://erid.nier.go.jp/files/COFS/s22ejm/chap8.htm 「そろばんを使って，加法や減法をすること。」]、旧制中学5年で[https://erid.nier.go.jp/files/COFS/s22ejm/chap10.htm 「乗法や除法をそろばんを使ってすること。」]と定められていたが、1951年(昭和26年)に改訂・施行された学習指導要領では、[https://ja.wikipedia.org/wiki/学制改革 学制改革]による移行措置が完了したことも相俟って、中学校と高等学校の数学科で「計算尺の使用方法」が正規のカリキュラムとして採用された。新制中学校数学科では[https://erid.nier.go.jp/files/COFS/s26jhm/chap4.htm 「乗・除の計算法としては中学二年になって，計算尺による方法が指導されることになっている。」]、新制高等学校数学科では[https://erid.nier.go.jp/files/COFS/s26jhm/chap5.htm 「計算尺の原理を明らかにし，その使い方に慣れること。」]と明記され、計算尺の使用方法は必修となったが、裏を返せば、&#039;&#039;&#039;計算尺は使用方法を教授されなければ使えない&#039;&#039;&#039;ことを示している。当然、教授されずとも誰でも使える(関数)電卓が一般家庭に普及すると計算尺は急速に廃れ、1970年(昭和45年)告示・1973年(昭和48年)施行の学習指導要領では早くも高等学校数学科から計算尺に関する記述が削除されて教授されなくなり、中学校数学科でも1977年(昭和52年)告示・1980年(昭和55年)施行の学習指導要領で[https://erid.nier.go.jp/files/COFS/s52j/chap2-3.htm 「図形の計量，統計などにおいて数値計算を行う場面では，必要に応じて，そろばん，計算尺又は計算機を使用させて，学習の効果を高めるように配慮するものとする。」]と記述されたのを最後に、計算尺に関して教授されなくなった。これらの変更が、1972年(昭和47年)に爆発的なヒット商品となった[http://arch.casio.jp/dentaku/info/history/casiomini/ カシオミニ]の登場による電卓のパーソナル化と同時期であることを指摘するのは野暮というものだ。&amp;lt;br&amp;gt;1975年生まれの管理人は、先述の1977年(昭和52年)告示・1980年(昭和55年)施行の学習指導要領で小学校・中学校と学んだが、中学の数学の授業では、計算尺はおろか、算盤やコンピュータについて一切触れられなかった。学習指導要領に“必要に応じて”と記述されていることから、当時通っていた公立中学校の数学科教師陣はこれらを“必要ではない”と判断したのだろう。今でも明確に覚えているのは、小学6年のときに「算数の授業で使うから」と父親の関数電卓と母親の算盤を持参したことだが、これは同時に改訂・施行された小学校算数の学習指導要領に[https://erid.nier.go.jp/files/COFS/s52e/chap2-3.htm 「計算の技能の指導に関連して，そろばんや計算機を第５学年以降において適宜用いさせることは差し支えないが，この場合は，概算によって見通しを立てるなどの能力の育成を妨げないように配慮する必要がある。」]と記述されていることを受け、当時の担任教師が持参させたからだ。この教師は専門が数学だったようで、この学習指導要領では中学3年で教授されることになっている「平方根の概念」と「記号&amp;lt;math&amp;gt;\sqrt{\vphantom{x}\quad}&amp;lt;/math&amp;gt;の存在」を小学6年の算数の授業で管理人を含む同級生の児童に教えており、かなりの数学好きだったことが窺える。なお、学習指導要領の記述で「計算機」が「電卓」に置き換わったのは、次回改訂にあたる1989年(平成元年)告示・1992〜1994年(平成4〜6年)施行の[https://erid.nier.go.jp/files/COFS/h01e/chap2-3.htm 小]・[https://erid.nier.go.jp/files/COFS/h01j/chap2-3.htm 中]・[https://erid.nier.go.jp/files/COFS/h01h/chap2-4.htm 高]向けが初である。&amp;lt;br&amp;gt;ちなみに、算盤の使用方法は、遅くとも1947年(昭和22年)から現在まで途切れることなく、小学校算数の学習指導要領に記述され続けている。計算尺同様、使用方法を教授されなければ使えない計算用具である算盤が学習指導要領に記述され続けている理由は、両者の製造精度と演算結果の差だろう。算盤は比較的簡単かつ安価に製造できるうえ演算結果に誤差が無く、暗算が速くなる副次的効果も得られるが、計算尺は目盛りを対数で刻むため製造精度の維持に一定水準以上の技術が必要なことから高価なうえ演算結果には必ず誤差が含まれる概数しか得られない。教授されなければ使用できない計算用具として両者を比較すれば算盤が勝るのは言うまでもない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;foreword&amp;quot;&amp;gt;本機附属マニュアルの序文&#039;&#039;SHIRT POCKET POWER&#039;&#039; が&#039;&#039;Our object in developing the HP-35 was&#039;&#039; &#039;&#039;&#039;&#039;&#039;to give you a high precision portable electronic slide rule.&#039;&#039;&#039;&#039;&#039; &#039;&#039;We thought you&#039;d like to have something only functional heroes like [https://en.wikipedia.org/wiki/James_Bond James Bond], [https://en.wikipedia.org/wiki/Walter_Mitty Walter Mitty] or [https://en.wikipedia.org/wiki/Dick_Tracy Dick Tracy] are support to own.&#039;&#039; という一文で始まることからも判るとともに、1972年時点ではポケット関数電卓が、冗談半分で“架空の主人公が近未来を予感させる世界で使う夢のガジェット”に喩えるような扱いだったことが読み取れる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pamphlet&amp;quot;&amp;gt;世界の書籍生産統計を作成する[http://portal.unesco.org/en/ev.php-URL_ID=13068&amp;amp;URL_DO=DO_TOPIC&amp;amp;URL_SECTION=201.html UNESCOによるパンフレットの定義]は&#039;&#039;A pamphlet is a non-periodical printed publication of&#039;&#039; &#039;&#039;&#039;&#039;&#039;at least 5 but not more than 48 pages, exclusive of the cover pages,&#039;&#039;&#039;&#039;&#039; &#039;&#039;published in a particular country and made available to the public&#039;&#039; である。本機のマニュアルは、表紙を除き序文を含めると46ページで、アメリカで発行され、本機を購入すれば誰でも入手可能な、非定期的な印刷出版物なので、UNESCOによるパンフレットの定義と合致する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;本機発売後の1972年9月12〜14日にアメリカ・サンフランシスコで開催された[https://www.computer.org/csdl/magazine/co/1972/01/01641501/13rRUIJcWr7 IEEE Computer Society Conference &amp;quot;COMPCOM72&amp;quot;]で、HPとMostekが共同で[https://www.hpmuseum.org/forum/thread-3745.html &amp;quot;MOS CIRCUIT DEVELOPMENT FOR THE HP-35&amp;quot;]と題した発表をしている。その中でMostekからHPへの報告として&#039;&#039;To achieve low power dissipation in these logic arrays we planned to use appropriate circuit design, and our&#039;&#039; &#039;&#039;&#039;&#039;&#039;ion-implanted depletion P-channel process.&#039;&#039;&#039;&#039;&#039;とあるため、これら3個のMOS LSIはイオン注入法によりpMOSで製造されたことが判る。この発表にはそれらMOS LSIの消費電力も書かれており、電源電圧5Vで、A&amp;amp;Rが20mW、C&amp;amp;Tが50mW、ROMが3mW(「1mW消費するROMが3個だから」と推定されるが明確な記述なし)とある。なお、本機底面に貼られた銘版には「3.75V, 500mW」とある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;battery&amp;quot;&amp;gt;RPN電卓マニアによる充電回路の解析や実験で、交換する充電池がNi-CdではなくNi-MHでも問題無いことが確認されているため、同じ形でも充電容量が2倍以上多いNi-MHへの置換が急速に進んでいる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;japan&amp;quot;&amp;gt;翻って当時の日本では、本機の発売から遅れること2年、1974年5月にカシオ計算機株式会社が発売した[[Casio fx-10|fx-10]](定価24,800円)が日本メーカによるポケット関数電卓の嚆矢だが、本機発売から2年経過しているにもかかわらず実装された関数が本機より少なく(逆三角関数が演算できない)、演算結果の精確さも本機と較べて大幅に劣っていた(有効桁数6桁を謳っているが、演算結果が正解と一致するのは4桁)。例えば&amp;amp;nbsp;&amp;lt;math&amp;gt;\sin 30^\circ&amp;lt;/math&amp;gt;&amp;amp;nbsp;の演算結果として&amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt;ではなく&amp;lt;code&amp;gt;0.499999&amp;lt;/code&amp;gt;を出力した。これでは高校生以下である。事程左様に、当時の日米間の技術力には圧倒的な差があったのだ。このことから、「関数電卓＝HP」「HPのRPN関数電卓を使い熟せてこそエンジニアは一人前」と言われていた。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;buggy&amp;quot;&amp;gt;所有するVer.4のうち、シリアル番号が1249で始まる1台だけ、Ver.1とVer.2だけが持つはずの&amp;amp;nbsp;&amp;lt;math&amp;gt;e^{\ln{2.02}}=2.02&amp;lt;/math&amp;gt;&amp;amp;nbsp;を&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;と演算するバグを抱えている。ハードプラスティックケースに長年封入されていたらしく、本体が異常に綺麗な完動品だったので購入したのだが、[https://www.hpmuseum.org/collect.htm#early1 シリアル番号が1249で始まるVer.4は、バグありのものと交換されている可能性がある]という情報から、今回はそれを把んでしまったようだ。なぜそのような交換が行われたのかは不明だが…。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP%E8%A3%BDRPN%E9%9B%BB%E5%8D%93%E3%81%AE%E7%89%B9%E9%95%B7&amp;diff=6825</id>
		<title>HP製RPN電卓の特長</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP%E8%A3%BDRPN%E9%9B%BB%E5%8D%93%E3%81%AE%E7%89%B9%E9%95%B7&amp;diff=6825"/>
		<updated>2026-03-19T22:38:46Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|frame=1}}&lt;br /&gt;
&lt;br /&gt;
[[RPN電卓/歴史と現在|歴史と現在]]でも記した通り、RPN電卓はその構造上、中置記法の電卓よりメモリを大量に実装する必要があるため、最終的な販売価格も中置記法の電卓より割高となる。即ち、関数電卓の購入者層にHP製RPN電卓を選択してもらうには、その割高な価格に見合うだけの演算性能と剛性が必要になる。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;「他社の関数電卓より数割高いのに、演算性能が同等以下だったり、些細な衝撃で故障したりするようでは、我々の製品は見向きもされなくなる」&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
この危機感からHPは、時にユーザから「やり過ぎだ」と言われるほど&#039;&#039;&#039;演算結果の精確さ&#039;&#039;&#039;と&#039;&#039;&#039;堅牢な造作&#039;&#039;&#039;に対してこだわり続け、その結果を愚直に製品へ反映した。そしてこのこだわりこそが、結果的に、他社製品とは一味も二味も異なる差別化に繋がり、世界中に「HP製RPN電卓マニア」を産むことになる。&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
==二進化十進数による精確な演算==&lt;br /&gt;
なぜ「HPの電卓事業撤退」のニュースに反響が大きかったのか。[[RPN電卓/序説|先述]]の通り、RPN電卓以外の電卓が使えなくなってしまったユーザが世界中にかなり居たというのもあるが、&#039;&#039;&#039;演算結果の精確さ&#039;&#039;&#039;と&#039;&#039;&#039;機能の豊富さ&#039;&#039;&#039;と&#039;&#039;&#039;(それに比例した)高価格&#039;&#039;&#039;でも、HPが他社の追随を許さなかったからだ。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:left; margin-right: 15px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;3&amp;quot;|{{縦書き|十進数}}&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|二進化十進数&amp;lt;br&amp;gt;(BCD)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|04&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|03&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|02&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|01&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|2&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|3&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|4&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|5&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|6&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|7&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|8&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:center;&amp;quot;|9&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center;&amp;quot;|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
何を以て一般的とするかは議論が分かれる&amp;lt;ref name=&amp;quot;math&amp;quot; /&amp;gt;ものの、少なくとも先進国で算数や数学を学んだ人間は十進数で演算(するよう学ぶ)し、電卓を含むコンピュータはディジタル表現の基本である二進数で演算する&amp;lt;ref name=&amp;quot;binary&amp;quot; /&amp;gt;。これは、二進数で使用する数字が&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;の2種類しか無いことにより、電圧/電流/電荷/磁荷の有無、即ち、電圧や電流や磁力のON/OFFで&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;を示せるため、非常に相性が良いからだ。この事実から、コンピュータはすべての情報を二進数で扱うことで演算資源を最小限の規模で実装でき、結果として有効に利用できる&amp;lt;ref name=&amp;quot;trinity&amp;quot; /&amp;gt;のだが、残念ながら、人間は直感的に二進数を十進数に変換できない。よって、電卓を含むコンピュータの内部では常に、人間から渡された十進数を二進数に変換し、二進数で演算、その結果を十進数に再変換して人間に返す動作を常に繰り返すことになるのだが、この十進⇔二進変換で問題が起きる。演算結果で端数が発生した場合だ。&lt;br /&gt;
&lt;br /&gt;
例えば &amp;lt;math&amp;gt;\frac{\,1\,}{\,3\,}\!\times 3&amp;lt;/math&amp;gt; を考える。数学として正しい演算結果は当然 &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; だが、最もポピュラーであろう中置記法の8桁電卓では&amp;amp;nbsp;{{keypress|1}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|3}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の時点での演算結果は&amp;lt;code&amp;gt;0.3333333&amp;lt;/code&amp;gt;となる。その理由は、数学として正しい演算結果が &amp;lt;math&amp;gt;0.{\dot 3}&amp;lt;/math&amp;gt; (小数点第1位が&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;の[https://en.wikipedia.org/wiki/Repeating_decimal 純循環小数])で、本来なら &amp;lt;math&amp;gt;0.333333333\cdots&amp;lt;/math&amp;gt; と小数点以降は無限に &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt; が続くべきところ、電卓やコンピュータが演算できる二進数の桁数は限りがあるため、どこかで打ち切らざるを得ないからだ。8桁電卓であれば、整数部に1桁の &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; があるので、小数部の連続する &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt; は小数点第7位で打ち切り、&amp;lt;code&amp;gt;0.3333333&amp;lt;/code&amp;gt;が演算結果となる。これに&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|3}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と入力・演算させたとて&amp;lt;code&amp;gt;0.9999999&amp;lt;/code&amp;gt;にしかならず、数学として正しい演算結果である &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; は得られない。&lt;br /&gt;
&lt;br /&gt;
このように、演算できる桁数以上の数字を、ある一定の幅の整数倍の数値に置き換える処理を、俗に&#039;&#039;&#039;[https://en.wikipedia.org/wiki/Rounding 丸め]&#039;&#039;&#039;と呼ぶ。丸めには、切り捨て・切り上げ・四捨五入・五捨六入・五捨五超入・偶数丸め・奇数丸めなど様々な種類があるが、どの丸めが入っても〝二進数による演算結果〟と〝数学として正しい演算結果〟の間に誤差が生じる。二進数演算で得られた端数を含む演算結果から更に端数を含む演算を実行するということは、数学として正しくない丸めた数字同士を演算することと同義であるとともに、更に誤差が増えることに繋がり、やがて〝数学として正しい演算結果〟と較べて無視できない誤差となる。先ほどの例で言えば、「切り捨て」という丸めが入ったことで、〝数学として正しい演算結果〟である &amp;lt;math&amp;gt;0.{\dot 3}&amp;lt;/math&amp;gt; や &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ではなく〝二進数による演算結果〟である&amp;lt;code&amp;gt;0.3333333&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;0.9999999&amp;lt;/code&amp;gt;が得られたことで、最終的に &amp;lt;math&amp;gt;0.0000001&amp;lt;/math&amp;gt; の誤差が生じている。特に関数電卓で頻繁に扱う定数には、円周率 &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; にしろ自然対数の底 &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; にしろ地球の重力加速度 &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; にしろ電気素量 &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; にしろ、その数値(近似値)には必ず端数が含まれるため、これらを含む数値を演算すると電卓内部は丸めの連続となり、最終的に得られる演算結果が信用できない事態となる。&lt;br /&gt;
&lt;br /&gt;
この事態を可能な限り回避し精確な演算結果を得るため、HP製の電卓は発売当初から伝統的に&#039;&#039;&#039;数値をニブル単位で扱い&#039;&#039;&#039;、&#039;&#039;&#039;[https://en.wikipedia.org/wiki/Binary-coded_decimal 二進化十進数:BCD]&#039;&#039;&#039;で演算する。&lt;br /&gt;
&lt;br /&gt;
BCDは、本来であれば二進法の4ビット(ニブル単位)が作成できる16種類のすべての状態に数値や文字や意味を割り当てて様々な演算をさせるべきところ、0〜9の10種類だけをそれぞれ十進数の1桁の数値である0〜9に割り当てて1桁ずつの数値演算に使用するものの、それ以降の6種類は敢えて使用しないという贅沢な仕様で、近年流行りの言葉だと「メモリや実行効率を気にせず、条件が変わる度にすべての計算や表示を行う『[http://www.pitecan.com/fugo.html 富豪的プログラミング]』で組まれたシステム」である。よって、純粋な二進法で多桁の十進数を演算する際、全桁を一括して二進数に変換しても演算できず、十進数の最下桁(一の位)から1桁ずつ順番に演算するしかないのだが、ここで繰り上がり/繰り下がりが発生した場合は、その事実を隣の桁へ確実に伝えることで、どんなに多桁の十進数であっても丸めが発生しないという圧倒的な利点がある。言い換えると、原理的には[https://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/03/18/1387017_004.pdf 小学1年の算数]で習う「繰り上がり/繰り下がりを含む1桁の加減算」を、実践的には[https://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/03/18/1387017_004.pdf 小学3年の算数]で習う「多桁の加減算」を、それぞれ筆算するかのように演算するのが、BCDでの演算である。&lt;br /&gt;
&lt;br /&gt;
このような特性をもつBCDでの演算は、丸めが原因で演算結果に誤差が出ると大問題となる場面、具体的には、金銭出納に関わる銀行の勘定系システムでは現在でも世界中で採用されているが、HPはこれを電卓に採用したのだ。その理由は、何を措いても、演算結果に精確さを求めたからである。&lt;br /&gt;
&lt;br /&gt;
しかし、HPが電卓事業に参入した1968年には、BCDはおろか、二進数で演算するマイクロプロセッサは存在しなかった&amp;lt;ref name=&amp;quot;hp9100&amp;quot; /&amp;gt;。1970年、演算結果の精確さにこだわるHPは、世界初の可搬型RPN関数電卓[[HP-35]]のために、BCDで演算するマイクロプロセッサを自社で開発・製造する決断に至った。ここで開発されたマイクロプロセッサは、数度の世代交代を経たものの、基本的な演算アーキテクチャは一切変わらず、HPが電卓事業からいったん撤退する2001年まで採用され続けることになる。&lt;br /&gt;
&lt;br /&gt;
===演算アーキテクチャ===&lt;br /&gt;
HPが自社開発したマイクロプロセッサ内で演算を実行する[https://en.wikipedia.org/wiki/Arithmetic_logic_unit 算術論理演算装置:ALU]は、ビットシリアルアーキテクチャもしくはニブルシリアルアーキテクチャを採用している。[https://en.wikipedia.org/wiki/Serial_binary_adder シリアルアーキテクチャ]は「最下位ビットから順番に1ビットの演算を&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;回繰り返すことで、1命令の&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;ビット演算を実行・成立させる」という考え方に基き、電子計算機の黎明期である1930年代後半に産み出されたが、その理由は、当時、ALUを設計・製作しようにも、マトモに使えるスイッチングデバイスが物理的に大きいうえに高価だった真空管しか無かったからである。ハードウェアとしての加減算器(演算回路)は1ビット分だけで済むため開発期間の短縮とプロセッサ自体の小型化と省電力化に向き経済的という利点と、処理時間は&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;倍に伸びるという圧倒的な欠点が背中合わせとなっているシリアルアーキテクチャを採用することは、ハードウェアを可能な限り極小化して費用と規模を節約する代償として演算速度には目を瞑る&amp;lt;ref name=&amp;quot;sa&amp;quot; /&amp;gt;ことを意味するものの、1970年代の電卓に求められた存在意義はコンピュータ並の高速な演算では無かった&amp;lt;ref name=&amp;quot;priority&amp;quot; /&amp;gt;ため、開発・製造コストと基板の小型化(ICやLSIと配線の極小化)の面からも、当時は理に適っていた。&lt;br /&gt;
&lt;br /&gt;
HP製マイクロプロセッサは一貫して4ビットだったので、1命令を実行・成立させるのに4回演算することになる。そのため、1クロックで1回演算するHP製4ビットマイクロプロセッサの実効演算速度は、プロセッサクロック周波数の&amp;amp;frac14;程度と考えて良い。例えば、[[HP-35]]に実装した初代マイクロプロセッサ(Classic)のプロセッサクロック周波数は200kHzなので、1桁あたり50kHz＝20&amp;amp;#181;sで演算できる。[[HP-35]]の仕様は最大で仮数部10桁、指数部2桁まで演算できるので、これらをすべて埋めるような数値同士でも240&amp;amp;#181;s前後で演算結果を得られることになる。&lt;br /&gt;
&lt;br /&gt;
なお、[[HP-35]]に実装した初代マイクロプロセッサ(Classic)が加減算&amp;lt;ref name=&amp;quot;adding&amp;quot; /&amp;gt;する動作を、HP自ら以下のように[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0023/other/0023hpjournal01.pdf 解説]している。&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;The adder-subtractor computes the sum or difference of two decimal numbers. It has two data inputs, storage for carry or borrow, and sum and carry/borrow output. For the first three clock time, the addition is strictly binary. At the forth clock time the binary sum is checked, and if the answer is more than 1001 (nine), then the sum is corrected to decimal by adding 0110 (six). The result is then entered into the last four bits of the receiving register and the carry is stored. A similar correction is done for subtraction.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(加減算器は、2個の数値入力、桁上げまたは桁下げを格納するストレージ、和と桁上げ/桁下げの出力を備え、2個の十進数の和または差を演算する。最初の3クロックの演算は、厳密に二進法で加算を行う。4クロック目の演算は二進数の和を確認し、&amp;lt;code&amp;gt;1001&amp;lt;/code&amp;gt;(十進数の9)より大きければ、&amp;lt;code&amp;gt;0110&amp;lt;/code&amp;gt;(十進数の6)を加えることで二進数の和を十進数に補正、レジスタの最後の4ビットに桁上げを設定する。減算でも同様の補正をする。)&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right; margin-left: 15px;&amp;quot;&lt;br /&gt;
|+「5と7の和」での&amp;lt;br&amp;gt;十進数への補正例&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;4&amp;quot;|{{縦書き|十進数}}&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|二進化十進数(BCD)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|flag&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|digit&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|04&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|03&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|02&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|01&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|04&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|03&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|02&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|01&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:right;&amp;quot;|5&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold;&amp;quot;|1&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:right;&amp;quot;|7&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold;&amp;quot;|1&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:right;&amp;quot;|&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:black;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:black;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:black;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:black;&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;9&amp;quot; style=&amp;quot;color:black; background-color:white; border-right:solid 1px white; border-left:solid 1px white;&amp;quot;|&amp;amp;#8659;&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;4&amp;quot;|{{縦書き|十進数}}&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|二進化十進数(BCD)&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|flag&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|digit&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|&amp;lt;i&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|04&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|03&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|02&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|01&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|04&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|03&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|02&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|01&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:right;&amp;quot;|&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:black;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:black;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:black;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:black;&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:right;&amp;quot;|&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;6&amp;lt;/font&amp;gt;&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;color:gray;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:green;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:green;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:green;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:green;&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:right;&amp;quot;|&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;/sup&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:red;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:red;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:red;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:red;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:blue;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:blue;&amp;quot;|0&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:blue;&amp;quot;|1&lt;br /&gt;
|style=&amp;quot;font-weight:bold; text-align:center; color:white; background-color:blue;&amp;quot;|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
4ビットシリアルアーキテクチャのALUでBCDを加減算する動作を端的に記した非常に解り易い文章である。先述の通り、BCDは1ニブル(4ビット)には0〜9の1桁の数値しか使用しない仕様だが、1桁同士の加減算は最大18&amp;lt;ref name=&amp;quot;adding&amp;quot; /&amp;gt;まで発生し得る。そのため、加減算の結果が10以上となったときは「一の位の値だけ抜き出し、繰り上がり/繰り下がりが発生した事実を隣の桁に伝える情報の組へ変換する」必要があり、それがこの文章にある &amp;lt;i&amp;gt;the sum is corrected to decimal (二進数の和を十進数に補正) &amp;lt;/i&amp;gt; である。&lt;br /&gt;
&lt;br /&gt;
具体的には、2個の1桁同士の十進数の和または差を演算した結果が&amp;lt;code&amp;gt;1010&amp;lt;/code&amp;gt;(十進数の10)〜&amp;lt;code&amp;gt;1111&amp;lt;/code&amp;gt;(十進数の15)の6種類と&amp;lt;code&amp;gt;10000&amp;lt;/code&amp;gt;(十進数の16)/&amp;lt;code&amp;gt;10001&amp;lt;/code&amp;gt;(十進数の17)/&amp;lt;code&amp;gt;10010&amp;lt;/code&amp;gt;(十進数の18)であったとき、その結果に更に&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;0110&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;(十進数の&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;6&amp;lt;/font&amp;gt;)との和を取ることで、&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;一の位の値&amp;lt;/font&amp;gt;だけ抜き出すのと同時に、繰り上がり/繰り下がりが発生した事実を隣の桁へ伝えるための特別なビット(繰り上がり[桁上げ]は&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;carry&amp;lt;/font&amp;gt;、繰り下がり[桁下げ]は&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;borrow&amp;lt;/font&amp;gt;)を生成する処理を「十進数への補正」という。この処理により、スタックに積まれた数値が何桁あっても、小学3年生がやる筆算と同じように、最下桁(一の位)から順にこの動作を繰り返せば良いことが判る。&lt;br /&gt;
&lt;br /&gt;
この解説をもとに、以下に[[RPN電卓/序説|序説]]でも例題として記載した「5と7の和」を演算するときの動作を示す。&lt;br /&gt;
&lt;br /&gt;
# {{keypress|5}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|7}}&amp;amp;nbsp;と入力し、それぞれをスタックに積む。この際、十進数からBCDへ変換するので、5は&amp;lt;code&amp;gt;0101&amp;lt;/code&amp;gt;、7は&amp;lt;code&amp;gt;0111&amp;lt;/code&amp;gt;となって、各スタックの最下桁(一の位)に積まれる。&lt;br /&gt;
# これらの和を演算すべく&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を入力する。最初の3クロックでは二進数で和を演算、演算結果として&amp;lt;code&amp;gt;1100&amp;lt;/code&amp;gt;(十進数の&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)を得る。&lt;br /&gt;
# 最後の4クロック目で&amp;lt;code&amp;gt;1100&amp;lt;/code&amp;gt;(十進数の&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)が&amp;lt;code&amp;gt;1001&amp;lt;/code&amp;gt;(十進数の9)より大きいと確認されるので、十進数へ補正するため、&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;0110&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;(十進数の&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;6&amp;lt;/font&amp;gt;)との和を二進数で演算、演算結果として&amp;lt;code&amp;gt;10010&amp;lt;/code&amp;gt;を得る。&lt;br /&gt;
# &amp;lt;code&amp;gt;10010&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0010&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;に、最下位ビットからニブル単位で分割する。1〜4ビット目の&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0010&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;(十進数の&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)はそのままスタックへ返すため触れずに保持。5ビット目の&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;が桁上げ(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;carry&amp;lt;/font&amp;gt;)であるため、flag用レジスタの4ビットに&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;を設定する。これにより&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;が筆算のように表記すると&amp;lt;sup&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;/sup&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;となる。&lt;br /&gt;
# flag用レジスタの4ビットに&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;が立ったため、「隣の桁へ1を加えよ」と指示する。&lt;br /&gt;
# それまで&amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt;(十進数の0)だった隣の桁(十の位)に1を加え&amp;lt;code&amp;gt;0001&amp;lt;/code&amp;gt;(十進数の1)とすることで繰り上がり処理が完了。十の位が&amp;lt;code&amp;gt;0001&amp;lt;/code&amp;gt;、一の位が&amp;lt;code&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0010&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;というBCDがスタックへ返される。これを各桁毎に十進数へ変換、ディスプレイには「5と7の和」の演算結果である&amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;が表示される。&lt;br /&gt;
&lt;br /&gt;
この解説はClassic以降のHP製マイクロプロセッサにもそのまま当て嵌り、基本的に同じ動作だが、HP製の電卓が他社と異なるのは、先述の通り、「1970年代前半」に「BCDによる演算」を「マイクロプロセッサによりハードウェアレベルでネイティブに実装」したことである。&lt;br /&gt;
&lt;br /&gt;
半導体技術が未熟で集積度がそこまで高くなかった1970年代前半は、世界初のマイクロプロセッサである[https://en.wikipedia.org/wiki/Intel_4004 Intel 4004]が1971年11月15日に登場し、単純な二進数による演算回路がようやくLSI化された時期だが、もし[https://en.wikipedia.org/wiki/Intel_4004 Intel 4004]でBCD演算をさせるのであれば、ソフトウェアで実装するしか無かった。即ち、HPが望むように「常にBCDで演算させたい」場合、演算する度に「二進数による演算⇔BCDによる演算を変換するソフトウェア」が起動することになり、動作が重く、遅くなる。それを嫌ったHPは「ソフトウェアによる変換を無くして軽くするには、すべての演算をBCDで実行するマイクロプロセッサを自社で作れば良い」と考えたのだ。この時点で、HPが演算結果の精確さに対する異常なこだわりが判る。HPがBill Hewlettの指示で[[HP-35]]の開発に着手したのが1970年初頭、発売開始が1972年2月1日なので、[https://en.wikipedia.org/wiki/Busicom 日本ビジコン]がIntelと共同で実質的に開発を開始したのが1969年8月末である[https://en.wikipedia.org/wiki/Intel_4004 Intel 4004]とは開発時期が1年ほど被っていることになるが、この差からも、HPと日本ビジコンで電卓市場に対する視座が、HPとIntelでコンピュータ市場に対する視座が、それぞれまったく異なっている&amp;lt;ref name=&amp;quot;viewpoint&amp;quot; /&amp;gt;ことは非常に興味深い。&lt;br /&gt;
&lt;br /&gt;
===メモリアーキテクチャ===&lt;br /&gt;
HPが自社開発したマイクロプロセッサ内で数値を格納するレジスタ(メモリ)は、1スタック(1ワード)あたり1ニブル1桁の二進化十進浮動小数点数を割り当てる構成で、初代(Classic)〜第3世代(Nut)までは「1ニブルの仮数部正負符号」「10ニブル(10桁)の仮数部」「1ニブルの指数部正負符号」「2ニブル(2桁)の指数部(範囲は±99)」の14ニブル(56ビット)、最終世代である第4世代(Saturn)では仮数部を2桁増やし「1ニブルの仮数部正負符号」「12ニブル(12桁)の仮数部」「3ニブル(3桁)の指数部(範囲は±499)&amp;lt;ref name=&amp;quot;complement&amp;quot; /&amp;gt;」の16ニブル(64ビット)である。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|+初代(Classic)から第3世代(Nut)までのメモリ割り当て&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|13&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|12&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|11&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|10&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|9&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|8&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|7&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|6&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|5&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|4&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|3&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|2&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|1&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|00&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|01&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|02&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|03&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|04&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|05&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|06&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|07&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|08&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|09&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|10&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|11&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|12&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|13&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|14&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|15&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|16&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|17&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|18&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|19&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|20&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|21&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|22&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|23&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|24&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|25&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|26&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|27&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|28&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|29&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|30&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|31&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|32&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|33&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|34&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|35&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|36&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|37&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|38&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|39&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|40&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|41&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|42&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|43&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|44&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|45&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|46&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|47&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|48&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|49&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|50&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|51&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|52&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|53&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|54&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|55&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;|仮数部&amp;lt;br&amp;gt;正負符号&lt;br /&gt;
|colspan=&amp;quot;40&amp;quot; align=&amp;quot;center&amp;quot;|仮数部&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;|指数部&amp;lt;br&amp;gt;正負符号&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot;|指数部&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto;&amp;quot;&lt;br /&gt;
|+第4世代(Saturn)でのメモリ割り当て&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|15&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|14&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|13&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|12&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|11&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|10&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|9&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|8&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|7&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|6&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|5&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|4&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|3&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|2&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|1&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|00&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|01&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|02&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|03&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|04&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|05&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|06&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|07&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|08&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|09&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|10&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|11&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|12&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|13&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|14&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|15&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|16&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|17&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|18&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|19&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|20&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|21&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|22&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|23&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|24&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|25&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|26&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|27&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|28&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|29&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|30&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|31&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|32&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|33&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|34&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|35&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|36&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|37&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|38&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|39&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|40&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|41&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|42&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|43&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|44&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|45&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|46&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|47&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|48&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|49&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|50&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|51&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|52&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|53&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|54&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|55&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|56&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|57&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|58&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|59&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|60&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|61&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|62&lt;br /&gt;
|style=&amp;quot;font-size: 5pt; color:gray; text-align:center;&amp;quot;|63&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot; align=&amp;quot;center&amp;quot;|仮数部&amp;lt;br&amp;gt;正負符号&lt;br /&gt;
|colspan=&amp;quot;48&amp;quot; align=&amp;quot;center&amp;quot;|仮数部&lt;br /&gt;
|colspan=&amp;quot;12&amp;quot; align=&amp;quot;center&amp;quot;|指数部&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以上のように、マイクロプロセッサ(ハードウェア)内部のすべての演算過程をBCDで行う環境を整え、演算結果の精確性を可能な限り保証した。あとはHPが販売ターゲット毎に「科学・数学向け」や「金融・財務向け」の演算ロジックや関数(ソフトウェア)を組み込めば、高精度な関数電卓を販売できることになる。例えば、仕様上の最大演算桁数である小数点第9位まで演算する設定にした科学・数学向けRPN関数電卓[[HP-25]]/[[HP-67/HP-97]]/[[HP-34C]]/[[HP-10C/HP-11C/HP-15C|HP-15C]]/[[HP-41CX]]の5機種で演算させても、すべての機種で、先の&amp;lt;math&amp;gt;\frac{\,1\,}{\,3\,}\!\times 3&amp;lt;/math&amp;gt;は&amp;amp;nbsp;{{keypress|3}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|3}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で&amp;lt;code&amp;gt;1.000000000&amp;lt;/code&amp;gt;が、かつて横河・ヒューレット・パッカード株式会社(YHP)が顧客向けに出したカタログで演算結果の精確さを試させるための例として挙げていた&amp;lt;math&amp;gt;\dfrac{1}{\left (\sqrt{\dfrac{1}{780}}\,\right )^2}&amp;lt;/math&amp;gt;は&amp;amp;nbsp;{{keypress|7}}&amp;amp;nbsp;{{keypress|8}}&amp;amp;nbsp;{{keypress|0}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{x}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で&amp;lt;code&amp;gt;780.0000000&amp;lt;/code&amp;gt;が、それぞれ演算結果として得られる。&lt;br /&gt;
&lt;br /&gt;
==異常に堅牢な造作==&lt;br /&gt;
2001年の撤退前のHPでは、マイクロプロセッサやソフトウェアはもちろん、基板、キーボードやケース、LEDや液晶ディスプレイに至るまで、全てを自社で開発・製造していたが、その方針は終始一貫して&#039;&#039;&#039;製品に『頑丈さ』『堅牢さ』を持たせる&#039;&#039;&#039;ことに尽きた。&lt;br /&gt;
&lt;br /&gt;
例えば、基板の素材は頑丈さを求めて当時主流のベークライトではなくガラスエポキシ樹脂を、基板上の配線は錆びの発生を避けるべく主流の錫メッキではなく金メッキを、各キーの役割を示す文字や記号は摩耗して消えないよう印刷ではなく[https://en.wikipedia.org/wiki/Damascening 象嵌]&amp;lt;ref name=&amp;quot;key&amp;quot; /&amp;gt;を、それぞれ採用した。これらアセンブリをケースに収める際も、基板や配線や部品にゴミや湿気が侵入するのを防ぐため、外気に触れる電池ボックスとアセンブリの間に必ずポリエチレンシートを敷く徹底ぶりだ。これも後期になるとケースの有り様から見直され、それまでの「後から開閉可能な『ネジ留めケース』」から「ケース自体を熱で溶解後に圧着し密閉することで二度と開閉不可能&amp;lt;ref name=&amp;quot;case&amp;quot; /&amp;gt;な『熱溶着ケース』」に変更することで、外部からの異物侵入を断固拒否した&amp;lt;ref name=&amp;quot;invasion&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
出自が測定機の開発・製造・販売であることや、電卓そのものが高価だった黎明期の1960年代から市場に参入したHPだからこそのこだわりだと管理人は理解しているが、人によっては「病的だ」とまで評されるこれらの対策を施したからこそ、HP製電卓は『異常に堅牢な造作』で有名となり、「机から落としても壊れない」のは勿論、「幼児が投げても壊れない」「尻で敷いても壊れない」「自動車に轢かれても壊れない」「飼料の混合比を[[HP-12C]]で演算していた動物園のカバ担当飼育員が誤って[[HP-12C]]を落としカバに食べられてしまった。しかし、後日、カバの糞から回収した[[HP-12C]]は、洗浄後に何の問題もなく正常に動作した」など、若干の笑いを含みつつ畏敬の念とともに世界中から経験談が集まることになる。つまり〝電池を入れ替え、電源さえ入れば、20年振りだろうと30年振りだろうと何の問題もなく正常に動作する〟のがHP製電卓の日常茶飯事であり、だからこそ現在でも当時の新古品や中古品が高値で取引されているのだ。&lt;br /&gt;
&lt;br /&gt;
とは言え、形あるものは必ず壊れる。管理人は「壊れる筐体と持つ筐体の差が激しい」という印象を持っている。壊れる筐体は、何の前触れもなく突然電源が入らなくなる等、予兆を感じさせずに逝き、持つ筐体は、不注意で落としてしまおうがどうしようが、壊れる気配すら一向に感じられない。尤も、凡そ50台ほど所有していて、このような壊れ方をしたのは、アメリカから購入した中古の[[HP-42S]]が1台だけなのだが…。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、最新機種である[[HP-48GX]]すら製造終了から20年以上経過しており、かつ、代替品が無いので、管理人を含むRPN電卓マニアは不断使いするにしても異常に丁寧に扱っている。&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;math&amp;quot;&amp;gt;[https://en.wikipedia.org/wiki/Ancient_Egyptian_mathematics 古代エジプト数学]は現代と同様の十進法だが、[https://en.wikipedia.org/wiki/Indian_mathematics 古代インド数学]では当初は八進法だったものの十進法に代わり、メソポタミア文明でシュメール人が使用した[https://en.wikipedia.org/wiki/Babylonian_mathematics バビロニア数学]では六十進法が、スペインに侵攻され絶滅したマヤ人が使用した[https://en.wikipedia.org/wiki/Maya_numerals マヤ数学]では五進法と二十進法を併用する特殊なものであった。事程左様に数学で使用する[https://en.wikipedia.org/wiki/Positional_notation 位取り記数法]は多様で、約5,000年前の各文明間の力関係如何では、現代に生きる我々も八進法や六十進法を一般的とした可能性が有ったことになる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;binary&amp;quot;&amp;gt;少なくとも日本の理系大学で情報理論を受講した学生であれば、指折り数えて十進数→二進数に変換できるよう学んでいると思われるが、それを常用するか？ と言われると、なかなか微妙ではある。話のネタとしては知っていよう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;trinity&amp;quot;&amp;gt;旧ソ連では1959〜1965年に[https://www.msu.ru/en/ モスクワ国立大学]が主導し三進数で演算する[https://ru.wikipedia.org/wiki/Сетунь_(компьютер) &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Сетунь&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;セトゥン&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]というコンピュータを50台製造したが、一般的とはならなかった。三進数は正負を分けずに扱える(1トリットで&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;が表現できるため、二進数では負数を示すのに必須の符号ビットが不要となる)利点が有るものの、肝腎の製造/運用コストと演算速度が二進数で演算するコンピュータとほぼ同じだったからだ。この結果、1970年に製造するはずだった後継機の&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Сетуни&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;セトゥニ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;-70はエミュレータでの実装に留まった。なお、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Сетунь&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;セトゥン&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;(キリル文字からラテン文字へ翻字するとSetun)とは、モスクワ国立大学の近くを流れる[https://ru.wikipedia.org/wiki/Сетунь_(нижний_приток_Москвы) モスクワ川の支流]の名前である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;hp9100&amp;quot;&amp;gt;1968年頃に電卓はようやく一部がIC化され始めたが、そのICは電卓の各機種毎に開発・製造する専用品(カスタムIC)であり、マイクロプロセッサという概念は無かった。この年にHPが電卓業界へ参入するにあたって販売した[https://www.hpmuseum.org/hp9100.htm HP-9100A/B]はICを一切使用せず、全てを個別単体部品(ディスクリート)で構成した[https://en.wikipedia.org/wiki/Wired_logic_connection ハードワイヤード制御]計算機である。即ち、CPUを含む演算部はトランジスタとダイオードと抵抗で40個の[https://en.wikipedia.org/wiki/Flip-flop_(electronics) JKフリップフロップ回路]と論理ゲートを構成、プログラム用ソフトを格納したROM(64ビット長で512ワード分＝32,768ビット)は1平方インチあたり1,000ビットの密度で16層プリント基板に作り込んでマザーボード代わりとし、制御用ソフトを格納しているROM(29ビット長で64ワード分＝1,856ビット)と、スタックを含むワーキングメモリ用のRAM(6ビット長で16×23＝368ワード分＝2,208ビット)は[https://en.wikipedia.org/wiki/Magnetic-core_memory 磁気コアメモリ]で実装、ディスプレイは3段スタックを全て表示する縦3インチ&amp;lt;math&amp;gt;\tfrac{\,1\,}{4}&amp;lt;/math&amp;gt;×横4インチ&amp;lt;math&amp;gt;\tfrac{13}{16}&amp;lt;/math&amp;gt;の単色[https://en.wikipedia.org/wiki/Cathode-ray_tube CRT]といった具合で、IC(集積回路)は存在しない。この回路にクロックサイクル825ナノ秒＝クロック周波数1.21MHzの同期パルスを流すと、半導体と較べると遅いことで有名な磁気コアメモリへの読み出し/書き出し時間(1.6ミリ秒)を含め、加減算は2ミリ秒、乗算は12ミリ秒、除算は18ミリ秒、開平は19ミリ秒、三角関数は280ミリ秒、自然対数は50ミリ秒、ネイピア数&amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt;を底とする冪乗は110ミリ秒という、比較的高速な応答速度で演算した。1969年8月末から開発が始まった[https://en.wikipedia.org/wiki/Intel_4004 Intel 4004]のクロックサイクルが1.35〜2.0マイクロ秒＝クロック周波数が500〜741kHzであるため、演算部は単純に比較してもHP-9100A/Bのほうが1.6倍ほど速かったことになる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sa&amp;quot;&amp;gt;シリコンウェハに億単位のトランジスタを比較的容易に作り込め、超大規模な演算回路が実現できる現代のマイクロプロセッサは、加減算器を&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;ビット分だけ並列にすることで高速に演算できるパラレルアーキテクチャが一般的である。&amp;lt;/ref&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;priority&amp;quot;&amp;gt;電卓が世に出た当初のアピールポイントは、「小ささ」でも「速さ」でも「値段の安さ」でもなく『静粛さ』だ。それまでの機械式計算機やリレー式計算機は演算時に盛大な音を出し、日常業務があらゆる計算に終始するエンジニアや経理担当者にとって、その音は苦痛以外の何物でもなく、まさに頭痛の種だったからだ。その次が「速さ」だが、比較対象はあくまで機械式計算機やリレー式計算機であって、『コンピュータと同等』などというものではない。尤も、電子式になれば、電卓に数値を入力するのに要する時間より、電卓がそれらを演算するのに要する時間が大幅に短いため、人間にとっては『瞬時』と同等の感覚に陥り、機械式やリレー式と比較するまでもなく「速さ」も満たさることになった。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;adding&amp;quot;&amp;gt;内部で使用している数値表現が補数表現であれば、四則演算はすべて加算器による加算のみで演算できる。よって、十進数の減算で繰り下がり(桁下げ)が発生しても、ニブルの値は10〜18のいずれかとなる。HP自身の[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0023/other/0023hpjournal01.pdf 解説]に記載されているArithmetic And Register Circuit (MOS/LSI)のブロック図(Fig. 3)にもAdder(加算器)しか無い。尤も、Classicが採用している補数表現が「[https://en.wikipedia.org/wiki/Ones%27_complement 1の補数]」と「[https://en.wikipedia.org/wiki/Two%27s_complement 2の補数]」のどちらかは不明である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;viewpoint&amp;quot;&amp;gt;かたやHPは、当時は本業である「電気・電子計測機の製造・販売」が順調だったので、ハードウェアオリエンテッドな思考から、とにかく高精度演算に特化して開発したこれらBCD演算マイクロプロセッサを外販する気も無く、したがって半導体では顕著な「大量生産による価格下落」にも特に期待せず、せいぜいが、プリンタやハンドヘルドコンピュータなどの自社の電卓以外の製品への適用に留まってしまった。かたや日本ビジコンとIntelは、両社とも当時は財務基盤が脆弱な半導体ベンチャー企業であったが故、当初は電卓用に開発したマイクロプロセッサに著しい汎用性があることを気付いた直後から、ソフトウェアオリエンテッドな思考に基き電卓以外への応用の可能性を広げ、否応なしに積極的に外販することで「大量生産による価格下落」を引き起こし、延いては粗利を増やさないと、会社が存続できないことを意味しており必死だった。その差がそのまま、現在のHPとIntelの有り様と、身近にマイクロプロセッサが溢れる現代人の日常生活を示していることになる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;complement&amp;quot;&amp;gt;この指数部の割り当て方から、最終世代であるSaturnの内部で使用している数値表現が「[https://en.wikipedia.org/wiki/Two%27s_complement 2の補数]」であることが判る。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;key&amp;quot;&amp;gt;文字を別の材料で立体的に成形し、それをキーに埋め込む構造。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;case&amp;quot;&amp;gt;この形式を採用したRPN電卓には修理サービスを提供できないため、もし保証期間中に故障した場合は、同じ製品(終売後で在庫が無い場合はそれ以上の製品)の新品と交換する対応が取られた。管理人の所有品では[[HP-35]]/[[HP-45/HP-46]]/[[HP-65]]/[[HP-25]]/[[HP-67/HP-97]]/[[HP-34C]]/[[HP-12C]]/[[HP-10C/HP-11C/HP-15C]]/[[HP-16C]]/[[HP-41CX]]がネジ留めケース、[[HP-28S]]/[[HP-42S]]/[[HP-48SX]]/[[HP-48GX]]/[[HP-50g]]/[[HP-35s]]が熱溶着ケースである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;invasion&amp;quot;&amp;gt;裏を返せば「いったん侵入してしまった異物を、容易に外へ出せない」構造なので、キーの隙間から入り込んだ伝導性の粉塵や、[https://en.wikipedia.org/wiki/Capillary_action 毛細管現象]で吸い込んだ水分などには滅法弱い。例えば、熱溶着ケースの電卓に誤って飲み物をぶち撒けた場合、その水分を蒸発・乾燥させるのに充分な隙間が無いため、通電すると基板上で回路短絡が発生し故障する。同様に、目には見え難い小さな伝導性の粉塵をブロワー等で都合良く吹き飛ばせる可能性が非常に低いため、突然故障したように錯覚する。ネジ留めケースの電卓であれば、ケースを開いて[https://www.sankyo-chem.com/products/high-concentration-ethanol/ 無水エタノール]で入念に洗浄後、数日乾燥させれば、何の問題も無く使用できる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-55&amp;diff=6824</id>
		<title>HP-55</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-55&amp;diff=6824"/>
		<updated>2025-12-13T00:29:46Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1975年1月1日〜1977年1月3日に販売された科学・数学向けRPN関数電卓で、第一世代であるClassicシリーズの最終モデルである。コードネームは[https://en.wikipedia.org/wiki/Merlin Merlin (アーサー王伝説に登場する神話上の人物で魔術師)]。&lt;br /&gt;
&lt;br /&gt;
なお、[[HP-35]]から始まるClassicシリーズ全機種は、筐体の金型を流用しているため外形が殆ど変わらず、これにより、バッテリパック(HP 82001A/B)とACアダプタ(HP 82002A/B/C)も全機種共通である。&lt;br /&gt;
__TOC__&lt;br /&gt;
===[[HP-65]]の廉価版===&lt;br /&gt;
もし彼らが喋るとしたら、己の不遇を託つであろう機種が2つある。[[HP-34C]]と本機だ。&lt;br /&gt;
&lt;br /&gt;
本機はClassicシリーズの殿を任せられたものの、その中身は、前年に発売された[[HP-65]]に劣る。優っている点は「[[HP-45/HP-46|HP-45]]で隠しコマンド状態だったもののバレで好評だった『時計・ストップウォッチ機能』を、水晶発振子も実装し正確な計時が可能な、正式な機能として公開した」のと「プログラミングで行番号を表示するようになった(ことで編集しやすくなった)」ぐらいなものだ。&lt;br /&gt;
&lt;br /&gt;
それ以外は[[HP-65]]の廉価版といった趣のスペックである。プログラム可能な行数は100行から49行に半減され、そのソースコードを保存する磁気カードリーダライタも省かれた。これにより定価は[[HP-65]]の半値以下となる395ドル(約118,500円)と抑えられたものの、このスペックが災いし、市場からの反応は薄いどころか「コレジャナイ」扱いを受ける有様で、製品寿命もHP製電卓史上2位の短さとなる丸2年と2日で尽きている。最後は60ドル値下げされ335ドルで叩き売られた。&lt;br /&gt;
&lt;br /&gt;
なぜなら、入力したプログラムのソースコードを記憶するRAMが揮発性メモリに保存されるため、電源を切れば綺麗さっぱり消去される仕様だからだ。これは当時の半導体技術で不揮発性メモリを作ろうとうすると異常に高価となるうえ電力消費も莫大となるためで、Classicシリーズと、次世代であるWoodstockシリーズでは全機種共通のハードウェア仕様となる。だからこそ[[HP-65]]は磁気カードリーダライタを自社で開発・内蔵したのだ。&lt;br /&gt;
&lt;br /&gt;
これを踏まえると、磁気カードリーダライタを省いてしまった本機で、気合を入れてプログラミングしようとは思わないだろう。本機のプログラミング機能は、あくまで、その場その場で使い捨てのソースコードを入力して使用するものとならざるを得ない。データ用レジスタは[[HP-65]]の倍が確保されているが、果たしてそこまで本機を使い込んだユーザが居たのかも怪しい。&lt;br /&gt;
&lt;br /&gt;
「なんで磁気カードリーダライタを省いちまったんだよ…」&lt;br /&gt;
&lt;br /&gt;
本機は己の身を呪ったに違いない。&lt;br /&gt;
&lt;br /&gt;
===[[HP-25]]開発の練習台？===&lt;br /&gt;
関数電卓のようなコンピュータ製品で、あるシリーズの最後を飾る機種が発売されるとなれば、ユーザはその機種に「そのシリーズでの利点を伸ばし、欠点を無くした、シリーズの集大成となる、機能山盛りの豪奢なもの」を期待し、メーカもそれに応えようとするのが一般的だ。HP製RPN電卓でいえば[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]や[https://www.hpmuseum.org/hp48s.htm HP-48シリーズ]が典型例である。しかし、本機はその正反対を行ったも同然な、中途半端でショボいスペックで仕上がってしまい、Classicシリーズを尻切れ蜻蛉にしてしまった。&lt;br /&gt;
&lt;br /&gt;
ではなぜHPは本機のスペックをこんなにショボくしたのか&amp;amp;#x2E3A;実装された関数や機能がほぼ同じであることから、「次世代であるWoodstockシリーズで唯一のプログラミングRPN関数電卓[[HP-25]]を開発する練習台として企画・製造・販売したのでは？」と愚考している。&lt;br /&gt;
&lt;br /&gt;
[[HP-25]]とその後継機種である[https://www.hp-collection.org/calculators/25c.html HP-25C]は、歴代のHP製RPN関数電卓史上最小筐体のプログラマブル機種だ。これを可能にしたのが、[[HP-25]]でも記載した、演算回路(A&amp;amp;R)・制御回路(C&amp;amp;T)・二相クロックドライバの3個を1チップに収めたマイクロプロセッサであるACT(Arithmetic, Control and Timing)の開発成功である。これにより実装するLSIの数を減らし、消費電力を抑え、延いては製品価格の低減を狙ったのだが、このとき同時に「過剰なまでの」筐体の小型化も目指したようだ。Classicシリーズでは7〜8個必要だったLSIを5個以下にできることから来た発想なのだろう。&lt;br /&gt;
&lt;br /&gt;
そこで、当時実用化されていたpMOS ROMで内蔵できる関数や機能がどの程度なのかを調べる目的だったように思える。「最小の筐体にプログラマブル関数電卓を実装しようとすると、どこまでの機能を盛り込めるか。技術的な検証をしたい」、「我々が考える関数や機能を、ユーザは欲しているか。市場調査をしたい」、この2点を探る観測気球の役割を本機に与えたように見えて仕方無い。&lt;br /&gt;
&lt;br /&gt;
結局、[[HP-25]]と[https://www.hp-collection.org/calculators/25c.html HP-25C]では、『時計・ストップウォッチ機能』以外で本機に実装された機能が採用されることになった。水晶発振子は高価で場所を取ることから省かれたのだろう。尤も、電源回りで致命的なハードウェア設計ミスを犯したため、現在から眺めると、Woodstockシリーズが成功したとは言い難いのだが。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、それまでHP製RPN電卓のラインナップを見てきた購入者層からは、本機のスペックが中途半端だと判断された。一大旋風を巻き起こした[[HP-65]]と比較されては歯が立たない。通常の四則演算は当然として、内蔵している各種関数を使用した演算性能そのものは現代でも通用する精確さがあるだけに、非常に勿体無い。&lt;br /&gt;
&lt;br /&gt;
このような状況なので、eBayをはじめとする中古市場やオークションサイトに本機が出品されることは稀で、比較的多量に出品される[[HP-65]]を100とすれば、[[HP-45/HP-46|HP-45]]は20〜30ぐらいだが、本機は1〜2といったところだ。それほどまでに当時は人気が無かったうえ、それ故、出品しようにもタマが無いと想像される。管理人はeBayで本機の完動美品が開始値100ドルのオークション形式で出品されているのを偶々見つけ入札したが、碌に競ることもなく(入札者は管理人含め僅か4名)、たった116ドルで落札できてしまった&amp;lt;ref name=&amp;quot;auction&amp;quot; /&amp;gt;1台のみ所有しているが、この事実だけでも本機に悲哀を感じずには居られない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7}518796.992\ \; (\varepsilon\!_R=2.87\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 43.00000001&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||200kHz (Classic)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||HP 82001A/B (3.6V 450mAh/900mAh 充電池:中身は単3形Ni-Cd充電池×3個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1975年〜1977年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||アメリカ、シンガポール&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1975年発売当時の定価||395ドル (約118,500円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;auction&amp;quot;&amp;gt;HP製RPN関数電卓の「完動」「美品」がオークション形式で出品されると、通常は世界中から20〜30名が締切時刻1分前あたりからドドドドッと入札し、少なくとも開始値の倍ぐらいまで落札価格が釣り上がる。よって、eBayで落札するには「締切時刻数秒前に、己に悔いが残らない最大金額で入札する」必要があり、本機のオークションでもこれに倣って入札したのだが、本機の落札価格の低さには、思わず「えっ」と声が出た。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0_%D0%9C%D0%9A-52&amp;diff=6822</id>
		<title>Электроника МК-52</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0_%D0%9C%D0%9A-52&amp;diff=6822"/>
		<updated>2025-11-24T09:21:37Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1983年〜1992年に旧ソ連の[https://ru.wikipedia.org/wiki/Военно-промышленный_комплекс 軍産複合体]である[https://ru.wikipedia.org/wiki/Министерство_электронной_промышленности_СССР ソヴィエト連邦電子産業省]が開発・製造・販売した可搬型プログラマブルRPN関数電卓で、旧ソ連製電卓では第三世代にあたる。本機はウクライナ・ソビエト社会主義共和国(当時)の首都キーウ(旧称キエフ)にある[http://nanokvazar.ru/en/kvazar Kvazar]で製造された。&lt;br /&gt;
&lt;br /&gt;
Электроникаは、キリル文字からラテン文字へ翻字するとElectronika、英訳するとElectronics、和訳すると「電子工学」で、もともとは[https://ru.wikipedia.org/wiki/Министерство_электронной_промышленности_СССР ソヴィエト連邦電子産業省]配下の工場が生産した電子部品に付されたブランド名だが、その後、それら電子部品を使用して設計・製造した家電製品にも付されるようになった。МКはロシア語のМикро Калькуляторの略で、英訳するとMicro Calculator、和訳すれば「小型計算機」である。&lt;br /&gt;
__TOC__&lt;br /&gt;
===10年遅れのスペック、20年遅れの外装===&lt;br /&gt;
手許にある本機の背面に刻印されたシリアルナンバーの隣に&amp;lt;code&amp;gt;92 08&amp;lt;/code&amp;gt;とあるので1992年8月に製造されたと推定される。以下はこのことを踏まえてお読みいただきたい。&lt;br /&gt;
&lt;br /&gt;
本機の新品を1つ購入すると、本機・専用ACアダプタ・マニュアルを外箱に収めたものが1セットとして送られてくる。2020年末時点では1セットが概ね10ドルで投げ売りされている。1セットだけ購入すると日本への輸送費のほうが高いため、ネタとして3セット購入した。3セットで輸送費と同価格だからだ。&lt;br /&gt;
&lt;br /&gt;
外箱は、小学校低学年の図工で使う厚紙(正式名称は[https://beruinsatu.com/item-detail/i24/ 学校芸能工作用紙])よりも薄い紙による[https://www.fukuro-oukoku.jp/item/47siromujibox/siromuji_suck_kumitate.html サック組立箱]で、その幅と奥行は本機がキッチリ入る大きさなので緩衝材を入れる隙間は無く、実際入っていない。薄い紙で作られた箱は強度が無いうえに専用ACアダプタがトランス式で重いため、箱の底が抜けているか、箱そのものが潰れている。この時点で、箱に収める目的が「輸送時の衝撃等から内容物を保護するため」ではなく「内容物を1セットにまとめるため」であることが判る。旧ソ連と旧共産圏諸国で販売・使用することを想定しているからか、外箱・本機・専用ACアダプタ・マニュアルの全てがロシア語表記のみだ。&lt;br /&gt;
&lt;br /&gt;
本機の外装は極めて安っぽい。素材であるプラスティックの質が悪いことと、ちょっと強く握ると割れそうなぐらいの薄さであることが、持っただけで判る。このチャチな造作から、前者は材料工学が、後者は人間工学が、当時の旧ソ連では未成熟だったことを一発で解らせる。力が加わっても割れない素材を選択するとか、それが適わぬなら、力が加わる箇所を肉厚にして割れないように配慮するとか、非共産圏諸国の量産品では当たり前であろうユーザへの気遣いがまったく無い。外装の縁にはまるで当然のようにバリが残っており、電池ボックスの蓋は本体側と噛み合せが悪く、蓋を外すのは勿論、電池を入れた後に再度蓋を付けるのにも難儀し、もし蓋を付けても完全には閉まらず蓋が浮く始末で、うっかり触ると蓋は勝手に外れる。電源を含むスライドスイッチを出す穴も歪んでおり、スイッチの摺動部が穴の両端まで行かない。キーボードの各キーも、本来は色を統一したいはずだが、微妙に色が異なっている。たとえば、本来はライトグレーであろうテンキーは、数字に依って黄色がかっていたり青みがかっていたりする……等々、見れば見るだけツッコミどころが湧き出てくる。初めて外装を見た管理人の第一声は「1980年代初頭に粗製濫造された[https://ja.wikipedia.org/wiki/ガンプラ ガンプラ]より酷いな」だった。なお、本機表側(キーボード側)に被せるプラスティック製の蓋も附属するが、これも微妙にサイズが合わない。&lt;br /&gt;
&lt;br /&gt;
ACアダプタのAC側は旧ソ連国内に合わせ220V規格Cタイプのコンセントプラグ、本機側プラグは2ピンの独自規格&amp;lt;ref name=&amp;quot;usb&amp;quot; /&amp;gt;である。マニュアルは全383ページと大部であるため2分冊されているが、外箱に収めるためか幅132mm×奥行78mmという掌サイズ([[HP-12C]]/[[HP-10C/HP-11C/HP-15C]]/[[HP-16C]]などHP-10Cシリーズとほぼ同じ大きさ)。表紙を含め紙質は極めて悪く、日本では1980年代に小中高校のプリントで使われていた[https://ja.wikipedia.org/wiki/わら半紙 藁半紙]そのものである。表紙こそカラーのオフセット印刷だが、本文は謄写版原紙にロシア語タイプライタで直接打刻した原稿を謄写版印刷したもので、それらが無線綴じされている。ただ、製本技術が未熟で、背表紙の糊付けが甘く、乱雑に扱うとメモ用紙のように本文がペリペリと1枚ずつ剥がれそうになる。&lt;br /&gt;
&lt;br /&gt;
表示部には1行8桁+2桁の[https://en.wikipedia.org/wiki/Vacuum_fluorescent_display 蛍光表示管]を、ユーザが組んだプログラムを保存する不揮発性メモリには[https://en.wikipedia.org/wiki/EEPROM EEPROM]を、それぞれ採用しているが、これらを採用した経緯は謎だ。蛍光表示管は1966年に日本で発明されたが、本機が製造された当時も今も非共産圏に属する日本の独自技術が、共産圏のど真ん中たる旧ソ連へ、どういう経緯で移転されたのだろうか。旧ソ連が独自に技術を習得(もしくはリバースエンジニアリングで技術を剽窃)した可能性は否定できないものの、正規の契約に基き日本から技術を輸入したのかは不明だ。&lt;br /&gt;
&lt;br /&gt;
本機は表示形式の指定も選択もできず、仮数部8桁・指数部2桁の[https://en.wikipedia.org/wiki/Scientific_notation 指数表記](HP製RPN電卓でいう〝SCIモード〟)固定である。これは非常に徹底されており、例えば&amp;lt;code&amp;gt;0.0025&amp;lt;/code&amp;gt;をスタックXにプッシュすべく&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|Войти&amp;amp;#8679;}}&amp;amp;nbsp;と押下する&amp;lt;ref name=&amp;quot;zero&amp;quot; /&amp;gt;と、わざわざ&amp;lt;code&amp;gt;2.5E-03&amp;lt;/code&amp;gt;に変換して表示する。&lt;br /&gt;
&lt;br /&gt;
EEPROMはその仕組み上、書換回数に上限があり、それを超えると書換不可能＝プログラムが保存不可能となるため、製品の目玉機能として『ユーザが作成したプログラムの保存と書換が可能』を謳うプログラマブルRPN関数電卓に採用する不揮発性メモリとしては不適切だ。これを知ったユーザはプログラムの書換えどころか保存にも躊躇するだろうし、本機の中古品を購入することはEEPROMの寿命について諦めることを意味するからだ。HP製RPN電卓のように、不揮発性メモリとして[https://en.wikipedia.org/wiki/Nonvolatile_BIOS_memory CMOSメモリ]を採用し、電池交換時には保存した内容が消去されることを前提としたほうが親切に思える。ちなみに、本機製造当時のアメリカや日本が製造したEEPROMは概ね10万回の書換が可能だが、旧ソ連製のそれは最大でも1万回が限界だったと謂われている。&lt;br /&gt;
&lt;br /&gt;
キーボードの出来も非常に悪く、HP製RPN電卓と較べるのも烏滸がましい。なにしろ、キーを保持する方法が「金属製のバネ」ではなく、クッション材としてよく使われる「軟質ポリウレタンフォーム製のスポンジ」である。これを3mm程度の厚さにスライスし、押下したキーで短絡させる箇所に丸穴を開けたものを基板の上に置き、更にその上に各キーを支持するプラスティック製の枠を置いたのが、本機のキーボードである。よって、キーを押下したとてキーが浮きも沈みもせず、クリック感どころか押し味がまったく無いので、キー入力が成立したか否かは勿論、キーを押したかどうかすら、キータッチで判断できない。コンピュータである電卓の入力装置とはとても思えない、お粗末極まりない代物で、未入力や誤入力を連発する羽目になる。数字キーであればキー入力が成立すれば該当の数字が表示部に出力されるので辛うじて判るが、関数キーは入力が成立したか否かを客観的に判断する術が無い&amp;lt;ref name=&amp;quot;key&amp;quot; /&amp;gt;ため致命的だ。本機の中古品を購入する際は「3mm厚のウレタンスポンジ」が経時劣化している(ことが原因でマトモにキー入力できない)ことを覚悟しなければならないが、そもそもポリウレタンは数年放っておくだけで空気中の水分により分子結合が脆くなり形状を保てなくなる[https://en.wikipedia.org/wiki/Hydrolysis 加水分解]を起こすので、先述のEEPROMのことも考えると、本機の中古品は購入しないほうが良い。尤も、加水分解は新品でも起きる事象なので、諸外国と較べても多湿な日本で本機をマジメに長期保存するなら、保存期間中は空気に触れさせないよう真空パックすることを考慮しなければならない。&lt;br /&gt;
&lt;br /&gt;
幅211mm×奥行76mm×最大高さ31mmの横長の本機上側面には、別売された本機専用ソフトウェアROMを装着するための拡張スロットが1口実装されている。物理インタフェースは基板に直挿しされた1列22ピンのL字型(90度曲げ)[https://akizukidenshi.com/catalog/g/gC-05779/ ピンソケット]により直接引き出す形で造成されている。他製品用の部品を流用したのか、22ピンは等間隔に配置されているものの、ソケット部品としては17ピンと5ピンに分かれている。これにより自動的に、ソフトウェアROMの物理インタフェースは1列22ピンの[https://akizukidenshi.com/catalog/g/gC-00167/ ピンヘッダ]となる。尤も、非共産圏諸国での一般的なハードウェア設計では、現在に至るまで、頻繁に抜き挿しする箇所にピンソケットとピンヘッダを組み合わせた物理インタフェースは採用しない。ピンソケットもピンヘッダもそのような使用形態を想定してない部品で、数回ならまだしも、日常的な抜き挿しに耐えられる強度は無く、1度挿入したら長期間(下手すると廃棄されるまで2度と)抜去しない箇所の物理インタフェースとして採用するのが常である。実際、本機のソフトウェアROMは装着や抜去に相応の力と妙なコツが必要だが、それ以前の話として、当時の旧ソ連で本機の購入を検討できる一般国民が得られる収入&amp;lt;ref name=&amp;quot;incoming&amp;quot; /&amp;gt;を考えると、公式には4種類&amp;lt;ref name=&amp;quot;rom&amp;quot; /&amp;gt;、実際には2種類([[БРП-3]]と[[БРП-4]])しかなく、生産量も少なかった&amp;lt;ref name=&amp;quot;counts&amp;quot; /&amp;gt;別売ソフトウェアROMを2種類とも購入し、都度交換して運用するユーザは非常に少なかっただろうと思われる。購入するにしてもどちらか一方だけで、その後は本機に挿しっ放しだったのではなかろうか。ただ、本機に装着したソフトウェアROMは大きく飛び出る&amp;lt;ref name=&amp;quot;size&amp;quot; /&amp;gt;ので、挿しっ放しだと持ち運ぶにも収納するにも邪魔なだけでなく、破損や故障の原因になりそうである。&lt;br /&gt;
&lt;br /&gt;
実装された関数は、四則演算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の他に、三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\mathrm{tg}&amp;lt;/math&amp;gt;}}&amp;lt;ref name=&amp;quot;tangent&amp;quot; /&amp;gt;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin^{-1}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos^{-1}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\mathrm{tg}^{-1}&amp;lt;/math&amp;gt;}}&amp;lt;ref name=&amp;quot;tangent&amp;quot; /&amp;gt;・二乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^2&amp;lt;/math&amp;gt;}}・冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;lt;ref name=&amp;quot;exp&amp;quot; /&amp;gt;・逆数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}・開平&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{x}&amp;lt;/math&amp;gt;}}・円周率&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;}}・常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;10^x&amp;lt;/math&amp;gt;}}・自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\ln&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で、これら関数による演算で乗ってしまう公称最大相対誤差は&amp;lt;math&amp;gt;4\times10^{-7}&amp;lt;/math&amp;gt;(冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;のみ&amp;lt;math&amp;gt;1\times10^{-6}&amp;lt;/math&amp;gt;)オーダとされているが、三角関数・逆三角関数・各種対数関数で定義域の際付近ではマトモに演算できず、冪乗も誤差が大きい。三角関数は角度の単位を物理スイッチで切り替えるが、弧度法&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {Р}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;だろうと度数法&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {Г}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;だろうとグラード(フランス度)&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {Грд}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;だろうと、&amp;lt;math&amp;gt;\sin \frac{\,\pi\,}{\,6\,} \mbox{ [rad]} = \sin 30^\circ = \sin \frac{100}{3} \mbox{ [g]}&amp;lt;/math&amp;gt;の演算には5秒ほど要し&amp;lt;code&amp;gt;5.0000002E-01&amp;lt;/code&amp;gt;を演算結果として出力する。&amp;lt;math&amp;gt;2^3&amp;lt;/math&amp;gt;を冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で演算すると、4秒後に&amp;lt;code&amp;gt;7.9999993&amp;lt;/code&amp;gt;を演算結果として出力する。いずれにしろ演算結果に含まれる誤差は本機より10年以上旧式の[[HP-35]]のそれより大きい。&lt;br /&gt;
&lt;br /&gt;
内部演算はBCDで実行されるが、その精度や数値の扱いは[[HP-35]]と同等程度だ。例えば&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|Войти&amp;amp;#8679;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;のそれぞれの演算結果は正解である&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;を出力するが、{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の演算結果は正解の&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;ではなく&amp;lt;code&amp;gt;9.9999999E-01&amp;lt;/code&amp;gt;を出力する。これらの挙動は[[HP-35]]と同じだ。これらの演算をHP製RPN電卓の第二世代にあたり1975年に発売された[[HP-25]]以降でまったく同じキーインをすれば全問正解を出力するので、演算ロジック(ソフトウェア)の作り込みが[[HP-35]]と同等程度と判断せざるを得ない。[[HP-35]]は1972年に、本機は1983年に発売されているため、スペックとしては10年以上遅れていることになる。&lt;br /&gt;
&lt;br /&gt;
1988年、旧ソ連海軍が艦艇の航法支援装置の一部として本機を採用した&amp;lt;ref name=&amp;quot;rom&amp;quot; /&amp;gt;ことは一部で知られているが、それ以上に、旧ソ連が伊達や酔狂ではなく非共産圏諸国と互角以上の技術力を有していた宇宙開発分野でも本機が使用されていたことは有名だ。1988年11月26日〜1989年4月27日、有人宇宙機[https://ru.wikipedia.org/wiki/Союз_(космический_корабль) &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]の[https://ru.wikipedia.org/wiki/Союз_ТМ-7 ミッションTM-7]で宇宙に出ている&amp;lt;ref name=&amp;quot;another&amp;quot; /&amp;gt;。その目的は、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;が内蔵していた航法支援装置が故障した際の代替手段であった。即ち、もし&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;の航法支援装置が故障し、地球へ帰還する軌道を演算・決定できなくなった場合は、搭乗した宇宙飛行士(3名のうち、恐らくフライトエンジニアであった[https://ru.wikipedia.org/wiki/Крикалёв,_Сергей_Константинович &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Сергей&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;セルゲイ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Крикалёв&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;クリカレフ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;])が[[БРП-3]]を装着した本機で地球帰還軌道を演算・決定し、手動操縦で地球へ帰還する手順となっていた。これは、旧ソ連の宇宙開発方針から来る伝統で、打上げ機から切り離された有人宇宙機の航行と制御が「宇宙機に内蔵された航法支援装置による完全自動」か「宇宙飛行士による完全手動」かの二択しか無いことに依る。旧ソ連では『装置はミスをしないが人間はミスをする。よって、宇宙飛行士には極力何もさせない』という設計思想で有人宇宙機を開発していたため、地上の管制部門が宇宙機に内蔵された航法支援装置が故障したと判断し遠隔から無効化しない限り、宇宙飛行士は宇宙機を手動で操縦できないどころか、どのような操作も受け付けない仕組みであった。つまり、旧ソ連の宇宙飛行士は、いったん宇宙に出てしまうと、有人宇宙機が故障しない限りは『自動で勝手に飛ぶカプセルの中で、ただ座席に縛り付けられているだけ』のお飾り&amp;lt;ref name=&amp;quot;ornament&amp;quot; /&amp;gt;でしかなかった。対するアメリカでは『装置は壊れてミスするが人間は訓練すればミスを減らせる。よって、宇宙飛行士が実行できる範囲の操作は全てやらせる』という設計思想で有人宇宙機を開発しており、自動化すべき箇所は自動化するものの、基本的には宇宙飛行士による手動操縦の余地を残し、装置故障など異常発生時の訓練を充分に実施してから宇宙へ送り出した。この差が[https://www.nasa.gov/mission_pages/apollo/missions/apollo13.html アポロ13号]で発生した致命的事故から全乗員を生還せしめたことを筆頭に、1960〜70年代の宇宙開発競争の雌雄を決した条件の1つと挙げられているが、本論ではないので以降の詳細は省く。&lt;br /&gt;
&lt;br /&gt;
===「共産主義」という壮大な社会実験が50年で失敗した理由が判る===&lt;br /&gt;
本機を概観することで嫌でも判るのは、「共産主義」という壮大な社会実験が50年で失敗した理由である。&lt;br /&gt;
&lt;br /&gt;
本機は、誤差の出方から、演算結果に誤差を含む理由は[[HP-35#cite_note-power-4|HP-35の脚注]]と同じと推定している。即ち、当時の旧ソ連では半導体製造技術が未熟かつ進歩しなかったことで、高速に演算するマイクロプロセッサと充分な演算精度を持たせられるだけの大規模ソフトウェアを格納できるROMやRAMを製造できなかった結果、演算精度と演算性能を妥協せざるを得なかったのだ。この推定が正しければ、当時の旧ソ連における半導体製造技術(集積度や高密度実装)は、当時はアメリカと日本が代表していたであろう非共産圏諸国の半導体製造技術から10年以上遅れていたことになるが、管理人は「さもありなん」と考える。&lt;br /&gt;
&lt;br /&gt;
共産主義かつ先軍政治体制が敷かれていた旧ソ連の国内工業は、ひとつの製品はひとつの国営工場で集約して製造することこそ正義&amp;lt;ref name=&amp;quot;competition&amp;quot; /&amp;gt;で、複数の工場が競って製造することは『非効率』『貴重な資源と資金の浪費』と見做される悪行であり、市場競争が働かない以前に競争原理が存在しない。しかもそれら国営工場の存在意義は、来るべき非共産圏諸国との核戦争に備えた軍需を満たすためにあり、製造される製品も軍需から要請される軍備品であった。故に、民需を満たす工場は非常に少なく、軍備品のお零れを仕方無く振り向ける形で民需に応えていた&amp;lt;ref name=&amp;quot;error&amp;quot; /&amp;gt;。軍備品に求められる最優先事項は『故障せず常に確実に動くこと』なので、下手に小型化や省力化することで故障が頻発するようでは軍備品として失格であり、余程画期的なブレイクスルーでも無い限りは古い技術が使い続けられる&amp;lt;ref name=&amp;quot;ak-47&amp;quot; /&amp;gt;。その結果、自国の軍備が重厚長大であることを非共産圏諸国へ誇示することが重要な外交手段の1つであった、東西冷戦真っ只中の1980年代の共産圏諸国では、それを構成する部品や製品を小型化や省力化する動機や契機が皆無となる。市場競争が無いため新しい技術を産み出す動機も無く、十年一日の如く、古い技術が改良されぬまま延々と生き延びてしまう。共産圏諸国が自国の主義・主張の正しさを非共産圏諸国へ喧伝するための見栄と突っ張りを維持したい政府の指示で、非共産圏諸国で産まれた新しい技術は後から慌ててキャッチアップするものの、その中身は似て非なるものであることが多く、正確に取得できたものは数える程度だった…この悪循環に嵌った旧ソ連の様子が、本機を通してありありと浮かぶ。&lt;br /&gt;
&lt;br /&gt;
翻って、非共産圏諸国で生活している管理人を含むユーザから見ると、本機の造りは「関数電卓」という製品の必要十分すら満たせておらず、やっつけ仕事にしか見えない。本機が最初に発売された1983年の日本は、1979年1月に勃発したイラン革命に端を発する第二次オイルショックによる不況からようやく脱出しハイテク景気と呼ばれる好況へ突入しようとしていた時期だが、管理人が小学生だったこの頃を思い出しても、さすがにここまでチープな家電製品は無かった。どんなに小さな製品でも発泡スチロールを緩衝材にボール紙や段ボールでできた箱に収められ、マニュアルは上質紙に印刷され、製品を手に持つときに気を遣う必要は無く、ボタンを押した感触は確実にあった。何より、本機と同じ年に日本で発売されたのが[https://ja.wikipedia.org/wiki/ファミリーコンピュータ ファミリーコンピュータ]だということが象徴的だろう。日本では8ビットCPUを実装した据置型家庭用テレビゲームの本体が[https://www.nta.go.jp/publication/statistics/kokuzeicho/minkan1997/menu/03.htm 平均月収]の6%弱で買えた頃、旧ソ連では非共産圏諸国より10年以上遅れたスペックのRPN関数電卓を買うのに1ヶ月分の月収をまるまる費やさねばならなかったという事実が全てを物語る。あらゆる品物で毎年新製品がリリースされ、その度に小型化・省力化・洗練化されていなければ、その新製品が売れることはない資本主義では、相互に競争することが当たり前で、そのためには新たな技術の開発が必要であった。健全な市場競争が産む好循環である。それに引き替え、政治体制として企業間競争が禁じられると、民需に応える製品は数年以上のオーダで変わることもなく、しかもチープで異常に高価となる共産主義。この彼我の差は明らかに、資本主義により市場競争が機能し、それらにより起きた技術革新の恩恵だと断じている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= -10000000&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;cal&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 33.924836&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;cal&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||75kHz&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||単3形×4本&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1983年〜1992年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||旧ソ連&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1983年発売時の定価||115ルーブル&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;usb&amp;quot;&amp;gt;形状と大きさはminiUSB A オス(plug)コネクタに似ているが、物理インタフェースは中央に丸く2ピンが並んで開いているものである。なお、どれだけ需要があるのか不明だが、この独自規格コネクタとUSB A オス(plug)コネクタを持つ、本機と[[Электроника МК-61]]専用の給電ケーブルが1本7ドルで売られているため、これも複数本購入した。この給電ケーブルを介してDC 5Vを出力する汎用USB充電器と本機または[[Электроника МК-61]]を接続することで、単3電池を装着することなく使用でき、蛍光表示管も電池使用時より若干明るく表示される。USB電流チェッカーで計測すると、消費電流は最大で80mA、平均で40mA程度であるため、PCからの給電でも問題無い。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;key&amp;quot;&amp;gt;一部の関数キーで入力が成立すると蛍光表示管全体が一瞬チラつく場合もあるが、それすら無い関数が大半のため、キー入力が成立したかを客観的に判断できる術は無いと考えて良い。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rom&amp;quot;&amp;gt;現在まで現物が見つからない2種類はБРП-2 «Астро»とБРП «Гео»である。前者は航海時に天測と時刻から緯度・経度を求めて船舶の航路を特定するもので、旧ソ連海軍にしか提供されていない。後者は雑誌に名称のみ掲載されただけで詳細が一切不明という幻のROMだが、その名称から、地上で現在地の緯度・経度・高度を求めるためのものと推定される。詳細かつ正確な海図と地図が現在でも軍事機密として扱われ一般国民にも非公開であるロシアや旧共産圏諸国で、1991年の旧ソ連崩壊前にこの種のROMを自国民に発売する訳がなかろう。もし発売すれば粛清される可能性すらある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;counts&amp;quot;&amp;gt;それはeBayをはじめとする取引市場やオークションサイトでの出品数や価格に如実に表れている。本機や[[Электроника МК-61]]は星の数ほど出品されており、1個10ドルどころか「1山いくら」という雑な扱いで叩き売られているが、稀に見掛ける[[БРП-3]]は1個60〜80ドル程度、1〜2度しか見たことがない[[БРП-4]]に至っては1個100ドル以上の値が付けられる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;incoming&amp;quot;&amp;gt;旧ソ連の平均月収は、大学教授が320ルーブル、大学准教授が170ルーブル、ソ連軍中尉で230ルーブル、裁判官が210ルーブル、トロリーバス運転手が140ルーブル、教師が132ルーブルであった。旧ソ連の物価は、食堂の定食1食・牛乳5リットル・公衆電話で50回架電・トロリーバスまたは地下鉄の切符20枚が1ルーブル、殆どの借家の家賃1ヶ月分・ウォッカ1本と多少の肴が5ルーブル、レニングラード(現サンクトペテルブルク)〜モスクワ間の国内航空運賃が18ルーブル、自転車が50ルーブルだったそうだ。本機の定価が115ルーブル、ソフトウェアROMの定価が16ルーブルであることを考えると、本機とソフトウェアROMを1個ずつ購入する際は、感覚的に『1ヶ月間の飲まず食わずを覚悟』する必要があった。1983年の日本に置き換えれば『[https://akiba-pc.watch.impress.co.jp/docs/column/retrohard/1068992.html PC-8801mkII]のフルセットを現金一括払いで買う』感じだろうか。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;size&amp;quot;&amp;gt;ソフトウェアROMの外形は幅59mm×奥行43mm×高さ16.5mm。装着すると本機のインタフェース嵌合部に多少埋没するものの、奥行25mm分は飛び出たままである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;tangent&amp;quot;&amp;gt;本機と[[Электроника МК-61]]では三角関数の正接(ロシア語ではтангенс)を&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;ではなく&amp;lt;math&amp;gt;\mathrm{tg}&amp;lt;/math&amp;gt;と表記しているが、これは[https://ru.wikipedia.org/wiki/Тригонометрические_функции ロシア数学界の流儀]のようだ。ドイツが除算を[https://de.wikipedia.org/wiki/Geteiltzeichen &amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;ではなく&amp;lt;math&amp;gt;\colon&amp;lt;/math&amp;gt;と表記する]のと同じく、国による表記の違いが興味深い。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;exp&amp;quot;&amp;gt;冪乗のスタック配置が通常のHP製RPN関数電卓と逆である[[HP-35]]と同様、羃指数を先に、底を後に、スタックにプッシュする必要がある。しかし、本機には[[HP-35]]と異なり10の冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;10^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が内蔵関数として実装されているため[[HP-35#cite_note-exp-3|スタック配置を逆にする必要性]]が無く、なぜこのような実装なのかは不明だ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;zero&amp;quot;&amp;gt;整数部がゼロの小数を入力する際は、整数部のゼロも必ずキーインする必要があり、HP製RPN電卓のように整数部のゼロの入力を省略できない。即ち、&amp;lt;code&amp;gt;0.0025&amp;lt;/code&amp;gt;をスタックXにプッシュするとき&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と押下しても小数とは認識されず&amp;lt;code&amp;gt;0025&amp;lt;/code&amp;gt;と表示され、このまま&amp;amp;nbsp;{{keypress|Войти&amp;amp;#8679;}}&amp;amp;nbsp;を押下しても整数の&amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt;がスタックXに積まれる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;another&amp;quot;&amp;gt;それ以前のミッションやフライトで旧ソ連製関数電卓が宇宙に出たか否かは不明である。1967年4月23日に初めて宇宙に出て以降、2020年代でも現役という&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;の長い歴史や、対するアメリカでは[[HP-35]]が発売直後から宇宙に出ていたこと等から、本機より前にも旧ソ連から宇宙に出た電卓は有ると思うものの、本機以外でこの種の情報は現在まで詳らかになっていない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ornament&amp;quot;&amp;gt;宇宙開発競争が始まった当初の1950〜1960年代は旧ソ連が圧倒的優位に立っており、その隙にアメリカを突き放すべく、旧ソ連では「宇宙空間に動物や人間を送る」ことが計画された。最初は射場近辺で大量に捕まえることができた野犬のメスで数度試すこととし、[https://ru.wikipedia.org/wiki/Спутник-2 &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Спутник-2&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;スプートニク2号&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]で宇宙に出たものの直後に機内で死亡した[https://ru.wikipedia.org/wiki/Лайка_(собака-космонавт) &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Лайка&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ライカ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]は特に有名だ。その結果を精査し、いよいよ人間をとなったが、ソ連共産党中央委員会が発した命令書では、成功裏に人間を宇宙空間へ上げるまでの猶予期間は僅か3ヶ月しか無かった。1961年、ソ連共産党中央委員会は人類初の宇宙飛行士に[https://ru.wikipedia.org/wiki/Гагарин,_Юрий_Алексеевич &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Юрий&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ユーリイ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Гагарин&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ガガーリン&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]を選抜したが、その理由が「身体的・精神的耐久性に優れた労働者階級出身者だから」という時点で全てを察せよう。&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Гагарин&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ガガーリン&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;をはじめとするこの時代の旧ソ連の宇宙飛行士候補生20名が受けた訓練は、耐高重力・耐高加速度・耐不安・反射神経鋭敏化に関するものが殆どで、打上げ機の飛翔や宇宙機の軌道、宇宙空間における理学的・工学的な話題や課題に関することは勿論、自らの命を預けることになる[https://ru.wikipedia.org/wiki/Восток-1 &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Восток-1&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ボストーク1号&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]の詳細も教育されていない。1961年4月12日06時07分(UTC)に宇宙空間に出た&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Восток-1&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ボストーク1号&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;は1周90分の[https://en.wikipedia.org/wiki/Low_Earth_orbit 地球低軌道]を飛行(実態は漂流)した後、地上からのコマンドで推進エンジンを逆噴射させて逆推進、07時55分(UTC)に地球へ帰還するという飛行計画に沿って設計されたが、この計画で&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Гагарин&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ガガーリン&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;に与えられた役割は「90分間の飛行中、座席に縛りつけられた状態で機外(地表と宇宙空間)の写真を撮る」「管制員からの質問に答える」のみで、その答に学問的知識からの演繹や帰納が含まれることは期待されなかった。それどころか、当時の上層部は「宇宙飛行士へ中途半端に知識を与えると却って不安を抱くだろう(から学ばせたくない)」と考えていた節すらある。後年、アメリカの複数の宇宙飛行士と会話する機会があった&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Гагарин&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ガガーリン&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;は、彼らから矢継ぎ早に浴びせられた専門的な話題や質問にまったく答えられず「軍事機密です」で逃げざるを得なかった己に愕然としている。&amp;lt;br&amp;gt;1963年06月16日09時29分(UTC)に打ち上げられた[https://ru.wikipedia.org/wiki/Восток-6 &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Восток-6&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ボストーク6号&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]で世界初の女性宇宙飛行士となった[https://ru.wikipedia.org/wiki/Терешкова,_Валентина_Владимировна &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Валентина&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ワレンチナ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Терешкова&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;テレシコワ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]に至っては、宇宙空間に出た直後からずっと「気持ち悪い！ 頭も体も痛い！」と管制員に泣き喚いて八つ当たりし、機内で暴れて窓ガラスに罅を入れた挙句、嘔吐を繰り返すという半狂乱状態に陥った。当然、ソ連共産党中央委員会はこの事実を極秘とし、国営タス通信から内外へ配信された、«&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Я&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ヤー&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Чайка&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;チャイカ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;» (「こちら、カモメです」)で始まる管制員との一連の通信を記録したフィルム映像は、曲り形にも軍人である矜持でどうにか取り繕った&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Терешкова&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;テレシコワ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;渾身の演技であったことが、ソ連崩壊後の[https://ru.wikipedia.org/wiki/Гласность &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Гласность&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;グラスノスチ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;(情報公開)]で明らかになっている。尤も、当時の旧ソ連では宇宙機と地上局の無線通信が非暗号のアナログ波だったため世界中のアマチュア無線家が傍受しており、噂の範疇ではあるが&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Терешкова&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;テレシコワ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;を危惧する声は出ていた。アメリカではCIAが傍受した内容を翻訳・解析し、当時の大統領である[https://en.wikipedia.org/wiki/John_F._Kennedy John&amp;amp;nbsp;F.&amp;amp;nbsp;Kennedy]をはじめ国家首脳陣と関係機関へ逐次報告しており、この惨状を常時把握していた。そんな&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Терешкова&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;テレシコワ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;しか搭乗していない&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Восток-6&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ボストーク6号&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;が地球へ帰還できたのは、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Терешкова&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;テレシコワ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;が&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Восток-6&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ボストーク6号&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;を直接操縦する必要が無かったからだ。但し、錯乱した&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Терешкова&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;テレシコワ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;は、地球帰還前に実行する手順にあった「&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Восток-6&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ボストーク6号&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;の状態確認と管制員への報告」を一切やらず、管制員からの問い掛けにも応答しなかったため、無事に帰還できる確証が得られぬまま地上から推進エンジンを逆噴射させており、06月19日08時20分(UTC)に無事帰還できたのは奇跡と言って良い。&amp;lt;br&amp;gt;このあたりは&#039;&#039;&#039;Two Sides of the Moon&#039;&#039;&#039; (ISBN 9780312308667)、和訳版は&#039;&#039;&#039;アポロとソユーズ&#039;&#039;&#039; (ISBN 9784789724524)に詳しい。&amp;lt;br&amp;gt;ちなみに、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Терешкова&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;テレシコワ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;が起こした惨劇がその後の宇宙開発に与えた影響はあまりに大きい。当事国の旧ソ連は「女性は宇宙飛行士に向かない」と判断、女性宇宙飛行士チームを解散し、1982年に[https://ru.wikipedia.org/wiki/Военно-воздушные_силы_СССР ソヴィエト連邦空軍]中将[https://ru.wikipedia.org/wiki/Савицкий,_Евгений_Яковлевич &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Евгений&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;エフゲニー&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Савицкий&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;サヴィツキー&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]の娘である[https://ru.wikipedia.org/wiki/Савицкая,_Светлана_Евгеньевна &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Светлана&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;スベトラーナ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Савицкая&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;サヴィツカヤ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]が選抜され[https://ru.wikipedia.org/wiki/Союз_Т-7 &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Союз&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ソユーズ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;amp;nbsp;T-7]で宇宙に出るまでの19年間、宇宙飛行士を男性に限定した。アメリカではNASAの鈍重な官僚機構が働いて更に慎重となり、初めて女性の宇宙飛行士を選抜するのは、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Савицкая&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;サヴィツカヤ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;の更に後、1983年に[https://en.wikipedia.org/wiki/Space_Shuttle_Challenger Space&amp;amp;nbsp;Shuttle&amp;amp;nbsp;Challenger]の第2回飛行である[https://en.wikipedia.org/wiki/STS-7 STS-7]で[https://en.wikipedia.org/wiki/Sally_Ride Sally&amp;amp;nbsp;Ride]が宇宙に出るまで待たねばならず、Sallyでようやく3人目となった。それ以降を総計しても、2020年末時点で、宇宙に出た経験がある男性宇宙飛行士が全世界で約450名なのに対し、女性宇宙飛行士が約60名(うち日本人は[https://en.wikipedia.org/wiki/Chiaki_Mukai 向井千秋]・[https://en.wikipedia.org/wiki/Naoko_Yamazaki 山崎直子]の2名)というのは、いかにもアンバランスである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;competition&amp;quot;&amp;gt;尤も、この正義はあくまで民需向けに限った話で、対非共産圏国への技術力の誇示が国の存続に係わる分野では意図的に競わせている。例えば宇宙開発分野は[https://ru.wikipedia.org/wiki/Королёв,_Сергей_Павлович &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Сергей&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;セルゲイ&amp;lt;/rb&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Королёв&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;コロリョフ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]が旧ソ連では巨人であり圧倒的な実績を遺しているが、ソ連共産党は[https://ru.wikipedia.org/wiki/Янгель,_Михаил_Кузьмич &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Михаил&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ミハイル&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Янгель&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ヤンゲル&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]も同じ分野で競わせている。即ち、当時のソ連共産党でも「技術の進歩に競争は不可欠である」ことは認識していたのだ。ただ、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Королёв&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;コロリョフ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;の肩書が「第1設計局(ОКБ-1)主任設計者」だったのに対し、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Янгель&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ヤンゲル&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;のそれは「第585設計局(ОКБ-586)主任設計者」だったことからも、数字の大小が能力を示すものではなかったとはいえ、&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Королёв&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;コロリョフ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;が優位だったのは揺がないようだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;error&amp;quot;&amp;gt;軍備品の製造過程で発生した、事前に規定した製品規格を満たさない品物は、非共産圏諸国では機械的に弾かれ、軍事機密に該当しなければ『放出品』として民間市場へ安価に払い下げて民需を満たしていたが、さすがに1980年代に入ると民需を満たす国内工業が充分育っており、この払い下げ措置は「民需を満たす」というより「貧困層の救済」や「市井のミリタリー趣味者に提供する」方向等へ変わっていった。翻って共産圏諸国では、この年代に入ったとて資源調達能力も国内工業も育たず生産能力が低いままであり、本来は軍に納品できず民需へ振り向ける規格外品であっても、指示された軍需を満たすためには軍に納品せざるを得ない状況であった。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ak-47&amp;quot;&amp;gt;その典型例が、旧ソ連で1946年に開発され1949年に旧ソ連軍に制式採用されて以降、現在も世界中の軍組織でバリバリの現役である自動小銃・[https://ru.wikipedia.org/wiki/Автомат_Калашникова AK-47]である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cal&amp;quot;&amp;gt;偶然か必然か、[[National Semiconductor 4510]]とほぼ同じ値(挙動)である。特に&amp;lt;math&amp;gt;\left (\tfrac{\ln 884736744}{\pi}\right )^2&amp;lt;/math&amp;gt;の演算結果が小数点第4位まで同じなのを「偶然」の一言で片付けて良いのだろうか。[[National Semiconductor 4510]]にも記したが、ナショセミはこれに実装した科学・数学向けRPN関数電卓用ワンチップマイクロプロセッサであるMM5760Nの外販を前提に動いており、かつ、MM5760Nは4ビットCPUなので、1950年1月から機能し始めた[https://en.wikipedia.org/wiki/Coordinating_Committee_for_Multilateral_Export_Controls COCOM(対共産圏輸出統制委員会)]の規制対象外であることから、旧ソ連はMM5760Nを正々堂々輸入し[https://en.wikipedia.org/wiki/Reverse_engineering リバースエンジニアリング]した可能性が否定できないと考えている。もしこれが正しいとすると、当時の旧ソ連とアメリカには、少なくとも8年の技術格差が存在したことになる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=RPN%E9%9B%BB%E5%8D%93&amp;diff=6821</id>
		<title>RPN電卓</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=RPN%E9%9B%BB%E5%8D%93&amp;diff=6821"/>
		<updated>2025-11-24T09:14:36Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1991年3月&amp;lt;ref name=&amp;quot;pc&amp;quot; /&amp;gt;に自分専用のPCを購入してもらったことから始まった、日常的にコンピュータと戯れる生活。その過程で、管理人には様々な奇癖が身についてしまった。例えば&lt;br /&gt;
*キーボードで&amp;amp;nbsp;{{keypress|Ctrl}}&amp;amp;nbsp;は&amp;amp;nbsp;{{keypress|A}}&amp;amp;nbsp;の左隣に無ければならない&lt;br /&gt;
*エディタは[https://www.gnu.org/software/emacs/ GNU Emacs]でなければならない&amp;lt;ref name=&amp;quot;mode&amp;quot; /&amp;gt;&lt;br /&gt;
*[https://ja.wikipedia.org/wiki/SKK SKK]以外で日本語が入力できない&lt;br /&gt;
*数字フォントの[https://en.wikipedia.org/wiki/Slashed_zero ゼロはスラッシュ入り]でなければならない&lt;br /&gt;
などで、これらが整っていないコンピュータでの作業能率は著しく低下する&amp;lt;ref name=&amp;quot;kink&amp;quot; /&amp;gt;。尤も、これらが発露したとて他人を傷つけることは無く、困るのは専ら己のみなので、今のところ矯める気はまったく無い。&lt;br /&gt;
&lt;br /&gt;
そんな一連の奇癖のなかに&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;電卓はRPNでなければならない&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
という、ある意味で致命的なものがある。&lt;br /&gt;
&lt;br /&gt;
なぜ致命的なのか。それは、ふつうの電卓が使えない体になってしまったにもかかわらず、世界の電卓市場でRPNは絶滅しかけており、こと日本においては2020年頃を境に正規品の新品が入手できなくなった希少種だからだ。どうしても、と言われれば、奇策を練り伝手を頼れば入手できるものの、往時より品質が劣る並行輸入品を現地価格の倍以上の高値で攫まされて悔悟するのが落ちだ。こういった現状が、同じ奇癖を持つ御同輩の殆どを「今使っているRPN電卓が壊れたときのために、状態が良い、往時の製品を蒐集する」という奇行に走らせる。管理人もその一人だ。&lt;br /&gt;
&lt;br /&gt;
「1,000円も出せば新品が買える電卓の『中古品』を買い漁って大丈夫か？」&lt;br /&gt;
&lt;br /&gt;
恐らく世間の大半の人には意味不明で理解不能な行動だろうが、[[HP製RPN電卓の特長#異常に堅牢な造作|「大丈夫だ、問題ない」と答えられる科学的な根拠]]が確かにあるのだから仕方無い。そして、こういう根拠を見つけ出し、言い訳にする行為そのものが、面白くも厄介なRPN電卓の沼に自ら進んで落ちた証であることを否定しない。趣味・嗜好とはそういうものだ。&lt;br /&gt;
&lt;br /&gt;
ここでは、管理人が所有・常用しているRPN電卓について、1968年〜2001年に旧[https://en.wikipedia.org/wiki/Hewlett-Packard Hewlett-Packard Company]が自社で企画・開発・製造・販売した機種&amp;lt;ref name=&amp;quot;after&amp;quot; /&amp;gt;を主として、個人的に調査・確認した事項を概括している。本文には宇宙開発に関わる記述が頻出するが、これは、管理人が宇宙工学([https://en.wikipedia.org/wiki/Kalman_filter カルマンフィルタ]による[https://en.wikipedia.org/wiki/List_of_orbits 人工衛星の軌道決定])を専攻していたことから強い思い入れがあるのと、電卓やコンピュータを含む計算機工学と宇宙開発が切っても切れない関係にあり、特にHP製RPN電卓はアメリカの宇宙開発の歴史に冒頭から登場しているからである。&lt;br /&gt;
&lt;br /&gt;
=目次=&lt;br /&gt;
#[[RPN電卓/序説|序説]]&lt;br /&gt;
#[[RPN電卓/歴史と現在|歴史と現在]]&lt;br /&gt;
#[[HP製RPN電卓の特長]]&lt;br /&gt;
#[[Nut/Saturnプロセッサファミリ]]&lt;br /&gt;
#[[所有するRPN電卓本体]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;販売期間&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-35]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1972年2月1日〜1975年11月30日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-45/HP-46]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1973年3月1日〜1976年1月15日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-65]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1974年1月19日〜1977年1月3日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-55]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1975年1月1日〜1977年1月3日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[National Semiconductor 4510]]  - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1975年2月??日〜1977年??月??日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-25]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1975年8月1日〜1978年5月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##*[[HP-25E]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;[[HP-25]]のチップセットを修理・アップグレードする同人キット 2015年1月25日〜現在&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-91]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1976年3月1日〜1979年1月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-67/HP-97]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1976年7月1日〜1982年1月11日/1984年12月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[OMRON 12SR]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;立石電機株式会社(現・オムロン株式会社)の輸出専用機種 1976年??月??日〜不明&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-10]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;HPで唯一の加算器方式 1977年7月1日〜1979年3月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-34C]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1979年7月1日〜1983年4月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-12C]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1981年9月1日〜現在&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-10C/HP-11C/HP-15C]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1982年9月2日/1981年9月1日/1982年7月1日〜1984年3月1日/1989年1月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-16C]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1982年7月1日〜1989年1月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-41CX]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1983年10月1日〜1990年11月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##*[[HP-41CL]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;HP-41シリーズのチップセットをアップグレードする同人キット 2010年1月14日〜現在&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[Электроника МК-52]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1983年??月??日〜1992年??月??日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[Электроника МК-61]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1983年??月??日〜1994年??月??日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-28S]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1988年1月4日〜1992年4月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-42S]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1988年10月31日〜1995年5月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-48SX]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1990年3月16日〜1993年6月1日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-48GX]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;1993年6月1日〜2003年5月30日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-50g]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;2006年7月??日〜2015年??月??日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[HP-35s]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;2007年7月12日〜2021年??月??日&amp;lt;/span&amp;gt;&lt;br /&gt;
##[[WP 34S]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;‎[https://en.wikipedia.org/wiki/HP_20b HP-20b]または[https://en.wikipedia.org/wiki/HP_30b HP-30b]を[[HP-16C]]と[[HP-42S]]を合体させたRPN関数電卓に化かすためのオープンソースソフトウェア 2011年6月29日〜現在&amp;lt;/span&amp;gt;&lt;br /&gt;
#:Extra. [[Casio CASIO-MINI CM-605]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;かの有名な[https://ja.wikipedia.org/wiki/カシオミニ カシオミニ]シリーズの6代目モデル 1974年4月??日〜1974年11月??日&amp;lt;/span&amp;gt;&lt;br /&gt;
#:Extra. [[Casio fx-10]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;日本初のポケット関数電卓 1974年5月??日〜1975年??月??日&amp;lt;/span&amp;gt;&lt;br /&gt;
#:Extra. [[Casio fx-7000GA]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;管理人が中学3年で初めて購入した中置記法のグラフィックプログラム関数電卓 1990年??月??日〜1991年??月??日&amp;lt;/span&amp;gt;&lt;br /&gt;
#:Extra. [[HP PrintCalc 100]] - &amp;lt;span style=&amp;quot;font-size:0.7em; font-style:italic&amp;quot;&amp;gt;再参入後に発売した活字ドラム式プリンタ付きの中置記法の四則演算電卓 2008年11月13日〜不明(だが終売済)&amp;lt;/span&amp;gt;&lt;br /&gt;
#[[所有するRPN電卓周辺機器]]&lt;br /&gt;
##[[HP-41CX]]/[[HP-42S]]/[[HP-48SX]]/[[HP-48GX]]/[[HP-50g]]向け&lt;br /&gt;
###[[HP 82240A/HP 82240B]]&lt;br /&gt;
##[[HP-25]]/[[HP-25E]]向け&lt;br /&gt;
###[[HP 82028A]]&lt;br /&gt;
##[[HP-65]]向け&lt;br /&gt;
###[[HP 00065-67001]]&lt;br /&gt;
###[[HP 00065-67002]]&lt;br /&gt;
###[[HP 00065-67005]]&lt;br /&gt;
###[[HP 00065-67007]]&lt;br /&gt;
###[[HP 00065-67044]]&lt;br /&gt;
##[[HP-67/HP-97]]向け&lt;br /&gt;
###[[HP 00097-90021]]&lt;br /&gt;
###[[HP 00097-90031]]&lt;br /&gt;
###[[HP 00097-90057]]&lt;br /&gt;
###[[HP 00097-90084]]&lt;br /&gt;
##[[HP-41CX]]向け&lt;br /&gt;
###[[Handy Compact&amp;amp;trade;]]&lt;br /&gt;
###[[HP 00041-14001]]&lt;br /&gt;
###[[HP 00041-14003]]&lt;br /&gt;
###[[HP 00041-15006]]&lt;br /&gt;
###[[HP 5061-7285]]&lt;br /&gt;
###[[HP 5061-7287]]&lt;br /&gt;
###[[HP 82104A]]&lt;br /&gt;
###[[HP 82120A]]&lt;br /&gt;
###[[HP 82143A]]&lt;br /&gt;
###[[HP 82153A]]&lt;br /&gt;
###[[HP 82181A]]&lt;br /&gt;
###[[HP 82182A]]&lt;br /&gt;
###[[HP 82242A]]&lt;br /&gt;
###[[Port-X-Tender]]&lt;br /&gt;
###[[PPC ROM]]&lt;br /&gt;
###[[ZENROM]]&lt;br /&gt;
##[[Электроника МК-52]]向け&lt;br /&gt;
###[[БРП-3]]&lt;br /&gt;
###[[БРП-4]]&lt;br /&gt;
##[[HP-48SX]]/[[HP-48GX]]向け&lt;br /&gt;
###[[EE・Pro&amp;amp;trade;]]&lt;br /&gt;
###[[Electrical Engineering Application Pac]]&lt;br /&gt;
###[[Electrical Engineering Reference Pac]]&lt;br /&gt;
###[[HP 82210A]]&lt;br /&gt;
###[[HP 82211A]]&lt;br /&gt;
###[[HP 82215A]]&lt;br /&gt;
###[[Math・Pro&amp;amp;trade;]]&lt;br /&gt;
###[[Mathematics Pac]]&lt;br /&gt;
###[[TDS 512K GX RAM CARD]]&lt;br /&gt;
#[[所有する電卓に関する書籍]]&lt;br /&gt;
##[[丸善 対数表 七桁]]&lt;br /&gt;
##[[フィスター ディジタル計算機の論理設計]]&lt;br /&gt;
##[[電卓技術教科書〈基礎編〉]]&lt;br /&gt;
##[[電卓技術教科書〈研究編〉]]&lt;br /&gt;
##[[Algorithms for RPN calculators]]&lt;br /&gt;
##[[ポケット電卓による計算解析 −HP 25による−]]&lt;br /&gt;
##[[Extend your HP-41]]&lt;br /&gt;
##[[HP-41 Extended Functions Made Easy]]&lt;br /&gt;
##[[HP-41 Synthetic Programming Made Easy]]&lt;br /&gt;
##[[Inside the HP-41]]&lt;br /&gt;
##[[WP 34S Owner&#039;s Manual and Calculation Guide]]&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pc&amp;quot;&amp;gt;管理人が高校へ進学する直前のタイミングだが、管理人以外でも、小・中学校からの友人や、高校でできた友人や知人も、押し並べて同じタイミングでPCを購入していた。この当時、東京から凡そ100km離れた地方都市で、公立の、いわゆる進学校と呼ばれる高校に通っていた生徒の結構な数が、同じ希望を抱いていたことに驚くと同時に、それを許可した親が結構居たことも興味深い。「私立に較べて学費が安く済む公立に合格したから」というのが最大の理由だろうが、[https://ja.wikipedia.org/wiki/バブル時代 バブル時代]の恩恵を受け地方にも出現し始めた複数のPCショップが毎週のように出稿した新聞折込広告の威力も相俟って、日を追う毎に価格が下落していたことも影響したと思う。ただ、この対象を同級生にまで広げると、PCを持ってないほうが圧倒的だったので、単に類が友を呼んだだけかもしれない。管理人がこのタイミングでPCを購入できた経緯は[[Casio_fx-7000GA#cite_note-pc-5|ここ]]で記した。&amp;lt;br&amp;gt;なお、厳密には、小学校4年で[https://ja.wikipedia.org/wiki/ファミリーコンピュータ ファミコン]を、小学校5年で発売と同時に[https://ja.wikipedia.org/wiki/ファミリーコンピュータ_ディスクシステム ディスクシステム]を、それぞれ買ってもらったものの、ユーザの任意に使用できるコンピュータではないため除外した。その意味では、もし、やはり当時猛烈に欲しかったものの友人・知人含め誰一人買ってもらえなかった、ファミコン上で任意のゲームプログラムが自作できる[https://ja.wikipedia.org/wiki/ファミリーベーシック ファミリーベーシック]を買ってもらえていたら、これを「初めて所有したコンピュータ」としただろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;mode&amp;quot;&amp;gt;[https://www.gnu.org/software/emacs/ GNU Emacs]には[https://www.gnu.org/software/emacs/manual/html_mono/calc.html 電卓(Calc)モード]が実装されており、{{keypress|Meta}}&amp;amp;nbsp;{{keypress|X}}&amp;amp;nbsp;{{keypress|C}}&amp;amp;nbsp;{{keypress|A}}&amp;amp;nbsp;{{keypress|L}}&amp;amp;nbsp;{{keypress|C}}&amp;amp;nbsp;{{keypress|Enter}}&amp;amp;nbsp;で呼び出せるが、このモードでのデフォルトはRPNだ。なぜなら、開発者が、実装した機能や関数を[[HP-28S]]を含むHP-28シリーズや[[HP-48SX]]と[[HP-48GX]]を含むHP-48シリーズを参考にしたからで、Calcモードのマニュアル冒頭でもその旨を[https://www.gnu.org/software/emacs/manual/html_mono/calc.html#What-is-Calc 宣言している]。それほどまでにRPNはこの業界に浸透している。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;kink&amp;quot;&amp;gt;当然、{{keypress|Ctrl}}&amp;amp;nbsp;が左下隅のキーボードや[https://en.wikipedia.org/wiki/Vi_(text_editor) vi]や[https://www.vim.org/ vim]も使えるし、[https://en.wikipedia.org/wiki/Google_Japanese_Input mozc]でも日本語は入力できるし、スラッシュが無いゼロも判読できるが、作業途中での休憩時間とタバコの本数は倍増する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;after&amp;quot;&amp;gt;HPは2001年末に電卓事業から撤退後、2003年に再参入したが、管理人は再参入後に発売された機種(本サイトでは[[HP-50g]]と[[HP-35s]]が該当する)には興味を唆られず、よって、これらについては詳細な調査や追跡をしていない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-41CX&amp;diff=6820</id>
		<title>HP-41CX</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-41CX&amp;diff=6820"/>
		<updated>2025-11-23T12:59:03Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1983年10月1日〜1990年11月1日に販売された上級プログラム関数電卓で、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の最終形態。コードネームは[https://en.wikipedia.org/wiki/Honeynut_squash Honeynut (南瓜の一種)]。単体では222関数を実装したプログラム関数電卓だが、その中身は「個人が所有できる高精度な数値演算専用コンピュータ」の嚆矢である。&lt;br /&gt;
__TOC__&lt;br /&gt;
===関数電卓とパーソナルコンピュータの狭間===&lt;br /&gt;
[[HP-34C]]でも記述したが、有り体に言えばHPは[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の購入者に富裕層と法人を想定しており、主たる用途も単体での使用はもとより周辺機器やオプションソフトウェアと組合せてユーザが求める演算システムを容易に構築できることに重きを置いた。〝パーソナルコンピュータ〟という概念がようやく形になり始めたものの、当然ながら非常に高価で、おいそれと手が出るものではなかったという時代背景を考えれば当然の開発方針である。&lt;br /&gt;
&lt;br /&gt;
このような用途に応じさせるには、ハードウェアには十分な拡張性を、ソフトウェア(プログラミング機能)には汎用性を、それぞれ持たせる必要がある。その答えとして1979年7月1日に定価295ドル(約65,000円)で発売したのが、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の初代である[http://www.hp-collection.org/calculators/41c.html HP-41C]だ。型名の末尾に付けられたCの意味は[[HP-25#cite_note-25c-5|HP-25の脚注]]と同じで、単体では128関数を内蔵した上級プログラム関数電卓だが、同時に発売した[[HP-34C]]とは大きく異なり、非常に挑戦的な製品として仕上がった。&lt;br /&gt;
&lt;br /&gt;
# HP製電卓で初めて液晶ディスプレイを採用した&amp;lt;ref name=&amp;quot;lcd&amp;quot; /&amp;gt;が、表示形式は、数字だけが表示できる[https://en.wikipedia.org/wiki/Seven-segment_display 7セグメント方式]ではなく、アルファベットと記号も表示できる&amp;lt;ref name=&amp;quot;segment&amp;quot; /&amp;gt;ようHPが独自開発した[https://en.wikipedia.org/wiki/Fourteen-segment_display 14セグメント方式]とした&amp;lt;br&amp;gt;これにより消費電流が激減し、HP製可搬型電卓では初めて、バッテリとして市販の乾電池が使用できるようになった&amp;lt;br&amp;gt;[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]はアルカリ単5形×4本で駆動する&amp;lt;ref name=&amp;quot;sideeffect&amp;quot; /&amp;gt;&lt;br /&gt;
# プログラミング方式を、これまでの制約が多い「内蔵関数キーを実行する順番に押下して覚えさせる」ものから、汎用性の高い「プログラミング言語により命令文で記述する」ものに変更すべく、本体型名の〝41〟を冠した専用プログラミング言語[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) &#039;&#039;&#039;FOCAL&#039;&#039;&#039;(&#039;&#039;&#039;F&#039;&#039;&#039;orty-&#039;&#039;&#039;O&#039;&#039;&#039;ne &#039;&#039;&#039;CA&#039;&#039;&#039;lculator &#039;&#039;&#039;L&#039;&#039;&#039;anguage)]を内蔵した&lt;br /&gt;
# [https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]のプログラムはアルファベットとアラビア数字と記号で構成される文字列で命令文を記述するため、単体でアルファベットを入力できるようにした&amp;lt;br&amp;gt;これに伴い、物理キーの有無を問わず、すべての内蔵関数をコマンドでも入力できるようにしたため、シフトキーは&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\color{Dandelion}\blacksquare&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;1段のみに削減した&amp;lt;br&amp;gt;例えば開平(square root)は、置数後に、物理キー&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{x}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下しても&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {XEQ}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {ALPHA}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {S}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {Q}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {R}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {T}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {ALPHA}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とコマンドで入力しても、まったく同じ開平の演算処理を実行、同じ結果を出力する&lt;br /&gt;
# 本体上部に4口の拡張スロットを設け、RAMの増量/周辺機器/オプションソフトウェアの装着を可能とした&lt;br /&gt;
&lt;br /&gt;
これらの特長はHPをして本機のマニュアル冒頭で&#039;&#039;&#039;&#039;&#039;personal computing systems&#039;&#039;&#039;&#039;&#039;と宣言&amp;lt;ref name=&amp;quot;manual&amp;quot; /&amp;gt;させるほどエポックメイキングな製品志向ではあるが、これが市場で受け容れられるとは必ずしも考えておらず、まずは単体のRPN関数電卓で使用してもらうことでコマンドやプログラミング方法を覚えてもらい、気に入ってくれたならオプションソフトウェアや周辺機器を徐々に購入してもらう…このような慎重な販売戦略で売り出した。関数電卓でありながら拡張スロットを備え各種オプションを装着できるアーキテクチャを採用するに至ったのは、1976年11月に世界で初めて[https://en.wikipedia.org/wiki/ROM_cartridge ロムカセット]形式の家庭用テレビゲーム機である[https://en.wikipedia.org/wiki/Fairchild_Channel_F フェアチャイルド・チャンネルF]が発売され、翌1977年には北米で[https://en.wikipedia.org/wiki/Atari_2600 Atari 2600]が売れまくっていたことで一般市民にも受け容れられると判断したのかもしれないが、その確証は無い&amp;lt;ref name=&amp;quot;rom&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
しかし、この販売戦略は大当たりする。&lt;br /&gt;
&lt;br /&gt;
先述の通り、現在のように一般人が比較的安価にパーソナルコンピュータを購入するどころか触れることすらできなかった当時、[[HP-35]]から連綿と続くHPのRPN関数電卓が精確な演算結果を出力するのは既に知られていたため、単体の関数電卓としての実力はもちろん、別ページで説明する[[HP_82143A|感熱紙プリンタ]]や[[HP_82104A|磁気カードリーダライタ]]、[[HP_82153A|バーコードリーダ]]などの充実した周辺機器、[[HP_5061-7287|数学・統計]]や[[HP_00041-14003|金融・財務]]、[[HP_00041-15006|回路網解析]]など専門分野に特化した数値演算をユーザがプログラムを組むことなく実行するためのオプションソフトウェアであるアプリケーションパックを同時に販売したことから、これらを組み合わせて〝精確な数値演算を入出力・実行するシステム〟が容易に構成できるため爆発的に売れたのだ。それまでのヒット機種である[[HP-67/HP-97]]でユーザが作成したプログラムや別売のソフトウェアも[[HP_82104A|磁気カードリーダライタ]]で読み込め実行できる&amp;lt;ref name=&amp;quot;compatibility&amp;quot; /&amp;gt;ことも拡販に寄与した。その結果、HPが事前に想定した購入者層からは大幅に外れ、販売店に月賦を申し込んでまで購入する個人が後を絶たない状況となった。&lt;br /&gt;
&lt;br /&gt;
これら一連の動きは、半導体の集積度と性能が上がり価格が下がったことで、科学者やエンジニアが「高精度な数値演算専用コンピュータを個人で所有」するようになった始まりと捉えられる。それまで、大学や研究所が購入したホストコンピュータに利用料金を払って[https://en.wikipedia.org/wiki/Time-sharing タイムシェアリング]するしかなかったところ、半導体技術の進歩により「高精度な数値演算専用コンピュータを個人で所有」できる時代が到来、好きな時間に好きなだけ利用料金を払わず演算できるのだから、多少の月賦も我慢しようというものだ。この視点で現代から俯瞰すると、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]は「関数電卓とパーソナルコンピュータの狭間」に位置付けられよう。&lt;br /&gt;
&lt;br /&gt;
===改良とユーザの拡大===&lt;br /&gt;
[http://www.hp-collection.org/calculators/41c.html HP-41C]が一躍大ヒットモデルとなったことで、開発・製造元であるHPはもちろん、サードパーティやユーザコミュニティからも様々なアプリケーションパックが発売され始めたが、その使い込まれ方もHPの事前の想定を遥かに超えていく。[http://www.hp-collection.org/calculators/41c.html HP-41C]のヘヴィユーザから「内蔵メモリが63レジスタ(441バイト)&amp;lt;ref name=&amp;quot;resistor&amp;quot; /&amp;gt;と少な過ぎる。ちょっと込み入ったプログラムを書くには、4口の拡張スロット全てに内蔵メモリ拡張モジュール(HP 82106A)を装着せざるを得ず、周辺機器が使えなくなる」というクレームを多数受ける事態となったのだ。HP 82106Aは1個で64レジスタ(448バイト)拡張でき定価45ドル(約9,900円)だが、さすがのHPも、定価295ドルの関数電卓のメモリを最大容量の319レジスタ(2,233バイト)まで拡張すべく180ドル(約39,600円)も追加で投資するユーザが大量に現れるとは考えもしなかったようだ。ちなみに[[HP_82143A|感熱紙プリンタ]]は定価350ドル(約77,000円)、[[HP_82104A|磁気カードリーダライタ]]は定価195ドル(約42,900円)だが、いずれも販売数は堅調に推移していく。&lt;br /&gt;
&lt;br /&gt;
嬉しい悲鳴と共に想定の斜め上なクレームを受けたHPは、[http://www.hp-collection.org/calculators/41c.html HP-41C]発売から僅か1年半後の1980年12月15日、内蔵メモリを予め最大容量の319レジスタまで拡張した二代目である[http://www.hp-collection.org/calculators/41cv.html HP-41CV]を定価325ドル(約73,500円)で発売することを決断する。型名に追加した末尾のVはローマ数字の5で、内蔵メモリが5倍になったことを示す。[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のチップセットとして採用している[[Nut/Saturnプロセッサファミリ|Nut]]アーキテクチャは内蔵メモリの上限が319レジスタなので「追加で30ドルお支払いいただければ予め内蔵メモリを上限まで積みますから、4口ある拡張スロットをHP 82106Aで埋めずに済みますよ」というのが[http://www.hp-collection.org/calculators/41cv.html HP-41CV]の製品コンセプトだが、これも相変らず売れることになる。特に有名なのは、「内蔵メモリを上限まで使い切るほど大規模なプログラムを書いても、すべての拡張スロットが空いている」ことがポイントとなり、アメリカ空軍が装備品として制式採用、空中給油機[https://en.wikipedia.org/wiki/Boeing_KC-135_Stratotanker KC-135]の[https://en.wikipedia.org/wiki/Center_of_gravity_of_an_aircraft W&amp;amp;B(ウエイト・アンド・バランス)]を演算&amp;lt;ref name=&amp;quot;w&amp;amp;b&amp;quot; /&amp;gt;するための専用アプリケーションパック&amp;quot;KC-135 W&amp;amp;B1&amp;quot;および&amp;quot;KC-135 W&amp;amp;B2&amp;quot;を作成・運用していたり、アメリカ航空宇宙局(NASA)が宇宙往還輸送船[https://en.wikipedia.org/wiki/Space_Shuttle スペースシャトル]に装備品として[https://history.nasa.gov/computers/Ch4-6.html 採用]し、宇宙空間を飛行中に必要な軌道決定や様々な演算、果ては乗組員の目覚まし時計として使われるまでに至った&amp;lt;ref name=&amp;quot;nasa&amp;quot; /&amp;gt;ことだろう。スペースシャトルの11回目の飛行計画である[https://en.wikipedia.org/wiki/STS-41-C STS-41-C]でミッションスペシャリストとして搭乗した宇宙飛行士の[https://en.wikipedia.org/wiki/Terry_Hart Terry Hart]は、スペースシャトルの飛行計画で使用する[http://www.hp-collection.org/calculators/41cv.html HP-41CV]のプログラミングを担当していた&amp;lt;ref name=&amp;quot;th&amp;quot; /&amp;gt;。これら漏れ聞こえてくる様々な使用実績が、[http://www.hp-collection.org/calculators/41cv.html HP-41CV]の販売台数を更に押し上げた。&lt;br /&gt;
&lt;br /&gt;
なお、HPは、[http://www.hp-collection.org/calculators/41cv.html HP-41CV]発売と同時に、先述のHP 82106Aを30ドル(約6,780円)まで値下げ、HP 82106Aの4倍である256レジスタ(1,792バイト)を1モジュールにしたQuad Memoryモジュール・HP 82170Aを95ドル(約21,500円)で発売し拡張スロットを3口空けられるようにするよう、それまでの[http://www.hp-collection.org/calculators/41c.html HP-41C]ユーザへ便宜を図ると共に、[http://www.hp-collection.org/calculators/41c.html HP-41C]の定価は295ドルから250ドル(約56,500円)に、HP純正アプリケーションパックはそれまで定価75ドル(約17,000円)だったものは45ドル(約10,200円)に、45ドルだったものは30ドルに、それぞれ一斉に値下げを断行した。半導体技術の進歩と量産効果によるコスト低減もあろうが、ユーザの拡大(と囲い込み)の意味合いが強い施策である。&lt;br /&gt;
&lt;br /&gt;
が、[http://www.hp-collection.org/calculators/41cv.html HP-41CV]を発売したとて、内蔵メモリを使い切ってしまうユーザが減らないことに変わりは無かった。これほどまでに売れた理由は、[http://www.hp-collection.org/calculators/41c.html HP-41C]の登場によりパーソナルユースであっても比較的大規模な数値演算を必要とする場面がそこここに出来上がったこと、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が乾電池で駆動し&amp;lt;ref name=&amp;quot;battery&amp;quot; /&amp;gt;可搬である&amp;lt;ref name=&amp;quot;pokecon&amp;quot; /&amp;gt;こと、当時はまだパーソナルコンピュータが一般人が気軽に買えるような価格ではなかったことが大きい。〝世界初〟を謳うラップトップパーソナルコンピュータは[https://en.wikipedia.org/wiki/Toshiba_T1100  Toshiba T1100]とされているが、これが発売されたのは[http://www.hp-collection.org/calculators/41cv.html HP-41CV]発売から約5年半後の1985年4月で、価格も1,900ドル(約478,800円)と高価であり、費用対性能比で関数電卓が勝っていたからだ。&lt;br /&gt;
&lt;br /&gt;
さりとて、[[Nut/Saturnプロセッサファミリ|Nut]]アーキテクチャでは内蔵メモリをこれ以上増設できない…思案したHPは、[http://www.hp-collection.org/calculators/41c.html HP-41C]と[http://www.hp-collection.org/calculators/41cv.html HP-41CV]では[[HP 82181A]]を別途購入・装着しないと使用できなかった拡張メモリ(補助記憶機構)を124レジスタ(868バイト)内蔵することにした。拡張メモリはファイルストレージとして機能し、ユーザが組んだプログラムをファイルとして保存できる。これにより拡張メモリを最大124 + 238 + 238 = 600レジスタ(4,200バイト)まで増設可能とした。更に、これだけでは芸がないと思ったのか、これまた[http://www.hp-collection.org/calculators/41c.html HP-41C]と[http://www.hp-collection.org/calculators/41cv.html HP-41CV]ではアプリケーションパックとして別途購入・装着しないと使用できなかった拡張メモリを操作する機能([https://archived.hpcalc.org/greendyk/hp41c-extended/5.html HP 82180A])や時計・タイマ機能([[HP 82182A]])など94関数も追加で内蔵することとし、単体で222関数を実装したRPN関数電卓へアップグレードすることにした。これが[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の三代目となる本機である。1983年10月1日、定価を[http://www.hp-collection.org/calculators/41cv.html HP-41CV]と同じ325ドル(約75,700円)に据え置いて発売した。型名に追加した末尾のXはeXtensions(拡張)を示す。このアップグレードは[http://www.hp-collection.org/calculators/41cv.html HP-41CV]発売以降の約3年間に進化した半導体技術が1チップあたりの集積度を向上させたために実現したもので、定価を据え置くことができたのも半導体技術の進化と同時に進行していた価格下落の賜物である。これもまた爆発的に売れ、7年1ヶ月もの長期間、HPのRPN関数電卓のトップモデルとしてラインナップされ続けることになる&amp;lt;ref name=&amp;quot;memory&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
===ユーザコミュニティと合成的プログラミング===&lt;br /&gt;
[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]について触れる際に絶対外せないのが「ユーザコミュニティによる合成的プログラミングの創出」である。&lt;br /&gt;
&lt;br /&gt;
[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP-9100A]から始まったHPの関数電卓は、出自がホストコンピュータであること、出力される演算結果が精確であること、プログラミングが可能であることから、早くからそこここにファンクラブ然としたユーザコミュニティが形成された。その活動内容は、所属するメンバ同士によるRPN関数電卓の使用法に関する情報交換や電卓自体への[https://en.wikipedia.org/wiki/Hacker_culture ハッキング]でほぼ統一されており、このような動きは他社の関数電卓ではあまり見られないものだ。開発・製造元であるHPも、市場に投入した製品に対する率直な意見を広範囲に拾い上げることができ、その後の製品戦略で参考になることから、この動きを拒否することはなく黙認していた。&lt;br /&gt;
&lt;br /&gt;
[[HP-65]]で触れたPPC(Personal Programming Center)は、1974年6月にアメリカ・カリフォルニア州サンタアナを本拠として設立されたHP製RPN関数電卓ユーザコミュニティの大手で、その活動は[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が発売されていたこの頃にピークを迎えていた。このPPCが、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が内蔵している[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]のプログラムソースコードを作成・編集するエディタ機能で「OSだけが使用するメモリ空間」を読み書きできるバグを発見したのは、[http://www.hp-collection.org/calculators/41c.html HP-41C]発売直後である。その後、これを故意に踏み抜き、「OSだけが使用するメモリ空間」に保持している値(内蔵ソフトウェアROMからロードした演算命令のバイナリコード)を書き換えると、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のマニュアルで公開されている関数より遥かに高機能な演算やプログラミングが可能なことも明らかとなった。&lt;br /&gt;
&lt;br /&gt;
あたかも[https://en.wikipedia.org/wiki/Test_tube 試験管]や[https://en.wikipedia.org/wiki/Laboratory_flask フラスコ]の中で複数の[https://en.wikipedia.org/wiki/Reagent 試薬]を混ぜて自然界には存在しない[https://en.wikipedia.org/wiki/Chemical_compound 化合物]を[https://en.wikipedia.org/wiki/Chemical_synthesis 合成]するかのように、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のメモリの中でメモリが保持している値を書き換えて内蔵ソフトウェアROMには存在しない演算命令を合成する様から&#039;&#039;&#039;合成的プログラミング (Synthetic Programming)&#039;&#039;&#039;と命名された&amp;lt;ref name=&amp;quot;synthetic&amp;quot; /&amp;gt;この一連の手順とプログラム技法は、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のヘヴィユーザを中心に急速に広まっていく。しかも、製造・開発元であるHPはその実行を禁止せず、ユーザの自己責任とした。「AYOR (At Your Own Risk) であれば、どうぞご勝手に。その代わり、これを実行した結果どうなろうと、我々に文句を言わないでね」と見逃したのだ。&lt;br /&gt;
&lt;br /&gt;
この様子と経緯を見たPPCは、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]ユーザが誰でも気軽に合成的プログラミングを実行できるよう122個の[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]ルーチンを作成し取り纏めた&#039;&#039;&#039;[[PPC ROM]]&#039;&#039;&#039;の有償頒布を開始した。同人ソフトウェアなのでHPによるサポートなど一切無いが、頒布以降、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のヘヴィユーザにとって必要不可欠なアプリケーションパックとして流布する。詳細は[[PPC ROM]]を参照されたい。&lt;br /&gt;
&lt;br /&gt;
===HP製RPN関数電卓史上2番目のロングセラー===&lt;br /&gt;
こうして、HPのRPN関数電卓の歴史でも特筆すべき一大勢力を築くことになった[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]は、初代である[http://www.hp-collection.org/calculators/41c.html HP-41C]の販売が終了する1985年1月1日までは三世代が同時に、初代の販売終了後は1990年1月1日まで二世代が同時にラインナップされ、最終的には本機が1990年11月1日で販売終了する11年5ヶ月に渡り販売され続けた。この記録は、1981年9月1日から現在まで販売され続けている[[HP-12C]]に次ぐ第2位で、同時発売だったものの1983年4月1日で販売終了となった[[HP-34C]]と較べるのも馬鹿らしくなるほどのロングセラーかつベストセラーである。そしてこの[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の成功は、その後に開発・販売されるHP製RPN関数電卓に多大な影響を与えることになる。&lt;br /&gt;
&lt;br /&gt;
ここまでロングセラーとなるとユーザの裾野も広大となるからか、販売終了から30年以上経った現在でも人気が高く、どこかの国の軍組織で使われていたと思われる放出品&amp;lt;ref name=&amp;quot;surplus&amp;quot; /&amp;gt;が大量に出品されることが間々あるなど、eBayをはじめとする中古市場やオークションサイトにも比較的大量に流通しており、入手性は良い。流通量としては[http://www.hp-collection.org/calculators/41cv.html HP-41CV]が最も多く、次に本機、最後に[http://www.hp-collection.org/calculators/41c.html HP-41C]となるが、その差は僅かだ。その中でも新品に近いものは高値で取引され&amp;lt;ref name=&amp;quot;auction&amp;quot; /&amp;gt;、非常に活発な[http://www.hp41.org ユーザコミュニティ]も健在である。&lt;br /&gt;
&lt;br /&gt;
まったくの余談だが、管理人は[[PPC ROM]]を装着した本機が「地球上で最強の関数電卓」だと考えており、管理人の手が届く範囲内には必ずこの組合せが置いてある。現在では[[HP 82104A]]や[[HP 82143A]]を装着した10セットほどがあちこちに転がっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7}507225.705\ \; (\varepsilon\!_R=1.33\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 42.99999997&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||約400kHz (Halfnut 1LF5-0003)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||アルカリ単5形×4本 または [[HP 82120A]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1983年〜1990年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||シンガポール&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1983年発売時の定価||325ドル (約75,700円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lcd&amp;quot;&amp;gt;世界で初めて液晶ディスプレイを採用した電卓は、1973年6月発売のシャープ製ポケット電卓[https://jp.sharp/products/lcd/tech/dentaku/story.html EL-805]である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;manual&amp;quot;&amp;gt;[http://www.hp-collection.org/calculators/41c.html HP-41C]と[http://www.hp-collection.org/calculators/41cv.html HP-41CV]では&#039;&#039;The HC-41C and HP-41CV calculators represent a totally new concept in the design of Hewlett-Packard calculators. In fact, because of their advanced capabilities, these calculators can even be called&#039;&#039; &#039;&#039;&#039;&#039;&#039;personal computing systems.&#039;&#039;&#039;&#039;&#039; とまで言い切っているが、本機では&#039;&#039;The HP-41CX is an advanced model of the HP-41 family of compact,&#039;&#039; &#039;&#039;&#039;&#039;&#039;handheld computers.&#039;&#039;&#039;&#039;&#039; と若干控え目な表現に書き換えられた。これは、本機の発売が1983年で、その頃には一部でパソコンが普及したからであろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rom&amp;quot;&amp;gt;机上設置型では1971年発売の[https://www.hpmuseum.org/hp9810.htm HP-9810A]が、本機を含む[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と同様に3口のROMスロットを備えていた。またこれとは別に周辺機器と接続するためのI/Oスロットを4口備えていた。これらの特長から「[https://www.hpmuseum.org/hp9810.htm HP-9810A]を可搬型にし、価格を抑え、パーソナルユースに堪えるようにしたのが、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]である」と、[https://www.hpmuseum.org/hp9810.htm HP-9810A]と[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の類似性は頻繁に指摘される。この8年間で起きた半導体の技術の進歩と価格の低減がそうさせたとも言えよう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;segment&amp;quot;&amp;gt;例えば、演算結果が桁溢れ(算術オーバーフロー:本機では&amp;lt;math&amp;gt;\mbox{OF}_{[1]}&amp;gt;9.999999999\times10^{99}&amp;lt;/math&amp;gt;)を起こした場合、7セグメント方式など数字しか表示できない機種では&amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt;などと表示するが、本機では&amp;lt;code&amp;gt;OUT OF RANGE&amp;lt;/code&amp;gt;と正確な理由を表示する。[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]でプログラミングする際もプログラム名やメッセージをアルファベットの文字列が設定できる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;sideeffect&amp;quot;&amp;gt;Owner&#039;s Manual Vol.2には、本機の消費電流が「通常使用時で5〜20mA、電源ON後に何も入力しない時で0.5〜2.0mA、電源OFF時は0.01〜0.05mA」であると記載されている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;resistor&amp;quot;&amp;gt;1レジスタ(7バイト)に「最長」7行のプログラムを格納できる。[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]は演算命令が可変長なので、このような記載となる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;compatibility&amp;quot;&amp;gt;後方互換性のみサポート。よって、前方互換性である「[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]で作成・保存した磁気カードは[[HP-67/HP-97]]で読み込んで実行する」ことは&#039;&#039;&#039;できない&#039;&#039;&#039;。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;w&amp;amp;b&amp;quot;&amp;gt;機体の大小にかかわらず、飛行機では燃料・貨客を含む総重量(ウェイト)とその重心の位置が非常に重要で、その機体にとっての平衡(バランス)状態を保てなければ安全な飛行も離着陸もできない。特に[https://en.wikipedia.org/wiki/Boeing_KC-135_Stratotanker KC-135]は空中給油機なので、離陸時は満載で88.452トンまで積載する「僚機への給油用のジェット燃料」が飛行中に急速に減るため、機体の重心も飛行中に大幅に移動する。よって、平衡状態を保つよう操縦し安全に着陸するには、「僚機への給油用のジェット燃料」の残量から、機体の重心がどこにあるかを常時演算し把握する必要がある。これは、民間航空機で乗客に対し「離着陸時は着席しシートベルトを着用せよ」と厳命している理由と同じで、離着陸時は機体が[https://en.wikipedia.org/wiki/Aircraft_principal_axes#Transverse_axis_(pitch) ピッチ(前後)方向]に傾くため危険というのもあるが、乗客に機内を歩かれると機体の重心が移動するため離着陸の操縦が著しく困難になるという理由も大きい。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;nasa&amp;quot;&amp;gt;このときNASAはHPに、納品する[http://www.hp-collection.org/calculators/41cv.html HP-41CV]に対して2点の改造を特注した。「クォーツ時計/タイマー/アラーム機能の実装」と「ACアダプタ差込口と拡張スロットの溶接による閉塞」である。HPはこれらに応え、前者は記録的な速さで[[HP 82182A]]を開発することで実現、後者は[http://www.hp-collection.org/calculators/41cv.html HP-41CV]への静電気の出入りを防止する施策のため念入りに行われた。これら[https://airandspace.si.edu/collection-objects/calculator-hand-held-hp-41/nasm_A19890003000 改造済のHP-41CV]を受領したNASAは、更に独自に、[https://hpinspace.wordpress.com/2013/08/26/nasa-hp-41cv-donated-to-ladd-observatory-at-brown-university/ 取り外し可能な特注キーパッド・オーバーレイを追加、背面のゴム足は取り払い、使われていない表面という表面にベルクロ(所謂マジックテープ)を貼り付けた]。搭乗した宇宙飛行士は各個人用に支給された[http://www.hp-collection.org/calculators/41cv.html HP-41CV]を宇宙服のどこかに貼り付けて活動し、それ以外の[https://images.nasa.gov/details-s07-14-629 2台がオービタの計器盤に備え付けられた]。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;th&amp;quot;&amp;gt;スペースシャトルの初飛行6ヶ月前である1981年2月、[https://en.wikipedia.org/wiki/Terry_Hart Terry Hart]はNASAから「宇宙飛行士にとって最高の電卓を見つけよ」と依頼され、当時の市販品の最上位機種である[https://en.wikipedia.org/wiki/TI-59_/_TI-58 TI-59]と[http://www.hp-collection.org/calculators/41cv.html HP-41CV]を比較検討、「英数字が表示できる」ことが決め手となって[http://www.hp-collection.org/calculators/41cv.html HP-41CV]を採用した。その後Hartは[http://www.hp-collection.org/calculators/41cv.html HP-41CV]がNASAの要求以上のスペックであることに気づき、「軌道離脱プログラム」「燃料消費に連動して移動する[https://en.wikipedia.org/wiki/Space_Shuttle_orbiter オービタ]の重心を演算するプログラム(通称&amp;quot;CG&amp;quot;)」「[https://en.wikipedia.org/wiki/Space_Shuttle_orbiter オービタ]の地球上での軌跡を演算し観測対象の地表の点を特定するプログラム(通称&amp;quot;Landtrack&amp;quot;)」などを組んだ。最も使用されたプログラムは「Acquisition of Signal(通称&amp;quot;AOS&amp;quot;)」で、ミッション中は連続実行された。[https://en.wikipedia.org/wiki/Space_Shuttle_orbiter オービタ]と管制官の直接通信は13ヶ所ある地球局のいずれかの上空を通過する10分間しか行えず、[https://en.wikipedia.org/wiki/Space_Shuttle_orbiter オービタ]地球局の真上を通過しない場合はさらに短くなるが、AOSは地球局上空を通過し始める時にビープ音を鳴らし、信号喪失(Loss of Signal: LOS)までの残り時間を表示するものであった。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;battery&amp;quot;&amp;gt;なにより「市販の乾電池」で動くことが決定的である。それまでの機種のように専用充電池を購入せずに済むのでランニングコストの削減に繋がる。液晶ディスプレイを採用したからこそだ。なお、[http://www.hp-collection.org/calculators/41c.html HP-41C]附属マニュアルでは「9〜12ヶ月持つ」と記載しているが、これはHP製電卓で初の液晶ディスプレイを採用したことを強調するためのものと考えられる。1年半後に発売された[http://www.hp-collection.org/calculators/41cv.html HP-41CV]の附属マニュアルでは、早くもこのような記載は無くなった。本機附属マニュアルでも寿命については記載されてないが、長寿命であることに変わりはない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;pokecon&amp;quot;&amp;gt;ほぼ同時期である1980年の日本では、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と似たコンセプトで、主に工業高校生や高専・大学生向けに開発された独自の製品文化である[https://ja.wikipedia.org/wiki/ポケットコンピュータ ポケットコンピュータ(ポケコン)]が発売されたため、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の日本国内での実売台数は海外ほど伸びていないと想像される。そしてHPでも、事実上のポケコンとして、1982年に[https://www.hpmuseum.org/hp75.htm HP-75C]を、1984年に[https://www.hpmuseum.org/hp75.htm HP-75D]と[https://www.hpmuseum.org/hp71.htm HP-71B]を、日本の後追いで開発・販売したものの、これら2モデル3機種が「日本国内で売れた」という話は寡聞にして知らない。ちなみに[https://www.hpmuseum.org/hp71.htm HP-71B]はHPが初めて&#039;&#039;&#039;&#039;&#039;Portable Computer&#039;&#039;&#039;&#039;&#039;を謳った製品で、その後、日本でも爆発的なブームとなり一部では[https://ja.wikipedia.org/wiki/Morphy_One 悲劇]も産んだ、[https://en.wikipedia.org/wiki/MS-DOS MS-DOS]で動く[https://en.wikipedia.org/wiki/HP_200LX HP-200LX/HP-100LX/HP-95LX]や、[https://en.wikipedia.org/wiki/Windows_Embedded_Compact Windows CE]で動く[https://en.wikipedia.org/wiki/Jornada_(PDA) Jornadaシリーズ]に続くこととなる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;synthetic&amp;quot;&amp;gt;これは計算機工学でいう[https://en.wikipedia.org/wiki/Program_synthesis &#039;&#039;&#039;プログラム合成 (Program synthesis)&#039;&#039;&#039;]とは意味も動作もまったく異なる&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;surplus&amp;quot;&amp;gt;出品者の国籍からするとアメリカかイスラエルの軍組織のようだ。これらの放出品は本体前面のHPのロゴが無く、頑丈そうな特殊なケースに納められているので一瞥して判る。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;memory&amp;quot;&amp;gt;言い換えると、「[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]プログラム用に319 + 600 = 919レジスタ(6,433バイト)まで内蔵することで、ようやく、当時のヘヴィユーザの需要を満たせた」ことになる。それほど大規模なプログラムを組んでいたのだろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;auction&amp;quot;&amp;gt;いわゆるMIB(Mint In Box:元箱入り未使用品)であれば1,000ドルを下ることはなく、状態の良い中古の完動品であれば[[HP-48SX]]や[[HP-48GX]]より100ドル以上高値で取引される。拡張性や周辺機器の豊富さが取引価格を押し上げているようだ。もっとも、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]で本体の不動品が出品されることはあまり無い。[[HP_82143A|感熱紙プリンタ]]や[[HP_82104A|磁気カードリーダライタ]]といった周辺機器は不動品でも出品されるが、これらの大半はDIYで修理可能だからだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=Debian%E3%81%A7Fcitx5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6SKK%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B&amp;diff=6816</id>
		<title>DebianでFcitx5を使用してSKKを設定する</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=Debian%E3%81%A7Fcitx5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6SKK%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B&amp;diff=6816"/>
		<updated>2025-06-22T02:43:52Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|Debian GNU/Linux Customize Tips|frame=1}}&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linuxを含む*NIX系OSで、日本語をはじめとする[https://en.wikipedia.org/wiki/Variable-width_encoding マルチバイト文字]を問題なく&#039;&#039;&#039;入力&#039;&#039;&#039;できる環境を構築するには、何を使いどう設定すべきか、というメモ。&lt;br /&gt;
&lt;br /&gt;
日本語圏でも該当者は非常に少ないだろうが、管理人には必須のハックなので、事象/原因/対策/経緯を下記に残す。&lt;br /&gt;
&lt;br /&gt;
==【事象】Webブラウザでだけ日本語が入力できない==&lt;br /&gt;
&lt;br /&gt;
管理人は、「[[RPN電卓/序説|RPN以外の電卓が使えない]]」のと同様に「[https://ja.wikipedia.org/wiki/SKK SKK]以外の日本語入力が使えない」&amp;lt;ref name=&amp;quot;windows1&amp;quot; /&amp;gt;という不治の病に冒されている。恐らく死ぬまで治らないし、治すつもりも一切ない、極めて平和的だが厄介な宿痾だ。&lt;br /&gt;
&lt;br /&gt;
ある時、下記の条件をすべて満たすと、一部のアプリケーションソフト(特にWebブラウザは種類問わず)で日本語が入力できない事象に遭遇した。&lt;br /&gt;
&lt;br /&gt;
*[https://www.debian.org/releases/stable/ Debian 12 (bookworm)]をフレッシュインストールするとき、&lt;br /&gt;
*デスクトップ環境に[https://en.wikipedia.org/wiki/KDE_Plasma_5 KDE Plasma 5]を選択し、&lt;br /&gt;
*[https://en.wikipedia.org/wiki/List_of_input_methods_for_Unix_platforms インプットメソッド]フレームワークに[https://en.wikipedia.org/wiki/Uim uim]/[https://en.wikipedia.org/wiki/System_for_Cross-domain_Identity_Management SCIM]/[https://en.wikipedia.org/wiki/Intelligent_Input_Bus IBus]のいずれかを使用して[https://ja.wikipedia.org/wiki/SKK SKK]を設定する。&lt;br /&gt;
&lt;br /&gt;
管理人がDebianでデスクトップ環境を新規に構築する流れ作業の1つで、今まで引っ掛かったことすら無かったのだが、今回はなぜかWebブラウザでだけSKKをONにできず日本語が入力できない。試しにDebianを丸ごと再インストールすること3回、やはり同じ事象が発生し続けた。インターネットに接続して運用することが当たり前となった現代のLinuxホストで、使用頻度が最も高いアプリケーションソフトであるWebブラウザでだけ日本語が入力できない(＝検索できない)のは致命的&amp;lt;ref name=&amp;quot;w3m&amp;quot; /&amp;gt;だ。&lt;br /&gt;
&lt;br /&gt;
==【原因】通信プロトコルとアプリケーションフレームワーク==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
「世に数多あるLinuxディストリビューションでソフトウェア品質に最も厳格なDebianで必ず発生するということは、SKKの設定云々ではなく、根本的な原因が別にあるはずだ」&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバにしろクラインアトPCにしろ、それらにインストールするOSを自由の選択できるとき、管理人はかれこれ20年以上、Debian GNU/Linuxだけを採用し続けている。その理由は先述の通り『世に数多あるLinuxディストリビューションでソフトウェア品質に最も厳格』だからで、それが証拠に、通常運用中にどれだけ過負荷になろうともサーバやPCがフリーズまたはストールした経験は1度も無く、[https://en.wikipedia.org/wiki/APT_(software) apt]コマンド一発で永遠にメジャーアップグレードし続けることが可能だからだ。ここまで堅実かつ堅牢で、日常の運用がストレスフリーなOSは他に無い。Windowsなんぞとは比較すること自体が失礼だ。管理人はDebianに全幅の信頼を寄せている。&lt;br /&gt;
&lt;br /&gt;
そんなDebianで必ず発生するということは、Debianが提供しているソフトウェアの問題ではなく、他に決定的な原因が別個に有るはず。それを把握しないことには対策を打てない&amp;amp;#x2E3A;そう踏んだのだ。&lt;br /&gt;
&lt;br /&gt;
週末の土日を丸々潰して調べ倒したところ、2つの原因が抽出できた。&lt;br /&gt;
&lt;br /&gt;
*1つは、*NIX系OSのデスクトップ環境特有の実装である&#039;&#039;&#039;ディスプレイサーバとクライアント間の通信プロトコルの差&#039;&#039;&#039;だ。&amp;lt;br&amp;gt;KDE Plasma 5では、ディスプレイサーバとクライアント間の通信プロトコルに[https://en.wikipedia.org/wiki/X_Window_System X Window System (X11)]だけではなく[https://en.wikipedia.org/wiki/Wayland_(protocol) Wayland]を採用している。管理人が20年以上お世話になっていた&#039;&#039;&#039;uimをはじめSCIMもIBusもX11だけをサポートしWaylandは未サポート&#039;&#039;&#039;で、&#039;&#039;&#039;今後もWaylandをサポートする予定が無い&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;support&amp;quot; /&amp;gt;とも聞く。故に、uim/SCIM/IBusを使用している限りはX11のみで日本語の文字コードを送信することになり、Waylandを使用できない。&lt;br /&gt;
&lt;br /&gt;
*もう1つは、&#039;&#039;&#039;アプリケーションフレームワークの差&#039;&#039;&#039;だ。&amp;lt;br&amp;gt;KDE Plasma 5は[https://en.wikipedia.org/wiki/Qt_(software) Qt]をベースに構築している。それが理由なのか詳細は不明だが、KDE Plasma 5のディスプレイサーバがクライアントに日本語の文字コードを送信する際、そのクライアントがQtをベースに構築したアプリケーションソフトの場合はX11でもWaylandでも正常に完了するものの、&#039;&#039;&#039;[https://en.wikipedia.org/wiki/GTK GTK]をベースに構築したアプリケーションソフトの場合、Waylandでは正常に完了するが、X11では正常に送信できず異常終了&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;gnome&amp;quot; /&amp;gt;する。&lt;br /&gt;
&lt;br /&gt;
この2つが重なると、冒頭に記した条件をすべて満たしたときにこの事象が発生することが理解でき、かつ、この事象がWebブラウザでだけ発生するのも納得できる。[https://en.wikipedia.org/wiki/Firefox Firefox]にしろ[https://en.wikipedia.org/wiki/Microsoft_Edge Microsoft Edge for Linux]にしろ[https://en.wikipedia.org/wiki/Vivaldi_(web_browser) Vivaldi]にしろ、現行の各種WebブラウザはGTKをベースに構築されているからだ。管理人が常用するWebブラウザ以外のアプリケーションソフトでは、GTKで構築されている[https://en.wikipedia.org/wiki/EasyTag EasyTag]でも同じ事象が発生し、日本語を入力するだけで自身ばかりかKDEをも巻き込んでハングアップしてしまうが、KDEのデフォルトのファイラである[https://en.wikipedia.org/wiki/Dolphin_(file_manager) Dolphin]や[https://en.wikipedia.org/wiki/Konqueror Konqueror]はQtで構築されているため事象が発生しない。&lt;br /&gt;
&lt;br /&gt;
これら直接確認できた一連の挙動と2つの原因を擦り合わせても、見事に辻褄が合う。原因はこの2つで確定だ。&lt;br /&gt;
&lt;br /&gt;
==【対策】Fcitx5へ乗り換える==&lt;br /&gt;
&lt;br /&gt;
即ち、クライアント-ディスプレイサーバ間の通信プロトコルとして&#039;&#039;&#039;X11とWaylandの両方をサポート&#039;&#039;&#039;し、アプリケーションフレームワークも&#039;&#039;&#039;GTKとQtの両方に対応&#039;&#039;&#039;したインプットメソッドフレームワークを使用すれば、この事象は発生しない&amp;amp;#x2E3A;これが原因から導き出される対策となる。&lt;br /&gt;
&lt;br /&gt;
2024年時点でこの条件を満たし正常に機能するインプットメソッドフレームワークは&#039;&#039;&#039;[https://en.wikipedia.org/wiki/Fcitx Fcitx5]のみ&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;part&amp;quot; /&amp;gt;だ。ソースコードも現在進行形でメンテナンスされており、バグフィックスもある程度は期待できる。これを期にuimからFcitxへ乗り換える以外にあるまい。&lt;br /&gt;
&lt;br /&gt;
現在のFcitxは[ˈfaɪtɪks]と発音する&amp;lt;ref name=&amp;quot;voice&amp;quot; /&amp;gt;と[https://fcitx-im.org/wiki/History#Name_story_of_Fcitx 決められている]が、かつては&#039;&#039;&#039;F&#039;&#039;&#039;ree &#039;&#039;&#039;C&#039;&#039;&#039;hinese &#039;&#039;&#039;I&#039;&#039;&#039;nput &#039;&#039;&#039;T&#039;&#039;&#039;ool of &#039;&#039;&#039;X&#039;&#039;&#039;の略であったことから解るように、当初はX11で中国語を入力するためのインプットメソッドフレームワークとして開発されたものだ。その汎用性の高さから、現在では中国語以外のアジア圏のマルチバイト文字入力で使われるようになり、Debianの公式debパッケージには中国語の他に日本語/朝鮮語/タイ語/ベトナム語がある。管理人は日本語と英語しか解せず、それ以外の言語には不案内だが、中国語/日本語以外の言語でも公式にdebパッケージとなっていることから、これらも正常に機能していると判断している。&lt;br /&gt;
&lt;br /&gt;
下記がFcitx5を使用してSKKを使うための設定手順である。これを実行すれば、ベースにしているアプリケーションフレームワークがQtだろうとGTKだろうと、すべてのアプリケーションソフトでSKKによる日本語入力が問題なく可能となる。&lt;br /&gt;
&lt;br /&gt;
なお、下記の手順は、管理人の趣味・嗜好により、LinuxディストリビューションはDebian、デスクトップ環境はKDEを選択した場合に適用できる。もし英語キーボードを使用している場合は、項番5の&amp;lt;code&amp;gt;キーボード - 日本語&amp;lt;/code&amp;gt;を該当するもの(例えば&amp;lt;code&amp;gt;キーボード - 英語 (US)&amp;lt;/code&amp;gt;など)に差し替える必要がある。SKK以外のインプットメソッドエンジンを使用する場合は、項番1の&amp;lt;code&amp;gt;fcitx5-skk&amp;lt;/code&amp;gt;を、[https://ja.wikipedia.org/wiki/Google_日本語入力#Mozc mozc]であれば&amp;lt;code&amp;gt;fcitx5-mozc&amp;lt;/code&amp;gt;に、[https://en.wikipedia.org/wiki/Anthy Anthy]であれば&amp;lt;code&amp;gt;fcitx5-anthy&amp;lt;/code&amp;gt;に、項番6の&amp;lt;code&amp;gt;SKK&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;mozc&amp;lt;/code&amp;gt;または&amp;lt;code&amp;gt;Anthy&amp;lt;/code&amp;gt;に、ぞれぞれ差し替えれば良い。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;kde-config-fcitx5&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;fcitx5&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;fcitx5-skk&amp;lt;/code&amp;gt;をインストール後、デフォルトでインストールされている&amp;lt;code&amp;gt;uim&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;uim-mozc&amp;lt;/code&amp;gt;をアンインストールする。&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;# apt install --install-recommends fcitx5 fcitx5-skk kde-config-fcitx5&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;# apt remove --purge uim uim-mozc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
# ユーザディレクトリの&amp;lt;code&amp;gt;~/.config/environment.d&amp;lt;/code&amp;gt;に、下記の3行だけを保存した&amp;lt;code&amp;gt;im.conf&amp;lt;/code&amp;gt;を置く。&amp;lt;blockquote&amp;gt;XMODIFIERS=@im=fcitx&amp;lt;br&amp;gt;GTK_IM_MODULE=fcitx&amp;lt;br&amp;gt;QT_IM_MODULE=fcitx&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# ユーザディレクトリの直下に、下記の3行だけを保存した&amp;lt;code&amp;gt;.xsessionrc&amp;lt;/code&amp;gt;を置く。&amp;lt;blockquote&amp;gt;XMODIFIERS=@im=fcitx&amp;lt;br&amp;gt;GTK_IM_MODULE=fcitx&amp;lt;br&amp;gt;QT_IM_MODULE=fcitx&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
# OSごと再起動する&lt;br /&gt;
# タスクバー左側のアプリケーションランチャーから [設定] → [KDE システム設定] → [入力デバイス] → [仮想キーボード] と進み、&amp;lt;code&amp;gt;Fcitx 5&amp;lt;/code&amp;gt;を選択後、[適用(A)]を押下する。&lt;br /&gt;
# 同じく [KDE システム設定] → [地域と言語] → [入力メソッド] と進み、[入力メソッドオフ]に&amp;lt;code&amp;gt;キーボード - 日本語&amp;lt;/code&amp;gt;を新規に追加後それ以外すべて削除、[入力メソッドオン]に&amp;lt;code&amp;gt;SKK&amp;lt;/code&amp;gt;を新規に追加し、[適用(A)]を押下する。&lt;br /&gt;
# 再度OSごと再起動し、&amp;lt;code&amp;gt;Fcitx 5&amp;lt;/code&amp;gt;が自動で起動する(タスクバー右側にSKKのアイコンが表示される)ことを確認する。&lt;br /&gt;
## 表示されない(SKKで日本語が入力できない)場合は、OS起動時に&amp;lt;code&amp;gt;Fcitx 5&amp;lt;/code&amp;gt;が自動で起動しないことが原因なので、手動で追加する。&amp;lt;br&amp;gt;タスクバー左側のアプリケーションランチャーから [設定] → [KDE システム設定] → [起動と終了] → [自動起動] と進み、[+Add…] から [+Add application…] を選択、ポップアップメニューが表示されるので、[ユーティリティ] から&amp;lt;code&amp;gt;Fcitx 5&amp;lt;/code&amp;gt;を選択後に [OK] を押下して追加する。&amp;lt;br&amp;gt;追加完了後に再度OSごと再起動し、&amp;lt;code&amp;gt;Fcitx 5&amp;lt;/code&amp;gt;が自動で起動する(タスクバー右側にSKKのアイコンが表示される)ことを確認する。&lt;br /&gt;
## 表示された(SKKで日本語が入力できた)場合は、SKKの詳細を設定する。&amp;lt;br&amp;gt;設定変更後はそのSKKのアイコンを右クリック、ポップアップメニューから [設定の再読み込み] を選択して実行し、変更したSKKの設定を反映させる。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
上記の手順は、最初に&amp;lt;code&amp;gt;~/.config/environment.d/im.conf&amp;lt;/code&amp;gt;でWaylandの挙動を、次に&amp;lt;code&amp;gt;~/.xsessionrc&amp;lt;/code&amp;gt;でX11の挙動を、それぞれ、&amp;lt;code&amp;gt;XMODIFIERS&amp;lt;/code&amp;gt;パラメタでKDEが使用するインプットメソッドフレームワークをFcitx5に指定し、&amp;lt;code&amp;gt;GTK_IM_MODULE&amp;lt;/code&amp;gt;パラメタと&amp;lt;code&amp;gt;QT_IM_MODULE&amp;lt;/code&amp;gt;パラメタでクライアントのアプリケーションフレームワークがGTKだろうとQtだろうとインプットメソッドフレームワークはFcitx5だと宣言、仮想キーボードに&amp;lt;code&amp;gt;Fcitx 5&amp;lt;/code&amp;gt;に設定することでFcitx5を有効とし起動させ、&amp;lt;code&amp;gt;Fcitx 5&amp;lt;/code&amp;gt;が文字入力を受け付ける物理キーボードの種類とFcitx5用の日本語入力エンジン(この場合はSKKなので&amp;lt;code&amp;gt;fcitx5-skk&amp;lt;/code&amp;gt;)を設定する操作である。こうすることで、ユーザが物理キーボードから入力したマルチバイト文字は、使用した物理キーボードの種類とインプットメソッドエンジンを基に仮想キーボードである&amp;lt;code&amp;gt;Fcitx 5&amp;lt;/code&amp;gt;が適切に変換、ディスプレイサーバはWaylandでもX11でも仮想キーボードから渡されたマルチバイト文字をクライアント(各アプリケーションソフト)に正常に渡すことができ、入力が完了する&amp;amp;#x2E3A;このような実装になっている。&lt;br /&gt;
&lt;br /&gt;
言い換えると、アジア圏のユーザが所望する言語のFcitx5用インプットメソッドエンジンが既にラインナップされていれば、それらの中から適宜選択してインストールするだけで済み、もしラインナップされていなければ、その言語用のインプットメソッドエンジンを開発しさえすれば良い。「仮想キーボード」という概念を導入することで統一した設定画面と方法をユーザに提供できるため、従来のuim/SCIM/IBusと較べてスマートな実装だ。&lt;br /&gt;
&lt;br /&gt;
気を付けなければならないのは、入力メソッドをON/OFFするホットキーに、多数の言語キーボードで使用できる設定が予め入っていることだ。Debianでdebパッケージ化されインストールできる&amp;lt;code&amp;gt;kde-config-fcitx5&amp;lt;/code&amp;gt;には中国語の他に日本語/朝鮮語/ベトナム語のキーボードでも入力できるホットキーがデフォルトで設定されているが、これらは誤操作を頻発させる原因にしかならない。日本語キーボードで入力できるホットキーには {{keypress|全角/半角}} と {{keypress|Ctrl}} - {{keypress|SPACE}} の2つが設定されているものの、EmacsではピュアなSKKの実装であるddskkを常用する管理人のようなユーザにとって {{keypress|Ctrl}} - {{keypress|SPACE}} は比較的高頻度で使用するキーバインド(選択範囲の始点を指定する[https://www.gnu.org/software/emacs/manual/html_node/emacs/Setting-Mark.html Mark Set])なので、ここでも設定された状態は害悪でしかない。よって、不要な設定はすべて削除したほうが良いだろう。管理人はKDE上でSKKをON/OFFするホットキーを {{keypress|全角/半角}} だけとし、それ以外すべての設定を削除した。&lt;br /&gt;
&lt;br /&gt;
その他の詳細は下記の公式記事を参照すること。&lt;br /&gt;
&lt;br /&gt;
https://wiki.debian.org/ja/I18n/Fcitx5&amp;lt;br&amp;gt;https://fcitx-im.org/wiki/Setup_Fcitx_5&lt;br /&gt;
&lt;br /&gt;
==【経緯】なぜこの事象に遭遇し格闘する羽目に陥ったのか==&lt;br /&gt;
&lt;br /&gt;
ここから先は、このメモを残すことになった経緯である。&lt;br /&gt;
&lt;br /&gt;
発生した【事象】の【原因】が把握でき【対策】を打つことで事象が終息したなら、以降の【経緯】を読む必要はまったく無い。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;☆&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2024年06月に入った途端、そろそろ無停止連続運用12年目を迎えようとしていた常用のファンレスPC(OSはDebian GNU Linux w/KDE)から、今まで聴いたことがない「キュルキュル」という微かな音が鳴り始めた。マウスカーソルを動かしたり、キーボードを打鍵したりすると、その度に音量が若干大きくなる。ずーっと鳴り続けているため耳に付くのもいただけない。&lt;br /&gt;
&lt;br /&gt;
「はて。ファンレスPCなのに音が鳴るとは何事ぞ？」&lt;br /&gt;
&lt;br /&gt;
いろいろ調べると、どうやら&#039;&#039;&#039;[https://www.intel.co.jp/content/www/jp/ja/support/articles/000032539/processors/intel-core-processors.html コイル鳴き]&#039;&#039;&#039;のようだ。管理人は初めて聴く音なので判別できなかった。&lt;br /&gt;
&lt;br /&gt;
「う〜ん。噂には聞いていたが、まさかナマで『コイル鳴き』を聴くことになるとはな…」&lt;br /&gt;
&lt;br /&gt;
“[https://ja.wikipedia.org/wiki/ルパン三世_カリオストロの城 ルパン三世 カリオストロの城]”で偽札工場とゴート札を目の当たりにしたルパンからカリオストロ公国の秘密を教えられた銭形のとっつぁんと同じフォーマットの&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;台詞&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ひとりごと&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;を吐いた己に驚くと同時に呆れながら、M/Bの状態を確認すべく、PCの電源を落とした。&lt;br /&gt;
&lt;br /&gt;
ケースを開け、M/Bを眺めてみたものの、外見からは特に異常は見られなかったので、ケースを閉じ、再びPCの電源を入れたのだが&amp;amp;#x2E3A;M/Bは先ほどと同じ音で「キュルキュル」と鳴くのみで、[https://en.wikipedia.org/wiki/BIOS BIOS]が[https://en.wikipedia.org/wiki/Power-on_self-test Post]することは二度と無かった。既にM/Bは壊れており、PCは惰性で辛うじて動いていたのだ。&lt;br /&gt;
&lt;br /&gt;
「やっちまった…電源落とさなきゃ良かった！」&lt;br /&gt;
&lt;br /&gt;
いくら嘆いても後の祭りである。&lt;br /&gt;
&lt;br /&gt;
それにしても、可動部が多く先に壊れそうなHDDが、この約12年間で1度も[https://en.wikipedia.org/wiki/Self-Monitoring,_Analysis_and_Reporting_Technology S.M.A.R.T.]エラーを吐かず稼動し続けたことに感動した。その間にDebianは squeeze → wheezy → jessie → stretch → buster → bullseye → bookworm と7世代もメジャーアップデートがあり、その都度[https://en.wikipedia.org/wiki/APT_(software) apt]コマンドでアップデートし続けた「Debianの権化」のような中身だが、先に壊れたのがM/Bとは…いよいよIntel Core 3rd Generationな[https://en.wikipedia.org/wiki/Ivy_Bridge_(microarchitecture) Ivy Bridge]ともお別れである。管理人の日常の使用法ではIvy Bridgeに16GBのRAMで何の不満もなく、OSがDebianだからこそ、約12年もの長寿を全うできたのだろう。ハードウェアを陳腐化させることにやたら熱心なうえにユーザには自由度をまったく与えないWindowsをOSとして使い続けていたら、ハードウェアは壊れていないにもかかわらず、疾うの昔に強制的に買い替えさせられていたはずだ。管理人はPC用OSとしてのWindows&amp;lt;ref name=&amp;quot;win&amp;quot; /&amp;gt;とはXP Service Pack 2で決別している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;☆&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
先ほどからPCがファンレスであることを強調しているが、これは管理人宅では「24時間365日いつでも使えるよう、PCは起動しっ放し」だからだ。2001年02月、社会人になって最初に住んだアパートの住所一帯がUSENブロードネットワークス(当時)が世界で初めて商用で開始した「光ファイバによるコンシューマ向けインターネット接続サービス」の[https://usen.com/cms_data/newsrelease/pdf/2001/20010214_8.pdf サービスエリア]になったため、それまでの[https://ja.wikipedia.org/wiki/ISDN ISDN]ダイヤルアップバルクチャネル接続(128kbps)から一足飛びに光ファイバ常時接続(100Mbps)へ移行した際に身に付いた悪癖である。現代ではその役割は専らスマートフォンだが、2001年早春の時点で一般ユーザがインターネットを使用する端末はPCしか無く、当時はデスクトップPCのOSとしてWindows XPしか選択肢が無かった&amp;lt;ref name=&amp;quot;windows2&amp;quot; /&amp;gt;うえに起動にも停止にも時間が掛かる代物だったので、それがじれったく思え、前段のルータでファイアウォールを噛まし、PC自体は24時間365日起動しっ放しにしたのだ。&lt;br /&gt;
&lt;br /&gt;
ファンレスを選択する理由は「多少なりとも部屋の中の雑音を減らしたい」「モータ等の可動部品を無くしてPCを1日でも延命したい」「消費電力を削減したい」の3つ。いずれも、管理人の用途ではPCがハイスペックである必要が無く、ファンレスで排熱できる程度のスペックで十分だからこそ設定できる項目だ。尤も、ファンレスPCなどというものが影も形も無かった頃から、排熱ファンがウヮンウヮン唸るPCですら構わず起動しっ放しだった。2001年当時は[https://en.wikipedia.org/wiki/Supermicro Supermicro]社のM/Bに[https://en.wikipedia.org/wiki/Xeon#NetBurst-based_Xeon Intel Xeon MP]をDual CPUで組んだ自作PCを使用しており排熱ファンも爆音だったが、ファンの風切り音程度では睡眠を妨げられない、得な性分であることも幸いした。&lt;br /&gt;
&lt;br /&gt;
そんな2002〜2003年頃、自作PC界隈で降って湧いたように「水冷PC」なるものが話題になり始めた。PCを静音化するため、小型モータが音高らかに&amp;lt;ref name=&amp;quot;fan&amp;quot; /&amp;gt;回転させるファンをCPUに密着させて強制空冷する方式ではなく、ラジエータに満たした純水をCPUに密着させた排熱用アダプタとの間でポンプで循環させることで純水に熱を逃して冷却する方式を指すが、そのあまりの怪しさ炸裂っぷりとシステムの大掛りっぷりに、管理人は手を出さなかった。高校からの友人は物珍しさから飛びついたものの、直径15cm高さ120cmぐらいある巨大なラジエータの置き場所に困ったり、排熱用アダプタ(正しくは「水冷ブロック」というらしい)の造作が甘く隙間から水漏れしたり、純水を通すホースから水漏れしたり、純水を循環させるポンプの駆動音が割と五月蝿いうえに頻繁に壊れたりと、個人では如何ともし難いトラブルの連続に心が折れ、早々に放棄して強制空冷に戻してしまった。現在は冷媒に純水だけではなく非電導性の油も使われるため「液冷PC」と呼ばれ、パーツの精度もそれなりに上がっているのだろうが、当時の水冷パーツはコンシューマ向けにすら熟れておらず、品質が悪かったのだ。&lt;br /&gt;
&lt;br /&gt;
結局、メンテナンスフリーで運用可能なコンシューマ向きの静音化は、CPUに密着させる[https://en.wikipedia.org/wiki/Heat_sink 放熱器(ヒートシンク)]とPCケースを一体化させて[https://en.wikipedia.org/wiki/Fin_(extended_surface) フィン]の伝熱面積を稼ぐことで放熱性能を上げて自然空冷させる方式しか残らなかった。これが「ファンレスPC」である。2005〜2006年頃に実用となるファンレスPCが出現したことで、管理人のPCの選択基準は「Linuxが動くこと」&amp;lt;ref name=&amp;quot;linux&amp;quot; /&amp;gt;とともに「ファンレスであること」を絶対条件とした。ハードウェアとしてのPCを、使用するOSを理由にした強制的な買い替え圧力から守れるのと同時に、常に高速回転し続けることから比較的短時間で故障しやすいモータを無くすことで長寿命化が期待できるからだ。&lt;br /&gt;
&lt;br /&gt;
そして今回、この考えが概ね正しかったと証明できたと思う。メンテナンスフリー期間の実績値の一例が「約12年」で確定したからだ。その間はハードウェアとしてのPCに何の手も加えずに済んでおり、したがって、財布から出て行く金銭と家から出て行く産業廃棄物の量も、世間一般のPCユーザと較べて驚くほど少なく済んだことになる。今までもそうだが、これからもオープンソースソフトウェアコミュニティに足を向けて寝ることはできない。&lt;br /&gt;
&lt;br /&gt;
ちなみに、管理人が約12年間連続で無停止運用していたPCは、LinuxファンレスPC専業といっても過言ではない、イスラエルが拠点の[https://fit-iot.com/web/ fit-pc]が開発・製造し2012年06月に販売を開始した[https://www.fit-pc.com/web/products/intense-pc/intense-pc-overview/ Intense PC]である。RAMもHDDも購入者が装着するベアボーンが当時の為替レートで約7万円。もはや十分過ぎるほどモトは取っただろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;☆&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
話が逸れた。元に戻す。&lt;br /&gt;
&lt;br /&gt;
己のミスで、不意に、自由に使えるPCが突然消えてしまった。急ぎ、ファンレスPCを購入しなければならない。&lt;br /&gt;
&lt;br /&gt;
いつもなら先述のfit-pcから購入するのだが、いつもなら翌日発送で1週間程度で日本に到着するところ、前年からの[https://en.wikipedia.org/wiki/Israel-Hamas_war ハマスとの戦争]が原因なのか「納期は1ヶ月」だという。さすがに1ヶ月は待てないし、状況が状況なだけに、本当に1ヶ月で納品されるかも怪しい。&lt;br /&gt;
&lt;br /&gt;
15年振りに国内から購入することにした。ファンレスPCといえば秋葉原の[https://www.oliospec.com オリオスペック]だ。管理人は15年前にもここから購入している。調べると、Intel Core 14th Generationな[https://en.wikipedia.org/wiki/Raptor_Lake Raptor Lake Refresh]が納期1週間だという。CPUとRAMは最速かつ最大容量にアップグレードして発注した。昨今の傾向から内蔵ストレージにSSDしか選択できないのは仕方無いが、そもそも今まで運用していたHDDが壊れてないので、受領後にAYORでそれに換装すれば良い。もともと、日常使用するファイル群は自宅ネットワーク内にあるNASに放り込む運用なので、HDD内にロストして困るファイルは特に無く、Debianと若干の設定用ファイルぐらいしか入ってない。この換装で問題なく動いてくれれば万々歳だ。&lt;br /&gt;
&lt;br /&gt;
が、そうは問屋が卸さない。&lt;br /&gt;
&lt;br /&gt;
最近の自作PC事情に詳しい諸兄姉ならお判りだと思うが、現代の最新M/BのファームウェアはBIOSではなく[https://en.wikipedia.org/wiki/UEFI UEFI]である。BIOSは実装されたストレージに[https://en.wikipedia.org/wiki/Master_boot_record MBR]があれば、それを起動ディスクと見做して読み込み始め、それからOSを…と進むのだが、UEFIはストレージにEFIパーティションが無いと読み込みすらしない。しかし、管理人の手許にある12年モノの「Debianの権化」にはMBRしか無い。よって、起動できないのだ。&lt;br /&gt;
&lt;br /&gt;
「そう言やぁそうだった。CSMを有効にせねば」&lt;br /&gt;
&lt;br /&gt;
CSM(Compatibility Supported Module)はUEFIでもMBRを読み込ませるための救済策で、まさにこのような場面で使用するためにある。では早速…と、今回購入した[https://www.asrock.com/index.jp.asp ASRock]社の[https://www.asrock.com/mb/Intel/B760M-ITXD4%20WiFi/index.jp.asp M/B]でUEFIを把み、CSMをEnableに倒してみたが、驚きの内容をポップアップ後に拒否された。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CSM is disabled.&lt;br /&gt;
To enabled CSM, please install an external graphics card.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
なんと、CSMをEnableにするには、外付けのグラボが刺さってなければならない…。&lt;br /&gt;
&lt;br /&gt;
「なんだこの意味不明で理解不能な制限事項は？！」&lt;br /&gt;
&lt;br /&gt;
先述のfit-pcから過去に何度か購入しているファンレスPCのUEFIにこのような莫迦げた制限は無く任意にCSMをEnableに倒せる。よって、BIOSのPCに装着していたHDDをそのまま換装できており、最初は目を疑ったのだが、何度やっても拒否されるため、現実として受け容れるしかない。&lt;br /&gt;
&lt;br /&gt;
そして当然のことながら、外付けのグラボなんぞ買ってないし、買う気も無い。管理人の用途では不要なうえ、CPUより高熱を発するグラボを装着したPCがファンレスで運用できる訳がないからだ。事実、オリオスペックも「ビデオカード等、発熱の大きいカードは搭載できません」と警告している。&lt;br /&gt;
&lt;br /&gt;
というか、ASRock社は、何を理由にこんな制限を設けているのだろうか？&lt;br /&gt;
&lt;br /&gt;
どこかのサードベンダから「M/Bに『外付けグラボが刺さっている』と認識させるダミーの[https://en.wikipedia.org/wiki/PCI_Express PCIe]カード」が売っていれば嬉しいが、そんな都合が良いものは無い。PCを自作する理由が25年前と異なり、外付けグラボが刺さってない自作PCがマイノリティと化したご時世&amp;lt;ref name=&amp;quot;minority&amp;quot; /&amp;gt;だ、そんなものを作っても需要が無い。&lt;br /&gt;
&lt;br /&gt;
万事休す。ほぼ自作PCと変わらないBTOなPCで起きたトラブルはすべて自己責任、事前に調べ切れなかった己を呪うしかない。&lt;br /&gt;
&lt;br /&gt;
「仕方無い。フレッシュインストールだ」&lt;br /&gt;
&lt;br /&gt;
管理人はPC用ストレージとしてのSSDをまったく信用していない&amp;lt;ref name=&amp;quot;ssd&amp;quot; /&amp;gt;ので、これを期にHDDは新品に交換することにした。それは12年前に購入した予備品だ。今まで12年間壊れることなく運用できていたため出番が無く、開封されぬままデッドストックと化していた、12年物だが新品のHDDを現役復帰させ、今回購入した500GB SSDはジャンク箱にお引き取りいただいた。12年の長い眠りに就いていたところ突如叩き起こされたHDDは今、何事もなく元気に稼動している。さりとて、今回購入したファンレスPCにはRAMを最大容量である64GBも奢ったことから、HDDに切った1GBのswapパーティションにキャッシュを書き込む場面は皆無で、すべてRAMだけで賄えていることが確認できている。よって、OSやアプリケーションソフトの起動時を除く通常運用中に、このHDDが必死こいてデータを読み書きする場面はそう無いだろう。これからも末永く頑張ってもらえると考えている。&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#x2E3A;こうしてDebianをフレッシュインストールした後に発覚し、丸2日ほど悩みに悩んで調べ倒したのが、冒頭の「SKKによる日本語入力不可事象」である。&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;windows1&amp;quot;&amp;gt;会社から支給されるWindows PCには、MIT Licenseで公開されている[https://github.com/nathancorvussolis/corvusskk CorvusSKK]をインストールして有り難く使わせてもらっている。ホントはWindowsすら使いたくないのだが、「禄を食むには仕方ない」と諦めている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;support&amp;quot;&amp;gt;伝聞なので真偽は不明だが、「今からWaylandを実装するにはソースコードの大幅な書き換えが必須」なのに「メンテナが不在」らしい。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;gnome&amp;quot;&amp;gt;もうひとつの*NIX系OSのデスクトップ環境の雄である[https://en.wikipedia.org/wiki/GNOME GNOME]はGTKのみで実装されているため、この事象は発生しないかもしれないが、面倒なので確認していない。ただ、最近のGNOMEの実装ではX11ではなくWaylandを採用しているそうなので、同じ事象が発生しそうではある。人柱求む。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;part&amp;quot;&amp;gt;Wayland対応はまだ完全ではないらしい。[https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland Using Fcitx 5 on Wayland]には&#039;&#039;certain features of fcitx that works under X11 are not yet supported by Wayland. (X11で動作するfcitxの一部の機能はまだWaylandではサポートされていません。)&#039;&#039; とある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;w3m&amp;quot;&amp;gt;一応、管理人が常用しているEmacsには必ず、テキストベースWebブラウザである[https://w3m.sourceforge.net/index.ja.html w3m]を使えるよう仕込んではいるものの、GUIによる操作が大前提となってしまった現代のWebコンテンツを目の前に、使用できる場面はかなり限定される。あくまで非常用だ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;voice&amp;quot;&amp;gt;日本語では「ファイティクス」と発音する&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;fan&amp;quot;&amp;gt;プロペラ/スクリュー/ファンなど呼び名の違いはあれど、[https://en.wikipedia.org/wiki/Impeller 羽根車(インペラ)]を空気中で回転させるとき、回転口径をより小さく、回転数をより多くすると、羽根が空気を切る音の周波数が高くなるのと同時に音量が増す。この事象は物理学の問題なのでヘリコプター(回転翼機)でも換気扇でも扇風機でもドローンでも共通して発生し、PCの静音化を阻む最大の要因となる。CPUが高負荷となり高温になったことで排熱ファンが高回転すると、ノートPCから「キーン」という耳障りな音が五月蝿く鳴り響く理由はこれだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;windows2&amp;quot;&amp;gt;2001年当時、LinuxにしろFreeBSDにしろ、X Window Systemに対応しているグラフィックカードは「そんな古いの、秋葉原のジャンク屋でも売ってないぞ」と苦笑されるような骨董品のみに限られていた。ネットワークインタフェースカード(NIC)も[https://en.wikipedia.org/wiki/NE1000 NE2000]互換のPHYチップ以外はマトモに機能しない期間が長かった。外付けNICベンダがわざわざ「NE2000互換です」と強調し始めたのもこの頃だ。斯様な状況ゆえ、恐ろしいことに、当時のコンシューマ向けOSは事実上Windows一択だったのだ。「とりあえず試してみるか」と軽口が出る程度にはドライバが充実している現代のLinux情勢とは隔世の感がある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;linux&amp;quot;&amp;gt;2004年ならいざ知らず、2024年のLinux Kernelは大概のハードウェアを自動で認識してくれるので、「Linuxが動くこと」をそこまで重要視する必要は無くなりつつある。一応、購入前には[https://linux-hardware.org/ ヒトバシラーな情報]は確認するのだが。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;win&amp;quot;&amp;gt;Blu-rayドライブの制御と書き出しにはWindowsのライブラリが必要ことから、市販のBlu-ray付きHDDレコーダにはWindows Embedded Compactが必ず組込まれている。よって、Windowsを完全に排除できない。ちなみにBlu-ray付きHDDレコーダは、HDDの制御が[https://en.wikipedia.org/wiki/TRON_project TRON]で、装置全体の制御がLinuxで、それぞれ実装されており、内部では3種類のOSが動いていることになる。なんと無駄な実装だろうか。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;minority&amp;quot;&amp;gt;管理人が社会人なりたての25年前は「メーカの市販品より高性能で安価に収まる」からと秋葉原を歩き回ったのだが、CPU/メモリ/HDDといったパーツの性能が向上したことで一般ユーザのPCの用途を満たすには十分な性能のパーツが低価格となり、PCも市販品で問題なくなったのと同時に、PCの需要がデスクトップからラップトップ(ノートPC)に移ったことで自作が不可能となり、自作PC市場は急速にシュリンクした。その結果、ここ10年の自作PCは「高性能なグラボを載せて高精細な画像がぬるぬる動く&amp;lt;s&amp;gt;紙芝居を観る&amp;lt;/s&amp;gt;ゲームをやる」ための嗜好品へと変わり、自作PC＝外付けグラボ必須＝高価となってしまった。なにしろ現代のグラボはCPUと同じかそれ以上の価格なのだから当然だろう。こうして「高性能を安価に」という需要で勃興した自作PC市場は、当初と正反対な性格に変貌し、ますますシュリンクした。秋葉原の通称“自作通り”も往時の面影はほぼ無い。最近はノートPCですらハイエンドモデルにはグラボを載せて「ゲーミングノート」と名付けて売る時代だ、仕方あるまい。&amp;lt;br&amp;gt;以上から、現代の自作PCで外付けグラボが刺さってないのは相当なレアケースで、しかもそれをわざわざダミーで埋めるなどという需要が皆無であることが判る。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ssd&amp;quot;&amp;gt;やはり24時間365日通電しっ放しで運用しているが故に、数年置きにMicroSDカードが読み書き不能に陥る[[Raspberry Pi]]での事例を引き合いに出すまでもなく、その仕組み上、書き込み回数に制限があり、それを越えると突然使用不能になる[https://en.wikipedia.org/wiki/Flash_memory フラッシュメモリ]を使用しているSSDは、読み書きが頻繁に行われるPCのストレージとして不適だと断じている。HDDよりも著しく短命なのは火を見るよりも明らかだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=RPN%E9%9B%BB%E5%8D%93/%E5%BA%8F%E8%AA%AC&amp;diff=6815</id>
		<title>RPN電卓/序説</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=RPN%E9%9B%BB%E5%8D%93/%E5%BA%8F%E8%AA%AC&amp;diff=6815"/>
		<updated>2025-06-14T08:54:21Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1968年、[https://en.wikipedia.org/wiki/Hewlett-Packard Hewlett-Packard Company]から「部屋を占拠するミニコンピュータに勝るとも劣らない、机上に置ける計算機」として4,900ドルで発売された[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0021/0021history.html HP-9100A]が世界初のRPN電卓である。その4年後の1972年2月1日に395ドルで発売された&#039;&#039;&#039;[[HP-35]]は世界初の&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;可搬型&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ポケット&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;関数電卓&#039;&#039;&#039;でもあるが、これもRPN電卓である。この世に電子式卓上計算機＝電卓が出た当初は、電卓といえばRPN電卓だったのだ。&lt;br /&gt;
&lt;br /&gt;
しかし、それから55年経った2023年時点で新品が購入できるRPN電卓は、残念ながら、俗にいう金融電卓の[[HP-12C]]が1機種のみだ。こうなった経緯は[[RPN電卓/歴史と現在|歴史と現在]]から各機種の概説を順を追ってお読みいただくと解るかもしれない。&lt;br /&gt;
&lt;br /&gt;
ここでは、RPN電卓がふつうの電卓と著しく異なる点を記載する。外観を一瞥して判るのは、ふつうの電卓に必ずある&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーが無く、その代わりに一際大きな&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;キーが有ることで、そのため操作方法もふつうの電卓とは違う。&lt;br /&gt;
&lt;br /&gt;
なぜ違うのか。なぜこのような電卓が世に出て、そして、忘れ去られようとしているのか。&lt;br /&gt;
&lt;br /&gt;
以下では序説として「RPN電卓とは何なのか」を述べる。&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
==記法==&lt;br /&gt;
現在市販されている電卓では、演算させたい数値(&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;被演算子&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;オペランド&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;)と四則演算記号(&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;算術演算子&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;オペレータ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;)や関数を入力する順番が2種類ある。&#039;&#039;&#039;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;中&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ちゅう&amp;lt;/rt&amp;gt;&amp;lt;rb&amp;gt;置&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ち&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;記法&#039;&#039;&#039;と&#039;&#039;&#039;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;後&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;こう&amp;lt;/rt&amp;gt;&amp;lt;rb&amp;gt;置&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ち&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;記法&#039;&#039;&#039;だ。&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Infix_notation 中置記法(Infix Notation)]は、算術演算子を被演算子の間に置く。例えば「『5と7の和』と『8から3の差』の積」を中置記法で立式すると、5と7と8と3が被演算子、＋とーと×が算術演算子なので、&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;(5+7)\times(8-3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
となる。これは現代の初等数学教育で教授される西洋数学で使用する数式とまったく同じで、日本では文部科学省が告示している[https://www.mext.go.jp/a_menu/shotou/new-cs/index.htm 学習指導要領]では[https://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/03/18/1387017_004.pdf 加算・減算を小学1年(6〜7歳)、乗算を小学2年(7〜8歳)、除算を小学3年(8〜9歳)]、[https://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2019/03/18/1387018_004.pdf 算術演算子の優先順位を中学1年(12〜13歳)]で教授するよう規定しているが、その間、初等教育(小学校) → 前期中等教育(中学校) → 後期中等教育(高等学校)&amp;lt;ref name=&amp;quot;logics&amp;quot; /&amp;gt;と一貫して数式の記法は中置記法のみなので、否が応でも馴染んでいる。一般的には数式＝中置記法と断言して良かろう。ふつうの電卓とは、中置記法の電卓を指す。&lt;br /&gt;
&lt;br /&gt;
対して後置記法(Postfix Notation)は、算術演算子を被演算子の後ろに置く。先ほどの「『5と7の和』と『8から3の差』の積」を後置記法で立式すると&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;5 \quad 7 \quad + \quad 8 \quad 3 \quad - \quad \times&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
となる。先ほどの中置記法と見比べると、同じ演算内容を示しているにもかかわらず、演算子の優先順位を示す&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;括&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;かっ&amp;lt;rt&amp;gt;&amp;lt;rb&amp;gt;弧&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;こ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;が排除されていることが判る。&#039;&#039;&#039;後置記法は、数式から括弧を排除し、数式の解釈(演算順位)を明確化する&#039;&#039;&#039;ために考案されたからだ。また、副次的な利点として、後置記法の数式を左から順に日本語でそのまま読むだけで和訳(文章題に変換)できる。この例であれば「『5と7を足したもの』と『8から3を引いたもの』を掛ける」即ち「『5と7の和』と『8から3の差』の積」となる。この利点は日本語の文法から来るものだが、その意味では後置記法は日本人と親和性が高い(かもしれない。少なくとも管理人には親和性が高い)。&lt;br /&gt;
&lt;br /&gt;
後置記法は一般に&#039;&#039;&#039;[https://en.wikipedia.org/wiki/Reverse_Polish_notation 逆ポーランド記法:Reverse Polish Notation]&#039;&#039;&#039;と呼ばれているため、入力の順番に後置記法を採用している電卓は世界的に&#039;&#039;&#039;RPN電卓&#039;&#039;&#039;と呼ばれる。&lt;br /&gt;
&lt;br /&gt;
なお、後置記法とは対義関係になる&#039;&#039;&#039;[https://en.wikipedia.org/wiki/Polish_notation &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;前&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ぜん&amp;lt;/rt&amp;gt;&amp;lt;rb&amp;gt;置&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ち&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;記法(ポーランド記法:Polish Notation)]&#039;&#039;&#039;も存在するが、これが電卓に採用された例は寡聞にして知らない。その理由は、前置記法を電卓の演算ロジック(ソフトウェア)に落とし込んでみると、中置記法や後置記法より動作が複雑で無駄が多くユーザにも不便だと判るからだろう。これは最後に考察する。念のため先ほどの「『5と7の和』と『8から3の差』の積」を前置記法で立式すると&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;\times \quad + \quad 5 \quad 7 \quad - \quad 8 \quad 3&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
となり、被演算子と算術演算子の位置が後置記法の対照となる。&lt;br /&gt;
&lt;br /&gt;
前置記法をポーランド記法、後置記法を逆ポーランド記法と別称する理由は、ポーランドの論理学者[https://en.wikipedia.org/wiki/Jan_%C5%81ukasiewicz &amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Jan&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ヤン&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;&amp;amp;nbsp;&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;&amp;amp;#xFF65;&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;Łukasiewicz&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ウカシェヴィチ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;]が、先に前置記法を、後で後置記法を考案したからだ。時系列としては、算術演算子と被演算子を分離し、算術演算子を前に、被演算子を後ろに記述することで、二項演算で括弧を排除しつつ一意に表記できるとŁukasiewiczが[https://philpapers.org/rec/POGRON 論文で公表]したのが1924年、それらを逆に配置しても同様だとŁukasiewiczが[https://philpapers.org/rec/UKAASF 論文で公表]したのが27年後の1951年である。&lt;br /&gt;
&lt;br /&gt;
ではなぜŁukasiewiczは先に前置記法を考案したのか。これは恐らくヨーロッパ圏で使用されている言語の文法から来たものと愚考している。例えば「&amp;lt;math&amp;gt;5+7=&amp;lt;/math&amp;gt;」を文章題として書き起こすことを考えてみる。算数の文章題は書き起こすと命令文になるが、命令文は主語(S)が取れ、動詞(V)は算術演算子を指すため、目的語(O)である2つの数詞を含めそのまま書き下すと、[https://en.wikipedia.org/wiki/Subject–object–verb_word_order SOV型]である日本語では「5と7を&amp;lt;b&amp;gt;加えよ&amp;lt;/b&amp;gt;」と動詞が文章の最後に置かれるOV型の後置記法に、[https://en.wikipedia.org/wiki/Subject–verb–object_word_order SVO型]である英語やポーランド語では &amp;amp;ldquo;&amp;lt;b&amp;gt;Add&amp;lt;/b&amp;gt; five and seven.&amp;amp;rdquo; や &amp;amp;bdquo;&amp;lt;b&amp;gt;Dodaję&amp;lt;/b&amp;gt; pięć i siedem.&amp;amp;rdquo; と動詞が文章の先頭に置かれるVO型の前置記法になる。話者が常用する文法としては決定的な差であり、ときに日本語話者が外国語を学ぶ際に高い壁を作るが、この差が、日本では後置記法が受け容れられ易く、ポーランド人のŁukasiewiczが前置記法を先に考案した理由ではないだろうか。&lt;br /&gt;
&lt;br /&gt;
そして、もしこの推測が正しいとすると、ここから想像されるのが「RPN電卓が廃れた一因」である。地球上に山ほどある言語体系のうち「動詞が文章の先頭(もしくは主語の直後)に置かれる文法」と「動詞が文章の最後に置かれる文法」の比率がどの程度なのか、管理人は言語学に不案内なので把握していない&amp;lt;ref name=&amp;quot;order&amp;quot; /&amp;gt;が、前者が多いのであれば、人間が楽をするための道具で不便なものは購入しないだろう。ユーザが頭の中で文章題を作成・読解する文法(論理)が前置記法なのに、後置記法であるRPN電卓ではわざわざひっくり返して入力しなければならない…こんな面倒なことをさせられるぐらいなら、学校で教授されることで慣れ親しんでいる中置記法をそのまま入力できる、ふつうの電卓を購入するのが当然というものだ。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、現代の電卓市場で、RPN電卓の存在感は皆無に等しい。&lt;br /&gt;
&lt;br /&gt;
以降、本サイトでは後置記法をRPNと表記する。&lt;br /&gt;
&lt;br /&gt;
==スタックマシン==&lt;br /&gt;
RPNと非常に相性が良く、ハードウェアもソフトウェアも最小限で済むことから、事実上のコンビとして使用される概念に&#039;&#039;&#039;[https://en.wikipedia.org/wiki/Stack_machine スタックマシン]&#039;&#039;&#039;がある。RPN電卓特有の操作方法はスタックマシンであるがゆえのもので、管理人が把握している限り、スタックマシンではないRPN電卓を見たことが無い。&lt;br /&gt;
&lt;br /&gt;
計算機工学におけるコンピュータアーキテクチャによるスタックマシンの学問的な定義は&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
 中間結果格納用に&#039;&#039;&#039;LIFO(Last In, First Out:後入れ先出し)&#039;&#039;&#039;形式でアクセス制限した&#039;&#039;&#039;スタック(stack)&#039;&#039;&#039;と呼ぶメモリを使用する計算機&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
となる。&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/LIFO LIFO]形式とは、最初に記憶した内容は最後に、最後に記憶した内容は最初に取り出すことができ、それらが無くなれば格納場所は空になるというデータ格納方式をいう。&lt;br /&gt;
[https://en.wikipedia.org/wiki/Stack_(abstract_data_type) スタック(stack)]とは、その英単語訳通り[https://dictionary.cambridge.org/ja/dictionary/english-japanese/stack 「箱にモノを入れて積み上げるような動作や状態」]を指す。&lt;br /&gt;
&lt;br /&gt;
書類を綴じて保存する[https://www.kingjim.co.jp/products/type/flat-file.html フラットファイル]を思い出せば解り易いかもしれない。メモを書いたレポート用紙をフラットファイルに1枚ずつ綴じていくと、最初に綴じたレポート用紙は背表紙のすぐ上となる最終ページに保存され、そこから1枚ずつ重ねて綴じられていき、最後に綴じたレポート用紙はフラットファイルの表紙を開いてすぐの1ページ目に保存される。綴じられたレポート用紙をフラットファイルから1枚ずつ取り出すには、必然的に、最後に綴じられた1ページ目から取り出すことになり、最初に綴じられた最終ページのレポート用紙を取り出せるのは最後になる。ここで「フラットファイル」がスタック、「レポート用紙に書かれたメモ」が記憶した内容、「レポート用紙を綴じる/取り出す順番の決まり」がLIFO形式である。&lt;br /&gt;
&lt;br /&gt;
言い換えると、&#039;&#039;&#039;メモリの内容を読み書きできる出入口が1箇所に制限されている&#039;&#039;&#039;ことで&#039;&#039;&#039;メモリの内容を読み書きする順番が自動的に一意に定まる&#039;&#039;&#039;のがLIFO形式である。これは非常に重要な事実で、電卓にスタックマシンを採用すれば&#039;&#039;&#039;被演算子に演算命令を実行する順番も自動的に一意に定まる&#039;&#039;&#039;ことから&#039;&#039;&#039;ハードウェアもソフトウェアも単純な処理だけで済む&#039;&#039;&#039;ため&#039;&#039;&#039;極めて小規模&#039;&#039;&#039;で実装でき&#039;&#039;&#039;高速な動作&#039;&#039;&#039;が可能となるからだ。更に、副次的な効果として、ハードウェアの部品点数が少なくソフトウェアも小さくなるため、製品の販売価格と、製品にバグを作り込む確率を劇的に下げられることも挙がる。計算機工学から見ても優秀なアーキテクチャの1つである。&lt;br /&gt;
&lt;br /&gt;
なお、スタックに内容を記憶させる操作を&#039;&#039;&#039;プッシュ(push)&#039;&#039;&#039;、スタックから記憶させた内容を取り出す操作を&#039;&#039;&#039;ポップ(pop)&#039;&#039;&#039;という。先ほどのフラットファイルの例えに倣うと、被演算子を書き込んだレポート用紙を1枚ずつフラットファイルに綴じる操作がプッシュ、フラットファイルに綴じられたレポート用紙を1枚ずつ順番に取り出す操作がポップとなる。&lt;br /&gt;
&lt;br /&gt;
==動作==&lt;br /&gt;
ではなぜRPNとスタックマシンは非常に相性が良く、RPN電卓では事実上コンビで使用されるのか。先ほどの「『5と7の和』と『8から3の差』の積」をHP製RPN電卓で演算させた際のスタックの動作で確認してみる。&lt;br /&gt;
&lt;br /&gt;
標準的なHP製RPN電卓はX・Y・Z・Tの4段スタック&amp;lt;ref name=&amp;quot;stack&amp;quot; /&amp;gt;で、ディスプレイには常にスタックXの内容が表示される。LIFOの例に倣えば、レポート用紙を4枚綴じることができるフラットファイルの表紙が破れていて、1ページ目に綴じられたレポート用紙のメモが常に読める状態である。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最初は全て空&amp;lt;ref name=&amp;quot;mem&amp;quot; /&amp;gt;である。空でない場合は&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {CL}x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;をキーインし空にする。スタックXは便宜的に&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;を表示する。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|T&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Z&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Y&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|X&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black;  font-family:monospace;&amp;quot;| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;をキーインし、スタックXに&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;をプッシュする。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|T&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Z&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Y&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|X&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;| 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{keypress|enter}}&amp;amp;nbsp;をキーインしてスタックXの内容をスタックYにプッシュし、続けて&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;7&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下してスタックXに&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;をプッシュする。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|T&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Z&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Y&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot; | 5&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|X&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;| 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;をキーインすると、スタックYとスタックXの内容をポップして、RPN電卓での算術演算子&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;の定義である「YとXの和」を演算、その結果である&amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;をスタックXにプッシュすることで表示され、スタックYは空になる。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|T&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Z&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Y&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|X&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|12&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
続けて&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;8&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;をキーインすると、スタックXの内容をスタックYにプッシュし、スタックXに&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;をプッシュする。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|T&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Z&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Y&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|X&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{keypress|enter}}&amp;amp;nbsp;をキーインすると、スタックYの内容をスタックZに、スタックXの内容をスタックYに、それぞれプッシュする。続けて{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;をキーインし、スタックXに&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;をプッシュする。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|T&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Z&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Y&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|8&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|X&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;をキーインすると、スタックYとスタックXの内容をポップして、RPN電卓での算術演算子&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;の定義である「YからXの差」を演算、その結果である&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;をスタックXにプッシュすることで表示される。スタックZの内容はスタックYにプッシュされ、スタックZは空になる。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|T&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Z&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Y&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|X&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最後に&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;をキーインすると、スタックYとスタックXの内容をポップして、RPN電卓での算術演算子&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;の定義である「YとXの積」を演算、最終的に求めたい結果である&amp;lt;code&amp;gt;60&amp;lt;/code&amp;gt;をスタックXにプッシュすることで表示され、スタックYは空になる。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|T&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Z&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Y&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|X&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|60&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以上の9ステップで完了する。このように、RPNとスタックマシンの組合せることで&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;頻出する二項演算では、常に2個の被演算子を先に入力・記憶させる必要があるが、この操作が「スタックにプッシュする」だけで済む&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;被演算子をスタックにプッシュした時点で、被演算子の桁数を含む内容が決定済であるため、その後に算術演算子に沿った演算を即実行して良いと電卓が判断でき、わざわざ演算を実行させる契機である&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を人間が入力する必要が無い&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;演算過程(中間結果)もスタックにプッシュするため、そのためのメモリを別途実装する必要が無いのと同時に、ユーザも確認できる&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ことになり、必要最低限のハードウェアとソフトウェアだけで極めて効率的な演算が可能となる。&lt;br /&gt;
&lt;br /&gt;
その代わり、RPN電卓ユーザは&#039;&#039;&#039;常に頭の中でスタックの状態や中身を思い浮かべる必要がある&#039;&#039;&#039;。が、それはすぐに慣れてしまう。それよりも、キーインするステップ数の少なさと合理性(合理的思考であり合理的志向である)から抜け出せなくなる。&#039;&#039;&#039;RPN電卓ユーザは、ふつうの電卓(中置記法の電卓)が使えなくなる能力が自然と身に付いてしまう&#039;&#039;&#039;と謂われる所以である。この能力が利点か欠点か、その判断は読者諸兄姉に委ねるが、少なくとも管理人は利点と判断している。&lt;br /&gt;
&lt;br /&gt;
これに対して、同じ式を中置記法の電卓で演算すると、{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;7&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\mbox{M}+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\mbox{C}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;8&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\mbox{MR}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と13ステップ入力する必要がある。&lt;br /&gt;
&lt;br /&gt;
まず「5と7の和」を演算し、その結果をメモリに保存。メモリ内容以外をクリアした後に「8から3の差」を演算、その結果に対して乗算の算術演算子を入力後、メモリに保存した「5と7の和」の演算結果を呼び出して&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を入力し演算させることで、ようやく最終的な演算結果の&amp;lt;code&amp;gt;60&amp;lt;/code&amp;gt;が得られる。&lt;br /&gt;
&lt;br /&gt;
ここまで煩雑になる理由は「演算過程(中間結果)を記憶させるにはユーザの操作が必要である」ことと「演算させる契機として都度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を入力する必要がある」ことに依る。特に後者は、最後に入力した被演算子(今回で言えば括弧内を演算するときの&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;)が1桁で終わるのか2桁以上あるのか、即ち、被演算子の内容が決定済か否かを電卓が判断できないため、演算するにはユーザからの指示が必須となる。よって、演算過程(中間結果)をメモリへ保存する操作と、演算を実行させる契機として都度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を入力する操作が加わり、トータルでの入力ステップ数を増やす結果を招いている。&lt;br /&gt;
&lt;br /&gt;
整理すると、電卓にRPNとスタックマシンを採用すると、&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
 数式から、演算順位を明確化するための括弧を排除する&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
ために&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
 算術演算子や関数が、必ず、被演算子の後ろに置かれる&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
ことから&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
 「電卓に演算させる契機の入力」と「演算させたい算術演算子や関数の入力」が集約されて、1回の入力で済む&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
という特性が生じ&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
 演算順位を考える必要が無くなり、キーインすべき回数も減るため、数式の演算を短時間で合理的に行える&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
ことになる。&lt;br /&gt;
&lt;br /&gt;
よって、RPN電卓は&lt;br /&gt;
 入力方法に後置記法を採用し、被演算子をスタックにそれぞれプッシュした後、それらに対して演算させたい算術演算子や関数を指定、スタックをポップして指定された演算を実行し、その結果をスタックにプッシュして表示する動作を繰り返すスタックマシン&lt;br /&gt;
と定義される。このとき、スタックを複数段用意(フラットファイルを厚くしてレポート用紙を多数綴じられるように)すると、入力した順に被演算子をスタックにプッシュし、最後の2つのスタックに対して算術演算子を指示することで連綿と演算できるのが、RPN電卓の最大の特長であり利点である。&lt;br /&gt;
&lt;br /&gt;
尤も、電卓に限らず、あらゆるコンピュータが演算を実行する動作はRPNである。先述の通り、ハードウェアもソフトウェアも必要最低限で済むため演算に必要なリソースとコストが低いこともあるが、人間が入力した数式をコンピュータが解釈(評価)する際も、人間と同様に、数式を被演算子と算術演算子または関数に分解する必要があり、その最短の手順は「最初に演算対象である被演算子を特定して読み込んでから、その後に演算命令である算術演算子や関数を読み込み、最後に被演算子へ演算命令を実行する」という形にならざるを得ず、この挙動はRPNそのものだからだ。&lt;br /&gt;
&lt;br /&gt;
つまり、中置記法の電卓は「人間には学校で学んだ数式通りの入力を求めつつ、内部でわざわざRPNに変換した後、当初の目的である演算をPRNで実行している」、RPN電卓は「RPNへの変換作業は人間にやらせて、電卓自身は当初の目的である演算のみに特化できている」ことになる。もっと言えば、中置記法の電卓には「中置記法→RPN変換機能」が必須なので回路とロジックが複雑で大規模になるが、RPN電卓には不要なので回路とロジックが単純で小規模に収まることになる。&lt;br /&gt;
&lt;br /&gt;
なお、現行の電卓の入力方式に&#039;&#039;&#039;加算器方式&#039;&#039;&#039;がある。目の前に積まれた伝票にある数字をひたすら集計する際にキーインするステップ数が最も少なく済むため現在では主に企業の経理担当者が好んで使用しており新品も製造・販売され続けているが、もともとは電卓より遥かに歴史が長い、小売店等に置かれている[https://en.wikipedia.org/wiki/Cash_register キャッシュレジスタ(金銭登録機、いわゆる「レジ」)]の入力方式である。基本的な操作は名前の通り「表示している数字に対して、数字を入力後、加算(または減算)を指示する」というもので、レジがまだ[https://en.wikipedia.org/wiki/Mechanical_calculator 機械式計算機]だったころの名残だが、これはRPNとまったく同じである。しかし、機械式から電子式(つまり電卓)へ置き換えるにあたり乗算機能と除算機能を付加した際、加算と減算は先述の基本操作が維持されたものの、乗算と除算は中置記法となった。&lt;br /&gt;
&lt;br /&gt;
即ち、&#039;&#039;&#039;加算器方式は「加減算が2段スタックのRPN、乗除算が中置記法」のハイブリッド&#039;&#039;&#039;となる。&lt;br /&gt;
&lt;br /&gt;
その理由は、[https://en.wikipedia.org/wiki/Logic_gate 論理回路]による乗算と除算の演算では[https://en.wikipedia.org/wiki/Shift_register シフタ]を使用するためだと推測される。マイクロプロセッサを使用していない電卓の演算回路は純粋な論理回路のみで構成する[https://en.wikipedia.org/wiki/Random_logic ワイヤードロジック]で駆動しておりソフトウェアは存在しないが、電卓が発明され世に出た当時の機種では論理回路をディスクリートで組まねばならなかった。論理回路だけで乗算と除算を実装する場合、『被乗数を乗数だけ繰り返し加算した結果(積)を求める』と定義される乗算では、乗数をシフタで左シフト後に被乗数と[https://en.wikipedia.org/wiki/Logical_conjunction 論理積]を取る必要が、『被除数から除数だけ繰り返し減算し、減算できた回数(商)と、減算できず余った数値(剰余)を求める』と定義される除算では、被除数と除数の大小比較を繰り返し減算できた(商が立った)際は被除数をシフタで左シフトし、再度除数と大小比較する必要が、それぞれある。即ち「これからキーインされる被演算子はシフタに渡せ」と物理的に回路を切り替えたり、「商が立った後は再度左シフトせよ」と繰り返す必要がある除算命令を出すための操作が中置記法という形で顕れたのだろう&amp;lt;ref name=&amp;quot;z80&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
それが顕著なのが、1961年に世界で初めて発売された電卓である[https://en.wikipedia.org/wiki/Sumlock_ANITA_calculator ANITA Mk-8]である。ANITA Mk-8は論理回路を半導体ではなく真空管群で構成しており、スイッチング素子には[https://en.wikipedia.org/wiki/Dekatron 計数放電管]を、数字の表示には[https://en.wikipedia.org/wiki/Nixie_tube ニキシー管]を、それぞれ使用しているが、[http://anita-calculators.info/AnitaMk8OperatingInstructions.pdf 操作マニュアル]を読むと非常に興味深い。&lt;br /&gt;
* 加算は「『加算モード設定キー』を押下後、フルキーで最上位桁から次々キーイン」&lt;br /&gt;
* 減算は「いったん『加算モード設定キー』を押下して被減数をフルキーからキーイン後、『減算モード設定キー』を押下して減数をフルキーで最上位桁から次々キーイン」&lt;br /&gt;
と、スタックが2段のRPNと同じ動きである。『加算モード設定キーの押下』がスタックに被演算子をプッシュする準備なのだろう。「次々キーイン」できるのは置数のためのフルキーがモーメンタリスイッチだからだ。しかし、&lt;br /&gt;
* 乗算は「『乗算モード設定キー』を押下して被乗数をフルキーからキーイン後、乗数を『乗数入力専用フルキー』からキーイン」&lt;br /&gt;
* 除算は「いったん『加算モード設定キー』を押下して被除数をフルキーからキーイン後、『除算モード設定キー』を押下して除数をフルキーからキーインし、『乗数入力専用フルキー』の&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下」&lt;br /&gt;
と、現代では凡そ見掛けない方法となる。ただ、「どうやってシフタに渡さねばならない被演算子を区別し、確実にシフタへ渡すか」に苦労している様子は見て取れる。この場合、「『乗算入力専用フルキー』からキーインした被演算子」は直接シフタに渡しているのだろう。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、「中途半端なRPN」とも「中途半端な中置記法」とも言える加算器方式を、本サイトでは「広義のRPN」として扱う。&lt;br /&gt;
&lt;br /&gt;
==2つの理由==&lt;br /&gt;
先述のANITA Mk-8から3年後の1964年には計数放電管をディスクリートのトランジスタに置き換えた電卓が発売されたが、依然として演算回路が純粋な論理回路のみで構成されていることに変わりはなかった。また、この時点から1970年代前半まではまだ半導体が未成熟で高価な部品だったこともあり、出荷後に電卓を故障させないためにも、延いては最終的な製品価格を抑えるためにも、使用する半導体の数は少なければ少ないほど良しとされた。&#039;&#039;&#039;電卓の回路とロジックを単純化・極小化し、使用する半導体の数を減らすには、加算器方式(広義のRPN)を選択するしかなかった&#039;&#039;&#039;のだ。これこそが、広義のRPNである加算器方式の電卓が世に出た理由である。&lt;br /&gt;
&lt;br /&gt;
そのため、かつて日本で開発・製造・販売されていた電卓の殆どが加算器方式(とその亜流)であった。にもかかわらず、現在のように中置記法が主流となったのは、かの有名な[http://arch.casio.jp/dentaku/info/history/casiomini/ カシオミニ]の初代(1972年8月発売)と2代目(1973年2月発売)が爆発的に売れた後である。&lt;br /&gt;
&lt;br /&gt;
それまで電卓の購入層は経理担当者や科学者や技術者に限られており&amp;lt;ref name=&amp;quot;abacus&amp;quot; /&amp;gt;、RPNへの変換作業を人間にやらせる操作方法でも問題になりにくかった。今では俄かに信じられないが、&#039;&#039;&#039;1972年にカシオが初めて発売した科学・数学向け机上設置型関数電卓[https://www.oldcalculatormuseum.com/casiofx1.html fx-1]ですら加算器方式&#039;&#039;&#039;だったぐらいだ。しかし、『電卓のパーソナル化』を目指して開発したカシオミニでは「すべてのユーザが加算器方式を受け容れるとは限らない。&#039;&#039;&#039;『パーソナル化』を目指すなら、学校で習った通りに入力できる中置記法へ移行したほうが良い&#039;&#039;&#039;」と3代目(1973年5月発売)から中置記法への移行を決断したのは当然の流れだろう。&lt;br /&gt;
&lt;br /&gt;
この3代目でカシオミニシリーズの累計販売台数は100万台を越え、1975年5月発売の最終モデルである8代目までで1,000万台以上を売り切った。うち600万台が国内で販売され、400万台は海外へ輸出されたようなので、[https://www.e-stat.go.jp/stat-search/file-download?statInfId=000007915541&amp;amp;fileKind=2 1975年の国勢調査で、当時の日本が約3,000万世帯]だったことを考慮すると、&#039;&#039;&#039;僅か3年で国内世帯の&amp;amp;#x2155;に中置記法の電卓が浸透する&#039;&#039;&#039;という凄まじい数字と勢いであった。この大成功でカシオは『電卓のパーソナル化』を見事に達成し、グローバルな視点からも電卓メーカとしての地位を確かなものとしたが、この出来事は同時に、競合他社をも一斉に中置記法へ移行させ、&#039;&#039;&#039;RPN電卓に電卓市場からの退場を宣告した&#039;&#039;&#039;ことにもなった。カシオミニをはじめとする中置記法の電卓が電卓市場を席捲したことで、加算器方式の電卓が売り場から追い遣られたからだ。3代目の製品開発期間を考慮すると、カシオは1972年後半に中置記法への移行を決断したことになるが、電卓が誕生したのは1964年なので、広義のRPNでもある加算器方式が主流派だったのは、僅か8年間だったことになる。&lt;br /&gt;
&lt;br /&gt;
が、奇しくも&#039;&#039;&#039;同じ1972年に[[HP-35]]が発売&#039;&#039;&#039;されている。HPは[[HP-35]]の開発期間が2年間、即ち1969〜70年に開発を開始したことを公表しており、このときはまだ広義のRPNである加算器方式が主流派だったため何ら不思議ではないが、もしこのときもカシオが加算器方式を採用し続けていたら、現在でもRPNが世界の電卓の標準的な入力方式として生き長らえていたのかもしれないし、もし[[HP-35]]の開発開始が2〜3年遅れていれば、本Webサイトは存在しなかっただろう。[[HP-35]]はマイクロプロセッサとソフトウェアの組合せで構成する[https://en.wikipedia.org/wiki/Microcode マイクロプログラム方式]のため、ROMとRAMの容量さえ許せば中置記法を採用することも可能だからだ。&lt;br /&gt;
&lt;br /&gt;
歴史に「たら・れば」は禁物とはいえ、RPN電卓とは、時宜の交錯が醸した妙味であると痛感せざるを得ない。&lt;br /&gt;
&lt;br /&gt;
==もし前置記法の電卓が存在したら…？==&lt;br /&gt;
最後に、前置記法の電卓を考察する。&lt;br /&gt;
&lt;br /&gt;
管理人の視野が狭いだけなのかもしれないが、先述した通り、管理人は「前置記法の電卓が実際に販売された例」を見聞きしたことがない。ではなぜ電卓に前置記法は採用されないのだろうか？&lt;br /&gt;
&lt;br /&gt;
先ほどと同じ「『5と7の和』と『8から3の差』の積」を、前置記法をスタックマシンに適用した電卓で演算するシミュレーションをしてみる。&lt;br /&gt;
&lt;br /&gt;
キーインするのは&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;7&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}} {{keypress|&amp;lt;math&amp;gt;8&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の9ステップとなるが、これをそのままキーインしても演算が実行されないことは中置記法の動作で説明したのと同じだ。最後の&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;が決定済か否かを電卓が判断できないからだ。そこで、「演算させる契機として&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;を入力する」ルールを設定すると下記になるだろう。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;7&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;までキーインした時点で『5と7の和』を演算して良いことが確定するため、スタックB・C・Dをポップし「CとBに対するD」即ち『5と7の和』を演算する。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|E&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|*&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|D&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|+    &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|C&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|5&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|B&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|7&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|A&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
『5と7の和』の演算結果である&amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;が、この演算を実行する契機となった&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;がプッシュされたスタックの1つ上段のスタック(この例ではスタックB)にプッシュされる&amp;lt;ref name=&amp;quot;swap&amp;quot; /&amp;gt;。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|E&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|D&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|C&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|*&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|B&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; color:red; font-family:monospace;&amp;quot;|12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|A&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
続けて&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;8&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と最後までキーインしても『8から3の差』は演算されない。最下段のスタックの内容(この例ではスタックAの&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;)が1桁で決定済で演算して良いことを電卓が検知できないからだ。よって、先ほど追加したルールに従い、演算させる契機として&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;をキーイン、スタックA・B・Cをポップし「BとAに対するC」即ち『8から3の差』を演算する。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|E&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|*&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|D&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|C&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|-&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|B&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|8&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|A&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
『8から3の差』の演算結果である&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;がスタックAにプッシュされるものの、ユーザが欲する『12と5の積』は演算されず停止する。この演算を実行して良いかを電卓が判断できないからだ。よって、先ほどと同様、演算させる契機として&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;を再度キーイン、スタックA・B・Cをポップし「BとAに対するC」即ち『12と5の積』を演算する。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|E&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|D&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|C&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|*&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|B&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|A&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
『12と5の積』の演算結果である&amp;lt;code&amp;gt;60&amp;lt;/code&amp;gt;がスタックAにプッシュされ、すべての演算が終了する。{{keypress|enter}}&amp;amp;nbsp;を2回追加でキーインしたため、トータルで11ステップとなった。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:middle;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|E&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|D&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|C&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|B&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; text-align:right; font-family:monospace;&amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; style=&amp;quot;color:white; background-color:black;&amp;quot;|A&lt;br /&gt;
| style=&amp;quot;height:1px; width:30px; font-weight:bold; text-align:right; color:white; background-color:black; font-family:monospace;&amp;quot;|60&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
…はっきり言って非常に使い難い。&lt;br /&gt;
&lt;br /&gt;
その理由は、前置記法が被演算子の前に算術演算子や関数を記述する記法ゆえ、&#039;&#039;&#039;被演算子だけではなく算術演算子や関数もスタックに積む&#039;&#039;&#039;必要があり、&#039;&#039;&#039;算術演算子や関数が必ず被演算子より奥のスタックに押し込まれる&#039;&#039;&#039;ことに尽きる。これにより、同じ規模の演算を実行するにも中置記法やRPNの電卓より多くのスタック(ハードウェアとしてのメモリとそれを管理するソフトウェア)を実装する必要があり、中置記法の電卓で {{keypress|&amp;lt;math&amp;gt;=&amp;lt;/math&amp;gt;}} を入力するのと同様に演算契機をユーザが別途入力しなければならなくなる。&lt;br /&gt;
&lt;br /&gt;
また、上記の考察では最下段のスタックのみ表示する電卓を想定したが、こうしてスタックの中身と演算過程を比較してみると、前置記法では最低3段のスタックを表示させたほうが良いことが判る。なぜなら、電卓で頻発する[https://en.wikipedia.org/wiki/Binary_operation 二項演算]を実行する際は常に「算術演算子または関数が1段」「被演算子が2段」の&#039;&#039;&#039;3段のスタックが同時にポップ&#039;&#039;&#039;されるため、RPNとは較べものにならないほどスタックの出入りが激しいからだ。&lt;br /&gt;
&lt;br /&gt;
更に言えば、記憶すべきスタックの中身や状態に被演算子＝数字だけでなく算術演算子または関数＝記号も加わることで、訓練されたユーザでも、積まれたスタックがどういう状態なのか途中で把握できなくなると思われる。それを防ぐには、RPNや中置記法の電卓より大きな(複数行が表示できる)ディスプレイを実装したほうが親切だろう。&lt;br /&gt;
&lt;br /&gt;
以上の考察から、電卓に前置記法を採用すると、ユーザが操作中に記憶すべきスタックの内容が増えるにもかかわらず、キーインするステップ数は中置記法と大差なく、実装しようとすればハードウェアもソフトウェアもどの記法より大規模となることが判る。これでは電卓の入力方式として&amp;lt;ref name=&amp;quot;lang&amp;quot; /&amp;gt;の前置記法は不適と言わざるを得ない。&lt;br /&gt;
&lt;br /&gt;
尤も、この考察は、冒頭で宣言したように「前置記法をスタックマシンに適用した電卓」に限られることに注意されたい。「スタックマシンではない電卓」ではもっとスマートな動作になる可能性が否定できないものの、管理人の貧弱な脳味噌では、前置記法の数式を入力した(読み込んだ)だけでは、その式を演算して良いか否かを判断できず、よってユーザからの演算実行指示が必須であることに変わりが無いため、「だったらわざわざ判り難い前置記法なんぞ使わず、中置記法で良いんじゃね？」という結論になると考えている。&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;logics&amp;quot;&amp;gt;私立学校は学習指導要領からの逸脱が容易であるため、私立学校で学習する場合、学年次が学習指導要領と同じとは限らないうえ、前置記法や後置記法を学ばない可能性を否定できない。また、管理人が調べる限り、「後期中等教育を包含する5年制(商船に関する学科は5年6か月)の高等教育機関」である高等専門学校(高専)でも『[https://en.wikipedia.org/wiki/Logic 論理学]』は開講していることと、その成り立ちから理工系が大半を占めることから、高専生が前置記法や後置記法を学ぶ可能性は高いと判断し除外した。当然「高等教育機関」である大学では『論理学』はそこここで開講しているため除外した。日本の大学では理工系学部生のみならず、論理学の発祥が哲学であるため文科系学部生でも学ぶ可能性は充分ある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;order&amp;quot;&amp;gt;Wikipediaの[https://en.wikipedia.org/wiki/Word_order 語順]によると、地球上の1,377言語ではSOV型が最多の565言語、次いでSVO型が488言語だそうだ。しかし、地球上での実際の話者数や、SOV型であるドイツ語では目的語を文頭に置いた場合は動詞が主語の次に置かれる[https://en.wikipedia.org/wiki/V2_word_order 動詞第二位語順]をとる場合があること等を考慮すると、実態としてはSVO型のほうが優勢だと思われる。地球上で圧倒的に話者が多い中国語・英語・スペイン語がいずれもSVO型であることも大きい。尤も、今後増えるであろうインド系言語はSOV型だそうなので、しばらくすると状況は変わるのかもしれない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;stack&amp;quot;&amp;gt;HPが最初に発売したRPN関数電卓である[https://www.hpmuseum.org/hp9100.htm HP 9100A/B]は3段スタックだった&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;mem&amp;quot;&amp;gt;1976年7月1日に発売された[http://www.hp-collection.org/calculators/25c.html HP-25C]以降のHP製RPN関数電卓は、バッテリが切れない限り、電源を切ってもスタックの内容が消去されないため、次に電源を入れたときに再利用できる。裏を返せば、まったく別の演算をさせる際は明示的にスタックの内容を消去する必要がある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;z80&amp;quot;&amp;gt;ここまでの説明で判る通り、コンピュータにとって算術乗算と算術除算はかなり複雑な処理で、論理回路が大規模になる。世界初のマイクロプロセッサである[https://en.wikipedia.org/wiki/Intel_4004 Intel 4004]はもちろん、[[HP-35]]から[[HP-65]]まで使用された[http://www.hp.com/hpinfo/abouthp/histnfacts/museum/personalsystems/0023/other/0023hpjournal01.pdf Classicアーキテクチャ]、現在でも使用されている[https://en.wikipedia.org/wiki/Zilog_Z80 Z80]には算術加算命令と算術減算命令しか実装されなかったぐらいだ。よって、これら初期のマイクロプロセッサで乗算と除算を実行するには、算術加算命令と算術減算命令を駆使してソフトウェアで実現する必要がある。&amp;lt;br&amp;gt;裏を返せば、これら初期のマイクロプロセッサより、論理回路だけで演算回路を構成しているにもかかわらず乗算と除算が演算できる電卓のほうが高級なハードウェアだったといえるうえ、すべてのHP製RPN電卓はマイクロプロセッサとソフトウェアの組合せで設計されていることになる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;abacus&amp;quot;&amp;gt;それ以外の学生や社会人は算盤(か筆算か暗算)が当たり前だった。商店街で買い物した際に店主自ら算盤を弾く様は1980年代まで日常生活の風景として溶け込んでいたし、管理人が足繁く通っている秋葉原の[https://akizukidenshi.com/ 秋月電子通商]では購入したパーツを入れる紙袋に店員がボールペンで筆算していた時代が長かった。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;swap&amp;quot;&amp;gt;「演算結果は常に最下段のスタックにプッシュする」仕様に仮定すると、この演算例では&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が奥のスタック(スタックB)に積まれるので、次の演算を考慮すると、ここでスタックの入れ替え&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;a \rightleftarrows b&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;も押下する必要がある。が、ここで述べたような「算術演算子や関数のキーインが契機で演算を実行した場合、その演算結果は、演算する契機となった算術演算子や関数がプッシュされたスタックの直上のスタックにプッシュする」仕様を設定すれば、ユーザに&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;a \rightleftarrows b&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下させずに済む気はする。尤も、前置記法の電卓の実機なんぞ見たことも聞いたことも触ったこともなく、頭で考えただけなので、どちらの仕様設定が正しいかは不明だ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lang&amp;quot;&amp;gt;「被演算子だけではなく算術演算子や関数もスタックに積む必要がある」ことが徒となり、電卓の入力方式としては欠点しか表出しない前置記法だが、この特性ゆえにプログラミング言語の文法として採用される場合がある。最も有名かつ歴史が長いのは、管理人も常用するエディタである[https://en.wikipedia.org/wiki/GNU_Emacs GNU Emacs]のコアも構成する、1958年に登場した[https://en.wikipedia.org/wiki/Lisp_(programming_language) LISP]におけるS式の構文である。LISPのS式はソースコード(即ち算術演算子や関数)とデータ(即ち被演算子)を等価に扱い評価するため、被演算子だけではなく算術演算子や関数もスタックに積んで演算(評価)する前置記法は文法として最適である。したがって、LISPの弱点も前置記法と同じで、ソースコードの読解にコツが要り、ステップ数が無駄に多くなりスタック(メモリ)も大量に必要で演算量(演算回数)も増える。その結果、電卓や二昔もしくは三昔前のホストコンピュータなど貧弱なハードウェアでは[https://en.wikipedia.org/wiki/Thrashing_(computer_science) スラッシング]が多発し動作が著しく遅くなる。そのため、多くのユーザが同時にログインする運用形態のUNIXマシンでハードウェアが貧弱な場合、そのUNIXマシンのrootにより、LISP処理系やEmacsの使用が禁止されていることが殆どである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=OMRON_12SR&amp;diff=6812</id>
		<title>OMRON 12SR</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=OMRON_12SR&amp;diff=6812"/>
		<updated>2025-05-24T02:25:20Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
数は少ないものの、HP以外のメーカがRPN電卓を製造・販売した例がある。本機はそのひとつで、1976年に日本企業である立石電機株式会社(現・オムロン株式会社)が&#039;&#039;&#039;輸出専用機種&#039;&#039;&#039;として製造・販売した、科学・数学向けポケットRPN関数電卓である。型番である12SRの「12」は演算可能桁数、「SR」はSlide Rule＝計算尺を指す。&lt;br /&gt;
&lt;br /&gt;
なお、本機を製造・販売した立石電機も、[[Nut/Saturnプロセッサファミリ#cite_note-busicom-1|ビジコン]]同様、電卓という製品に触れる際には外せない日本企業である。世界市場をも巻き込む激戦だった電卓戦争中の1971年4月19日、電卓の販売価格が俗に「1桁1万円」と謂われていたこの頃に、8桁電卓の[http://transistor0069.blog96.fc2.com/blog-entry-1438.html OMRON 800]を49,800円で発売し[https://www.icom.co.jp/personal/beacon/electronics/774/ オムロン・ショック]を惹起したことや、海外を含む数多の電卓メーカの[https://en.wikipedia.org/wiki/Original_design_manufacturer ODM]/[https://en.wikipedia.org/wiki/Original_equipment_manufacturer OEM]引受元でもあったため自社ブランド製品含め当時最も多くの電卓を生産していた&amp;lt;ref name=&amp;quot;first&amp;quot; /&amp;gt;ことでも有名だが、本論ではないので割愛する。&lt;br /&gt;
__TOC__&lt;br /&gt;
===とにかく詳細不明===&lt;br /&gt;
輸出専用機種である本機の情報は日本国内にほぼ無く、海外のRPN電卓マニアが&#039;&#039;One of non-HP RPN calculators&#039;&#039;と触れる程度で、その量は少ない。底面に貼られた銘板から日本で製造されたことは確定しているが、販売時期からして製造年は1975〜1976年と推定される。当時の販売価格(または卸値)も不明&amp;lt;ref name=&amp;quot;wholesale&amp;quot; /&amp;gt;である。当然だが附属するマニュアルには日本語が1文字も無く、1ページを縦に2分割して、左側に英語、右側にドイツ語で同じ内容を並記した48ページのパンフレット1冊のみで、背表紙右下に『11909 (4-76) Printed in Japan』とあることから、マニュアルの版下は1976年4月に作られ、日本で印刷されていることは判る。&lt;br /&gt;
&lt;br /&gt;
本機を国内で販売せず輸出専用機種とした理由も不明だが、管理人は「本機の性能がHP製に太刀打ちできなかった」からだと考えている。本機は、[[HP製RPN電卓の特長|特長]]にある演算例を本機で実行するとHP製と同じ結果が得られることから&#039;&#039;&#039;BCDでの演算&#039;&#039;&#039;と推定され、その&#039;&#039;&#039;演算結果がやけに高精度&#039;&#039;&#039;で同時期に販売されていたWoodstockシリーズより勝っているにもかかわらず、それよりなにより、&#039;&#039;&#039;演算速度が極めて遅い&#039;&#039;&#039;ことで有名だからだ。これは三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{arc}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\ln&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;10^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、階乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x!&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;といった、本機に内蔵している機能や関数を使用した演算で顕著となり、例えば&amp;lt;math&amp;gt;2^3=8&amp;lt;/math&amp;gt;の演算に冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を使うと&#039;&#039;&#039;約3.5秒&#039;&#039;&#039;掛かるという超鈍足ぶりである。しかもその3.5秒間は『表示部のVFD全桁が高速でチラつく』という、いかにも「(一昔前の)コンピュータが全力で演算してますよ」というギミック付きでだ。本機の表示部はただでさえ消費電力量が多いVFDを採用しているので、電池の消耗を考えれば、この3.5秒間は何も表示させずブラックアウトさせたほうが良いのだが…。なお、附属マニュアルに記載されている「バッテリの寿命」は、マンガン乾電池とNi-Cd充電池&amp;lt;ref name=&amp;quot;ni-cd&amp;quot; /&amp;gt;で5.5時間、アルカリ乾電池で10時間である。&lt;br /&gt;
&lt;br /&gt;
本機の1年前に製造・販売された[[HP-25]]の冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は勿論、5年前に製造・販売された世界初のポケットRPN関数電卓である[[HP-35]]の冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;でも&amp;lt;math&amp;gt;2^3=8&amp;lt;/math&amp;gt;は数ミリ秒で演算できるのに、後発で新規開発した本機のほうが低速どころか超鈍足というのは異常である。自分で起こしたオムロン・ショックを考えれば、当時も今も異常に高価と映るであろうHP製にRPN関数電卓で対抗するには販売価格で勝負するしか無いはずが、いざ製造してみたらこの体たらく。本機が販売された時期は電卓戦争の末期ではあるものの、ただでさえ日本人は今でいう〝スペック厨〟の気があり、電卓戦争の真っ最中は同価格や同機能で少しでも性能が低い製品はメーカを問わず容赦無くデッドストックと化し、二束三文でも売値が付かない状況に陥るため、企業規模に関係なく大赤字を被ることになり、大企業であれば電卓事業からの撤退、中小・零細企業であれば倒産の憂き目に遭うというその戦況は、まさに血で血を洗う悲惨さであった。しかも本機は科学・数学向けであり、想定される購買層が関数電卓の仕組みや他社の製品動向を把握している可能性が高いため、同機能で高性能(というか当たり前の演算速度)であるHP製に対抗できないと考えたとしても不思議ではない。「この演算速度では、いくら低価格に設定したとて国内で売れないだろう。であれば、演算速度やスペックをあまり気にしない海外へ最初から全台振り向けて、ある程度の卸値で売り切ったほうが、被害は少なく済むのでは？」…立石電機が本機を輸出専用機種した理由は、このような営業面での判断だったと想像している。&lt;br /&gt;
&lt;br /&gt;
===Mostekの御仕着せ===&lt;br /&gt;
管理人は当初、本機は、立石電機がRPN関数電卓市場に乗り込むべくフルスクラッチで自社開発したと考えていたが、それは誤りであった。海外の計算尺マニアが主宰するWebサイトに、本機についての[https://www.sliderulemuseum.com/Calculators.htm 興味深い記事]を見つけたのだ。&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;&#039;&#039;Mostek, the chip maker of the original Hewlett Packard HP 35 and dozens of other early HP calculators, introduced in 1975 a sensational set of Integrated Circuits with the MK50075A &amp;quot;Data Processor&amp;quot; and two sets of ROM&#039;s with 1k*15bits, each, defining the algorithm of the product: MK50101/MK50102: Financial calculator and MK50103/MK50104: Scientific calculator We know only six calculators based on the MK50075A and MK50103/104 chip-set: APF Mark 55, Corvus Model 500 and its twin Emerson E12, this Omron 12SR, the Sanyo CZ-2901 and Privileg SR54NC. But they all have two things in common: RPN and superior performances.&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(ヒューレット・パッカードの[[HP-35]]をはじめとする数多くの初期HP電卓のチップメーカであるMostekは、1975年に、MK50075Aデータプロセッサと、製品のアルゴリズムを定義した1k×15ビットROMの2セットを搭載した素晴しいICセットを発表した。MK50101/MK50102:金融・財務向け電卓とMK50103/MK50104:科学・数学向け電卓で、MK50075AとMK50103/104チップセットを採用した電卓は6機種しかない。[https://www.calculator.org/calculators/APF_MARK_55.html APF Mark 55]、[https://www.calculator.org/calculators/Corvus_500.html Corvus Model 500]とその双子であるEmerson E12、Omron 12SR、[http://www.taschenrechner-sammlung.de/Calculators/Sanyo-CZ-2901/Contents.htm Sanyo CZ-2901]、[https://www.calculator.org/calculators/Privileg_SR_54_NC.html Privileg SR54NC]である。しかし、それら全てに、RPNと優れたパフォーマンスという2つの共通点がある。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
つまり、本機を含む6機種のRPN電卓は、[[HP-35]]でも登場し、それ以降もHP製RPN関数電卓では不可欠な半導体ベンダである[https://en.wikipedia.org/wiki/Mostek Mostek]が1975年に独自開発したマイクロプロセッサ[http://www.calcuseum.com/SCRAPBOOK/BONUS/22291/1.htm MK50075A]と、RPN関数電卓用ソフトウェアROMである[http://www.calcuseum.com/SCRAPBOOK/BONUS/20098/1.htm MK50103]と[http://www.calcuseum.com/SCRAPBOOK/BONUS/22292/1.htm MK50104]を組み合せただけの、謂わば「Mostek御仕着せのRPN関数電卓」だと判ったのだ。海外のRPN電卓マニアにより本機の[https://www.keesvandersanden.nl/calculators/omron12sr_inside.php 基板]が公開されているが、確かにマイクロプロセッサと2個のROMの型番は合っている。それまで立石電機は伝統的に日立製作所製のカスタムLSIで電卓を製造していたので本機だけイレギュラーということになるが、電卓メーカの立場からすれば、半導体の供給元を複数確保できれば納入価格を下げられる可能性が上がるため、試験的にMostekから出来合いの電卓用LSIを量産最小ロットだけ購入して製造したのが本機なのかもしれない。&lt;br /&gt;
&lt;br /&gt;
更に、上記抜粋にもある[https://www.calculator.org/calculators/Corvus_500.html Corvus Model 500]/[https://www.calculator.org/calculators/APF_MARK_55.html APF Mark 55]/本機を解説した書籍・[http://www.wass.net/manuals/Everything%20RPN.pdf Everything you&#039;ve always wanted to know about RPN]が1976年にT. K. Enterprisesから7ドル50セントで発売されていたことも見つけた。HP以外の電卓メーカによるRPN関数電卓、正確に言えば先述した3個のMostek製LSIを採用したRPN関数電卓を解説するという、実売部数が見込めないだろうニッチ過ぎる書籍&amp;lt;ref name=&amp;quot;book&amp;quot; /&amp;gt;だが、これを読むと、これら3個のMostek製LSIを採用した全てのRPN関数電卓で内蔵関数を含む物理キーへの機能配置がまったく同じであることが判る。機能やキーアサインはHP製をよく研究した(もしくは真似した)もので、プログラミング機能は存在しないものの、スタックの名称はX・Y・Z・&#039;&#039;&#039;W&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;stack&amp;quot; /&amp;gt;とされ、10個用意されているメモリへの記憶&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {STO}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、メモリからの呼び出し&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {RCL}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、スタックXとYの入替え&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x\!\leftrightarrow\!y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、各スタックを巡回して表示&amp;amp;nbsp;{{keypress|R⬇}}&amp;amp;nbsp;、冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は、HP製と機能ともども同じである。また、度量衡換算機能として、キログラム⇔ポントの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {kg/lb}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、センチメートル⇔インチの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {cm/in}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、リットル⇔ガロンの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {lit/gal}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、摂氏⇔華氏の変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt; {^\circ\mbox{C}/^\circ\mbox{F}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;ができる&amp;lt;ref name=&amp;quot;exchange&amp;quot; /&amp;gt;のも同じだ。&lt;br /&gt;
&lt;br /&gt;
整理すると、このMostek製LSIを採用したRPN関数電卓の機能は、[[HP-35]]の後継機種として1973年5月1日に発売された[[HP-45/HP-46|HP-45]]とほぼ同じになるため、スペックとしてはHPから3年遅れていることになる。&lt;br /&gt;
&lt;br /&gt;
三角関数/逆三角関数の演算で使用できる角度の単位として、本体上部の物理スイッチでは度数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {DEG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とグラード(フランス度)&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {GRAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;しか設定できず、最も使用頻度が高いであろう弧度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {RAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;に設定するには、シフトキー(本機ではfunction keyと名付けている)&amp;amp;nbsp;{{keypress|{{Font color|black|Limegreen|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{F}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}} と入力せねばならない他、度数もしくはグラード(フランス度)から弧度への変換として&amp;amp;nbsp;{{keypress|{{Font color|black|Limegreen|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{F}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が内蔵関数として割り当てられているが、これはMostek製ROMの仕様のようだ。即ち、このROMでは、電源ON直後は物理スイッチに依り度数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {DEG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;モードかグラード(フランス度)&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {GRAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;モード&amp;lt;ref name=&amp;quot;grad&amp;quot; /&amp;gt;、オプションキーと&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で弧度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {RAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;モードで動作する。そのため、電源スイッチ以外の物理スイッチを増設することによる価格高騰や要らぬ故障の誘発を嫌ったからか、[http://www.taschenrechner-sammlung.de/Calculators/Sanyo-CZ-2901/Contents.htm Sanyo CZ-2901]以外の4機種ではグラード(フランス度)モードが省略されている。&lt;br /&gt;
&lt;br /&gt;
また、この同じ時期(1975年〜1976年)に、アナログ半導体の代名詞として有名な大手半導体ベンダであり10年ほど前にTIに買収された[https://en.wikipedia.org/wiki/National_Semiconductor ナショナル セミコンダクター](通称ナショセミ)も、自社開発のLSIによるRPN電卓を7機種([https://www.calculator.org/calculators/Novus_650.html Novus 650 Mathbox]/[https://www.calculator.org/calculators/Novus_3500.html Novus 3500 Sliderule]/[[National Semiconductor 4510|Novus 4510 Mathematician]]/[https://www.calculator.org/calculators/Novus_4515.html Novus 4515 Mathematician PR]/[https://americanhistory.si.edu/collections/search/object/nmah_1305758 Novus 4520 Scientist]/[https://www.calculator.org/calculators/Novus_4525.html Novus 4525 Scientist PR]/[https://www.calculator.org/calculators/National_Semiconductor_4640.html National Semiconductor 4640])製造・販売したが、この7機種で撤退している&amp;lt;ref name=&amp;quot;ns /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
このような一連の経緯が判ると、1975年〜1976年の電卓業界の様子が目に浮かぶ。即ち、&lt;br /&gt;
*電卓戦争も終戦間近であるこの時期には既に、一部からは圧倒的な支持を受けていたものの、RPNはマイノリティとなっていたこと。&lt;br /&gt;
*RPN関数電卓はHPしか製造・販売しておらず販売価格も高止まりしたままであることを見据えて、HP以外の電卓メーカが価格勝負でRPN関数電卓市場へ参入しようとしていたこと。&lt;br /&gt;
*HPからRPN関数電卓専用LSIの製造を受託されRPNの肝を知っているはずのMostekがRPN関数電卓専用のチップセットを作っても、その演算速度は超鈍足&amp;lt;ref name=&amp;quot;scpa&amp;quot; /&amp;gt;で、世界中で6機種にしか採用されず、RPNの実装に一日の長があるHP以外がRPNに手を出すことを躊躇わせるには十分な出来事だったであろうこと。&lt;br /&gt;
*1973年に電卓市場へ参入したナショセミは、自社の半導体工場でLSIを開発・製造できるため、価格競争力が他社より強い&amp;lt;ref name=&amp;quot;price&amp;quot; /&amp;gt;にもかかわらず、PRN電卓の販売継続を断念せざるを得ないほど、HPの機能と性能が勝っていたこと。&lt;br /&gt;
が容易に想像できるのだ。&lt;br /&gt;
&lt;br /&gt;
ただ、結果論ではあるものの、これ以降「RPN電卓」という製品そのものがHPの独擅場となってしまった。これが良かったのか悪かったのか、判断に苦しむところではある&amp;lt;ref name=&amp;quot;judge&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
ちなみに、本機の基板にはMostek製LSI以外に、東芝製の、表示部に採用されている14桁分の&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;VFD&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;蛍光表示管&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;ドライバICが3個実装されている。VFDは1966年に日本で発明された技術で、電卓戦争の最中に電卓の表示部として採用されたことで技術が進歩したデバイスだが、裏を返せば、1970年代の電卓で表示部にVFDを採用しているのはほぼ日本メーカのみであり、海外メーカは殆どで7セグメントLEDを採用しているため、表示部がVFDというだけで日本製の電卓である可能性が極めて高い。&lt;br /&gt;
&lt;br /&gt;
再三記述している通り、本機は輸出専用機種だったからか、国内で入手するのはほぼ不可能で(少なくとも管理人は国内で売られているのを見たことがない)、eBayをはじめとする中古市場やオークションサイトで海外から購入するしかない。管理人は4台所有しているが、入手先はスペイン・イギリス・旧東ドイツ・アメリカとバラバラである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-749}6813.85411\ \; (\varepsilon\!_R=9.99\times10^{-4})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 43.0000000000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||不明&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||単3形×3本&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1975年？〜1976年？&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||日本&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1976年発売当時の定価||不明&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;first&amp;quot;&amp;gt;まったくの余談だが、小学校低学年だった管理人が初めて触れた電卓は、自宅の居間に転がっていた[https://www.tus.ac.jp/info/setubi/museum/db/database/dentaku_data/omuron/16203.html OMRON 8S]である。管理人が産まれる前の新婚だった母親が家計簿をつける際の、算盤からの乗換え先だったようだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ni-cd&amp;quot;&amp;gt;本機は、乾電池の代わりに単3形Ni-Cd充電池を装着し、別売の純正ACアダプタ(4510AL)で充電して使用することもでき、満充電まで15時間と記載されている。附属マニュアルと電卓背面の銘板によれば、ACアダプタの出力は「DC4.5V、200mA、センターマイナス極性」で、本体上面左側のジャックを確認すると現在最も標準的な「⌀2.1mmプラグ」であるため、[https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=6AYJ-FMF7 センターマイナス極性への変換]だけ注意すれば、[https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-05MT Ni-Cd充電池]と[https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-57ZY ACアダプタの代替品]はいくらでも入手可能である。充電池はNi-MH充電池でも問題無いと思うが試していない。&amp;lt;br&amp;gt;なお、HP製RPN関数電卓では、RPN電卓マニアによる充電回路の解析や実験で、交換する充電池がNi-CdではなくNi-MHでも問題無いことが確認されているため、同じ形でも充電容量が2倍以上多いNi-MHへの置換が急速に進んでいる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;wholesale&amp;quot;&amp;gt;ほぼ同時期に販売されていたと推定される[http://www.taschenrechner-sammlung.de/Calculators/Sanyo-CZ-2901/Contents.htm Sanyo CZ-2901]の、オーストラリアでの販売価格が[https://people.eng.unimelb.edu.au/jzobel/calculators/page2.html 60ドル]だったそうだ。AUDにしろUSDにしろ、1975年頃は1ドル＝300〜320円なので、日本円で約20,000円と考えて良いだろう。とすると、メーカからの卸値は32〜34ドル＝10,000円周辺だろうか。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;book&amp;quot;&amp;gt;やはり売れなかったようで、2020年時点では、当時出版された実物(古本)の存在が確認できていない。[https://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/archv021.cgi?read=220338 所有者は居る]ので、出版されていたことは間違いないようだが。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;stack&amp;quot;&amp;gt;HP製RPN電卓で3+1段スタックの場合はX・Y・Z・&#039;&#039;&#039;T&#039;&#039;&#039;と名付けられ、最上位である4段目のTは&#039;&#039;&#039;Top&#039;&#039;&#039;の略だが、本機の4段目である&#039;&#039;&#039;W&#039;&#039;&#039;の意味は、附属マニュアルにも解説書にも記載されておらず不明である。管理人の想像では「アルファベット順がW→X→Y→Zだから」。つまり、Wに特段の意味は無く、日本語で甲・乙・丙・丁や仁・義・礼・智を使うときと同様、単なる記号であろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ns&amp;quot;&amp;gt;ナショセミは中置記法の(関数)電卓も自社開発LSIで多機種を製造・販売していたが、1980年頃には電卓市場そのものから撤退している。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;exchange&amp;quot;&amp;gt;このMostek製LSIでは、キログラム⇔ポントの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {kg/lb}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、センチメートル⇔インチの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {cm/in}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、リットル⇔ガロンの変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {lit/gal}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、摂氏⇔華氏の変換&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt; {^\circ\mbox{C}/^\circ\mbox{F}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が、それぞれ&amp;amp;nbsp;{{keypress|{{Font color|black|Limegreen|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{F}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;と&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;}} に割り当てられている。なお、[[HP-45/HP-46]]には&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt; {^\circ\mbox{C}/^\circ\mbox{F}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が実装されていない。&amp;lt;br&amp;gt;尤も、もし本機が日本国内で開発されていたなら、このような度量衡換算機能は実装されないだろう。これらはすべてアメリカやヨーロッパで使用されている単位系で、日本国内では換算する需要がほぼ無いだからだ。その意味でも本機の開発が日本国内ではないことが判る。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;scpa&amp;quot;&amp;gt;1984年11月9日にアメリカで[https://en.wikipedia.org/wiki/Semiconductor_Chip_Protection_Act_of_1984 Semiconductor Chip Protection Act (半導体チップ保護法)]が成立する前まで、世界中の半導体ベンダが互いに競合他社の回路パターンを剽窃して製造・販売すること自体が違法ではなく、特に、世界初のマイクロプロセッサである[https://en.wikipedia.org/wiki/Intel_4004 Intel 4004]を開発したIntelはそれに悩まされ続けた。裏を返せば、この時期のMostekは、HPが起こした回路パターンを剽窃することも可能だったのだが、HPとの契約なのか、単に紳士協定なのか、Mostekはそれをやらなかったようだ。なお、日本でも、1985年5月31日公布の[https://ja.wikipedia.org/wiki/半導体集積回路の回路配置に関する法律 半導体回路配置保護法]により、登録から10年間保有できる[https://ja.wikipedia.org/wiki/回路配置利用権 回路配置利用権]が知的財産権の1つとして定義され、違法となった。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;price&amp;quot;&amp;gt;一例として、1975年末時点で、HPが[[HP-45/HP-46|HP-45]]の定価を395ドルから195ドルへ値下げして販売していた時、ナショセミは対抗機種である[https://www.calculator.org/calculators/National_Semiconductor_4640.html National Semiconductor 4640]を半値以下の[http://www.vintagecalculators.com/html/national_semiconductor.html 90ドルで販売]できていた。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;judge&amp;quot;&amp;gt;2001年時点のHPの莫迦な経営判断で強制的に終幕させられてしまい、今となっては「RPN電卓」という製品そのものが廃れたも同然であることと、現在のHPに電卓の製造品質を保つ能力が無いことが[[HP-10C/HP-11C/HP-15C#cite_note-le-3|HP-15Cの限定復刻版]]の製造時に白日の下に晒されたことから、終幕させられる前のHPによる、一貫して無駄に高品質なRPN電卓が市場に供給され続けたこと自体が世界中の好事家を熱狂させたという事実を考慮すると、良かったのではないかと思う反面、RPNそのものはプログラミング言語やCPUアーキテクチャで生き続けており死ぬことは有り得ないので、粗製濫造でも構わないから「RPN電卓」という製品は生き長らえて然るべきとも考えており、この面では悪かったのではないかと思う。つまり、愛憎相半ばする感想を抱いている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;grad&amp;quot;&amp;gt;物理スイッチでソフトウェアROMの特定のピン間を短絡することで&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {GRAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;モードとなる。よって、物理スイッチが常時ONとなるような故障が発生すると、度数モードが使用できなくなる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-34C&amp;diff=6802</id>
		<title>HP-34C</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-34C&amp;diff=6802"/>
		<updated>2025-05-06T04:15:03Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1979年7月1日〜1983年4月1日に販売された、[[HP-25]]を含むWoodstockシリーズの次の世代にあたる、第三世代の上級プログラム関数電卓。この世代はSpiceシリーズと呼ばれているが、本機のコードネームは[https://dictionary.cambridge.org/us/dictionary/english/basil Basil (ハーブの一種。バジリコ)]である。&lt;br /&gt;
__TOC__&lt;br /&gt;
本機はSpiceシリーズの科学・工学・数学向け関数電卓では最上位機種に当たるが、ポケット関数電卓として世界で初めて、&amp;lt;math&amp;gt;f(x)=0&amp;lt;/math&amp;gt;&amp;amp;nbsp;形式の任意の方程式で、&#039;&#039;&#039;&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;方程式の求根&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;ルートソルバ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {SOLVE}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と、任意の区間で定積分を演算する&#039;&#039;&#039;数値積分&#039;&#039;&#039;&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \int_{y}^{x}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の2機能が実装されたことと、本機の階乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x!&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は、階乗の概念を複素数全体に拡張した特殊関数である[https://en.wikipedia.org/wiki/Gamma_function &#039;&#039;&#039;ガンマ関数&#039;&#039;&#039;]が演算できる&amp;lt;ref name=&amp;quot;gamma&amp;quot; /&amp;gt;ことが最大の特長である。スタックXに非負の整数をプッシュして&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x!&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すれば階乗を、任意の数をプッシュして&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;を減算後に&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x!&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すればガンマ関数を、それぞれ演算する。96関数を内蔵した本機の物理キーは30個しか無いことから、1個の物理キーに4機能を割り当てるべく、シフトキーが&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|{{Font color|black|DeepSkyBlue|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{g}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|{{Font color|white|black|&amp;lt;math&amp;gt;\; \color{white}{\mathbf{h}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;の3段構えとなった。3段シフトキーはClassicシリーズの[[HP-65]]・[[HP-67/HP-97|HP-67]]に続き3機種目で、一部では[https://www.thimet.de/CalcCollection/Calculators/HP-34C/Contents.htm リアルモンスター]とも呼ばれている。&lt;br /&gt;
&lt;br /&gt;
プログラムは通常で70行、20個あるユーザレジスタを開放することで1レジスタあたり7行追加できるため最大で210行を保存できる。[[HP-25]]とは異なりサブルーチンや間接ジャンプ命令も設定できるうえ、本機の型名の末尾にCがある&amp;lt;ref name=&amp;quot;c&amp;quot; /&amp;gt;通り、バッテリに残容量がある限りは電源をOFFにしてもレジスタやプログラムの内容は保存される。&lt;br /&gt;
&lt;br /&gt;
これ以外はこれまでのハードウェアを踏襲しており、赤色7セグメントLEDによる10桁表示、純正ACアダプタ(HP 82087&#039;&#039;&#039;B&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;b&amp;quot; /&amp;gt;)で純正充電池(HP 82109A)を充電することで最大3時間ほどコードレスで使用できるなど、ほぼ同じである。HP 82109Aの実態は2本直列の単3形Ni-Cd充電池だが、[[HP-25]]の純正充電池(HP 82019A/B)とは異なり、専用プラスティックケースに収めたものではなく単3形電池を2個並べた外形そのままであるため、現代であれば単3形アルカリ乾電池で置き換えて使用するほうが便利である。ただ、その外形故、様々なベンダから純正充電池の代替となる充電池が販売されており、充電池の入手には困らない。&lt;br /&gt;
&lt;br /&gt;
===販売政策の犠牲に===&lt;br /&gt;
このように本機は割と華々しくデビューしたのだが、残念ながらあまり人気が出ず、販売台数は伸びなかった。理由は「HPによるRPN関数電卓のラインナップと価格の政策」にある。1979年7月1日、HPは本機と同時に、現在でも大変人気がある[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の初代である[http://www.hp-collection.org/calculators/41c.html HP-41C]も発売したのだ。&lt;br /&gt;
&lt;br /&gt;
本機発売当時のHPは、RPN関数電卓のラインナップと価格の政策上、本機と[http://www.hp-collection.org/calculators/41c.html HP-41C]の存在意義を明確に分けていた。両機を比較すると、販売価格では、本機は[http://www.hp-collection.org/calculators/41c.html HP-41C]の半値で、実装された機能では、本機は単体でルートソルバや数値積分があるものの[http://www.hp-collection.org/calculators/41c.html HP-41C]は単体でこれらを演算できず、別売の純正アプリケーションパック(HP-41シリーズ用数学拡張モジュールもしくは[[HP_5061-7287|HP-41シリーズ用数学・統計拡張モジュール]])を購入する必要があった。これらの差は、経済面から購入時の制約が厳しいものの高機能なプログラム関数電卓を求める購買層には本機を、制約が緩い購買層には[http://www.hp-collection.org/calculators/41c.html HP-41C]を、という意図で付けられたものと推定されている。尤も、本機には拡張性が無く、表示部は部品価格も仕様も熟れた7セグメントLEDを採用しだが、[http://www.hp-collection.org/calculators/41c.html HP-41C]には4口の拡張スロットが設けられ、HPでは初めて液晶ディスプレイを採用し、実装したLSIやICの数も倍以上多い等、両機に価格差を付けなければならない要素は政策以外にも十分有るのだが、それらを差し引いても、人気面や販売量で本機は[http://www.hp-collection.org/calculators/41c.html HP-41C]に敵わなかった。&lt;br /&gt;
&lt;br /&gt;
その結果、当時の購入希望者が、本機の販売時期と実装された機能と価格を、前世代である[[HP-25]]および[http://www.hp-collection.org/calculators/25c.html HP-25C]と[http://www.hp-collection.org/calculators/41c.html HP-41C]を含めて比較すると、ちょうど狭間に落ち込む形で没個性に映ってしまったことと、1982年7月1日にHPは本機の後継機種として[[HP-10C/HP-11C/HP-15C|HP-15C]]を発売したが、当然のように本機より高機能かつ低価格となった[[HP-10C/HP-11C/HP-15C|HP-15C]]が選択されたからである。マニアの間では「[[HP-25]]や[http://www.hp-collection.org/calculators/25c.html HP-25C]を買って数年後に、本機と[http://www.hp-collection.org/calculators/41c.html HP-41C]を同時に売られても、財布が持たない」「最大の敵は[[HP-10C/HP-11C/HP-15C|HP-15C]]と[[HP-10C/HP-11C/HP-15C|HP-11C]]。(中略) 本機を十分に拡張したのが[[HP-10C/HP-11C/HP-15C|HP-15C]]であり、本機からルートソルバと数値積分を削ると[[HP-10C/HP-11C/HP-15C|HP-11C]]になる」「比較すれば[http://www.hp-collection.org/calculators/41c.html HP-41C]が本機より優れていたのは明白だ。本機を選択する唯一の理由は価格だ」等と[https://archived.hpcalc.org/museumforum/thread-32470.html 議論]された。通常の四則演算は当然として、本機が内蔵している各種関数を使用した演算性能そのものは現代でも通用する精確さがあるだけに、非常に残念な扱いをされてしまったことになる。&lt;br /&gt;
&lt;br /&gt;
その後にHPが[[HP-10C/HP-11C/HP-15C|HP-15C]]を発売した際にも、HP-41シリーズを[[HP-12C]]/[[HP-10C/HP-11C/HP-15C|HP-15C]]/[[HP-16C]]等と同等以上に関数や機能を拡張するためのアプリケーションパックである[[HP 5061-7285|HP-41シリーズ用アドバンテージ拡張モジュール]]を発売することで、このラインナップと価格の政策を維持した。即ち、購入時の制約が厳しい層に勧める機種を本機から[[HP-10C/HP-11C/HP-15C|HP-15C]]に置き換えたのだが、皮肉なことに、それまでのHP製RPN関数電卓とは一線を画す斬新かつ小型なデザインの筐体、表示部に液晶ディスプレイを採用したことでバッテリの長寿命化に成功しACアダプタを不要にしたこと、そしてなにより本機に実装された機能や関数に加え複素数が扱え行列も演算できるのに本機より低価格であること等、本機と比較する気を失せさせるほど高機能な[[HP-10C/HP-11C/HP-15C|HP-15C]]は爆発的に売れた。ますます本機の立つ瀬が無い。[[HP-10C/HP-11C/HP-15C|HP-15C]]は1989年1月1日に終売となり、現在でも製造復活が所望される名機にまで登り詰めたが、1983年4月1日の販売終了後は誰からも省みられることなく姿を消した本機とは、あまりに対照的である。もし本機が喋るとしたら、己の不遇を託つであろう2機種のうちのひとつが本機である(もうひとつは[[HP-55]])。&lt;br /&gt;
&lt;br /&gt;
なお、このラインナップと価格の政策は、8年半後の1988年1月1日に一新され、その3日後である1988年1月4日に発売した[[HP-28S]]から適用された。その間に劇的な進歩を遂げた半導体の品質向上と価格低下が、一新せざるを得ない状況にHPを追い込んだからだ。尤も、[https://www.hp-collection.org/calculators/28c.html HP-28C]とその改良版である[[HP-28S]]は、ユーザからもHPからも「失敗作」と捨て置かれたため、本機や[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]を含む科学・数学向けRPN関数電卓の後継機種は、機能からも販売価格からも[[HP-42S]]のみ1機種に収斂されてしまい、1990年3月16日に[[HP-48SX]]が発売されるまでは雌伏の時期&amp;lt;ref name=&amp;quot;lying&amp;quot; /&amp;gt;だったのだが。この意味で[[HP-42S]]は〝一般ユーザ向け〟のRPN関数電卓の、ひとつの頂点であろう。〝RPN電卓マニア向け〟の頂点は[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]から不動だ。&lt;br /&gt;
&lt;br /&gt;
以上のような状況と、現代でも充分通用する演算精度を持つ本機を既存のユーザが手放す動機がほぼ皆無であることから、eBayをはじめとする中古市場やオークションサイトには殆ど出品されず、状態の良い個体を入手するには同志の伝手を辿ったほうが早い。これは他のSpiceシリーズでも同様だ。また、この状況に引き摺られるように、HP電卓マニアによるSpiceシリーズに関するアーキテクチャやチップセットのプロセッサクロック周波数等のハッキング情報が皆無だ&amp;lt;ref name=&amp;quot;clock&amp;quot; /&amp;gt;。これらをハックするには否が応にも分解する必要があるが、比較的気軽に分解できるほどタマが無いのか、そもそもマニアですらSpiceシリーズに興味が無いのか…もしかすると、歴代のHP製RPN関数電卓で最も謎に包まれているのがSpiceシリーズかもしれない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7}507225.705\ \; (\varepsilon\!_R=1.33\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 42.99999997&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||不明 (Spice)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||HP 82109A (2.4V 450mAh 充電池:中身は単3形Ni-Cd充電池×2個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1979年〜1983年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||アメリカ、シンガポール、ブラジル&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1979年発売時の定価||150ドル (約35,850円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;gamma&amp;quot;&amp;gt;階乗はSpiceシリーズから実装された関数だが、そもそも階乗が実装されていない[[HP-25]]は当然として、階乗が実装されている[[HP-41CX]]や[[HP-42S]]でもガンマ関数を演算するにはプログラムを組む必要がある。ちなみに、本機の次にポケットRPN関数電卓単体でガンマ関数が演算できる機種は[[HP-10C/HP-11C/HP-15C|HP-15C]]である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;c&amp;quot;&amp;gt;型名の末尾に付けられたCの意味は[[HP-25#cite_note-25c-5|HP-25の脚注]]を参照のこと&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;b&amp;quot;&amp;gt;Spiceシリーズの純正ACアダプタにはHP 82087&#039;&#039;&#039;A&#039;&#039;&#039;も存在するが、本機のように型名の末尾にCが付けられたSpiceシリーズの機種では必ずHP 82087&#039;&#039;&#039;B&#039;&#039;&#039;を使うよう指示されている。本機マニュアル271ページでは&#039;&#039;Use only the &amp;quot;B&amp;quot; suffix version ac adapter/recharger shipped with your calculator (see product number on recharger). Earlier &amp;quot;A&amp;quot; suffix version rechargers will not damage your calculator, but may clear continuous memory when plugged in. (本機に同梱されているBバージョンのACアダプタ/充電器のみを使用してください(充電器の製品番号を参照してください)。それ以前のAバージョンを使用しても本機は破損しないものの、連続メモリの内容をクリアしてしまうかもしれません。)&#039;&#039;と警告している。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lying&amp;quot;&amp;gt;[[HP-28S]]を失敗作と断じたことから、HPは、依然として売れ行きが好調だった[[HP-41CX]]を249ドル(約35,000円)に値下げして1990年11月1日まで販売していた。[[HP-42S]]が性に合わなかったり、[[HP-10C/HP-11C/HP-15C|HP-15C]]の購入を逸してしまったユーザへの救済策でもある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;clock&amp;quot;&amp;gt;[https://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/archv016.cgi?read=107447 全機種で同じベンチマークプログラムを走らせ、これが走り切る時間を計測することで他機種と比較する]手法では、220kHzの[[HP-10C/HP-11C/HP-15C|HP-15C]]よりは速いことが判っており、300〜350kHz程度ではないかと推定されている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=PPC_ROM&amp;diff=6799</id>
		<title>PPC ROM</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=PPC_ROM&amp;diff=6799"/>
		<updated>2025-05-06T01:10:00Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓周辺機器|frame=1}}&lt;br /&gt;
&lt;br /&gt;
[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のユーザコミュニティがハッキングにより創出した&#039;&#039;&#039;合成的プログラミング(Synthetic Programming)&#039;&#039;&#039;を、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のユーザであれば誰でも実行できるようにするための[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]ルーチンをまとめた同人モジュール。[[HP-41CX]]の拡張スロットに装着し、合成的プログラミングを実行する。1981年12月末にPPC ROM PROJECT名義で有償頒布された。PPCはPersonal Programming Centerの略で、1974年6月にRichard J. Nelsonが創設した、アメリカ・カリフォルニア州サンタアナを本拠とするHP製RPN関数電卓ユーザコミュニティの大手。モジュール背面に記されるパッケージ名称は〝&#039;&#039;&#039;PPC ROM&#039;&#039;&#039;〟。&lt;br /&gt;
&lt;br /&gt;
その高性能と多機能っぷりから11年5ヶ月もの長期に渡り販売され続けた[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]には、HPは勿論サードパーティからも[https://calc.fjk.ch/db/hp41mod.php 多種多様なアプリケーションパック]が市場に投入されたが、本モジュールはこれらと異なりアプリケーションソフトウェアではない。[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]でプログラムを実行する際、内蔵ソフトウェアが抱えるバグを突いてOSを乗っ取り、ユーザがマニュアルの記載通りに使用していればアクセスできないはずの「OSだけが使用するメモリ空間」にアクセス、そこに記憶している内容をユーザの任意のものに書き換えることで、マニュアルに記載している関数や機能より高度かつ高機能に動かすための、122個のルーチン集である。よって、本モジュールはプログラミングをしないと機能せず、単体で挿してルーチンだけ実行しても何の意味も無い。液晶ディスプレイに&amp;lt;code&amp;gt;NONEXISTENT&amp;lt;/code&amp;gt;と実行不能エラーを表示して停止するだけだ。&lt;br /&gt;
&lt;br /&gt;
122個のルーチンには[[HP 5061-7287|HP-41シリーズ用数学・統計拡張モジュール]]や[[HP 00041-14003|HP-41シリーズ用財務・金融拡張モジュール]]を装着することで使用できる機能と類似するものも含まれるが、その大半は、通常の[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]では実行できない&#039;&#039;&#039;「あるレジスタ(またはスタック)に格納された数値/演算結果を、ユーザ(またはプログラマ)の任意の形式/場所で、閲覧/変換/移動/削除する」&#039;&#039;&#039;機能を提供するもので埋められている。各ルーチンには2レターコードが割り当てられており(例えば「高精度積分ルーチン」には積分:&#039;&#039;&#039;I&#039;&#039;&#039;nte&#039;&#039;&#039;g&#039;&#039;&#039;rateから&amp;lt;code&amp;gt;IG&amp;lt;/code&amp;gt;)、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]でプログラムを組むときや実行するときにプログラマがそれを指定することで本モジュールからルーチンを呼び出して適用する。現代なら差し詰め〝チートツール〟とでも言うのだろう。&lt;br /&gt;
&lt;br /&gt;
同人モジュールなので[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の製造元であるHPのサポートは皆無だが、[https://literature.hpcalc.org/items/1330 電話帳にも喩えられるほど分厚い(492ページ)丁寧かつ詳細なマニュアル]が附属しており、ルーチンの中身や使用法で迷うことは無い。実行できる内容も実行した結果も申し分無く、本モジュールを装着した[[HP-41CX]]は一介の関数電卓から高機能かつ多機能な数値解析システムへと進化する。&lt;br /&gt;
&lt;br /&gt;
ebayをはじめとする中古市場やオークションサイトでは[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]本体以上の高値で取引されるが、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]を使用するなら、それを押して購入すべきだろう。管理人は保有する[[HP-41CX]]の台数以上の個数を常に確保しており、4口ある拡張スロットの1口に本モジュールを装着している。&lt;br /&gt;
&lt;br /&gt;
本モジュールのマニュアルの前言では、特長として下記が列挙されている。&lt;br /&gt;
&lt;br /&gt;
* 何百名ものユーザによってプログラムされ、文書化されている&lt;br /&gt;
* 1バイトあたりの機能比が抜群&lt;br /&gt;
* 非常に完全な技術的詳細&lt;br /&gt;
* 追加ヘルプのための個人的な連絡先&lt;br /&gt;
* ルーチンROM - アプリケーションプログラムROMではありません。これはプログラマのためのROMです&lt;br /&gt;
* すべてのHP-41ユーザが合成的プログラミングのフルパワーを利用できる&lt;br /&gt;
* オペレーティングシステムの拡張と強化プログラム&lt;br /&gt;
* 最速の数値ソートルーチン&lt;br /&gt;
* ブロック演算と行列演算の定義とプログラム化&lt;br /&gt;
* 財務計算の機能拡張と精度向上&lt;br /&gt;
* 称賛に値する積分プログラム&lt;br /&gt;
* 大幅に拡張されたマルチプロット高解像度グラフィックプログラム&lt;br /&gt;
* Viewフラグで設定したフラグの行列式の印刷&lt;br /&gt;
* ブロックビューでのゼロデータのスキップ&lt;br /&gt;
* &amp;lt;code&amp;gt;XE&amp;lt;/code&amp;gt;ルーチンによるHP-41の全ROMへのアクセス向上 &lt;br /&gt;
* &amp;lt;code&amp;gt;IP&amp;lt;/code&amp;gt;ルーチンと&amp;lt;code&amp;gt;PS&amp;lt;/code&amp;gt;ルーチンを使用したQUAD&amp;quot;ページ&amp;quot;切替によるメモリの拡張&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
===頒布された経緯と背景 - &#039;&#039;バグから出た怒り&#039;&#039;===&lt;br /&gt;
このような〝電卓向け〟の〝同人ソフトウェア〟というトリッキー極まりない際物が40年も前に頒布された経緯と背景は非常に興味深いため、以下に概略を記述する。&lt;br /&gt;
&lt;br /&gt;
1970年代中盤になると、民生品向けに採用される程度に普及し始めた8ビットマイクロプロセッサを応用した製品として、個人でも購入できるコンピュータ＝パーソナルコンピュータが製造・販売されるようになった。様々なメーカが市場に参入したが、成功と見做されるのは1977年に発売された[https://en.wikipedia.org/wiki/Apple_II Apple II]であろうか。しかし、[https://en.wikipedia.org/wiki/Apple_II Apple II]の当時の定価は最小構成でも1,298ドル(約354,000円)と高価で、購入できる層は非常に限定された。なによりOSやプログラミング環境を含むソフトウェアが未熟かつ高価だったことと、現代と比較すれば玩具同然のハードウェアスペックだったことも相俟って、好事家以外にまで受け容れられる状況ではなかった。&lt;br /&gt;
&lt;br /&gt;
[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の初代である[http://www.hp-collection.org/calculators/41c.html HP-41C]が295ドル(約65,000円)で発売された1979年当時、職務上必要だったり、趣味で欲したりするであろう、HPの本拠たる[http://www.garbagenews.net/archives/1971980.html アメリカで年収五分位における中位年収層の平均年収は約50,000ドル]＝平均月収は約4,170ドル(約921,600円)であった。アメリカでの所得税等の非消費支出は収入の35%程度だそうなので、月収換算で約2,700ドル(約600,000円)になる。この程度の収入があれば個人でも[http://www.hp-collection.org/calculators/41c.html HP-41C]は購入可能だ。このような時代背景を考慮すると、電池で駆動する可搬型で、プログラミング環境と機能拡張のための外部インタフェースがオプションを購入せずとも実装済で、現代でも通用する精確な数値解析を含む演算が実行できる関数電卓として販売された[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が、アッという間に多数のユーザを獲得し、熱狂させ、[https://en.wikipedia.org/wiki/Hacker_culture ハッキング]を伴う同人活動が自然発生する必要条件を十分満たしていたと言えよう。&lt;br /&gt;
&lt;br /&gt;
エンジニアや科学者に一大旋風を巻き起こした[[HP-65]]の発売から約半年経った1974年6月に&amp;quot;HP-65 Users Club&amp;quot;として組織されたPPCは、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が発売されたこの時期にハッキング活動量のピークを迎えていた。それまでも[http://www.hp-collection.org/calculators/41c.html HP-41C]では[https://www.finseth.com/hpdata/hp41c.php 様々なバグの存在が指摘されていた]が、このときPPCは、本来であればユーザが触れることすらできないはずの、マイクロプロセッサと内蔵ソフトウェアによる演算処理中の「OSだけが使用するメモリ空間」が、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が内蔵している「FOCALプログラムやテキストファイルを作成・編集するエディタ機能」で直接覗ける(readできる)バグを発見した。&lt;br /&gt;
&lt;br /&gt;
このバグを突いて、PPCの会員が「OSだけが使用するメモリ空間」を覗いたところ、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]は下記の挙動であると解析された。&lt;br /&gt;
&lt;br /&gt;
[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]に実装された命令には、ユーザが物理キーの押下かアルファベット文字列と&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text{XEQ}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の組合せ入力で指示する演算命令(関数や機能)である「マクロな命令」と、それを内部で順番に実行するひとつひとつの手順(処理)である「ミクロな命令」がある。「ミクロな命令」は内蔵関数や機能で共通して使い回せる単位に分解されたものなので、必要な「ミクロな命令」を順番にひとつひとつ処理することで、内蔵されたりアプリケーションパックによって拡張されたりした多種多様な関数や機能である「マクロな命令」が実行される。つまり、「マクロな命令」は「ミクロな命令」の集合体である。[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]で機能しているプログラミング言語の視点で整理すると、「ミクロな命令」と「マクロな命令」は[https://en.wikipedia.org/wiki/Low-level_programming_language 低級言語]([https://en.wikipedia.org/wiki/Machine_code 機械語])に、[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]は[https://en.wikipedia.org/wiki/High-level_programming_language 高級言語]に、それぞれ分類され、包含関係は「ミクロな命令」⊂「マクロな命令」⊂ [https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]となる。&lt;br /&gt;
&lt;br /&gt;
なぜこんな回りくどい実装なのか。その理由は、多種多様な関数や機能の中で同じ処理を共通化(ルーチン化)することで、可用性が広がるのと同時にソフトウェアが極小化でき、ひいては内蔵関数を増やせることが期待できるからだ。半導体が高価だった頃の常套手段である。[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]での実際の実装とは異なる代表例だが、乗算は被乗数を乗数回加算するものと[https://en.wikipedia.org/wiki/Multiplication 定義される]ので、マクロな命令である乗算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を、被乗数を乗数回だけ、ミクロな命令である加算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を繰り返す処理で実装する手法&amp;lt;ref name=&amp;quot;method&amp;quot; /&amp;gt;がある。[[RPN電卓/序説#動作|序説]]で言えば、最後の&amp;amp;nbsp;&amp;lt;math&amp;gt;12 \times 5&amp;lt;/math&amp;gt;&amp;amp;nbsp;を&amp;amp;nbsp;&amp;lt;math&amp;gt;12+12+12+12+12&amp;lt;/math&amp;gt;&amp;amp;nbsp;で演算することになるが、どちらも結果は&amp;amp;nbsp;&amp;lt;math&amp;gt;60&amp;lt;/math&amp;gt;&amp;amp;nbsp;が得られ同等である。即ち、乗算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;という関数を実現するために、乗算専用の命令を別個で新規に作るのではなく、既存の加算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を再利用して同等の機能を実現している&amp;lt;ref name=&amp;quot;times&amp;quot; /&amp;gt;。このように「実装する関数や機能をすべて個別に作り込む」のではなく「いくつか『使い勝手が良い』ミクロな命令だけを用意し、それらを再利用して組合せて新しい関数や機能を実現する」手法を積み重ねソフトウェアの規模を極力小さくすることで、ハードウェアとしてのROMの上限まで「『使い勝手が良い』ミクロな命令を組合せた新しい関数」を1個でも多く実装できる余地が生まれる&amp;lt;ref name=&amp;quot;dq1&amp;quot; /&amp;gt;。[[HP-35]]が、僅か7,680バイト(7.5kB)のROMに焼き込んだ767命令&amp;lt;ref name=&amp;quot;hp35&amp;quot; /&amp;gt;で、四則演算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;-&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;は当然として、度数法での三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sin&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cos&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\mbox {arc}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\ln&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とその逆関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;e^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、逆数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、開平&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{x}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;lt;ref name=&amp;quot;exp&amp;quot; /&amp;gt;、円周率&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を実装できたのは、こうした努力の賜物であり好例だろう。塵も積もれば山となる。[https://en.wikipedia.org/wiki/Prajnaparamita 般若経]を解説する[https://en.wikipedia.org/wiki/D%C3%A0_zh%C3%ACd%C3%B9_l%C3%B9n 大智度論]の教えそのままである。&lt;br /&gt;
&lt;br /&gt;
ただし、容易に想像できるように、このような回りくどい形式で実装された関数や機能は、回りくどい演算手順で実行されることになるため、演算(処理)完了まで時間が掛かる。特に、電池で駆動させる可搬型関数電卓に実装できる程度の非力なマイクロプロセッサとメモリの組合せでは、演算桁数を多く(高精度に)設定すると、演算完了までの時間が秒単位で延びる。このことから、製品設計の最初で規定する「『使い勝手が良い』ミクロな命令」は、マイクロプロセッサやメモリなどハードウェアの仕様や実際の挙動と首っ引きして慎重に見極め取捨選択しなければならないことが判る。ソフトウェアとしては使い勝手が良くても、ハードウェアとしては煩雑な処理が強いられる命令を実装してしまうと、ただでさえ遅い演算(処理)完了時間が更に延びることになるため、ここはメーカの腕の見せ所だ。&lt;br /&gt;
&lt;br /&gt;
実際の[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]では「スタックにプッシュされた数値の有無を確認する処理」、「スタックから数値をポップする処理」、「演算した結果をスタックXにプッシュする処理」、「スタックXにプッシュした数値を液晶ディスプレイに表示する処理」など、どの関数や機能でも実行される同じ処理が「ミクロな命令」として共通化されており、あらゆる関数を実行する際は、同じ「ミクロな命令」を呼び出す形となる。&lt;br /&gt;
&lt;br /&gt;
[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]では、「ミクロな命令」は1個が1バイト(8ビット)でバイナリコード化されているため&#039;&#039;&#039;演算処理命令(バイト)&#039;&#039;&#039;と、「マクロな命令」はミクロな命令を処理する順番に並べたものであることから&#039;&#039;&#039;演算処理命令列(バイト列)&#039;&#039;&#039;と、それぞれ呼ばれる&amp;lt;ref name=&amp;quot;call&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
よって、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の「OSだけが使用するメモリ空間」には、演算過程の中間値と、内蔵ソフトウェアから読み出されたバイト列が記憶されることになる。&lt;br /&gt;
&lt;br /&gt;
例えば、ユーザが二項演算の加算を実行すべく、スタックXとスタックYに所望する数値をプッシュし&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーを押下したときを考える。ユーザには「スタックYとスタックXにプッシュした数値をポップし、加算を実行、その結果をスタックXに再度プッシュする」動作だけが見えているものの、「OSだけが使用するメモリ空間」にバイト列として記憶される内容は、「キーが押下されるのを待つ」バイトから始まり、{{keypress|&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;〜&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;9&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の置数キーや&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;キーが押下される度に「どのキーが押下されたか特定する」バイト、「そのキーに割り当てられている演算の種類や数値が何かを特定する」バイト、「入力された数値をスタックにプッシュする」バイト等、最初にユーザから何かしらキーインされた際に順番に処理すべきバイトが、内蔵ソフトウェアから処理する順番に呼び出され、バイト列として記憶される。マイクロプロセッサはバイト列を頭から順番に読み取って(デコードして)実行可能なプロセスに変換して実行することで、ユーザが加算したい数値がスタックXとスタックYにプッシュされる。&lt;br /&gt;
&lt;br /&gt;
ここでユーザが加算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を押下すると、キーインされた関数や演算が加算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;だと特定された後、「対象となる数値をスタックYとスタックXへ検索に行く」バイト、「検索した結果、スタックに数値が存在することを確認する」バイト、「スタックから数値をポップする」バイト、「数値を加算する」バイト、「演算結果をスタックXにプッシュする」バイト、「スタックXにプッシュした数値を液晶ディスプレイに表示する」バイト等、加算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を実行するために順番に処理すべきバイト列が、内蔵ソフトウェアから処理する順番に呼び出されて記憶され、先ほどと同様、マイクロプロセッサはそれを頭から順番にデコードして実行可能なプロセスに変換して実行、すべて走り切ることで、ようやく加算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が完了する。&lt;br /&gt;
&lt;br /&gt;
つまり、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]で何かしらの関数や演算を実行するということは、スタックにプッシュした数値に対して、関数や演算ごとに内蔵ソフトウェアで設定されたバイト列を適用することである&amp;amp;#x2E3A;このように解析されたのだ。&lt;br /&gt;
&lt;br /&gt;
肝腎なのは、この挙動が加算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;に限らずすべての関数や演算で同じであり、ユーザから指定された関数や演算によって内蔵ソフトウェアから呼び出されるバイト列だけが異なる、という点だ。これは、&#039;&#039;&#039;[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の演算処理手法や内容は、ミクロな命令であるバイトを組合せたマクロな命令であるバイト列で規定され&#039;&#039;&#039;ており、&#039;&#039;&#039;内蔵関数やアプリケーションパックがもつ機能に応じてバイト列を変更することで、あらゆる演算を実行している&#039;&#039;&#039;ことを意味している。&lt;br /&gt;
&lt;br /&gt;
更に、この挙動は演算だけに留まらず、装置の管理もまったく同じである。装着されたバッテリの電圧を監視し閾値以下となったら&amp;lt;code&amp;gt;BAT&amp;lt;/code&amp;gt;と警告を表示することや、4口ある拡張スロットに対してアプリケーションパックや周辺機器の装着有無を監視し、もし装着を検知したら、それらとの入出力や制御をすることも、内蔵ソフトウェア(やアプリケーションパックや周辺機器)から読み出したバイト列によって実行している。&lt;br /&gt;
&lt;br /&gt;
と、いうことは&amp;amp;#x2E3A;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;「『OSだけが使用するメモリ空間』がエディタで覗ける(readできる)のであれば、このメモリ空間が記憶している演算処理命令(バイト)をエディタで書き換える(writeする)ことも可能なのでは？」&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;「もし書き換えが可能なら、演算処理命令列(バイト列)を変更できることになるので、演算処理の手法や内容、周辺機器の動作も、ユーザの任意のものに変更できるのでは？」&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
こう想定したPPC会員は更にハッキングを続け、遂に任意のバイトを書き換える(writeする)手順を確立。いざバイト列を書き換えてみたところ、ここでもうひとつ重要な動作仕様を発見する。&#039;&#039;&#039;OSやマイクロプロセッサがバイト列の真正性を検証しない&#039;&#039;&#039;のだ。&lt;br /&gt;
&lt;br /&gt;
言い換えると、OSやマイクロプロセッサが処理する演算処理命令の組合せ＝演算処理命令列が、内蔵ソフトウェアには存在しない、通常では考えられない突飛な内容でも、OSやマイクロプロセッサは何の疑いもせず実行してしまう(どのようなバイト列でも「処理しなければならない」ものとして動いている)のだ。この動作仕様により、HPが[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]では不可能と規定した演算も実行可能であることが確認された。&lt;br /&gt;
&lt;br /&gt;
尤も、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が発売された1980年初頭の時点では、この動作仕様は已むを得なかったと考える。所謂メインフレームをはじめとする大型コンピュータに実装している数値演算プロセッサやOSならまだしも、乾電池で駆動させる関数電卓が内蔵できる非力な4ビットマイクロプロセッサとOSに、演算処理命令列の真正性を検証する仕様を持たせること自体が明らかにオーバースペックで、もし持たせた場合は演算処理が重く遅くなり消費電力が増えることが目に見えているからだ。それ以前に、関数電卓が内蔵するソフトウェアを外部からハッキングされて演算処理命令を書き換えられる事態なんぞHPは想定すらしておらず、したがって、演算処理命令列の真正性はHPの製品開発体制内で担保されると判断したのだろう。インターネットの普及とともに大なり小なり殆どのコンピュータがネットワークを介して相互に接続される現代だと、OSやマイクロプロセッサがこのような動作仕様であれば「とんでもない大穴が開いてるぞ！ 脆弱性だ！」と大騒ぎになり、[https://en.wikipedia.org/wiki/Security_hacker#Cracker クラッカー]の恰好の餌食となるだろうが、ネットワーク接続とは無縁なこの当時のコンシューマ向けコンピュータ製品では妥当だ。&lt;br /&gt;
&lt;br /&gt;
こうして[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]は、ユーザコミュニティの手により、HPが指定した演算処理手法や内容の縛りから(半ば強引に)解放され、ユーザが任意に演算処理内容を操れる自由度を得ることになった&amp;lt;ref name=&amp;quot;preface1&amp;quot; /&amp;gt;。この&#039;&#039;&#039;「HPが指示した演算処理命令(バイト)をユーザが書き換えることで、HPが指定した演算処理手法や内容とは異なる、ユーザが実行させたい新たな演算処理命令列(バイト列)をメモリ内で合成する」&#039;&#039;&#039;手順が合成的プログラミングと呼ばれ、ヘヴィユーザの間で急速に広まっていく。これらを組合せると、HPがマニュアルで公開している関数や機能より遥かに高度かつ高機能な演算やプログラミングが可能だからだ。本モジュールのマニュアルでは端的に下記のように説明している。&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;A &amp;quot;synthetic instruction&amp;quot; is any combination of HP-41C bytes that can not be entered into a program or manually executed using normal keystrokes. Various techniques have been developed that enable the construction of arbitrary byte sequences in program memory. When the 41C processor encounters a byte sequence, it must process it, whether it is a normal combination or not. The results of executing non-standard byte combinations often turn out to have useful, practical applications.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(「合成命令」は、通常のキーストロークではプログラムに入力したり手動で実行したりできない、HP-41Cのバイトの任意の組合せです。プログラムメモリ内に任意のバイト列を構成する様々な技法が開発されました。41Cプロセッサは、バイト列を検出すると、それが通常の組合せであるかどうかにかかわらず処理しなければなりません。非標準なバイト列の組合せを実行した結果は、多くの場合、有用で実用的なアプリケーションになります。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
だが同時にこの事実は「HPは意図的に[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のポテンシャルを大幅に絞ってやがる！」とも受け取られた。&lt;br /&gt;
&lt;br /&gt;
プログラマはふだんから、そのプログラミング環境に用意されたミクロな命令を自由自在に組合せ、マクロな命令を実行するソースコードを書くのが仕事だ。それまでは、HPの御仕着せで自由度が少ない[https://en.wikipedia.org/wiki/High-level_programming_language 高級言語]である[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]でしか[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のソースコードが書けないと思っていたところ、挙動の解析結果から、HPが規定したマクロな命令も内部ではミクロな命令の組合せで動いていて、しかも、HPの手によるミクロな命令の組合せ方は詰めが甘く見え、更に言えば、これら[https://en.wikipedia.org/wiki/Low-level_programming_language 低級言語]で構成されたマクロな命令をユーザの任意に変更できたり、ユーザが新規に任意のマクロな命令を作成できることが判ったのだから、バグによる僥倖とはいえ、怒るのは当然だろう。&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;「[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]として規定・公開しているマクロな命令を、プログラマが欲する粒度のミクロな命令の組合せで動かしているなら、なぜミクロな命令をそのままユーザに使わせてくれないんだ！」&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;「[https://en.wikipedia.org/wiki/High-level_programming_language 高級言語]だけではなく[https://en.wikipedia.org/wiki/Low-level_programming_language 低級言語]も使えるようにしたほうが、木目細かなプログラミングが可能なことは知ってるはずだろ！」&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;「それに、折角のミクロな命令をこんな勿体無い使い方してるんじゃぁ、OSもメモリも、己が持っているはずの能力を完全に出し切れないじゃないか！」&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;「我々プログラマなら、HPよりも上手くミクロな命令を使い熟せて、OSとメモリの潜在能力を使い切れるぞ！」&#039;&#039;&amp;lt;ref name=&amp;quot;time&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
本モジュールのマニュアルにある『合成的プログラミング入門』という章は、怒気を含んだ下記の文面で締め括られている。&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;In closing, it should be reemphasized that there is nothing magic about synthetic programming, despite its strange history and &amp;quot;exotic&amp;quot; creation techniques. Synthetic instructions are just instructions that didn&#039;t happen to find their way into the Owner&#039;s Manual. Their use should be embraced by all serious HP-41C/V programmers.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(最後に、その奇妙な歴史と「風変わりな」作成技法にもかかわらず、合成的プログラミングには何の魔法も無いことを再度強調しておきます。合成命令は、偶々、マニュアルに掲載されなかったにすぎません。HP-41C/Vの本格的なプログラマであれば、合成命令を積極的に活用すべきです。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
このような経緯で広まった合成的プログラミングを、製造・開発元であるHPではその実行を禁止せず、ユーザの自己責任とした。「AYOR (At Your Own Risk) であれば、どうぞご勝手に。その代わり、これを実行した結果どうなろうと、HPに文句を言わないでね」と見逃したのだ&amp;lt;ref name=&amp;quot;preface2&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;preface4&amp;quot; /&amp;gt;。先述した通り、合成的プログラミングは「OSだけが使用するメモリ空間」にもアクセスするため、例えば、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が関数電卓として正常に駆動し続けるうえで変更してはならないバイト列を誤って書き換えると、いとも簡単に完全にロックされ、キーボードからのキーインを含め外部から何の操作も受け付けない状態に陥る。こうなると、バッテリパックを抜去し、メモリに記憶した内容が飛び工場出荷時の状態に戻るまで[https://en.wikipedia.org/wiki/Prostration_(Buddhism) 五体投地]を数時間続けた後、バッテリパックを再度装着、電源を再投入し、無事に工場出荷時の状態で起動してくれるのを願うしかないのだが、合成的プログラミングを実行する度にドキドキしながらこの操作を繰り返さねばならないようでは、とてもではないが危なっかしくて、PPC会員は勿論、他のマニアや一般ユーザが気軽に使用できない。&lt;br /&gt;
&lt;br /&gt;
そこでPPCはHPに[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]に関する仕様や内部文書を開示を要望、合成的プログラミングがより安全に行えるよう、手順やソースコードをブラッシュアップし、アプリケーションパックとしてまとめることを企図した。これが本モジュールの製造名義でもある&#039;&#039;&#039;PPC ROM PROJECT&#039;&#039;&#039;だ。当然、HPも当初は出し渋ったのだが、最終的にはPPCの熱意に負けて開示した&amp;lt;ref name=&amp;quot;preface3&amp;quot; /&amp;gt;。だからといってHPが合成的プログラミングにお墨付きを与えた訳ではなく&amp;lt;ref name=&amp;quot;preface4&amp;quot; /&amp;gt;、40年以上経った現在でもAYORで実行するものだが、開示されたこと自体が本モジュールの開発成功に大きく寄与したのは言うまでもない。&lt;br /&gt;
&lt;br /&gt;
本モジュールのマニュアルの前言に&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;It took two years and two months to complete. The first year was spent in mastering the HP-41 system, and while we were &amp;quot;first in line&amp;quot; for HP&#039;s announced Custom ROM Program, we waited until we could utilize the full power of the HP-41 to produce as complete a programmer&#039;s ROM as possible.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(完成までに2年2カ月を要しました。最初の1年間はHP-41システムを習得するのに費やし、HPが発表した「カスタムROMプログラム」には「一番乗り」したのですが、HP-41をフル活用して、可能な限り完全なプログラマ向けROMを作成できるようになるまで待ちました。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
とある通り、このプロジェクトは作業期間が2年を越える膨大なものとなった。さりとて同人モジュールなので、頒布する期日にデッドラインが設定されているわけではないため、慌てず焦らず急ぎつつ、納得するまでチューニングし万全を期すことを選択しているのは流石だ。HPとの受託製造契約はいの一番に締結したものの、実際に製造する日までもいの一番である必要は無い、と極めて冷静である。&lt;br /&gt;
&lt;br /&gt;
また、一介のユーザコミュニティが同人モジュールを製造・頒布できたのは、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が爆発的に売れたことから様々なサードパーティがHPに対し[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]向けのアプリケーションソフトをリリースすることを希望したことを受け、HPが[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]向けのアプリケーションソフト用のカスタムROMを受託製造する「カスタムROMプログラム」を始めたからであると明記されているのも興味深い。&lt;br /&gt;
&lt;br /&gt;
この「カスタムROMプログラム」を申し込んだサードパーティはかなりの数に上ったらしく、HPは途中でカスタムROMの受託製造費を大幅に値下げした&amp;lt;ref name=&amp;quot;cost&amp;quot; /&amp;gt;。カスタムROMの種類が多くとも、モジュールとしての製造総数が多ければ、製造コストが当初の見積りほど掛からなかいことが判ったからだ。本モジュールも製造時にHPから値下げを告げられたことから[https://www.hpmuseum.org/forum/thread-18935-post-165025.html#pid165025 出資1口について2セット(2個のROM、2冊のポケットガイド、2冊の製本版マニュアル、2冊のルーズリーフ版マニュアル)頒布する]よう方針を転換、完成した本モジュールを出資者へ送付する際は、PPCを主宰するRichard J. Nelsonが認めた&lt;br /&gt;
 &#039;&#039;Because of the economics of numbers and a price reduction that HP made after the project started you actually have two ROMs and two sets of manuals. I believe that it is most fitting that if you &amp;quot;dispose&amp;quot; of one of your ROM&#039;s that you do so to another PPC Member, or to a person who joins PPC.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(規模の経済性と、プロジェクト開始後のHPの値下げにより、貴殿には2個のROMと2セットのマニュアルをお届けします。もし貴殿が、お届けしたROMのうち1個を「処分」するなら、他のPPC会員か、PPCに新規入会した方にするのが、最も適切であると考えます。)&#039;&#039;&lt;br /&gt;
という手紙も同梱した。全出資者に半額相当を返金する手間や送金手数料、PPCへの新規加入者を増やす施策などを考えると、当初の出資金額に見合う2セットを頒布して、1セットは受領した出資者の自由にしたほうが手っ取り早いと考えたのだろう。いかにも大量生産・大量消費を地で行くアメリカらしいマッチョなやり方である。&lt;br /&gt;
&lt;br /&gt;
ちなみに、この手紙には&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;Your ROM&#039;s are serialized. The complete list of serial numbers (1A, 1B thru 2500A, 2500B)&amp;lt;ref name=&amp;quot;serial&amp;quot; /&amp;gt; are in the Manual in Appendix F on page 135. Serial numbers 1997A and 1997B &amp;quot;disappeared&amp;quot; in the packing process. If you ever see either of these ROM&#039;s let me know.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(貴殿のROMにはシリアル番号が付与されています。シリアル番号の完全なリスト(1A, 1B から 2500A, 2500B)&amp;lt;ref name=&amp;quot;serial&amp;quot; /&amp;gt;はマニュアル135ページの付録Fに掲載しています。シリアル番号1997Aと1997Bは梱包の過程で「消えて」しまいました。もしこれらのROMを見かけたら教えてください。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ともあるので、本モジュールの製造に[https://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/archv016.cgi?read=104732 1口あたり95ドル(約22,000円)出資]&amp;lt;ref name=&amp;quot;price&amp;quot; /&amp;gt;した会員が約2,500名&amp;lt;ref name=&amp;quot;users&amp;quot; /&amp;gt;居り、その全員に、数字は同じだが末尾だけAとBに分かれたROMを送付したことが判る。よって、本モジュールは少なくとも5,000個製造された&amp;lt;ref name=&amp;quot;lot&amp;quot; /&amp;gt;ことになる。同人ソフトウェアとしては異例の大量生産だ。裏を返せば、自分たちで計画した同人ソフトウェアの製造に対して2,500名近い会員から賛同を得られ総額237,500ドル(約5,230万円)もの資金を集めることができた当時のPPCは、相当な動員力と資金力を有する巨大なユーザコミュニティだったということになる。2020年代ではよく見掛ける、クラウドファウンティングで資金を集めてニッチなモノの開発・製造するプロジェクトと比較しても引けを取らないどころか凌駕している規模である。&lt;br /&gt;
&lt;br /&gt;
===HPとユーザコミュニティは「ズブズブの〝共犯関係〟」？===&lt;br /&gt;
ここまでの経緯を追うと、大きな謎がひとつ残される。HPのバグ対応の奇妙さだ。&lt;br /&gt;
&lt;br /&gt;
[[HP-35]]での手痛い実例を出すまでもなく、これまでHPは、内蔵ソフトウェアにバグが存在していることが判れば、可及的速やかにソフトウェアからそのバグを取り除き、その後の生産ではバグを取り除いたソフトウェアを焼き込んだROMに差し替える対応をしてきた&amp;lt;ref name=&amp;quot;rom&amp;quot; /&amp;gt;。これはユーザから指摘されたバグでも同様である。&lt;br /&gt;
&lt;br /&gt;
だが、頒布開始が&#039;&#039;&#039;1981年12月末&#039;&#039;&#039;である本モジュールは、&#039;&#039;&#039;1979年7月&#039;&#039;&#039;1日発売の[http://www.hp-collection.org/calculators/41c.html HP-41C]や&#039;&#039;&#039;1980年12月&#039;&#039;&#039;15日発売の[http://www.hp-collection.org/calculators/41cv.html HP-41CV]は勿論、&#039;&#039;&#039;1983年10月&#039;&#039;&#039;1日発売の[[HP-41CX]]でも問題なく同等に機能する。即ち、HPは、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が抱えるエディタ機能のバグを故意に取り除かず存置することで、すべての[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]で本モジュールが正常に機能するよう対応しているかに見えるのだ。&lt;br /&gt;
&lt;br /&gt;
ではなぜHPはこのバグを取り除かず存置したのか。当時のHPが「折角『カスタムROMプログラム』を利用してまで製造した同人モジュールを『無かったこと』にするのは可哀想だし、ここまで育ったユーザコミュニティを大事にしたい」と考えたのか、「このバグを取り除いたソフトウェアを焼き込んだROMを実装した[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が市中に出回ることで、本モジュールが使える筐体と使えない筐体が併存すると判ったときの、ユーザコミュニティの対応が面倒だ」と考えたのか。はたまた逆に「ユーザコミュニティからの要請で、このモジュールが今後も多くのユーザで使えるよう、このバグだけは存置することに決めた」のか。&lt;br /&gt;
&lt;br /&gt;
この謎が管理人の頭の片隅で深い眠りに就いていたあるとき、興味深い公式文書に出くわした。1949年〜1998年にHPが自社の技術開発情報をまとめ月刊誌として公開していた[https://en.wikipedia.org/wiki/Hewlett-Packard_Journal HP Journal]の[https://www.hpl.hp.com/hpjournal/pdfs/IssuePDFs/1981-01.pdf 1981年1月号]には[[HP 82153A]]に関する技術解説記事が掲載されているが、その末尾にある謝辞に、当時のPPCが[[HP 82153A]]の製品化前のテストに協力した旨が記されている&amp;lt;ref name=&amp;quot;ack&amp;quot; /&amp;gt;のを見つけたのだ。この記述は、世間一般のユーザには非公開の機密情報であろう、新しく発売される[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]専用の周辺機器に関する内容を、大手のユーザコミュニティであるPPCにだけは事前に漏洩するどころか、あまつさえ、所属している有力な一部の会員にその製品のテスタとして参加を求め意見を聴取していたことを意味する。&lt;br /&gt;
&lt;br /&gt;
これを素直な人が見たなら「へぇ〜。えらくオープンだな。数多居るHP電卓ユーザの代表として呼んだのだろけど、それぐらい、当時のHPとユーザコミュニティ(特にPPC)の間には信頼関係が成立していたのね」と受け取るのだろうが、俗世の濁りに染まった管理人の目には「おいおい、想像以上にズブズブの〝共犯関係〟じゃねーか。それに、協力を求めたのが『個人』じゃなくて『自社に好意を持っているユーザコミュニティ』というのもイヤラシイ。当然、事前に何かしらの契約書は交わすのだろうけど、そんなことをしなくとも、機密情報を集団に共有させれば自律的に会員相互が機密を漏洩させないか監視し合うだろうことを解ってやっている」と映り、頭の中で熟睡していた謎を叩き起こした。&lt;br /&gt;
&lt;br /&gt;
有り体に言えば、この文書を目の当たりにしたことで、このバグを取り除かず存置した理由として先ほど挙げたいくつかのうち「ユーザコミュニティからの要請を受けて、このバグだけは存置することに決めた」線が濃く見えるようになってしまったのだ。&lt;br /&gt;
&lt;br /&gt;
なにしろ、ユーザコミュニティに出入りするほどではない世間一般の[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]ユーザがマニュアルの記述に従って操作する限り、このバグを踏み抜くことは無いうえ、このバグが存在したとて、マニュアルに記載している仕様通りの演算が実行できることは明確になっている。つまり、このバグは世間一般のユーザに何の影響も無い、所謂 &#039;&#039;harmless issue&#039;&#039; (存在は認識しているが、存在していても無害なバグ)と言えるものだ。&lt;br /&gt;
&lt;br /&gt;
よって、これまでHPが行ってきたバグ対応の過程を把握しているユーザコミュニティが、HPの機先を制して「我々は今後も、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]で合成的プログラミングを実行したいし、継続して本モジュールを使用できる環境を維持・拡大したいから、このバグは取り除かず、そのまま存置して欲しい」と要望、それを受諾したHPがこのバグを &#039;&#039;harmless issue&#039;&#039; に分類し、世間一般のユーザには勿論HP社内の他部署や上層部にもこのように説明もしくは説得することで、「このバグは取り除かず存置する」と決定するのは十分可能だと考えられる。更に、&#039;&#039;harmless issue&#039;&#039; を取り除くときに新しいバグを作り込んでしまう(ことで結果的に改修費用が増大する)可能性や、そもそも &#039;&#039;harmless issue&#039;&#039; を取り除くこと自体の費用対効果が薄い&amp;lt;ref name=&amp;quot;excuse&amp;quot; /&amp;gt;ことも付言すれば、この説明や説得を補強できる。&lt;br /&gt;
&lt;br /&gt;
謂わば、HPとユーザコミュニティの、ズブズブの〝共犯関係〟が、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]からこのバグを取り除かず存置させ続けたのではないだろうか。&lt;br /&gt;
&lt;br /&gt;
元より、このバグが存外に根深く、下手するとソフトウェアを最初から作り直さなければならないぐらい、簡単に取り除けない類のものだった可能性も考えられるが、客観的な事実として、[https://www.finseth.com/hpdata/hp41c.php HP-41Cで指摘されたエディタ機能以外の13個のバグ]&amp;lt;ref name=&amp;quot;cv&amp;quot; /&amp;gt;が[https://www.finseth.com/hpdata/hp41cx.php HP-41CXでは全て取り除かれている]ことから、その可能性は低いだろうことも、この線をより太くさせた。&lt;br /&gt;
&lt;br /&gt;
本モジュールが5,000個以上も製造され&amp;lt;ref name=&amp;quot;lot&amp;quot; /&amp;gt;ユーザコミュニティの手に渡ったことがHPの対応を変えさせたのか、ユーザコミュニティとの〝共犯関係〟がこのバグを取り除かせなかったのか&amp;amp;#x2E3A;謎は深まるばかり&amp;lt;ref name=&amp;quot;mystery&amp;quot; /&amp;gt;だが、HPのRPN関数電卓ラインナップから去るその時まで、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]はこのバグを抱えたまま生産され続けたのは事実である。そのお陰で、現在流通しているすべての[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]で本モジュールが使用できるのだ。&lt;br /&gt;
&lt;br /&gt;
===時代の20年先を行っていたオープンソースプロジェクト===&lt;br /&gt;
本モジュール開発当時の様子はマニュアルの前言に色濃く表れている。&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;Because of the nature of the PPC ROM PROJECT, this manual is somewhat unusual. This manual is the effort of over one hundred users who worked directly on it, and many hundreds of others who indirectly contributed to its completion.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(PPC ROM PROJECTの性質上、このマニュアルはやや特殊です。このマニュアルは、直接取り組んだ100名以上のユーザと、間接的に完成に貢献した数百名ものユーザの、努力の結晶です。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;This project is unique in the history of software projects. IBM and other large corporations have assigned multi-tens of programmers to a software project, but never before have over 100 programmers worked so long and so hard on a project--without compensation of any kind. The PPC ROM PROJECT is a community project in the true sense of the word. The project has always been completely public with month by month reports openly published for all to study and respond to.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(このプロジェクトは、ソフトウェアプロジェクトの歴史の中でも特異なものです。IBMをはじめとする大企業は何十名ものプログラマをひとつのソフトウェアプロジェクトに従事させたことはありますが、100名以上のプログラマが、これほど長時間、これほど懸命に、如何なる報酬も無しにプロジェクトに取り組んだことは、かつてありませんでした。PPC ROM PROJECTは本当の意味でのコミュニティプロジェクトです。​このプロジェクトは月例報告書によって常に完全に公開されており、すべての人が研究・対応できるようになっています。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
驚くことに、この内容は、1998年2月に成立した[https://en.wikipedia.org/wiki/Open_Source_Initiative Open Source Initiative]が提唱する[https://opensource.guide/starting-a-project/ オープンソースプロジェクト]の精神そのままである。このような活動が1979年8月&amp;lt;ref name=&amp;quot;before&amp;quot; /&amp;gt;に勃興した事実は、当時[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の登場がRPN関数電卓コミュニティでいかに衝撃的だったかを物語る証左だろう。それほどまでに当時の[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]ユーザは熱心かつ真剣に向き合っており、また、向き合わせるだけの魅力があったということだ。これには管理人も心から同意する。&lt;br /&gt;
&lt;br /&gt;
また、&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;We believe in true personal computing and that a so-called higher level language is not always the path to greater computing power. We want to manage our always-too-small memory in ways we think are best. We prefer a flexible operating system that allows us to control our programming environment, and we want a well thought out operating system that can be altered if we wish.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(私たちは真のパーソナルコンピューティングを信じており、所謂[https://en.wikipedia.org/wiki/High-level_programming_language 高級言語]が、より大きな演算能力への道とは限らないと考えています。私たちは、いつも小さ過ぎるメモリを、最善と考える方法で管理したいのです。私たちは、プログラミング環境を制御できる柔軟なオペレーティングシステムを好みますし、必要に応じて変更できる、よく考えられたオペレーティングシステムを使いたいのです。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;The routines in the PPC ROM express these interests and concerns. Much of the work that went into the ROM is original and makes a contribution to the Art&amp;lt;ref name=&amp;quot;art&amp;quot; /&amp;gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;(PPC ROMに焼き込まれたルーチンは、こういったことに関心と興味を示しています。これらルーチンの多くはオリジナルであり、プログラム術&amp;lt;ref name=&amp;quot;art&amp;quot; /&amp;gt;へ貢献します。)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
の二文には、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のソフトウェア開発者に対する猛烈な怒りと強烈なアンチテーゼが込められていて清々しい。&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;「あなたがたが作った[https://en.wikipedia.org/wiki/High-level_programming_language 高級言語]である[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]とOSでは、ハードウェアの能力を十分に生かし切れない。[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]を動かすための[https://en.wikipedia.org/wiki/Low-level_programming_language 低級言語]であるバイトを適切に組み直すだけで、ここまで高機能な演算とプログラミングが可能であることを、我々は証明した。もしあなたがたが[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]での『ユーザが実行できるプログラミング環境』として[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]程度のものを提示すればユーザが納得すると考えているなら、それはおかしい。ユーザはそこまで馬鹿ではない」&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;「我々が作ったルーチンは、ユーザによるプログラミングに使われたがっていることを確信できる。翻って、あなたがたが作った[https://en.wikipedia.org/wiki/FOCAL_(Hewlett-Packard) FOCAL]のルーチンは、そこまでユーザに求められているだろうか？」&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
そう述べているのと同義だからだ。凄まじいまでのhacker spiritsの発露である。&lt;br /&gt;
&lt;br /&gt;
===ユーザコミュニティの熱気が作らせた===&lt;br /&gt;
現代ではまったく見られなくなったが、1980年代前半ぐらいまで、日本で販売されていた電化製品の取扱説明書には、その製品の回路図が記載されており、回路図だけを集めた書籍も販売されていた。半導体の集積回路化がそこまで進んでおらず、ほぼ全てがディスクリートで設計・構成されていたため、故障して修理を依頼するとフィールドエンジニアが現地に足を運び、その場で取説に記載された回路図を読んで故障箇所を特定、異常と判定した部品を交換して復旧させるために必要だというのもあるが、電化製品の生命線である回路図が不特定多数へ公開されることにそこまで神経質になる必要もなかった、長閑な時代だったからだ。管理人も小学生だったころに家にあったブラウン管アナログカラーテレビのディスクリート回路図に魅せられ、故障時には家に呼び付けられた電器屋のオヤジがそれを読み、壊れたトランジスタを特定後、半田鏝で剥がして交換し復旧させているのを目撃している。&lt;br /&gt;
&lt;br /&gt;
アメリカでも同じ状況だったかまでは調べ切れてないが、HPは電化製品を含む電気機器を対象とした測定機の開発・製造が出自なので、ユーザコミュニティの熱意に負けて詳細仕様の公開に踏み切った判断は理解できる。「マニアは中身の詳細を知りたいだろう」と。その裏には、アメリカという国の根幹に常に流れるDIY精神があるとはいえ、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の部品はほぼ全てが集積回路化され、それらは市販されていなかった&amp;lt;ref name=&amp;quot;repair&amp;quot; /&amp;gt;ので、1980年代であれば「製品仕様を公開したとて容易に真似できるものではない」うえ「公開することでユーザの裾野が更に広がり、それが拡販にも繋がる」という自信あってこその対応だという想像もつく。&lt;br /&gt;
&lt;br /&gt;
これが2020年代である現代となると、ライトユーザの安価な設備投資でも、ROMに焼かれたソフトウェアを吸い出せたり、空のROMにソフトウェアを書き込めたり、マイクロプロセッサや液晶ディスプレイやキーボード用スイッチが安価で入手できることから、「製品のクローンを安易に作成できてしまう」可能性が高い。もし現代のHPがユーザコミュニティから同様の要請を食らったら、特許や実用新案が引っ掛かったり、競合他社に剽窃される可能性を考えたりで、仕様や回路図を公開せず&amp;lt;ref name=&amp;quot;wp34s&amp;quot; /&amp;gt;門前払いするだろう。&lt;br /&gt;
&lt;br /&gt;
このような世情の変化を踏まえると、同人とはいえ本モジュールが頒布されるまでに至った事実は、40年前という時間軸を考慮しても非常に画期的かつ重要な出来事であったかが解る。〝電卓向け〟の〝同人ソフトウェア〟なんぞ、後にも先にも、本モジュール以外に見たことが無い。当時のユーザコミュニティが持つ熱気が作らせたのだろう。とりもなおさず、この出来事から、当時の[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のユーザコミュニティが如何に広大だったかを窺い知ることもできる。&lt;br /&gt;
&lt;br /&gt;
ちなみに、1979年の日本では、それまで部品を個別の集めるか半完成品のキットでしか売られておらず「マイクロコンピュータ(マイコン)」と呼ばれていたところに、日本電気株式会社から初めて完成品の「パーソナルコンピュータ(パソコン)」が[https://ja.wikipedia.org/wiki/PC-8000シリーズ#PC-8001 PC-8001]と名付けられ本体価格168,000円で発売されている。この年の大卒平均初任給は109,500円だったので、[https://ja.wikipedia.org/wiki/PC-8000シリーズ#PC-8001 PC-8001]は勿論、[http://www.hp-collection.org/calculators/41c.html HP-41C]ですら高価だと感じたことだろう。日本での[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の販売実績は公開されておらず不明だが、HP製品の日本での総販売代理店でありHPと横河電機製作所の合弁企業であった横河・ヒューレット・パッカード株式会社(YHP)は、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の国内販売にあたり500ページ超のマニュアルを日本語に翻訳してから販売していることから、それなりに売れてはいたようだが。&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;method&amp;quot;&amp;gt;使用するマイクロプロセッサとプログラミング言語に依存するものの、乗算させる処理で、プログラミング言語に規定された乗算関数を使用せず、被乗数を乗数回加算する形で実装すると、コンパイル後のバイナリコードが小さくなるうえ処理速度が向上することが結構ある。マイクロプロセッサやプログラミング言語では、基本的な機能である加算と減算は単純な処理だが、その応用である乗算と除算は複雑な処理で、かつ、処理完了までのステップ数が多くなることが理由だ。コンパイル後のバイナリコードを焼き付けるROMの容量が非常に小さいハードウェア環境や、ミリ秒どころかマイクロ秒単位で演算が完了すること自体がミッションの成否を分けるため全体の処理性能をカリカリにチューンしなければならない宇宙開発(特に宇宙機)等では現代でも使われる手法である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;times&amp;quot;&amp;gt;1976年3月に発売され現在も製造され続けている超有名8ビットマイクロプロセッサ[https://en.wikipedia.org/wiki/Zilog_Z80 Z80]は、実行できる算術演算命令が加算&amp;lt;code&amp;gt;ADD&amp;lt;/code&amp;gt;と減算&amp;lt;code&amp;gt;SUB&amp;lt;/code&amp;gt;のみである。したがって、[https://en.wikipedia.org/wiki/Zilog_Z80 Z80]に乗算や除算をさせる場合はソフトウェアで実装するしかないのだが、[https://en.wikipedia.org/wiki/Zilog_Z80 Z80]がデフォルトでアクセスできるメモリ空間はROMとRAMを合わせて64kB(65,536バイト)と狭小だ。よって、[https://en.wikipedia.org/wiki/Zilog_Z80 Z80]のソフトウェアはこのような書き方のオンパレードとなる。乗算は本文と同じ実装が殆ど、除算は被除数から除数を減算できた回数(と、それによって生じた剰余)を得る実装が基本だ。ちなみに222関数を実装した[[HP-41CX]]の内蔵ソフトウェアは20kB(20,480バイト)のROMに焼き込まれ、RAMは2,233バイト(1レジスタが7バイトで319レジスタ)＝2kBちょっとである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dq1&amp;quot;&amp;gt;ソフトウェアのダイエットと言えば、管理人の世代は漏れなく購入することが義務(？)であろう[https://ja.wikipedia.org/wiki/ドラゴンクエストシリーズ ドラゴンクエストシリーズ]の第1作「[https://ja.wikipedia.org/wiki/ドラゴンクエスト ドラゴンクエスト]」が、僅か64kBのROMにプログラム・キャラクタ・音楽のすべてを収めるべく、[https://game.watch.impress.co.jp/docs/news/312961.html ゲーム内で使う片仮名を20個に制限した]ことが有名だ。1986年5月27日発売のソフトウェアですらこのような状況だったということは、それ以前に発売された[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のソフトウェア開発では、プログラム関数電卓として使い勝手が良く、かつ、ソフトウェアのダイエットに繋がるミクロな命令を、如何に設定するかが何より重要な課題だったかが判る。ちなみに[https://ja.wikipedia.org/wiki/ドラゴンクエスト ドラゴンクエスト]で使える片仮名は「イ・カ・キ・コ・シ・ス・タ・ト・ヘ・ホ・マ・ミ・ム・メ・ラ・リ・ル・レ・ロ・ン」で、これらと濁点「゛」と音引き「ー」の組合せが許容された。なお、平仮名は全文字が許容されたようだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;hp35&amp;quot;&amp;gt;この場合は「ミクロな命令」と「マクロな命令」を合算した個数である。三角関数/逆三角関数/対数/指数で近似値を得るには[https://en.wikipedia.org/wiki/Taylor_series テイラー展開]を使用するが、それをたった767命令で、しかも現代でも通用する演算精度で実装しているのだから驚く他ない。演算量を減らすためか、本来のテイラー展開を使用せず簡易式で実装した[[電卓技術教科書〈研究編〉|シャープのエンジニア]]は、[[HP-35]]の演算精度に何を思ったのだろうか。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;exp&amp;quot;&amp;gt;歴代のHP製RPN関数電卓で[[HP-35]]だけ、冪乗のスタック配置が逆である。例えば&amp;amp;nbsp;&amp;lt;math&amp;gt;2^3&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算させる場合、他機種のように&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;であれば&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とRPNらしく素直に入力できるが、本機では&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|enter}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と羃指数を先に入力する必要がある。これは、本機の命令数の制約から常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\log&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の逆関数である10の冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;10^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の実装が見送られたため、スタックXの真数を演算する際にキーイン数が最小となる&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;x^y&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で済むよう、敢えて入れ替えたといわれている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;call&amp;quot;&amp;gt;&#039;&#039;For the most part, instruction codes are not handled by the CPU as individual binary bits, but are grouped to gether into groups of 8 bits called &amp;quot;bytes&amp;quot;. A byte is the smallest unit of program code over which the user has keyboard control. Many 41C instructions are represented as a single byte, and the remainder as multibyte groups; none are coded with fewer than 8 bits. (殆どの場合、CPUは命令コードを個々のバイナリビットとして扱わず、「バイト」と呼ばれる8ビットのグループにグループ化して扱います。バイトはユーザがキーボードで制御できるプログラムコードの最小単位です。多くの41C命令は1バイトで表現され、残りは複数バイトのグループで表現されます。8ビット未満でコード化されたものは有りません。)&#039;&#039;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;preface1&amp;quot;&amp;gt;Richard J. Nelsonによるマニュアルの前言には&#039;&#039;It is true that PPC members have mastered the HP-41 all by themselves. It is also true, however, that while those wild and weird synthetic programmers were exploring the 41 system, HP was quietly cheering and applauding their effort. (PPC会員がHP-41を独力でマスタしたのは事実です。しかし、このような荒唐無稽で奇妙な合成プログラマたちが41のシステムを探求している間、HPは静かに彼らの努力を応援し、拍手を送っていたこともまた事実です。)&#039;&#039; とある。どうやら当時のHPはユーザコミュニティによるハッキングを、疎ましいので止めさせたい行為ではなく、自社のソフトウェアを無償でデバッグしてくれる有り難い行為だと考えていたようだ。40年以上前のHPとユーザコミュニティの関係性が解る、貴重な記述である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;time&amp;quot;&amp;gt;HPが指定した演算処理手法や内容が手緩く、実装次第では[[HP 5061-7287|HP-41シリーズ用数学・統計拡張モジュール]]や[[HP 00041-14003|HP-41シリーズ用財務・金融拡張モジュール]]を購入せずとも大抵の演算が可能だと判ったのだから、ある意味で当然の反応と言えよう。ただ、演算時間から見ると痛し痒しである。例えば、数多ある円周率&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;の近似値を得る公式の1つとして有名な[https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80 ライプニッツの公式]&amp;lt;math&amp;gt;\textstyle \int_{0}^{1}\!\frac{4}{(x^2+1)}dx=\pi&amp;lt;/math&amp;gt;の演算で比較する。本文でも触れた、本モジュールに収録されている高精度積分ルーチン&amp;lt;code&amp;gt;IG&amp;lt;/code&amp;gt;は[https://en.wikipedia.org/wiki/Romberg%27s_method ロンベルグ法]による数値解析だが、演算桁数を小数点第4位までに設定すると&#039;&#039;&#039;49秒&#039;&#039;&#039;掛かって&amp;lt;code&amp;gt;3.1416+00&amp;lt;/code&amp;gt;を、第6位までに設定すると&#039;&#039;&#039;89秒&#039;&#039;&#039;掛かって&amp;lt;code&amp;gt;3.141593+00&amp;lt;/code&amp;gt;を、それぞれ出力することが、本モジュールのマニュアルに明記されている。これに対し、[[HP 5061-7287|HP-41シリーズ用数学・統計拡張モジュール]]が内蔵している数値積分&amp;lt;code&amp;gt;INTG&amp;lt;/code&amp;gt;は[https://en.wikipedia.org/wiki/Simpson%27s_rule 合成シンプソン&amp;amp;frac13;法]による数値解析だが、演算時間と演算結果を実機で確認すると、&amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;で演算すると&#039;&#039;&#039;9秒&#039;&#039;&#039;で&amp;lt;code&amp;gt;3.141592614&amp;lt;/code&amp;gt;が、&amp;lt;math&amp;gt;n=30&amp;lt;/math&amp;gt;で演算すると&#039;&#039;&#039;26秒&#039;&#039;&#039;で&amp;lt;code&amp;gt;3.141592653&amp;lt;/code&amp;gt;が、それぞれ得られる。両者を比較すると、演算精度はどちらも問題無いが、演算速度は[[HP 5061-7287|HP-41シリーズ用数学・統計拡張モジュール]]が倍以上速い。即ち、演算精度と演算時間を天秤にかけた結果、当時のHPは「『演算時間が長い』のはユーザにデメリットで、マーケティングからも製品のメリットを覆い隠してしまう」と、数値積分をアプリケーションパックとして切り出す判断をしたと考えられる。だが、プログラマからすれば「単体でそのポテンシャルが有るなら、演算時間が多少長くても、高精度な演算結果が得られる機能が欲しい！」と考えるのも解る。マーケティングとエンジニアリングでどうバランスするか、難しい話である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;preface2&amp;quot;&amp;gt;Richard J. Nelsonはマニュアルの前言で&#039;&#039;Also, there was no reason to restrict these instructions from being placed into the ROM--at PPC&#039;s risk, of course. (また、これらの命令をROMに入れることを制限する理由はありません&amp;amp;#x2E3A;勿論、PPCのリスクで。)&#039;&#039; と、本モジュールの製造と使用の危険性はPPCが負っていたことを述べている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;preface3&amp;quot;&amp;gt;Richard J. Nelsonはマニュアルの前言で&#039;&#039;Formally, informally, officially, and unofficially, HP personal assisted where they could. (公式、非公式、正式、略式に、HPは可能な範囲で個人的に支援しました。)&#039;&#039; と謝意を述べている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cost&amp;quot;&amp;gt;[[HP-41CX]]で記載したように、[http://www.hp-collection.org/calculators/41c.html HP-41C]を発売した当初のHP純正アプリケーションパックの定価は75ドルか45ドルであったところ、1980年12月15日に[http://www.hp-collection.org/calculators/41cv.html HP-41CV]を発売したと同時に、75ドルのものは45ドルに、45ドルのものは30ドルに、それぞれ一斉に値下げしたが、このとき同時に「カスタムROMプログラム」による受託製造費も値下げした。アプリケーションパックがバカ売れしていたところに「カスタムROMプログラム」の受注も加わったことでモジュールとしての製造総数が積み増しされ、結果として、製造コストが半減したからだ。「規模の経済」(和製英語でいうスケールメリット)を地で行く好例であろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;preface4&amp;quot;&amp;gt;Richard J. Nelsonもマニュアルの前言で&#039;&#039;It is not possible for HP to endorse or approve synthetic instructions. (HPが合成的命令を推奨したり承認したりすることは有り得ません。)&#039;&#039;と強い調子で明記している。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;serial&amp;quot;&amp;gt;管理人は13個のPPC ROMを所有しているが、この形式のシリアル番号が刻まれたものは8個(末尾Aが6個、末尾Bが2個)ある。即ち、それ以外の5個は追加で製造されたものとなる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;price&amp;quot;&amp;gt;この金額はかなり高い。[[HP-41CX]]で記載したように、[http://www.hp-collection.org/calculators/41c.html HP-41C]を発売した当初のHP純正アプリケーションパックの定価は75ドルか45ドルだったが、1980年12月15日に[http://www.hp-collection.org/calculators/41cv.html HP-41CV]を発売したと同時に、75ドルのものは45ドルに、45ドルのものは30ドルに、それぞれ一斉に値下げしている。本モジュールの製造・販売が企画された1979年8月時点では[http://www.hp-collection.org/calculators/41cv.html HP-41CV]が発売されてないため、このときユーザが持っていたであろうアプリケーションパックに対する相場感は75ドルか45ドルだったはずだ。よって、出資額は相場より20〜50ドル高いことになる。ユーザコミュニティだけでの話とはいえ、それでも2,500口が埋まったのだから、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]に対する当時の熱狂ぶりと期待感の大きさが判る。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;users&amp;quot;&amp;gt;マニュアルの該当ページを確認すると、1名義で2口・3口・4口・5口と出資した会員が結構居ることが判る。よって、出資者の総数は2,500名を割る。最多は1名義で10口。7口出資した名義もある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;lot&amp;quot;&amp;gt;[https://www.hpmuseum.org/forum/thread-18935-post-165027.html#pid165027 ここ]に依ると、最初に製造した5,000個は1981年末に全出資者へ送付している。その後、本モジュールが評判となり、出資しなかったことを後悔したPPC会員が続出したため、PPCは追加での製造を決断。PPCは概ね250個単位でHPに発注し、1982年末までにトータルで5,600〜5,650個を(即ち、1年間で600〜650個を追加で)製造・送付している。なお、1983年以降も追加製造は続いており、製造総数は詳らかでない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;rom&amp;quot;&amp;gt;真のHP製RPN関数電卓マニアは「ある機種で内蔵ソフトウェアROMが差し替えられたことが判っている場合、すべてのROMバージョンの本体を所有する」のが大前提で、「[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]や[https://www.hpmuseum.org/hp71.htm HP-71]のアプリケーションパックでROMのバージョン違いが存在する場合も、すべてのROMバージョンを揃える」とのこと。とてもではないが、管理人は[[HP-35]]以外の機種でそこまでするつもりはない。そもそも重大なバグを抱えた内蔵ソフトウェアROMを実装した本体は殆ど市場に出回らない＝摘出されたバグは即改修され入手困難＝市場に出ると異常に高値で取引されることもある。稀に、その貴重性をあまり理解してないセラーが「バグばかりだから」と極端な安値で出品すると争奪戦になる。&amp;lt;br&amp;gt;管理人も、[https://www.finseth.com/hpdata/hp41c.php 13個のバグ]をすべて含む最初期のソフトウェアROMが実装された、1979年第32週(8月5日〜11日)製造の[https://www.hp-collection.org/calculators/41c.html HP-41C]を所有しているが、これは偶々eBayに「170ドルで即落札」という異常な安値で出品されていたのを見つけ、その場で応札したからだ。このようにRPN関数電卓マニアは、日々のeBay巡回が欠かせない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ack&amp;quot;&amp;gt;14ページに&#039;&#039;Special thanks goes to the PPC (a user&#039;s group) for help in testing the product, especially to Jake Schwartz for suggestions leading to the paper keyboard layout. (製品のテストに協力してくれたPPC(ユーザグループ)、特に紙のキーボードの配置につながる提案をしてくれたJake Schwartzに特別な感謝を捧げます。)&#039;&#039;とある。「紙のキーボード」とは、各物理キー毎に振られたバーコードを本体の外形に合わせて配置し印刷したもので、Jake Schwartzは[https://m.youtube.com/watch?v=XQ_wC2Zp0OI 2023年現在もPPCに所属する超古参会員]だ。テストに参加していたであろう1980年末頃は[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のソフトウェアの全貌を把握し終えており本モジュールの開発で忙しかっただろうが、一般ユーザは決して触れることができない、製品化される前の試供品のテストに参加できたのだから、ユーザコミュニティとしても鼻高々だっただろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cv&amp;quot;&amp;gt;[http://www.hp-collection.org/calculators/41cv.html HP-41CV]のROMは[http://www.hp-collection.org/calculators/41c.html HP-41C]と[https://www.finseth.com/hpdata/hp41cv.php まったく同じ]である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;mystery&amp;quot;&amp;gt;もし当時の関係者にインタビューできたら、HPとユーザコミュニティでは公式見解が異なるのではないだろうか。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;excuse&amp;quot;&amp;gt;このような &#039;&#039;harmless issue&#039;&#039; への対応は、費用対効果を何よりも重視する外資系企業では特にありがちな、極めて現実的な内容だ。管理人も日々頻繁に見掛ける。稀に、他の重要なバグと一緒に改修されることもあるが、やっつけ仕事なので、正しく改修されていないこともよく経験する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;before&amp;quot;&amp;gt;Richard J. Nelsonはマニュアルの前言に&#039;&#039;In the August, 1979, FPC JOURNAL (V6N5P27c), I proposed that we take on a routines ROM. In late August of 1979 I sent a formal letter to Hewlett-Packard which stated in part: &amp;quot;PPC would like to purchase an 8K HP-41C Custom ROM. Please consider this as a formal &amp;quot;Letter of Intent&amp;quot;. Enclosed is a check (PPC #999) for $1,000.00 as a deposit.&amp;quot; (1979年8月のFPC JOURNAL (V6N5P27c)で、私はルーチンROMの開発を提案しました。1979年8月下旬、私はHPに次の内容を認めた正式な文書を送付しました：「PPCはHP-41Cの8kBカスタムROMの購入を希望します。この手紙を正式な『合意文書』と見做してください。手付金として1,000ドルの小切手を同封します。」)&#039;&#039; と、PPC ROM PROJECTが1979年8月にスタートしたことを明記している。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;art&amp;quot;&amp;gt;この文でのartの語義は「技術・要領・コツ」だが、わざわざ&amp;quot;the Art&amp;quot;と定冠詞＋大文字で記しているのは、数学者・計算機科学者であり「アルゴリズム解析の父」と呼ばれる[https://www-cs-faculty.stanford.edu/~knuth/ Donald Knuth]が1968年からライフワークとして出版しているアルゴリズム解説書[https://www-cs-faculty.stanford.edu/~knuth/taocp.html &#039;&#039;The Art of Computer Programming (TAOCP)&#039;&#039;]から来ていると想像される。1974年、氏のそれまでの様々な偉業に対し「コンピュータ界のノーベル賞」と位置付けられる[https://en.wikipedia.org/wiki/Turing_Award チューリング賞]が[https://amturing.acm.org/award_winners/knuth_1013846.cfm 授与された]が、その1つに「TAOCPの出版」が挙げられるほど、この業界では影響力が大きく、今なお必読の書とされる。尤も、原著である英語版はもとより、日本語訳版で読んでも、内容を理解するのは難しい。行間と意図を読み取り、想像力を働かせ、脳をフル回転させる必要がある。ただ、読んでいて面白いのは確かだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;repair&amp;quot;&amp;gt;1987年12月31日以前に発売した機種に対してはHPが修理サービスを提供しており、また、ユーザでも簡単に開腹できたため、ユーザがAYORでDIYで修理したい場合、HPに問合せることで、そのための保守部材であるLSIを含む部品の入手は可能だったようだ。1988年1月1日以降に発売した機種からは「購入後1年未満で故障した製品には同等以上機種の新品と交換、購入後1年経過後は修理サービス提供なし」へ製品保証内容が変更され修理サービスが提供されなくなり、保守部材も市販されなかったようだ。詳細は[[HP-28S#「半導体の技術進歩と低廉化」が全てを変えた|HP-28S]]を参照のこと。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;wp34s&amp;quot;&amp;gt;尤も、ユーザ自身がAYORで製品の中身を解析し公開すること自体は避けられず、また、そうするよう仕向けたとしか思えない製品をHPが販売したことはある。さもなければ、ユーザコミュニティによるもう1つの偉業と言って然るべき同人プロジェクトである[[WP 34S]]は産まれなかっただろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP_82182A&amp;diff=6795</id>
		<title>HP 82182A</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP_82182A&amp;diff=6795"/>
		<updated>2025-05-05T13:33:19Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓周辺機器|frame=1}}&lt;br /&gt;
&lt;br /&gt;
[http://www.hp-collection.org/calculators/41c.html HP-41C]および[http://www.hp-collection.org/calculators/41cv.html HP-41CV]専用の時計モジュール。モジュール背面に記されるパッケージ名称は〝&#039;&#039;&#039;TIME MODULE&#039;&#039;&#039;〟。HP-41CおよびHP-41CVの拡張スロットに装着し、時計および計時に関する機能を拡張する。&lt;br /&gt;
&lt;br /&gt;
このモジュールを装着すると、時計・2199年12月31日までのカレンダーと経過日数や週数の計算・スプリットタイムを含むストップウォッチ機能・タイマー機能・アラーム機能が使えるようになる。なお、[[HP-41CX]]には高精度発振器とこのモジュールで拡張できる機能が内蔵されているため装着不要だ。&lt;br /&gt;
&lt;br /&gt;
===NASAからの要請===&lt;br /&gt;
本モジュールはNASAからの要請により超特急で新規開発されたものだ。1981年、NASAが初飛行を目指していた[https://en.wikipedia.org/wiki/Space_Shuttle スペースシャトル]の装備品として[http://www.hp-collection.org/calculators/41cv.html HP-41CV]を制式採用するにあたり、HPに2点の改造を要請したが、本モジュールはそのうちの1点「クォーツ時計/タイマー/アラーム機能の実装」に端を発する。恐らくNASAはこれらの機能を[http://www.hp-collection.org/calculators/41cv.html HP-41CV]に内蔵させることを意図したと思われる&amp;lt;ref name=&amp;quot;nasa&amp;quot; /&amp;gt;が、HPは[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の拡張性をフルに生かしモジュールを新規開発することで実現、一般発売に至った。&lt;br /&gt;
&lt;br /&gt;
本モジュールには[http://www.hp-collection.org/calculators/41c.html HP-41C]と[http://www.hp-collection.org/calculators/41cv.html HP-41CV]には実装されていない高精度発振器が組込まれているため、これら2機種に装着することで正確な計時が可能となるが、高精度発振器を駆動させ続ける必要があるため消費電力が増す&amp;lt;ref name=&amp;quot;battery&amp;quot; /&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
管理人は[http://www.hp-collection.org/calculators/41c.html HP-41C]と[[HP-41CL]]で使用するために所有している。&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;nasa&amp;quot;&amp;gt;NASAがHPに要求したもう1点が「ACアダプタ差込口と拡張スロットの溶接による閉塞」であることからも判る。なお、HPはこの「溶接による閉塞」を施した以外は市販品とまったく同じ[http://www.hp-collection.org/calculators/41cv.html HP-41CV]と本モジュールをNASAに納品している。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;battery&amp;quot;&amp;gt;マニュアルでは以下のように記載されている。&amp;lt;br&amp;gt;&lt;br /&gt;
*高電流消費(5～20mA)。{{keypress|ALMCAT}}&amp;amp;nbsp;機能(アラームカタログ)を使用している場合、または、ストップウォッチモードに設定している(ストップウォッチが表示されている)場合。このモードは、[http://www.hp-collection.org/calculators/41c.html HP-41C]または[http://www.hp-collection.org/calculators/41cv.html HP-41CV]がプログラムを実行している状態に相当する。&lt;br /&gt;
*中程度の電流消費(0.5～2.0mA)。時計を表示している場合。このモードは、[http://www.hp-collection.org/calculators/41c.html HP-41C]または[http://www.hp-collection.org/calculators/41cv.html HP-41CV]とディスプレイの電源がONでキーボードからの入力を待っている状態に相当する。&lt;br /&gt;
*低電流消費(0.01～0.05mA)。[http://www.hp-collection.org/calculators/41c.html HP-41C]または[http://www.hp-collection.org/calculators/41cv.html HP-41CV]とディスプレイの電源がOFFの場合。本モジュールの高精度発振器は、時計、および(動作中の場合は)ストップウォッチを維持するために継続的に動作する必要がある。このモードは、[http://www.hp-collection.org/calculators/41c.html HP-41C]または[http://www.hp-collection.org/calculators/41cv.html HP-41CV]の電源がOFFの状態に相当する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-67/HP-97&amp;diff=6784</id>
		<title>HP-67/HP-97</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-67/HP-97&amp;diff=6784"/>
		<updated>2025-05-05T01:24:45Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1976年7月1日〜1982年1月11日/1984年12月1日に販売された科学・数学向けRPN関数電卓。HP-67は可搬型、HP-97は机上設置型だが、マイクロプロセッサと実装された関数はまったく同じで、両機種専用ROMとRAMは第二世代にあたるWoodstockシリーズ向けに開発されたアーキテクチャを流用することで大幅なコストダウンを実現した。コードネームは、HP-67が[https://en.wikipedia.org/wiki/Northrop_Grumman_E-2_Hawkeye Hawkeye (ノースロップ・グラマン社が製造しているアメリカ海軍向け早期警戒機E-2)]&amp;lt;ref name=&amp;quot;hawkeye&amp;quot; /&amp;gt;、HP-97が[https://en.wikipedia.org/wiki/Kitty_Hawk,_North_Carolina Kitty Hawk (アメリカ・北カリフォルニア州の街。ライト兄弟により初の有人動力飛行が成功した地)]である。製品寿命としてはHP-97が約2年長いが、その理由は、HPが発売する机上設置型RPN関数電卓の最終モデルをHP-97としたことに依る配慮だろう。1980年代に入ると購入者側も関数電卓を含む電卓＝可搬型という認識が当たり前となったことで机上設置型の販売数が漸減傾向となり、残り少ない需要はHP-97で賄うことにしたのだ&amp;lt;ref name=&amp;quot;95c&amp;quot; /&amp;gt;。HP-97の販売終了を以て、HPの関数電卓のラインナップから机上設置型は姿を消した。&lt;br /&gt;
__TOC__&lt;br /&gt;
===HP製関数電卓のプログラミング環境の種を播く===&lt;br /&gt;
両機種の共通仕様として、磁気カードリーダライラを内蔵し、メモリは26スタック分、プログラミングは224ステップ(＝磁気カード1枚)分まで拡大されている。プログラミング機能では間接アドレスが指定できるようになり、ネストも3段まで許容されるよう改善されている。また、標準ソフトウェアである14本＋1本のプログラム入り磁気カード、24本のブランク磁気カード、1本のヘッドクリーニングカードを1セットにした〝Standard Pac〟(00067-13101/00097-13101)&amp;lt;ref name=&amp;quot;standard&amp;quot; /&amp;gt;も附属した。&lt;br /&gt;
&lt;br /&gt;
可搬型であるHP-67は[[HP-35]]の外形を踏襲して物理キーが35個しか無いため、各キーに4つの機能を割り当てるべくシフトキーがシフトキーが&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|{{Font color|black|DeepSkyBlue|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{g}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;{{keypress|{{Font color|white|black|&amp;lt;math&amp;gt;\; \color{white}{\mathbf{h}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;と3段構えだが、机上設置型であるHP-97はサーマルプリンタを実装し筐体が大きいことから、関数だけで物理キーを24個実装できたため、シフトは&amp;amp;nbsp;{{keypress|{{Font color|black|DarkOrange|&amp;lt;math&amp;gt;\; \color{black}{\mathbf{f}} \;&amp;lt;/math&amp;gt;}}}}&amp;amp;nbsp;のみ1段で済んでいる。サーマルプリンタでは純正感熱ロール紙(HP 82045A)を使用するが〝幅2インチ¼＝57.15mm〟〝直径45mm〟を満たす市販の感熱ロール紙であれば転用できる。管理人が調べる限り、三栄電機製プリンタ[http://www.sanei-elec.co.jp/products/printer-sm1-21/ SM1-21]の専用補充品である[http://www.printy-net.jp/html/roll/p-57-45a.html P-57-45A]が、幅はまったく同じ、直径はほぼ同じなので、使用している。HP-67は勿論、HP-97も充電池で駆動できるが、満充電後の連続運用時間はそれぞれ「3時間」「3〜6時間」と短い。専用充電池は販売停止となって久しいが、代替品の入手は容易く、その点で困ることは無い。&lt;br /&gt;
&lt;br /&gt;
HP-67とHP-97の間でプログラムは完全互換する。即ち、HP-67でプログラムしたものを磁気カードに書き込み、それをHP-97に読み込ませても、HP-97は問題なくプログラムを実行でき、まったく同じ結果が得られる。逆もまた然りである。しかし、磁気カードに記録される内容は両機種で異なる。プログラミングは物理キーに割り当てられた機能や関数を呼び出す形で実行するが、このとき機能や関数を呼び出す方法が「物理キーの座標(位置)」だからだ。先述の通り、HP-67とHP-97では物理キーの数も位置もまったく異なるため、プログラムを磁気カードに保存する際は、プログラムのソースコードと一緒にプログラミングした機種を記録する。磁気カードを読み込んだ機種とプログラミングした機種が異なるときは、ソースコードにある「物理キーの座標(位置)」を、読み込んだ機種のそれに変換してからRAMに格納して実行することで、互換性を確保している。&lt;br /&gt;
&lt;br /&gt;
日本では、伝説的なプログラマであり経営者であった&amp;lt;span style=&amp;quot;font-size:0.7em&amp;quot;&amp;gt;故&amp;lt;/span&amp;gt;[https://en.wikipedia.org/wiki/Satoru_Iwata 岩田聡]氏が高校生だった時、HP-67のプログラミング機能で磁気カード6枚(224ステップ×6枚＝1,344ステップ)を費やし[https://en.wikipedia.org/wiki/Star_Trek Star Trek]をテーマにしたゲームを作成、それを当時のHP製品に関する日本国内での総代理店でありHPと横河電機製作所の合弁会社であった横河・ヒューレット・パッカード株式会社(YHP)に送ったところ、あまりの出来の良さに驚いたYHPがHP-67に関する大量の資料を送り返した[https://www.4gamer.net/games/999/G999905/20141226033/index_2.html エピソード]が有名である。[http://www.dentaku-museum.com/calc/calc/51-hp/hp/ad/ad5/1.pdf YHPによる日本国内での定価]は、HP-67が144,000円、HP-97が240,000円。&lt;br /&gt;
&lt;br /&gt;
なお、先代である[[HP-65]]と異なり、本機には宇宙に出た記録が無い。NASAの公式記録では、1978年8月1日、航空機の[https://en.wikipedia.org/wiki/Aircraft_dynamic_modes 空力安定性]を本機のプログラミング機能で演算・実行するための[https://ntrs.nasa.gov/citations/19780022195 メモ]を公開したのが唯一の事例である。&lt;br /&gt;
&lt;br /&gt;
HP-67にしろHP-97にしろ、eBayをはじめとするオークションサイトへの出品は少ないどころか、両機種とも発売から45年経過しているため、状態が良好で完動品となると珍品扱いで高価となる。特に両機の磁気カードリーダライタとHP-97のサーマルプリンタは〝故障してるのが当たり前〟なので、RPN電卓マニアが売っているDIYキットを購入のうえ公開している手順([https://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=241 HP-67磁気カードリーダライタの修理手順]/[https://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=180 HP-97磁気カードリーダライタの修理手順]/[https://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=84 HP-97サーマルプリンタの修理手順])に沿って自分で修理するか、有償で請け負うRPN電卓マニアに修理を依頼するかの二択となる。尤も、DIYキットは日本国内で売っておらずアメリカから取り寄せる必要があるため、DIYキットを取り寄せるにしろ修理を依頼するにしろアメリカとやりとりする手間は同じなので、最初からRPN電卓マニアに修理を依頼するほうが早い。管理人は懇意にしているアメリカ在住の信頼できるRPN電卓マニアに修理を依頼&amp;lt;ref name=&amp;quot;mania&amp;quot; /&amp;gt;することで全台を完動品とし、可搬型のHP-67は4台所有しているが、机上設置型のHP-97は、その大きさ故、2台しか所有していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7}507225.705\ \; (\varepsilon\!_R=1.33\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 42.99999997&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|180kHz (Woodstock)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-67&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|HP 82001A/B (3.6V 450mAh/900mAh 充電池:中身は単3形Ni-Cd充電池×3個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-97&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|HP 82033A (4.8V 750mAh 充電池:中身はSC(Sub-C)形Ni-Cd充電池×4個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|1976年〜1982年/1984年&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-67&lt;br /&gt;
|アメリカ → シンガポール&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-97&lt;br /&gt;
|アメリカ → シンガポール → ブラジル&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1976年発売当時の定価&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-67&lt;br /&gt;
|450ドル (約132,750円)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|HP-97&lt;br /&gt;
|750ドル (約221,250円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;hawkeye&amp;quot;&amp;gt;本機の開発に着手したと想定される1973年、E-2に実装されたコンピュータをアナログからディジタルへ換装したE-2Cがロールアウトしているが、そのディジタルコンピュータ群のひとつとして[https://en.wikipedia.org/wiki/HP-UX HP-UX]の[https://en.wikipedia.org/wiki/Windowing_system Windowing system]で動くAdvanced Control Indicator Set (ACIS)が含まれており、それを記念して付与したものと思われる。なお、ACISに実装されたCPUは[https://www.jhuapl.edu/content/techdigest/pdf/V23-N2-3/23-02-Sunday.pdf 組込専用のHP 743、のちHP 744]である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;95c&amp;quot;&amp;gt;1977年1月、実装された機能や関数から[[HP-41CX]]を含むHP-41シリーズの机上設置型と見做せる[http://www.hp-collection.org/calculators/95c.html HP-95C]を完成、ごく少量(50台とも100台とも)生産したものの、市場に投入しなかった。型番にCが付されていることから判るように、本機は磁気カードリーダライタの代わりに[[HP-25#cite_note-25c-5|連続メモリ]]を実装しているが、複数人で共有する形で使われることが多い机上設置型では、各ユーザがキーインしないと機能や定数を記憶させることができないうえ、使用後はそれらを忘れずに全てクリアしないと別のユーザの演算に影響を及ぼす可能性が高い[[HP-25#cite_note-25c-5|連続メモリ]]より、各ユーザが作成した磁気カードを読み込ませるだけで機能や定数を一気に書き換えられる磁気カードリーダライタのほうが市場性があるとHPは判断、[http://www.hp-collection.org/calculators/95c.html HP-95C]はお蔵入りとし、HP-97を継続して販売することにした。しかし、2年後の1979年、[[HP-25#cite_note-25c-5|連続メモリ]]を実装し、磁気カードリーダライタを別売[[HP_82104A|オプションパーツ]](195ドル＝約42,900円)とした初代HP-41シリーズである[http://www.hp-collection.org/calculators/41c.html HP-41C]を295ドル(約65,000円)で市場に投入したところ、ヴァージョンアップを繰り返し足掛け11年5ヶ月間販売されるという超ベストセラー機種となったことから、このときHPが下した「[http://www.hp-collection.org/calculators/95c.html HP-95C]は販売中止」という決断は誤っていたことになる。このような経緯から、HP製RPN電卓マニアが[http://www.hp-collection.org/calculators/95c.html HP-95C]について触れるときは「時代を先取りし過ぎた機種」と哀憫の情を伴うことになる。&amp;lt;br&amp;gt;ではなぜ[http://www.hp-collection.org/calculators/95c.html HP-95C]の存在が知られたのかと言えば、「HP(の誰か)が倉庫で眠っていたのを放出したから」が正解のようだ。あまりの生産数の少なさ故、入手できるか否かは時の運。もし出品された場合は著しく高価になると思われる。ネットに転がっている全232ページの[https://literature.hpcalc.org/items/1121 マニュアル]を読むにつけ、少なくともHPの製造部門は[http://www.hp-collection.org/calculators/95c.html HP-95C]の販売について準備万端整えていたことが窺え、寂寥感が増す。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;standard&amp;quot;&amp;gt;磁気カードリーダライタで読み込ませることで、以下の機能や関数を拡張する。​&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Moving_average 移動平均]&lt;br /&gt;
*作表(タビュレータ) 最大24行&lt;br /&gt;
*曲線あてはめ&lt;br /&gt;
*カレンダー&lt;br /&gt;
*年金と複利演算&lt;br /&gt;
*プログラミングの初歩(Follow me)&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Solution_of_triangles 三角形の決定]&lt;br /&gt;
*ベクトル演算&lt;br /&gt;
*多項式評価&lt;br /&gt;
*3行3列の行列式演算&lt;br /&gt;
*&amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;の演算と求根&lt;br /&gt;
*[https://en.wikipedia.org/wiki/United_States_customary_units アメリカ慣用単位]⇔SI単位変換&lt;br /&gt;
*算数の初歩(Arithmetic Teacher)&lt;br /&gt;
*ゲーム「月ロケットと着陸船」&lt;br /&gt;
*HP-67/HP-97故障診断&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;mania&amp;quot;&amp;gt;こうして現地のRPN電卓マニアと仲良くなると、状態が良いRPN電卓をeBay等へ出品する前に割安な価格で斡旋してくれたり、面白い情報を教えてくれたりするメリットも副次的に発生する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-25&amp;diff=6783</id>
		<title>HP-25</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-25&amp;diff=6783"/>
		<updated>2025-05-05T00:56:55Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1975年8月1日〜1978年5月1日に販売された科学・数学向けRPN関数電卓。第一世代である[[HP-35]]の後継となる第二世代の[https://www.hpmuseum.org/hp21.htm HP-21]の上位機種にあたり、HP製RPN電卓としては8機種目である。コードネームは[https://dictionary.cambridge.org/us/dictionary/english/squash Squash (南瓜)]。第二世代はWoodstockシリーズとも呼ばれている&amp;lt;ref name=&amp;quot;1st&amp;quot; /&amp;gt;が、本機はWoodstockシリーズ初のプログラマブル関数電卓&amp;lt;ref name=&amp;quot;program&amp;quot; /&amp;gt;である。管理人は『[[ポケット電卓による計算解析 −HP 25による−]]』という書籍の存在を知り、本書の美品が購入できたため、本機を購入している。&lt;br /&gt;
__TOC__&lt;br /&gt;
[[HP-35]]から3年経過した間に進歩したMOS LSI技術&amp;lt;ref name=&amp;quot;mos&amp;quot; /&amp;gt;を貪欲に取り入れることで、[[HP-35]]ではそれぞれ独立した半導体として実装した演算回路(A&amp;amp;R)・制御回路(C&amp;amp;T)・二相クロックドライバの3個を1チップに収めたマイクロプロセッサであるACT(Arithmetic, Control and Timing)を[https://www.hpmuseum.org/hp21.htm HP-21]と本機向けに新規開発・実装し、[[HP-35]]と比較して1台あたり200ドルにも及ぶ大幅な価格低減に成功している。スタックは3+1段で変わらず、ACTは10進数だけではなく16進数でも演算できるよう拡張され、12ビットアドレス空間(最大4,096命令)、再帰命令、ユーザが自由に使用できる8個のユーザレジスタ(1レジスタは56ビット)、16個のフラグ、2レベルのリターンアドレス、4ビットレジスタを実装しており、内部では[[HP-35]]と同じ14桁BCDで演算しているが、筐体をポケットサイズに収めることと消費電力を抑えるために、演算結果は7セグメント赤色LEDが10桁分しか無い。演算結果の比較から、本機に実装された演算アルゴリズムを含むソフトウェアは[[HP-35]]と同じと推定される&amp;lt;ref name=&amp;quot;soft&amp;quot; /&amp;gt;ものの、プロセッサクロック周波数が20kHz切り下げられ180kHzにされたため演算速度が[[HP-35]]より遅いのを体感できる。ユーザによる最大49ステップのプログラムを実行できるが、スタックとプログラムを格納するRAMは揮発性で、入力したプログラムを外部に出力する手段も用意されていないため、電源をOFFするとスタックの内容とプログラムは消失する&amp;lt;ref name=&amp;quot;25c&amp;quot; /&amp;gt;。本機の附属マニュアルは非常に充実しており、120ページ4色刷りのOwner&#039;s Manual、Quick References Guide、161ページのProgram Bookの3部構成。プログラムフォームのサンプルシートも含まれている。&lt;br /&gt;
&lt;br /&gt;
===自爆する電卓 - &#039;&#039;Roasted chip&#039;&#039;===&lt;br /&gt;
[[HP-35]]の好評を受けて設計・開発された第二世代たるWoodstockシリーズだが、残念ながら、ハードウェアに致命的な欠陥が存在する。それは&#039;&#039;&#039;消耗品である純正充電池(HP 82019A/B)が、整流回路で必須の回路素子(基準電圧源)として組み込まれることを前提にした設計になっている&#039;&#039;&#039;というものだ。&lt;br /&gt;
&lt;br /&gt;
現在市販されているACアダプタは、内蔵する降圧用交流トランスで商用交流電力から受電した交流電力を降圧後、整流回路で直流化して外部に直流電力を供給するのが一般的だが、本機を含むWoodstockシリーズの純正ACアダプタ(HP 82026A)は、交流120V/240Vの複電圧に対応した降圧用交流トランスしか内蔵しておらず、したがって、外部には交流電圧10V程度&amp;lt;ref name=&amp;quot;ac&amp;quot; /&amp;gt;の交流電力を供給する。これによりWoodstockシリーズでは、HP 82026Aから受電した交流電力を本体に内蔵した整流回路で直流化し、基板上のMOS LSIやICやLEDなど各ハードウェアに供給しつつ、HP 82019A/Bも充電するという回路構成にならざるを得ないのだが、この整流回路の設計に大きな問題がある。&lt;br /&gt;
&lt;br /&gt;
Woodstockシリーズの整流回路は、&lt;br /&gt;
#整流用ダイオード1本で半波整流&lt;br /&gt;
#電流制限抵抗1本に直列する形でHP 82019A/Bを充電 (充電電圧2.75V, 充電電流125mA)&lt;br /&gt;
#電流制限抵抗とHP 82019A/Bの間から線を引き出し、DC-DCコンバータである2石ブロッキング発振回路へ直流電圧2.4Vの電力を渡す&lt;br /&gt;
#2石ブロッキング発振回路はMOS LSIやICやLEDなど各ハードウェア所定の電圧まで昇圧し、これらへ直流電力を供給する&lt;br /&gt;
という構成だが、2石ブロッキング発振回路へ渡す電力の直流電圧2.4Vを規定するクランプ回路の基準電圧源として、充電中であるHP 82019A/Bの端子電圧2.4Vを利用する設計になっているのだ。&lt;br /&gt;
&lt;br /&gt;
クランプ回路は、受電した電力が基準電圧源より過大な電圧であっても、基準電圧源と同じ電圧に&amp;lt;ruby&amp;gt;&amp;lt;rb&amp;gt;固定&amp;lt;/rb&amp;gt;&amp;lt;rt&amp;gt;クランプ&amp;lt;/rt&amp;gt;&amp;lt;/ruby&amp;gt;する機能を提供する。本機のような低電圧の整流回路では、管理人を含むアマチュアの電子回路設計者でも、基準電圧源にダイオード2本を採用する。しかし、当時のHPのハードウェア設計者は「HP 82019A/Bの実態は『2本直列した単3形Ni-Cd充電池』だ。充電されたNi-Cd充電池は1本あたりの起電力＝電圧が1.2Vだから、2本直列で2.4Vになる」ことに着目、基準電圧源にHP 82019A/Bを利用することを思い付いてしまい、整流回路からダイオード2本をケチった。&lt;br /&gt;
&lt;br /&gt;
これにより、本機をHP 82026Aで給電した状態で使用するときもHP 82019A/Bが取り外せなくなった。裏を返せば、HP 82019A/Bが正常に装着されてなかったり、経時劣化や容量抜けなど異常な状態であることを見逃したりと、HP 82019A/Bに少しでも不備がある状態で本機にHP 82026Aで給電すると、HP 82019A/Bが基準電圧源として機能せずクランプ回路が成立しないため、規定の直流電圧2.4Vより高圧の直流電力を2石ブロッキング発振回路へ渡すことを意味する。ブロッキング発振回路は入力電圧が高ければ昇圧後の出力電圧も高くなる回路特性なので、整流回路全体としては、MOS LSIやICやLEDの電気的仕様を超える高圧の直流電力を供給し、最終的にはそれらを焼き切ってしまう(過電圧による焼損)。&lt;br /&gt;
&lt;br /&gt;
つまり、Woodstockシリーズ使用時は常に、HP 82019A/Bの装着状態や劣化状況をユーザが監視せねばならず、それを怠ると、いとも簡単に自爆する電卓なのだ。&lt;br /&gt;
&lt;br /&gt;
さすがに「電源回りの回路設計が雑なので…」とは言えないからだろう、Woodstockシリーズのマニュアルは随所に&#039;&#039;Whether you operate from battery or from power supplied by the charger,&#039;&#039; &#039;&#039;&#039;&#039;&#039;the battery must always be in the calculator.&#039;&#039;&#039; (充電池で使用する場合も、充電器から電源を供給する場合も、&#039;&#039;&#039;必ず、常に、電卓に充電池を装着してください。&#039;&#039;&#039;)&#039;&#039; という定型の注意書きが繰り返され、本機マニュアル102ページでは、わざわざ下記のように目立たせて警告を発しているものの、これらの文から、整流回路がここまで粗末なことを見透すのは難しい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|style=&amp;quot;border-style: solid; border-width: 1px; border-color: skyblue&amp;quot;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;CAUTION&#039;&#039;&#039;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;Attempting to operate the HP-25 from the ac line with the battery pack removed may result in damage to your calculator.&#039;&#039;&#039;&amp;lt;br&amp;gt;&#039;&#039;(純正充電池を取り外した状態でACアダプタを接続してHP-25を使用すると、損傷する可能性があります。)&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
恐らくはHP 82026Aを単純にして、かつ、ダイオード2本をケチることでコストダウンを狙ったのだろうが、MOS LSIの微細化で実装するLSIの数を減らせた時点で既に200ドルもの大幅なコストダウンに成功しているので、MOS LSIと較べてかなり安価な基準電圧源ダイオード2本を削ってまで、通常使用時ですら故障が発生する整流回路を採用すべきではないのは言うまでもない。もし「ダイオード2本を実装する場所が筐体内に確保できなかった」のが削減の理由だとしたら、ここを妥協してまで筐体を小型化すること自体を止めるべきなのも同じだ。当時としては高価なRPNポケット関数電卓に、自爆したとき運悪く回路が短絡したままだと発火しかねない整流回路を採用したのか、現在でも理解不能な謎のひとつである。海外のRPN電卓マニアが&#039;&#039;&#039;&#039;&#039;Roasted chip&#039;&#039;&#039;&#039;&#039;と呼ぶこの事象は現在も世界中で多発しており、その殆どはHP 82019A/Bの経時劣化を見逃したことが原因で、ユーザが知らぬ間に致命傷を負っている。何如な当時のNi-Cd充電池でも1年未満で容量抜けが発生するような経時劣化は起きないであろうことから、発売当初に購入した本機のユーザは「HPが規定した1年間の無償修理期間を過ぎて暫くしたら突然壊れた」ように見えただろう。&lt;br /&gt;
&lt;br /&gt;
このように、本機はユーザが気付かぬうちに勝手に自爆して故障することが多かったうえ、ふつうのユーザは故障した電卓を廃棄するため、発売から45年経った現在、本機は美品はおろか完動品や故障品ですら貴重品扱いである。尤も、先述した「電源OFFでスタックの内容とプログラムが消失する」仕様が嫌われ、そもそも本機は人気が無く&amp;lt;ref name=&amp;quot;popularity&amp;quot; /&amp;gt;、eBayをはじめとする中古市場やオークションサイトにも殆ど出品されない&amp;lt;ref name=&amp;quot;exhibit&amp;quot; /&amp;gt;ため、入手性は極めて悪い。[http://www.dentaku-museum.com/calc/calc/51-hp/hp/ad/ad5/1.pdf YHPによる日本国内での定価]は40,000円。&lt;br /&gt;
&lt;br /&gt;
なお、この自爆機能を発動させることなく現在まで生き残った数少ない本機を使用する際は、遥か昔に販売を停止した[https://www.keesvandersanden.nl/calculators/batteries.php HP 82019A/Bのケース中央のプラスティックバーを慎重に切り落とし、Ni-Cd充電池から市販のアルカリ単3電池に入れ替え]て使用するか、もし現在も正常なHP 82019A/Bが手許にあるとしても、絶対に本機では充電せず、HP 82019A/B専用の純正充電器([[HP 82028A]])で充電後に装着して使用するのがお約束である。純正充電池が手許に無い場合は純正ACアダプタによる給電で使用するしか選択肢が無い[[HP-35]]とは異なり、本機を含むWoodstockシリーズでは如何なる場合でも純正ACアダプタの使用が禁忌事項であるという珍しい状況になっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7}518796.992\ \; (\varepsilon\!_R=2.87\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 42.99999997&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||180kHz (Woodstock)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||HP 82019A/B (2.4V 325mAh/650mAh 充電池:中身は単3形Ni-Cd充電池×2個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1975年〜1978年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||アメリカ、シンガポール、ブラジル&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1975年発売当時の定価||195ドル (約59,300円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;1st&amp;quot;&amp;gt;[[HP-35]]をはじめとする第一世代のチップセットには呼称が無かったらしく、便宜上、Classicシリーズと呼んでいる。なお、一連のシリーズ名称はHP電卓マニアが勝手に名付けたものなので、“解ってる”人にしか通用しない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;program&amp;quot;&amp;gt;プログラム可能なHP製ポケットRPN関数電卓としては、いずれもClassicシリーズである[[HP-65]]、[[HP-55]]に続き3機種目となる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;mos&amp;quot;&amp;gt;主に採用したのは微細化(集積度)に関する技術であり、構造は[[HP-35]]と同じpMOSであるため、実装するLSIの数は減っているものの、消費電力はそこまで下がっていない(2.5V, 500mW)。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;soft&amp;quot;&amp;gt;現代の一般的な関数電卓と同様、本機には、三角関数・逆三角関数の直接演算可能な角度の単位として、度数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {DEG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の他に弧度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {RAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とグラード(フランス度)&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {GRD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が実装されたが、敢えて度数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {DEG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;に設定し、&amp;lt;math&amp;gt;\tfrac{355}{226}&amp;lt;/math&amp;gt;に&amp;lt;math&amp;gt;\tfrac{180}{\pi}&amp;lt;/math&amp;gt;を乗じて度数に変換して正接&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\tan&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を演算させると、[[HP-35]]と同じ結果である&amp;lt;code&amp;gt;-7462686.567&amp;lt;/code&amp;gt;&amp;lt;math&amp;gt; (\varepsilon\!_R=4.61\times10^{-3})&amp;lt;/math&amp;gt;を出力する。&amp;lt;br&amp;gt;本文にある通り、弧度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {RAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で演算させるほうが高精度な結果を出力するのは当然なのだが興味深い。電卓内部で丸めたことで誤差が発生した無理数を含む演算が多ければ多いほど、誤差を累積・伝播させることになり、その演算結果が数学的な正解からどんどん離れる様子が端的に判る。これは他のHP製RPN関数電卓はもちろん、日本製の関数電卓でも同じで、[[HP-41CX]]で度数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {DEG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;に設定し同様の演算をさせると&amp;lt;code&amp;gt;-7519131.170&amp;lt;/code&amp;gt;&amp;lt;math&amp;gt;(\varepsilon\!_R=2.92\times10^{-3})&amp;lt;/math&amp;gt;となり弧度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {RAD}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;での演算結果より精度が悪化することが、偶々手許にあるCasio fx-61Fでは弧度&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {RAD}&amp;lt;/math&amp;gt;}} で演算させると&amp;lt;code&amp;gt;-7497938.067&amp;lt;/code&amp;gt;&amp;lt;math&amp;gt;(\varepsilon\!_R=9.07\times10^{-5})&amp;lt;/math&amp;gt;となかなかの高精度ではあるものの、度数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {DEG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で演算させると&amp;lt;code&amp;gt;-7498171.713&amp;lt;/code&amp;gt;&amp;lt;math&amp;gt;(\varepsilon\!_R=1.22\times10^{-4})&amp;lt;/math&amp;gt;と精度が1桁落ちることが、それぞれ確認できる。管理人が理系大学の学生だった30年ほど前には単独の授業科目として開講されていた『[https://en.wikipedia.org/wiki/Numerical_analysis 数値解析]』の講義内容を、PCに処理言語をインストールしてソースコードを書いてプログラムを組んで演算させるまでもなく関数電卓1台で理解できる好例である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;25c&amp;quot;&amp;gt;本機が発売された翌1976年7月1日、この不便さを解消するため、新規に開発した低消費電力CMOSメモリとキャパシタを実装することでスタックとプログラムを格納するRAMを不揮発性にし、電源をOFFにしてもスタックの内容とプログラムを消失させないよう改良した[https://www.hpmuseum.org/hp25c.htm HP-25&#039;&#039;&#039;C&#039;&#039;&#039;]を発売した。型名に追加した&#039;&#039;&#039;C&#039;&#039;&#039;は、HPでは不揮発性RAMをContinuous Memory:連続メモリと名付けたことに因む。その後、1979年〜1987年に発売した機種のうち型名にCが付与されたもの[HP-33C/[[HP-34C]]/HP-38C/HP-41C(1979年7月1日発売)、HP-41CV(1980年12月15日発売)、[[HP-10C/HP-11C/HP-15C|HP-11C]]/[[HP-12C]](1981年9月1日発売)、[[HP-10C/HP-11C/HP-15C|HP-15C]]/[[HP-16C]](1982年7月1日発売)、[[HP-10C/HP-11C/HP-15C|HP-10C]](1982年9月2日発売)、[[HP-41CX]](1983年10月1日発売)、HP-18C(1986年6月1日発売)、HP-28C(1987年1月5日発売)]も同じ機能が実装されていることを表す命名規則を採用していたが、1988年1月4日発売の[[HP-28S]]で廃止された。どのメーカでも不揮発性RAMを実装するのが当たり前となり、製品の型名でわざわざ強調する意味が無くなったからである。ちなみに、HPのライバルであるTIは、同じものをConstant Memory:定常メモリと名付けている。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ac&amp;quot;&amp;gt;仕様上の出力は交流電圧10V・最大容量1.8VAだが、単なる交流トランスであることと、電力会社から各戸に引き込まれている商用交流電力の電圧が頻繁に上下することから、交流トランスの仕組み上、入力電圧が上下すれば出力電圧も上下することになり、出力交流電圧を10Vに固定できない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;popularity&amp;quot;&amp;gt;Woodstockシリーズでは、本機の改良版である[https://www.hpmuseum.org/hp25c.htm HP-25C]と、本機の上位機種にあたる上級プログラム関数電卓[https://www.hpmuseum.org/hp29.htm HP-29C]が人気のようだが、本文で示した致命的な欠陥により、これらも美品どころか完動品ですら貴重品で、eBayをはじめとする中古市場やオークションサイトに出品されるのも稀である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;exhibit&amp;quot;&amp;gt;HP製RPN電卓を専門に扱っているような“解ってる”出品者であれば、Woodstockシリーズを出品する際の品物説明に「動作確認でACアダプタを使っていません」や「私はこの商品にACアダプタを接続したことがありません」といった但し書きを必ず付けて、出品者が品物を自爆させかねない操作をしてないことを宣言することで、これまた“解ってる”人は安心して入札し、あまり人気が無い本機でも完動品は比較的高価で取引されるが、リサイクル業者等の“解ってない”出品者から、動作確認作業の内容やこの種の但し書きが無く出品された品物は、その動作確認作業が原因で自爆している可能性が高いため、“解ってる”人は入札を控える。&amp;lt;br&amp;gt;管理人は1度、恐らく殆ど使われてなかったであろう、外装に傷ひとつ無い、極めて美品の本機がeBayに出品されていたのを見つけたものの、説明文に「充電池が壊れていたのでACアダプタのみで動作確認しましたが、LEDが一瞬鈍く光った後、動きませんでした」とあったときの遣る瀬無さたるや…もしかすると物好きが出品者に直接連絡して買い叩いたのかもしれないが、システム上はその出品に誰も入札せず、取引終了日時経過後に引っ込められた。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=GNU_Emacs%E3%81%A8Wanderlust%E3%81%A7OAuth2%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6Gmail%E3%82%92%E9%80%81%E5%8F%97%E4%BF%A1%E3%81%99%E3%82%8B&amp;diff=6777</id>
		<title>GNU EmacsとWanderlustでOAuth2を使用してGmailを送受信する</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=GNU_Emacs%E3%81%A8Wanderlust%E3%81%A7OAuth2%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6Gmail%E3%82%92%E9%80%81%E5%8F%97%E4%BF%A1%E3%81%99%E3%82%8B&amp;diff=6777"/>
		<updated>2025-04-20T01:51:43Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|Debian GNU/Linux Customize Tips|frame=1}}&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Email_client メーラ(MUA)]を使用してGmailを送受信する際のユーザ認証に[https://oauth.net/2/ OAuth2]が強制されるようになって久しい。これは、[https://www.gnu.org/software/emacs/ GNU Emacs]と[https://github.com/wanderlust/wanderlust/blob/master/README.ja.md Wanderlust]の組み合わせでGmailをOAuth2認証で送受信するには、何をどう設定すべきか、というメモ。&lt;br /&gt;
&lt;br /&gt;
なお、管理人のPC環境から、OSはDebian、Emacsとそれに付随するelispパッケージはDebian公式リポジトリやMELPAリポジトリにアップロードされているものに限定する。再インストール時などに再現性が悪いからだ。&lt;br /&gt;
&lt;br /&gt;
===前提条件===&lt;br /&gt;
#[https://support.google.com/cloud/answer/15549257?hl=ja&amp;amp;ref_topic=15540269&amp;amp;sjid=13290097507279632304-NC Googlaが公開している手順]に従い、送受信したいGmailアカウントのclient IDとclient secretを取得・有効化し、別途メモする。&lt;br /&gt;
#EmacsでMELPAリポジトリが使用できるよう&amp;lt;code&amp;gt;~/.emacs.el&amp;lt;/code&amp;gt;に必要な行を追加する。&lt;br /&gt;
#GmailではSMTP送信文を暗号化する[https://en.wikipedia.org/wiki/Opportunistic_TLS STARTTLS]を採用しているので、EmaceとWanderlustから&amp;lt;code&amp;gt;gnutls-bin&amp;lt;/code&amp;gt;を使用できるようインストールと設定をする。&lt;br /&gt;
&lt;br /&gt;
===設定手順===&lt;br /&gt;
#&#039;&#039;&#039;Debian公式リポジトリから&#039;&#039;&#039;Wanderlustと必要なelispパッケージをインストールする。&amp;lt;br&amp;gt;Wanderlustと必要なelispパッケージはMELPAリポジトリからもインストールできるが、&#039;&#039;&#039;MELPAリポジトリからインストールするとOAuth2が機能しないので要注意。機能しない理由は不明。&#039;&#039;&#039;&amp;lt;br&amp;gt;ここでWanderlust本体である&amp;lt;code&amp;gt;wl&amp;lt;/code&amp;gt;と、これに必要な&amp;lt;code&amp;gt;apel&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;flim&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;semi&amp;lt;/code&amp;gt;の3個のelispパッケージが同時にインストールされる。&lt;br /&gt;
#MELPAリポジトリから&amp;lt;code&amp;gt;auth-source-xoauth2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oauth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oauth2-auto&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oauth2-request&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;url-http-oauth&amp;lt;/code&amp;gt;の5個のelispパッケージをインストールする。&amp;lt;br&amp;gt;このとき、&amp;lt;code&amp;gt;aio&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;alert&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dash&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oauth2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;request&amp;lt;/code&amp;gt;の5個のelispパッケージがdependencyとして使用可能であることを確認する。&lt;br /&gt;
#&amp;lt;code&amp;gt;~/.wl&amp;lt;/code&amp;gt;に、OAuth2認証を有効とする&amp;lt;code&amp;gt;(auth-source-xoauth2-enable)&amp;lt;/code&amp;gt;という行を追加後、[https://wanderlust.github.io/wl-docs/wl-ja.html#oauth2 Wanderlustのマニュアル]に従って、先述の前提条件でメモしたclient IDとclient secretを追加する。&lt;br /&gt;
#WanderlustでGmailアカウントの認証手段に&amp;lt;code&amp;gt;xoauth2&amp;lt;/code&amp;gt;と指定する。&amp;lt;br&amp;gt;たとえば、IMAP受信メールボックスでは&amp;lt;code&amp;gt;~/.folders&amp;lt;/code&amp;gt;に&amp;lt;code&amp;gt;%INBOX:&amp;quot;xxxxx@gmail.com&amp;quot;/&amp;lt;font color=red&amp;gt;xoauth2&amp;lt;/font&amp;gt;@imap.gmail.com:993!&amp;lt;/code&amp;gt;と設定する。&amp;lt;br&amp;gt;SMTP送信認証では&amp;lt;code&amp;gt;~/.wl&amp;lt;/code&amp;gt;に&amp;lt;code&amp;gt;(wl-smtp-authenticate-type . &amp;quot;&amp;lt;font color=red&amp;gt;xoauth2&amp;lt;/font&amp;gt;&amp;quot;)&amp;lt;/code&amp;gt;と設定する。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以降は、他のメールアカウントと同様に送受信できる。&lt;br /&gt;
&lt;br /&gt;
なお、設定後に初めてGmailアカウントでSMTP/IMAPアクセスすると「アクセストークン受け入れ処理」が走り、そのPCのデフォルトWebブラウザにリダイレクトされるので、遷移後の画面に表示される手順に従いアクセストークンをactivateする必要がある。また、このアクセストークンは受け入れ後7日(604,800秒)でexpireして使用不可となり、結果としてGmailが送受信できなくなるので、そのときは&amp;lt;code&amp;gt;~/.emacs.d/sasl-xoauth2/&amp;lt;/code&amp;gt;に保存されている送信用と受信用の2個のアクセストークン(拡張子は&amp;lt;code&amp;gt;.plstore&amp;lt;/code&amp;gt;)を手動で削除し、再度、アクセストークン受け入れ処理をやり直す必要がある。&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-48GX&amp;diff=6776</id>
		<title>HP-48GX</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-48GX&amp;diff=6776"/>
		<updated>2025-04-13T08:30:24Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1993年6月1日〜2003年3月30日に販売された汎用RPL上級グラフィックプログラム関数電卓。[[HP-48SX]]の直接の後継機で、コードネームは[https://en.wikipedia.org/wiki/Charles_Martel Hammer (メロヴィング朝フランク王国の宮宰だったカール・マルテルの別称)]である。型名にXが付いていることから判るように、本機背面には拡張カードスロットを2口装備している。同日に兄弟機種として拡張カードスロットが無い[http://www.hp-collection.org/calculators/48g.html HP-48G]も発売された。この2機種に[[HP-48SX]]/[http://www.hp-collection.org/calculators/48s.html HP-48S]/[http://www.hp-collection.org/calculators/48g+.html HP-48G+]の計5機種でHP-48シリーズを構成し、すべてでRPL(と階層化メニュー)を採用している。&lt;br /&gt;
&lt;br /&gt;
[[HP-48SX]]と較べ、マイクロプロセッサのクロック周波数は4MHzに倍速クロックアップ、RAMは128kBに4倍増、内蔵関数も500以上増やしたことで、「これ以上を関数電卓に求めるのは酷だ」と言わんばかりの超高機能数値解析コンピュータへ進化したが、価格は[[HP-48SX]]と同額に据え置かれ、[[HP-48SX]]と入れ替わる形で9年9ヶ月もの間製造・販売された。操作体系は[[HP-48SX]]と変わらないよう配慮されているものの、内蔵関数が増えたことで階層化メニューも深くなり、関数の入力や設定の手数が増えている。例えば本機で&amp;amp;nbsp;&amp;lt;math&amp;gt;253!&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算させるには&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {MTH}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {NXT}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color:black&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;PROB&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color:black&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;&amp;amp;emsp;!&amp;amp;emsp;&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt; と[[HP-48SX]]より1ステップ多くキーインする必要がある。製造年によりドットマトリクス液晶ディスプレイが代わっていることも知られており、当初からの大半は明表示が青色のパネルだったが、時期は不明なものの終盤の少数は明表示が黒色のパネルに変更されている。&lt;br /&gt;
&lt;br /&gt;
マニュアルも[[HP-48SX]]より更に分厚くなり、附属マニュアルとしては全612ページのUser&#039;s Guideが同梱されたが、実際にはこれだけでは足りず、プログラミング方法と実装されたコマンドの詳細を知るには、別売マニュアルである全764ページのAdvanced User&#039;s Reference Manualを購入する必要があった。即ち、本機の全貌を把握し使い込むには全1,376ページに及ぶマニュアルを読破しなければならない。[[HP-48SX]]同様、本機もRPLで演算環境が実装・構築されており、その体系をユーザに余すことなく伝えるにはそれだけの紙幅が必要だったのだ。&lt;br /&gt;
__TOC__&lt;br /&gt;
===最後の徒花===&lt;br /&gt;
しかし、ここまで超高機能に仕上がった本機が「爆発的に売れた」とか「製造復活を熱望されている」という話は聞かない。せいぜい、電卓はRPNしか使えない体になってしまった管理人のような者が購入する程度に留まり、結果として、HPが自社で開発・製造したRPN関数電卓は本機が最後となった。&lt;br /&gt;
&lt;br /&gt;
その理由はいくつかあるが、最大の理由は&#039;&#039;&#039;関数電卓を取り巻く環境の変化&#039;&#039;&#039;である。本機が発売された1993年は、IBM PC互換機(DOS/V機)が登場してパーソナルコンピュータ(PC)の価格破壊が進み、インターネットが一般ユーザにも開放されたことで商用ISPが登場、サービス提供を開始した年であり、[[HP-48SX]]を発売した時とは大きく異なる。それまでであれば関数電卓を最も使い込むユーザ層であろうハッカーやエンジニアを中心に急速にPCとグローバルリーチャビリティが普及し、オープンソースによるOSや数値解析プログラミング言語のコンパイラが比較的簡単に入手できるようになったことで、関数電卓に内蔵されてない関数や任意の演算アルゴリズムを、関数電卓以上の演算速度で、関数電卓と同等以上の演算精度を持つ演算結果が、関数電卓を最も使い込むユーザ自身が所有するPCで得られるようになり、関数電卓を購入する必要性が無くなったのだ。管理人は大学2年生だった1995年の秋(後期)にPC-9801シリーズからDOS/Vシリーズに乗り換えたが、1991年に購入したPC-9801シリーズと較べて、購入価格は半減し、CPUクロック周波数と内蔵メモリは10倍に増えた。通っていた私立理系単科大学は、情報系学科の講義・演習用に[https://www.freebsd.org/ FreeBSD]で構築されたワークステーションが整然と並ぶ計算機室が5室整備されており、これらが講義や演習で使われていない時間帯は、事前に利用講習を受講しログインIDを発行された学生であれば所属学科を問わず自由に利用できた。管理人が大学に入学した1994年春、初めてインターネット(WWWとFTPとE-mail)と[https://en.wikipedia.org/wiki/Fortran#FORTRAN_77 FORTRAN 77]と[https://en.wikipedia.org/wiki/C_(programming_language) C]と[https://en.wikipedia.org/wiki/LaTeX &amp;lt;span class=&amp;quot;texhtml&amp;quot; style=&amp;quot;font-family: &#039;CMU Serif&#039;, cmr10, LMRoman10-Regular, &#039;Latin Modern Math&#039;, &#039;Nimbus Roman No9 L&#039;, &#039;Times New Roman&#039;, Times, serif;&amp;quot;&amp;gt;L&amp;lt;span style=&amp;quot;text-transform: uppercase; font-size: 0.75em; vertical-align: 0.25em; margin-left: -0.36em; margin-right: -0.15em; line-height: 1ex;&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;T&amp;lt;span style=&amp;quot;text-transform: uppercase; vertical-align: -0.25em; margin-left: -0.1667em; margin-right: -0.125em; line-height: 1ex;&amp;quot;&amp;gt;e&amp;lt;/span&amp;gt;X&amp;lt;/span&amp;gt;]に触れたのも、これら計算機室であった。進級する条件として単位取得が必修であった工学実験で課されるレポートも、それまでは、実験で得られた数値に数式を適用する際は関数電卓で演算、その結果を[https://www.d2sol.co.jp/product_search/handwritten/sheet/graphpaper/ 方眼紙/片対数方眼紙/両対数方眼紙]上に点で打ち、それら点同士を[https://webshop.sekaido.co.jp/product/A000993 自在定規]や[https://webshop.sekaido.co.jp/product/A000989 雲形定規]で結ぶことで曲線グラフを手描き&amp;lt;ref name=&amp;quot;ruler&amp;quot; /&amp;gt;したが、比較的若い教員が担当する科目から順に、PCでの演算やシミュレーションを前提として、数値演算も曲線グラフ描画もPCで出力させる内容へ差し替えられていった。これにより一部の同級生が「過去レポが通用しなくなった」と嘆いていたのを覚えている&amp;lt;ref name=&amp;quot;report&amp;quot; /&amp;gt;。本機が発売された1990年代中盤はまさに、&#039;&#039;&#039;個人による数値演算の主役が関数電卓からPCへ移行&#039;&#039;&#039;する過渡期にあたり、しかもこの変化は不可逆であった。&lt;br /&gt;
&lt;br /&gt;
もう1つの理由は、&#039;&#039;&#039;アメリカ国内の電卓市場におけるHPのマーケット・シェア低下&#039;&#039;&#039;である。[[Nut/Saturnプロセッサファミリ#cite_note-vs_ti-4|別ページ]]でも記した通り、アメリカの電卓市場は初等および中等の数学教育がキャスティング・ボートを握っており、電卓メーカの売上げも大半がここからとなるため、製品開発のターゲットは自然と中高生(と中高生に教える教師)になる。ライバルであるTIは徹底的なまでに中高生とアメリカの数学教育に適合した安価な機種を開発・販売し続けることで「電卓＝TI」と刷り込み、その中高生が社会に出て働き始め電卓を買う際にもTIを選択するように仕向ける&amp;lt;ref name=&amp;quot;share&amp;quot; /&amp;gt;という、ファストフードチェーンの日本マクドナルドに似た長期戦略がこの頃に結実し、アメリカ国内の電卓市場におけるマーケット・シェアの90%以上を獲得するに至った。当然、数学教育以外の分野向け製品についてもTIはHPの動向を窺っており、HPが本機を発売した年の対抗機種である[https://en.wikipedia.org/wiki/TI-82 TI-82]は本機を圧倒する高性能機に仕上がった。これは、HPが、信頼と実績と伝統から、[[HP-35]]から本機に至るまで、電卓に採用するCPUアーキテクチャを「自社開発の4ビットシリアルマイクロプロセッサ」から頑として変えなかったことからハードウェアの高性能化に遅れを取ると同時に高コスト化に喘いでいたのに対し、TIは、こだわりも節操も無く、[https://en.wikipedia.org/wiki/Zilog_Z80 Z80]や[https://en.wikipedia.org/wiki/Motorola_68000 MC68k]や[https://en.wikipedia.org/wiki/ARM_architecture_family ARM]など、そのときに最適で低コストなCPUアーキテクチャを選択し、その中で可能な範囲で容易にハードウェアを高性能化できたことが大きい。その結果、同じ販売価格で純粋にハードウェアスペックを比較するとTIが勝ることと、世の大勢はRPNに思い入れやこだわりが無いことから、ますますTIのシェアが上がっていった。RPNの優位性を積極的に説かなかったHPにも責任はあろう。&lt;br /&gt;
&lt;br /&gt;
最後の理由は、&#039;&#039;&#039;ハードウェアとソフトウェアのアンバランスさ&#039;&#039;&#039;である。そもそも本機はグラフの描画が「可能なものの常用するには厳しい」ほど処理が遅いどころか、特に拡張カードスロットに何かしらのアプリケーションカードを装着していると秒間3回以上連続してキーインできない(ユーザからの入力を零す)ことすらある。何かしらキーインする度に、内蔵および拡張カードスロットに装着したアプリケーションソフトウェアから認識した関数を[https://en.wikipedia.org/wiki/Tree_(data_structure) 木構造]を辿って探索していて、しかもその間は[https://en.wikipedia.org/wiki/Keyboard_buffer キーバッファ]が機能しない&amp;lt;ref name=&amp;quot;hp81&amp;quot; /&amp;gt;からだ。当然、キーインされた数値/文字/命令に応じて探索結果は絞られていくのだが、キーインの入力速度より関数の探索速度が遅ければ、ハードウェアリソースがソフトウェアによる関数の探索に引っ張られ(遅い処理に律速され)、[https://en.wikipedia.org/wiki/Keyboard_buffer キーバッファ]を準備する処理が実行されず&amp;lt;ref name=&amp;quot;hp81&amp;quot; /&amp;gt;、ユーザからのキーインを零すことになる。端的に言えば、アプリケーションカードを装着した状態の本機は、CPUクロック周波数とメモリ量と内部バス速度が不整合な状態&amp;lt;ref name=&amp;quot;unbalance&amp;quot; /&amp;gt;に陥っている。[[HP-48SX]]ではこの事象が発生しないため、[[HP-48SX]]から500以上の関数を追加実装した時点で、関数の探索速度が既に常時最速のまま張り付いている状態なのだろう。言い換えると、アプリケーションカードを装着した状態での性能試験を実施しなかったと考えられる。もし実施していれば、アプリケーションカードを装着したときは「探索速度を上げる」か「探索方法を変える」か「探索対象を絞る」か、いずれかの対策を打たねばならないと判断できよう。いずれにしろ、ハードウェアとソフトウェアがまったく噛み合ってない本機は、&#039;&#039;&#039;超高機能だが超高性能ではない&#039;&#039;&#039;、残念な機種と言わざるを得ない。この状況を回避するには、気長に、ひと呼吸置いてキーインすれば良いだけなのだが、それまでの他機種では難無くできたことができないのはストレスになるもので、これまでのHP製関数電卓と同じ感覚でキーインすると苛々させられる。故に、管理人が日頃常用する機種は、本機の遠い祖先である[[HP-41CX]]となり、本機を「最後の徒花」と難じている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;☆&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
現在からこれら3つの理由を俯瞰すると、管理人の眼には「本機が[https://en.wikipedia.org/wiki/TI-82 TI-82]に負けた時点で、HPは、電卓市場での積極的な事業展開を諦めた」ように映ってしまう。ひょっとすると、この時点で電卓事業部門が大幅に縮小されたのかもしれない。一応、2002年中に発売する予定で、TIの独擅場である初等および中等の数学教育市場に特化した[https://www.hpmuseum.org/xpand.htm Xpander]を開発していたものの、先述したように一般ユーザ向けは本機が最後で、後継機を開発していた話を聞かないからだ。そしてこの[https://www.hpmuseum.org/xpand.htm Xpander]も、HPの経営陣が2001年末で電卓事業からの撤退と事業部門の閉鎖を決断したことを受け、製造開始数ヶ月前である2001年11月に社内プロセスのすべてがキャンセルされ「幻の機種」となってしまった&amp;lt;ref name=&amp;quot;xpander&amp;quot; /&amp;gt;。ちなみに、[https://www.hpmuseum.org/xpand.htm Xpander]のCPUには従来の自社製4ビットシリアルマイクロプロセッサではなく日立製[https://en.wikipedia.org/wiki/SuperH SH-3]が、OSには自社のRPLではなく[https://en.wikipedia.org/wiki/Windows_Embedded_Compact#Releases Windows CE 3.0]が、ぞれぞれ採用され、関数電卓やプログラミング環境は[https://en.wikipedia.org/wiki/Windows_Embedded_Compact#Releases Windows CE 3.0]で動く個別のアプリケーションソフトウェアとしてインストールされる形態を取り、ハードウェアとしてテンキーのキーボードは実装したものの、アプリケーションソフトウェアの操作体系は液晶ディスプレイをスタイラスペンでなぞる方法を主とした。そのため、この当時ですら「これは『グラフィックプログラム関数電卓』ではなく『高価で中途半端な[https://en.wikipedia.org/wiki/Personal_digital_assistant PDA]』だ」「中高生の乱暴な取扱いに液晶ディスプレイが持ち堪えるとは思えない」など散々な言われようで、もし発売したとしても、HPの目論見通りに売れたかどうかは怪しい。なお、その後、[https://www.hpmuseum.org/xpand.htm Xpander]用に開発した[https://en.wikipedia.org/wiki/Windows_Embedded_Compact#Releases Windows CE 3.0]上で動く関数電卓アプリケーションソフトは、ノンサポートの単体ソフトウェアとして無償で開放された。「せっかく開発したのに、そのまま廃棄(削除)するのは勿体無い。だが、電卓事業から撤退した以上、このソフトのサポートやバグ対応に人員を割くことはできない」&amp;amp;#x2E3A;当時のHPの良心と社内事情がそのまま表出したような対応である。&lt;br /&gt;
&lt;br /&gt;
===さらば、RPN電卓===&lt;br /&gt;
こうしてHPの電卓事業はジリ貧状態に突入し、2001年末に撤退するニュースが世界を駆け巡ったのは[[RPN電卓/歴史と現在|先述]]の通りだ。しかもこのときのHPのCEOが[https://en.wikipedia.org/wiki/Carly_Fiorina Carly Fiorina]だったという凶運も重なり、撤退方法に「電卓事業部門を丸ごと閉鎖、従業員は全員解雇」が選択されてしまった。この選択は、世界中のRPN電卓マニアを驚愕させもしたが、同時に憤怒と悲嘆の情をも抱かせた。「RPN電卓の33年の歴史が強引に幕引きさせられた」「なぜ電卓事業を他社へ譲渡もしくは売却しなかったのか」「もうRPN電卓は買えないのか」。&lt;br /&gt;
&lt;br /&gt;
間髪を置かず、その情は「さらば、RPN電卓」「最後にRPN電卓を買おう」と怒涛の勢いで本機を含む4機種のRPN電卓の流通在庫を買い漁らせ、瞬く間に世界中の電卓売り場から一掃された。2001年末当時のHPの関数電卓ラインナップでRPNを採用していたのが、[[HP-10C/HP-11C/HP-15C|HP-15C]]の後継機種とされる[http://www.hp-collection.org/calculators/32sii.html HP-32SII]&amp;lt;ref name=&amp;quot;32sii&amp;quot; /&amp;gt;と、HP-48シリーズの本機/[http://www.hp-collection.org/calculators/48g.html HP-48G]/[http://www.hp-collection.org/calculators/48g+.html HP-48G+]の4機種しか無かった&amp;lt;ref name=&amp;quot;49g&amp;quot; /&amp;gt;からである。&lt;br /&gt;
&lt;br /&gt;
あれから二十余年。eBayをはじめとする中古市場やオークションサイトには[[HP-48SX]]ともども出品数は多く、入手するのは比較的容易だ。特に本機は新品未開封のまま出品されることが多いのも特長だろう。これは、現在も本機を数値演算のメインで常用しているユーザが減り、RPN関数電卓とはどういう製品だったか、それを保存するという意味で購入・所有するマニアが大半だったことと、本機のエミュレータがWindows向け/Linux向け/Android向け/iOS向け/その他OS向け問わず山ほど出回っていることも影響していると思われる。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
なお、本機特有の事象として、経年により&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {ON}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーを押下しただけでは電源が入らないことがある。もしこの事象に遭遇したら、キーボード最上部にあるファンクションキーの&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {B}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {C}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の中点から液晶ディスプレイの下部へ向かい垂線を1cm伸ばした点を軽く押しながら&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {ON}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キーを押下すれば、電源を入れることができる。&lt;br /&gt;
&lt;br /&gt;
また、本機はシンガポールとインドネシアで製造されたが、一部のヘヴィユーザから「1996年以前のシンガポール製のほうが耐静電気性能が高い」と評されているものの、真偽は不明である。管理人は両国製を所有しているが、有意な差を見出せていない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7497}089.06508\ \; (\varepsilon\!_R=2.26\times10^{-5})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 43.0000000000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||無制限 (内蔵メモリが許すまで)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||4MHz (Yorke 00048-80063)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||単4形×3本&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1993年〜2003年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||シンガポール (〜1996年) → インドネシア (1997年〜)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1993年発売時の定価||350ドル (約39,000円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ruler&amp;quot;&amp;gt;機械系や建築系は当然だが、電気(強電)系でも電子(弱電)系でも、ましてや情報系でも、1990年代前半に工学部に居た大学生なら学科を問わず、一通りの製図用具を購入させられた。当時はPCを所有している学生のほうが少ないうえ、卒業後に就職した企業が社員全員にPCを与えるわけではない時代でもあったため、職業訓練の一環としても「曲線グラフを手描きする技能」の習得が求められたからだ。管理人は工学部電子工学科を卒業したが、弱電系の学生ですら、[https://en.wikipedia.org/wiki/Computer-aided_design 2D CAD]で作図し[https://en.wikipedia.org/wiki/Plotter X-Yプロッタ]で出力させる製図と、[https://en.wikipedia.org/wiki/Drafting_machine ドラフタ]と[https://en.wikipedia.org/wiki/Technical_pen 製図ペン]で手描きする製図の授業が、4年生へ進級する条件として単位取得が必修だった頃の話である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;report&amp;quot;&amp;gt;管理人が受験生だった1990年代前半、私立大学の入学試験で、各大学が独自に作問して課す試験(一般入試)だけではなく、[https://ja.wikipedia.org/wiki/大学入試センター試験 大学入試センター試験(セ試)]の結果を利用できるようになり、これらを並行して実施することが流行り始めた。しかも後者では「受験生が大学に申し出る『合否判定に使用して欲しい科目』は、セ試で受験したどの科目を選択しても良い＝一般入試では必須の科目を選択しなくても良い」とする大学もあった。本来はその大学にどうしても入学したい受験生が一般入試で失敗した際の救済策(故にセ試の結果に自信がある受験生が出願するため高倍率)なのだが、この脆弱性を突いて、高校で数学Ⅱ(基礎解析/代数・幾何/微分・積分/確率・統計)/物理/化学を履修していない文系の受験生が、セ試(の自己採点)で高得点だった国語/英語Ⅰ・Ⅱ/日本史/世界史を『合否判定に使用して欲しい科目』に申し出て理系の大学に合格、なぜかそのまま入学してしまう椿事が出来し始めた。高校から理系の学生であれば数学Ⅱ/物理/化学について素養がある(からこそ入試で合格した)ため、学部レベルの必修の工学実験ごときで過去レポなんぞ不要で、担当する教授もそのように実験全体を構築しているのだが、この脆弱性を突いて入学した元・文系の学生は、まず実験の意義と内容の理解が追い付かず慌てていたのを何度も目撃している。尤も、通常の講義や試験の前後でも内容がまったく理解できず慌てていたのだが。なお、碌に単位が取れてないことで有名だった、顔と名字は知っているものの話したことはないその同級生が卒業できたか否かは把握していない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;share&amp;quot;&amp;gt;これは教師の側にも言える。もし関数電卓のメーカを変えると操作方法も変わるため、教師もそれを学習し直す必要があるが、教師はそれを面倒臭がり、自分の生徒にはTIの関数電卓を購入するよう勧める…このサイクルは現在に至るまでアメリカの初等教育現場で延々と続いており、HPが気付いたときにはこの牙城を崩すのが難しいと判断、最終的には電卓事業そのものから(一旦)撤退となった。なお、なぜ教師が操作方法の学習し直しを面倒臭がったかと言えば、TIの電卓は中置記法であり、HPのRPN関数電卓を採用するには[[RPN電卓/序説|概念を変える必要がある]]からだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;hp81&amp;quot;&amp;gt;[[HP-45/HP-46|HP-46]]で触れた[https://www.hpmuseum.org/hp81.htm HP-81]には、このような事態が発生することを見越してキーバッファが別売オプションとして用意されており、希望するユーザは有償で装着・内蔵できた(「バッファアセンブリ(00081-66542)」と「バッファ表示アセンブリ(00081-66543)」)。事前に性能試験を実施したからこその対応だ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;unbalance&amp;quot;&amp;gt;本文冒頭に記載した通り、本機は[[HP-48SX]]と較べ、マイクロプロセッサのクロック周波数は4MHzに倍速クロックアップ、RAMは4倍増の128kBあるが、内部バス速度は変更ナシと推定される。また一般に、拡張カードスロットに装着するアプリケーションカードで採用されているフラッシュメモリはアクセス速度が低い。いくら回転が速く記憶量が多い脳を持っていても、それらを繋ぐ神経が細く鈍いのでは、情報を処理する時間より、欲しい情報/処理した情報が届くのを待つ時間が長くなる。よって、脳は正常だが、他者からの問い掛けに対する反応が遅くなり、「とろいぞ！」と言われる…これと同じだ。足を引っ張っているのは内部バスとフラッシュメモリではなかろうか。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;xpander&amp;quot;&amp;gt;「幻の機種」であるにもかかわらず、極稀に、1,000ドルを優に超える価格でeBayに出品されているのを見掛けることがある。しかし、これが落札されたのを見掛けたことはない。OSが[https://en.wikipedia.org/wiki/Windows_Embedded_Compact#Releases Windows CE 3.0]であるが故、入手しても碌に使えないだろうことが容易に想像できるからだ。いくら変わり者が多いRPN電卓マニアでも、落札したとて「飾る」か「保存する」かしか選択肢がない機種に1,000ドル以上を払う奇矯な人は居ない。[[HP製RPN電卓の特長#異常に堅牢な造作|特長]]でも記載した通り、HP製RPN電卓は「異常に堅牢な造作」ゆえに「故障せず長期間使える」ことが最大の利点であり、多少の高値が許される理由である。そこを履き違えられてもね…ということだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;32sii&amp;quot;&amp;gt;製品の並びとしては確かに、1991年3月1日に70ドルで販売開始となった[http://www.hp-collection.org/calculators/32sii.html HP-32SII]は、1989年1月1日で販売終了となった[[HP-10C/HP-11C/HP-15C|HP-15C]]の後継と位置付けられるが、その割には[[HP-10C/HP-11C/HP-15C|HP-15C]]より機能が削られたり縮小されたりしている。[[HP-10C/HP-11C/HP-15C|HP-15C]]では行列が演算できるうえ、複素数演算状態に設定するとスタックが実部用と虚部用に2列並行するように倍増することで複素数でも最大4組積めるため、実数演算時と同じ感覚で複素数を扱うことができるが、[http://www.hp-collection.org/calculators/32sii.html HP-32SII]では行列が演算できず、複素数は1組の実部と虚部でスタックを2段消費してしまうため2組しか積めない。そのためRPN電卓マニアは[http://www.hp-collection.org/calculators/32sii.html HP-32SII]について、[[HP-10C/HP-11C/HP-15C|HP-15C]]の大人気振りと[[HP-34C]]の不人気振りから「『[[HP-10C/HP-11C/HP-15C|HP-15C]]から機能を削った』のではなく『[[HP-34C]]に(複素数演算)機能を(中途半端に)追加した』機種だよ」と皮肉るが、その指摘は正鵠を得ており、なぜHPが先発機種で好評だった機能を後継機種で削ったり縮小したりと改悪したのか、その理由が傍目には理解不能である。[[HP-10C/HP-11C/HP-15C|HP-15C]]と[http://www.hp-collection.org/calculators/32sii.html HP-32SII]の間には8年半もの歳月があり、その間に起きた半導体技術の進歩と価格の暴落を考慮すれば、わざわざ機能を削ったり縮小したりする理由が見当らないため尚更である。ちなみに、[http://www.hp-collection.org/calculators/32sii.html HP-32SII]に実装された、Saturnマイクロプロセッサを内包するワンチップLSIは[https://www.keesvandersanden.nl/calculators/hp32sii_repair.php NEC製]である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;49g&amp;quot;&amp;gt;厳密には[https://en.wikipedia.org/wiki/HP_49/50_series HP-49G]もあるが、これのデフォルトの入力方法は中置記法で、RPNで入力するには、電池を入れ替える度に「RPNモード」に設定変更する必要がある。即ち、[https://en.wikipedia.org/wiki/HP_49/50_series HP-49G]ではRPNがオマケ機能の扱いであるため、今回のようにRPN電卓に含めない場合が結構ある。この〝迷い〟や〝ブレ〟は、同じ仕様である[[HP-35s]]について触れる際にも見られる。なお、管理人は、[https://en.wikipedia.org/wiki/HP_49/50_series HP-49G]と[[HP-35s]]をRPN電卓に含めていない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-48SX&amp;diff=6774</id>
		<title>HP-48SX</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-48SX&amp;diff=6774"/>
		<updated>2025-04-13T07:22:45Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1990年3月16日〜1993年6月1日に販売された科学・数学向けRPL上級グラフィックプログラム関数電卓。コードネームは[https://en.wikipedia.org/wiki/Charlemagne Charlemagne (カール大帝)]。HPでは4機種目&amp;lt;ref name=&amp;quot;display&amp;quot; /&amp;gt;の、ディスプレイにグラフを描画できる機種である。型名にXが付いていることから判るように、本機背面にはソフトウェアや拡張メモリ(補助記憶機構)を装着できる拡張カードスロット&amp;lt;ref name=&amp;quot;card&amp;quot; /&amp;gt;を2口装備している。1991年4月2日には後発の兄弟機種として拡張カードスロットが無い[http://www.hp-collection.org/calculators/48s.html HP-48S]も発売された。この2機種に[[HP-48GX]]/[http://www.hp-collection.org/calculators/48g.html HP-48G]/[http://www.hp-collection.org/calculators/48g+.html HP-48G+]の3機種を加えた計5機種でHP-48シリーズを構成し、すべてでRPL(と階層化メニュー)を採用している。&lt;br /&gt;
__TOC__&lt;br /&gt;
===もはや「関数電卓」ではなく「数値演算専用コンピュータ」===&lt;br /&gt;
ハードウェアとソフトウェアは、様々な意味で議論を巻き起こした[http://www.hp-collection.org/calculators/28c.html HP-28C]と[[HP-28S]]が直接の祖先となるものの、実装された機能からは、[[HP-41CX]]を含む[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の後継機種として開発されたことが判る。RPLを採用したため本機のOwner&#039;s Manualは全457ページのVol.1と全395ページのVol.2に二分冊(後に合冊)される程度に分厚く、全貌を把握するには骨が折れるが、合冊版では末尾にAppendix Fとして&#039;&#039;Comparing the HP 48 and HP 41 (HP-48とHP-41の比較)&#039;&#039;が14ページ追記され、本機と[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の共通点と差異を、主にプログラミングの面から説明している。その理由は、RPLを採用した本機を含むHP-48シリーズでは、[[HP-42S]]と異なり、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のプログラムを直接流用できないからだ。11年5ヶ月も販売され続けたことで膨大な数となった[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のユーザから同様の問合せが多数あったことを窺わせるが、この追記には、HPが目論んでいたであろう「[http://www.hp-collection.org/calculators/28c.html HP-28C]と[[HP-28S]]による、既存ユーザのSaturnプロセッサファミリへの移行」が失敗したこと対する、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]ユーザへの贖罪も含まれている気がしてならない。即ち、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]のユーザの殆どは[http://www.hp-collection.org/calculators/28c.html HP-28C]や[[HP-28S]]を購入しなかったため碌にハックされず、ユーザコミュニティでも[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]からの移行方法等が話題にならかったようで、HPはこの2機種を失敗作と断じたのだろう。&lt;br /&gt;
&lt;br /&gt;
その失敗作に届いたクレームを反映した結果、本機を含むHP-48シリーズでは、筐体は従来からのストレート型(幅81mm×奥行180mm×高さ29mm)に戻され、ドットマトリクス液晶ディスプレイは倍となる22桁8行まで拡大し、外部接続インタフェースとして有線シリアル通信ポートが追加され、物理キーは49個に減らされたにもかかわらず比較的高頻度に使用するであろう三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {SIN}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {COS}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {TAN}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、開平&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{x}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、冪乗&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、逆数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;には独立した物理キーが復活した。マイクロプロセッサは引き続きSaturnだが、クロック周波数は関数電卓とは思えぬ2MHzまでクロックアップし、単4電池3本を装着した質量は295gと肥大化したものの、こういった強化により、[http://www.hp-collection.org/calculators/28c.html HP-28C]や[[HP-28S]]で致命的な弱点として指摘された「外部とのデータやプログラムの授受手段」が複数用意され、拡張カードスロットには拡張メモリであるRAMカードの他、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]同様、HPやサードパーティから多種多様に発売されたソフトウェアを装着できる点は、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]を意識している証左である。&lt;br /&gt;
&lt;br /&gt;
本機では、四則演算や三角関数/逆三角関数/指数関数/対数関数/冪乗/羃根/逆数は当然として、階乗/ガンマ関数/双曲線関数/ルートソルバ/数値積分/行列式/複素数の扱い/平均/標準偏差/順列・組合せ/線形回帰と推定/正規分布/乱数発生などなど、凡そ現代数学で真値もしくは近似値の求解を迫られるであろう関数や機能を2,100個以上内蔵し、かつ、これらについてグラフを描画できるようにした。[https://en.wikipedia.org/wiki/Numerical_integration 数値積分]を演算させるべく数式を入力すれば、大型化されたドットマトリクス液晶ディスプレイの特性を生かしてインテグラル&amp;lt;math&amp;gt;\int&amp;lt;/math&amp;gt;を使用した見慣れた定積分の式がそのまま表示されるギミックには感動すらしたようだ。本機のOwner&#039;s Manual Vol.1の冒頭では&#039;&#039;Discovering the Power of the HP 48 (HP-48の威力を知る)&#039;&#039;という節を設け&amp;lt;ref name=&amp;quot;tutorial&amp;quot; /&amp;gt;、架空の企業が実地試験から得たという廃棄プラスティックから原油を生成する速度のモデル式&amp;amp;nbsp;&amp;lt;math&amp;gt;R=\frac {G^2(1+\sin PT)}{1.4}&amp;lt;/math&amp;gt;&amp;amp;nbsp;について、&amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;&amp;amp;nbsp;と&amp;amp;nbsp;&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;&amp;amp;nbsp;には実地試験から得られる定数を代入することで時間&amp;amp;nbsp;&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&amp;amp;nbsp;を変数とする関数と見做し&amp;amp;nbsp;&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&amp;amp;nbsp;で積分することで、生成される原油の量&amp;amp;nbsp;&amp;lt;math&amp;gt;V=\!\!\int_{0}^{T}\!\!R(T)\,dT =\int_{0}^{T}\!\frac {G^2(1+\sin PT)}{1.4}\, dT&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算、速度&amp;amp;nbsp;&amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&amp;amp;nbsp;と量&amp;amp;nbsp;&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&amp;amp;nbsp;を縦軸に、時間&amp;amp;nbsp;&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&amp;amp;nbsp;を横軸に取って1画面でグラフを描かせ、その曲線をカーソルでトレースしつつ、「ユーザが指定した量&amp;amp;nbsp;&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&amp;amp;nbsp;を生成するには、どの程度の時間&amp;amp;nbsp;&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&amp;amp;nbsp;が必要か」や「ユーザが指定した時間&amp;amp;nbsp;&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&amp;amp;nbsp;では、どの程度の量&amp;amp;nbsp;&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&amp;amp;nbsp;の原油が生成されるか」等を確認する一連の手順をスクリーンショット付きのチュートリアルで示しているが、1990年3月発売で、単4乾電池3本で駆動する可搬型RPN関数電卓が、内蔵関数だけ(＝単体)でここまでできることを示したこの内容は、管理人のように高校で[https://erid.nier.go.jp/files/COFS/s53h/chap2-4.htm 物理]と[https://erid.nier.go.jp/files/COFS/s53h/chap2-3.htm 微分・積分]を取っていれば平易に理解できる演算内容ながら「もっと難しい、解くのが面倒な式を食わせてみたい！」と思わせる複雑さも包含しており、購入者に本機の威力を解らせるには十分過ぎるインパクトである。&lt;br /&gt;
&lt;br /&gt;
しかし、内蔵関数が4桁ともなると、使用頻度が高い関数や機能を物理キーへの割り当てに苦労することになり、シフトキーは[[HP-34C]]以来の右&amp;amp;nbsp;&#039;&#039;&#039;&amp;lt;font color=&amp;quot;#00BFFF&amp;quot;&amp;gt;{{keypress|&amp;amp;#8625;}}&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;左&amp;amp;nbsp;&#039;&#039;&#039;&amp;lt;font color=&amp;quot;#FF6600&amp;quot;&amp;gt;{{keypress|&amp;amp;#8624;}}&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;アルファベット&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;の3段構えとなった。例えば常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {LOG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {LN}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;はそれぞれ&amp;amp;nbsp;&#039;&#039;&#039;&amp;lt;font color=&amp;quot;#00BFFF&amp;quot;&amp;gt;{{keypress|&amp;amp;#8625;}}&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;y^x&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と&amp;amp;nbsp;&#039;&#039;&#039;&amp;lt;font color=&amp;quot;#00BFFF&amp;quot;&amp;gt;{{keypress|&amp;amp;#8625;}}&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が割り当てられている。使用頻度が低い関数や機能には物理キーが割り当てられてないため、これらを呼び出すには相変わらず階層化メニューを辿らねばならない。例えば&amp;amp;nbsp;&amp;lt;math&amp;gt;253!&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算するには、[[HP-42S]]同様、本機も階乗関数は確率&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color:black&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;PROB&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;amp;nbsp;メニュー配下にあるため、{{keypress|&amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {MTH}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color:black&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;PROB&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color:black&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;&amp;amp;emsp;!&amp;amp;emsp;&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt; と階層を下ることで、演算結果である&amp;lt;code&amp;gt;5.17346099264E499&amp;lt;/code&amp;gt;を得られる。なお、この結果に&amp;amp;nbsp;&amp;lt;math&amp;gt;254&amp;lt;/math&amp;gt;&amp;amp;nbsp;を乗じる(即ち&amp;amp;nbsp;&amp;lt;math&amp;gt;254!&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算させる)と算術オーバーフローするため&amp;lt;code&amp;gt;9.99999999999E499&amp;lt;/code&amp;gt;が表示され、数学的な真値の近似値である&amp;amp;nbsp;&amp;lt;math&amp;gt;1.31405909213\mathrm{E}502&amp;lt;/math&amp;gt;&amp;amp;nbsp;は得られない。尤も、アルファベットの入力が階層化されてないだけでも[[HP-42S]]よりマシである。{{keypress|&amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;とアルファベットシフトキーを連打すると英字大文字入力モード、続けて&amp;amp;nbsp;&#039;&#039;&#039;&amp;lt;font color=&amp;quot;#FF6600&amp;quot;&amp;gt;{{keypress|&amp;amp;#8624;}}&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;で英字小文字入力モード、再度&amp;amp;nbsp;&#039;&#039;&#039;&amp;lt;font color=&amp;quot;#FF6600&amp;quot;&amp;gt;{{keypress|&amp;amp;#8624;}}&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と押下すれば英字大文字入力モードに戻れる。いずれかのモードに入れば、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と同様にアルファベットを連続して入力できるので、RPLのソースコードを書く際の苛々は大幅に低減された。アルファベット入力モードから抜けるには&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;を1回押下すれば良いことも含め、この挙動は[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]を見習ったのだろうが、本機単体でソースコードを書く場面を考えれば至極当然の作り込みである。アルファベットを1文字入力するためにいちいち階層化メニューを辿らねばならない[[HP-42S]]が異常なのだ。&lt;br /&gt;
&lt;br /&gt;
結果として本機は、[http://www.hp-collection.org/calculators/28c.html HP-28C]や[[HP-28S]]と比較するのも烏滸がましい、RPN関数電卓の範疇を超えた「数値演算専用コンピュータ」といった趣で仕上がった。RPLを採用したため数式の数値化に&amp;amp;nbsp;&#039;&#039;&#039;&amp;lt;font color=&amp;quot;#00BFFF&amp;quot;&amp;gt;{{keypress|&amp;amp;#8625;}}&amp;lt;/font&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\rightarrow\text{NUM}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;(本機でも&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {EVAL}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;キー)を実行する一手間が必要だったり、不便極まりない階層化メニューが採用されていることは残念なものの、有線シリアル通信インタフェースが設けられたことでユーザがRPLのソースコードを書く手段が本機の階層化メニューだけに限られず、ユーザが持つ有線シリアル通信インタフェース付き端末で書いてから本機へ流し込めるようになったことで、ソースコードの長短でユーザが入力手段を使い分けられる逃げ道が用意された恰好となり、購入者にも納得感があったようだ。それでも、本機を単体で使い熟す場合は、階層化メニューをすべて記憶するか、別売で全504ページのReference Manualを傍らに首っ引きしなければならないことに変わりは無いのだが。&lt;br /&gt;
&lt;br /&gt;
===ラストチャンス===&lt;br /&gt;
本機が発売された1990年初頭はIBM PC互換機(DOS/V機)によるPCの価格破壊が起きる直前にあたり、現代のようにオープンソースによるOSや数値解析プログラミング言語のコンパイラが気軽に入手できる訳もなく、それよりなにより一般ユーザがインターネットに接続できる環境が整ってなかった&amp;lt;ref name=&amp;quot;isp&amp;quot; /&amp;gt;ため国内・海外問わずネットワーク越しに演算リソースを借りることもできず、個人所有のパーソナルコンピュータで本機に実装された関数と同等の演算をするのは至難の業であった。&lt;br /&gt;
&lt;br /&gt;
よって、HPが意図的に狙ったかは不明なものの、発売時期が絶妙だった本機は良く売れた。関数電卓にとってのラストチャンスを見事に攫んだと言って良い。結果論だが、真っ当に売れた最後のRPN関数電卓は本機である。ライバルであるTIが同時期に発売した[https://en.wikipedia.org/wiki/TI-81 TI-81]より高機能かつ高性能だったことも本機の販売台数を押し上げた。&lt;br /&gt;
&lt;br /&gt;
が、本機も[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と同じ運命を辿る。あまりに有用であったが故にHPの想定を超えた使い込まれ方が続出、「内蔵メモリもCPUクロックも足りない！」という指摘を多数受けることになったのだ。その指摘からHPが出した答えが、1993年6月1日に発売した[[HP-48GX]]である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7497}089.06508\ \; (\varepsilon\!_R=2.26\times10^{-5})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 43.0000000000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||無制限 (内蔵メモリが許すまで)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||2MHz (Clarke 1LT8)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||単4形×3本&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1990年〜1993年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||シンガポール&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1990年発売時の定価||350ドル (約50,750円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;display&amp;quot;&amp;gt;初は[http://www.hp-collection.org/calculators/28c.html HP-28C]と[[HP-28S]]、その後に[[HP-42S]]が続くが、液晶ディスプレイの大きさが、[http://www.hp-collection.org/calculators/28c.html HP-28C]と[[HP-28S]]は4行、[[HP-42S]]は2行しか無いため、単体でグラフを描画しても実用的とは言えず、実装されている赤外線インタフェースと[[HP_82240A/HP_82240B|HP 82240A/HP 82240B]]を経由して感熱ロール紙に印刷して視認することが事実上の前提であった。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;card&amp;quot;&amp;gt;セイコーエプソン(当時)が開発した40ピンインタフェース規格をHPが独自に変更したもの。カードの大きさは[https://en.wikipedia.org/wiki/PC_Card PCMCIA(当時。1993年に「PCカード」と改称)]と同じ幅54.0mm×奥行85.6mmだが、高さはType 1の3.3mmより低い2.45mmである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;isp&amp;quot;&amp;gt;世界初の商用ISPは1989年にPSINetが、日本国内初の商用ISPは1992年11月にAT&amp;amp;T Jensが、それぞれサービスを開始している。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;tutorial&amp;quot;&amp;gt;本機の後継機種である[[HP-48GX]]のUser&#039;s Guideには、このような購入者を掻き立てる演算例は無く、六法全書のように淡々と使用方法の記載が続くため、読んでも面白くない。HPは「ページ数も激増したし、[[HP-48GX]]は本機の購入者しか買わないだろうから、この種の演算例は要らんだろ」と考えたのだろうか。勿体無いことである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-42S&amp;diff=6773</id>
		<title>HP-42S</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-42S&amp;diff=6773"/>
		<updated>2025-04-13T07:11:53Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1988年10月31日〜1995年5月1日に販売された科学・数学向け上級グラフィックプログラム関数電卓。コードネームは[https://en.wikipedia.org/wiki/Leonardo_da_Vinci Davinci (レオナルド・ダ・ヴィンチ)]。管理人が所有するのはシンガポール製。&lt;br /&gt;
&lt;br /&gt;
プログラム形式を、[[HP-41CX]]で追加実装した関数以外の、[http://www.hp-collection.org/calculators/41c.html HP-41C]と[http://www.hp-collection.org/calculators/41cv.html HP-41CV]に実装した関数とフォーマットに完全互換させ、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]向けに開発されたプログラム(ソースコード)をそのまま移植できることを売りにしているため、本機は[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の正当な後継機と見做すべきなのだが、その中身は「RPLを採用してない[[HP-28S]]」である。&lt;br /&gt;
__TOC__&lt;br /&gt;
===宿痾と化した「階層化メニュー」===&lt;br /&gt;
販売開始日から[[HP-28S]]と同時並行で開発が進められていたことが想像され、実装された関数や機能も[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]と酷似している。本来の意味の関数電卓に加え、複素数/ベクトル/行列/統計も演算でき、ルートソルバや数値積分、HEX/DEC/OCT/BINの数値で基数変換/整数演算/ビット演算を実装&amp;lt;ref name=&amp;quot;basis&amp;quot; /&amp;gt;し、22桁2行の英数字とグラフが描画できる&amp;lt;ref name=&amp;quot;graph&amp;quot; /&amp;gt;131×16画素のドットマトリクス液晶ディスプレイと赤外線プリンタと接続するための赤外線インタフェースを備え、ユーザインタフェースが階層化メニュー形式であることも含め同じである。異なるのは、プログラムを保存できるユーザメモリが7.2kBに切り下げられたこと、ドットマトリクス液晶ディスプレイの大きさ(行数)が半分になったこと、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と後方互換性を持たせるためにRPLを採用してないこと(したがってスタック段数は従来機種と同じ3+1段)、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]では別売のアプリケーションパックを装着しないと使用できなかった関数を含め内蔵関数が600以上まで拡大されたことぐらいである。&lt;br /&gt;
&lt;br /&gt;
物理キーが存在しない内蔵関数や機能は階層化メニューを辿って入力するは百歩譲って仕方無いとして、アルファベットの入力をも階層化メニューに押し込んだのはどういう了見なのだろうか。物理キーは37個あるもののシフトキーが&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\color{RedOrange}\blacksquare&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;のみ1段であることも相俟って、階層化メニューの悪辣さで言えば[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]より本機のほうが上だ。[[HP-28S]]でも例示した&amp;amp;nbsp;&amp;lt;math&amp;gt;69!&amp;lt;/math&amp;gt;&amp;amp;nbsp;を演算するには、本機の階乗関数は確率&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {PROB}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;メニューの下にある&amp;lt;ref name=&amp;quot;28s&amp;quot; /&amp;gt;ので&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {6}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {9}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\color{RedOrange}\blacksquare&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {PROB}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color:black&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;&amp;amp;emsp;N!&amp;amp;emsp;&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;amp;nbsp;となる。プログラミングでアルファベットを入力する場合は更に酷く、例えば&amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;を入力するには&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\color{RedOrange}\blacksquare&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {ALPHA}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color:black&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;ABCDE&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;background-color:black&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;tt&amp;gt;&amp;amp;emsp;A&amp;amp;emsp;&amp;lt;/tt&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/span&amp;gt;&amp;amp;nbsp;となる。アルファベット1文字入力するのに最長で4ステップ…いくらプログラム形式が[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と後方互換していてもこのユーザインタフェースでは、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]向けのソースコードを本機に移植する作業は苦行以外の何物でもない。先述した通り、本機には物理キーが37個あるのだから、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と同様、1物理キーに1アルファベットを割り当てた「アルファベット入力モード」を作れただろうに。&lt;br /&gt;
&lt;br /&gt;
この「アルファベットの入力をも階層化メニューで行う」仕様が致命傷となり、本機の階層化メニューは宿痾と化した。[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]でのアルファベット入力の軽快さを知っている管理人はこの仕様に心が折れ、本機でのプログラミングは早々に諦めた。せめてもの救いは、関数電卓では使用頻度が高い三角関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {SIN}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {COS}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {TAN}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、常用対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {LOG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、自然対数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {LN}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、逆数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\textstyle \, {^{1} \!\!\! \diagup \!\!\! _{x}}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、開平&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\sqrt{x}&amp;lt;/math&amp;gt;}} には物理キーが設けられたため[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]のように「数値解析プログラミング専用機」とはならず、ユーザの手許に転がっている直近の諸問題について真値や近似値をお手軽に求解できることだが、これは関数電卓の基本であり、[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]と比較すること自体がオカシイのだと捉えなければならない。それだけ[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]の異常さが際立つ。&lt;br /&gt;
&lt;br /&gt;
なお、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と較べてプロセッサクロック周波数が2.5倍もクロックアップされたにもかかわらず、使用するバッテリがHP-10Cシリーズと同等の低容量に切り下げられた&amp;lt;ref name=&amp;quot;vshp10&amp;quot; /&amp;gt;ため、本機を常用すると高頻度にバッテリを交換する&amp;lt;ref name=&amp;quot;battery&amp;quot; /&amp;gt;羽目に陥る。&lt;br /&gt;
&lt;br /&gt;
===一般人には人気らしいが…？===&lt;br /&gt;
あまりの[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]の不人気振りに、1990年3月16日に[[HP-48SX]]が発売されるまでの1年半、本機はHP製RPN関数電卓のラインナップで事実上の最上位機種に位置付けられた。[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と[[HP-10C/HP-11C/HP-15C|HP-15C]]の大多数と[[HP-16C]]の一部の機能や関数が本機に実装できたことで、それまでのラインナップにあった各機種のほぼ全ての機能が本機に収斂し、かつ、それらよりも販売価格が大幅に下がったからだ。そういう意味で本機は、〝一般ユーザ向け〟RPN関数電卓の、ひとつの頂点であろう。実際、本機は比較的良く売れたようで、製造期間は6年半に渡り、[https://thomasokken.com/free42/ Windows/Mac/Linux/Android/iOS向けエミュレータ]が存在する程度の人気は現在も保っている。eBayをはじめとする中古市場やオークションサイトにも出品され、入手性は良くもないが悪くもなく、状態が良ければ&amp;lt;ref name=&amp;quot;condition&amp;quot; /&amp;gt;落札価格や値付けもそれなりに高い。&lt;br /&gt;
&lt;br /&gt;
が、HP製関数電卓の歴史が事実上終焉した今となって俯瞰すると、この期間はHPの関数電卓事業がどん底だったと管理人は考える。「初めて触れたHP製RPN電卓が本機だ」というユーザであれば「まぁ…こんなもんかな」と刷り込まれるかもしれないが、古参のHP製RPN電卓ユーザ、特にプログラミングも多用する[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]ユーザともなると、階層化メニューの悪辣さと拡張性の無さから、本機に魅力を感じることは無い。演算精度と純正プリンタで印刷できるグラフの粒度は良い&amp;lt;ref name=&amp;quot;dotmatrix&amp;quot; /&amp;gt;ものの、それ以外は煮ても焼いても食えない代物だと即気付くからだ。先述した通り、本機は[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]の直接の後継機として開発したため、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]をリファレンスとしつつ、これを凌駕することを目指したはずだが、結局は[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]を越えられなかったことになる。1990年11月1日までは、併売されていた[[HP-41CX]]が相変らず売れ続けたことが何よりの証左だろう。「[[HP-28S#cite_note-repair-4|HPは電卓修理サービスを止めてしまった]]ので、今使っている[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]が壊れたら修理できない。ならば、終売する前に予備機として[[HP-41CX]]を買っておこう」という動きすらあったようだ。&lt;br /&gt;
&lt;br /&gt;
即ち、HPは、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]をはじめとする既存のユーザを、次世代プロセッサたる[[Nut/Saturnプロセッサファミリ|Saturn]]を採用した新しいプラットフォームである本機や[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]へ積極的に移行させたかったのだが、それを動かすOSやソフトウェアのユーザインタフェースやハードウェアの拡張性に関する判断を悉く誤り、すべての面で既存のユーザの要望とは正反対の方向へ走ってしまったことで、その目論見が潰れたのだ。[[HP-28S]]で詳述した惨劇と同様「エンジニアリングとマーケティングの自己満足による敗北」と言って良かろう。この感想は歴代のHP製RPN関数電卓を使用してきたマニアやヘヴィユーザが異口同音に述べたようで、他者にRPN関数電卓を知らしめるとき本機を推す者は居ない。&lt;br /&gt;
&lt;br /&gt;
この状況を察知したHPは、次のHP-48シリーズでRPN関数電卓最後の大花火を打ち上げる。その端をきったのが[[HP-48SX]]である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7497}089.06508\ \; (\varepsilon\!_R=2.26\times10^{-5})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 43.0000000000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||1MHz (Lewis 1LR2)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||LR44×3個&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1988年〜1995年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||アメリカ → シンガポール → ブラジル → インドネシア&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1988年発売時の定価||120ドル (約15,400円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;basis&amp;quot;&amp;gt;[[HP-16C]]と異なり、演算させるには基数を揃える必要がある。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;graph&amp;quot;&amp;gt;[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]や[[HP-48SX]]/[[HP-48GX]]を含むHP-48シリーズと異なり「グラフ機能」がアプリケーション化されてないため、本機でグラフを描くには、ドットマトリクス液晶ディスプレイの&amp;amp;nbsp;&amp;lt;math&amp;gt;x,y&amp;lt;/math&amp;gt;&amp;amp;nbsp;座標を指定して1画素を点描する&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {PIXEL}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;命令や、文字コードで指定した縦8画素を選択しつつ点描する&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {AGRAPH}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;命令を駆使した、その数式専用のプログラムを書く必要がある。本機附属マニュアルにはプログラム例として、ドットマトリクス液晶ディスプレイにグラフを描く&amp;lt;code&amp;gt;&amp;quot;DPLOT&amp;quot;&amp;lt;/code&amp;gt;のソースコードが154ページに、赤外線接続式サーマルプリンタ[[HP 82240A/HP 82240B]]にグラフを印刷する&amp;lt;code&amp;gt;&amp;quot;PLOT&amp;quot;&amp;lt;/code&amp;gt;のソースコードが158ページに、それぞれ記載されている。なお、マニュアルに記載されている&amp;lt;code&amp;gt;&amp;quot;DPLOT&amp;quot;&amp;lt;/code&amp;gt;は234バイト、&amp;lt;code&amp;gt;&amp;quot;PLOT&amp;quot;&amp;lt;/code&amp;gt;は337バイトのユーザメモリを消費する。本機のユーザメモリは7,200バイト超あるため、相当込み入った数式を描画させてもメモリ不足にはならないと思われる。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;28s&amp;quot;&amp;gt;なぜ階乗関数のカテゴライズが[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]での実数関数&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {REAL}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;メニューから変更されたかは不明である。尤も、管理人が学んだ頃の高校数学では[https://erid.nier.go.jp/files/COFS/s53h/chap2-3.htm 「確率・統計」]の[https://en.wikipedia.org/wiki/Partial_permutation 順列]・[https://en.wikipedia.org/wiki/Combinatorics 組合せ]で階乗&amp;amp;nbsp;&amp;lt;math&amp;gt;n!&amp;lt;/math&amp;gt;&amp;amp;nbsp;が初出するので、本機のように確率&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {PROB}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;メニューの下にあるほうが自然とも思える。実数関数としては大学数学の代数学や解析学で出て来るものの、工学部出身で[https://en.wikipedia.org/wiki/Stochastic_process 確率過程論]を駆使していたためか、代数学や解析学に馴染が無いというのが正直な感想である。当然、理学部(特に数学科)なら話は別だろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;vshp10&amp;quot;&amp;gt;HP-10Cシリーズはプロセッサの待機電流が10nA程度であることやプロセッサクロック周波数が220kHzと低いことも相俟って消費電力が0.25mW程度に収まり〝前回交換した時期を忘れる〟ほど長寿命となる&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;battery&amp;quot;&amp;gt;本機のバッテリ残量監視は閾値が微妙な設定だ。四則演算や内蔵関数による演算・プログラムの作成は可能だが、プログラムの実行・赤外線インタフェース経由での[[HP_82240A/HP_82240B|プリンタ]]への印刷など消費電力が大きい動作は不可能、という程度のバッテリ残量では、本機はバッテリ残量不足を警告する電池アイコン&amp;amp;#128267;を表示しない。「電卓の本分は『電卓だけで完結する演算』だろ！」と言わんばかりの閾値設定である。管理人が初めてこの事象に遭遇したとき、当初は本機や[[HP_82240A/HP_82240B|プリンタ]]の故障を疑ったが、本機のバッテリを新品へ交換すると復旧、それまで使用していたバッテリへ戻すと同じ事象が再発したため、本機のバッテリ(の残量監視の閾値)の問題であると切り分けられた。本機で「プログラムを作成することはできる(ソースコードを入力し保存することはできる)が、これを実行することはできない」事象が発生した場合は、バッテリを新品に交換してみることを推奨する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;condition&amp;quot;&amp;gt;本機を含む熱溶着封止ケースから採用された、上側ケース表面に貼られる「物理キーを説明するアルミニウム製シールプレート」と「それへの印刷品質」があまり良くないようで、ちょっと使い込むだけで文字やインクが剥げる。加えて、シールプレートの四隅や押下回数が多い電源キー&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {ON}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;やシフトキー&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\color{RedOrange}\blacksquare&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;周辺など、通常使用中によく擦れる箇所は、剥げると同時に罅割れも発生し皺が寄る。しかし、上側ケースと一体成形された物理キー上面の文字は、[[HP製RPN電卓の特長|特長]]で記した通り印刷ではなく象嵌なので、長期間使用しても剥げたりせず新品同様である。その結果、本機の中古品は「キー表面は新品同様なのにキー周辺は罅割れて剥げる」という、俯瞰すると違和感を覚える外観となり見窄らしく映る。この美的感覚は世界共通のようで、本機の中古品取引相場は(完動品であれば)シールプレートの美醜で全てが決まる。未使用・未開封なデッドストックはもちろん、中古品でもシールプレートに傷ひとつ無い美品は500ドル以上の値付けとなるが、剥げた面積と値付けは反比例し、罅割れがあると買い手はほぼつかない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dotmatrix&amp;quot;&amp;gt;[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]と[[HP 82143A]]または[[HP 82242A]]のセットで曲線を表現すると、印刷ヘッドがキャラクタ単位(通常は&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;を使用する)でしか移動しないため、印刷した曲線には滑らかさもなにもあったものではないが、本機や[[HP-28S]]でのグラフの印刷は「ドットマトリクス液晶に出力した画面をそのまま[https://en.wikipedia.org/wiki/Hard_copy ハードコピー]する」動作なので当たり前である。尤も、[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]に[[PPC ROM]]を装着し、&amp;lt;code&amp;gt;HA&amp;lt;/code&amp;gt;ルーチン(HIGH RESOLUTION HISTOGRAM WITH AXIS)や&amp;lt;code&amp;gt;HS&amp;lt;/code&amp;gt;ルーチン(HIGH RESOLUTION HISTOGRAM)や&amp;lt;code&amp;gt;HP&amp;lt;/code&amp;gt;ルーチン(HIGH RESOLUTION PLOT)を使用して曲線を印刷すると、ドットマトリクス液晶画面のハードコピーと同等の出力が可能なので、本機/[http://www.hp-collection.org/calculators/28c.html HP-28C]/[[HP-28S]]の優位性は「マイクロプロセッサの性能向上による演算精度だけ」という身も蓋もないことになる。この意味でも[https://www.hpmuseum.org/hp41.htm HP-41シリーズ]に[[PPC ROM]]は必須である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8&amp;diff=6764</id>
		<title>メインページ</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8&amp;diff=6764"/>
		<updated>2025-03-30T08:19:26Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*{{Fontsize|15|[[RPN電卓]]}}&lt;br /&gt;
*{{Fontsize|15|[[Raspberry Pi]]}}&lt;br /&gt;
*{{Fontsize|15|[[Debian GNU/Linux Customize Tips]]}}&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Fontsize/doc&amp;diff=6763</id>
		<title>テンプレート:Fontsize/doc</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Fontsize/doc&amp;diff=6763"/>
		<updated>2025-03-30T08:15:23Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation subpage|種類=[[Help:テンプレート|テンプレート]]}}&lt;br /&gt;
&lt;br /&gt;
==使用方法==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|ピクセル数|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|サイズ|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
===例===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|25|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;||{{Fontsize|25|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|250%|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;||{{Fontsize|250%|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|xx-small|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - もっとも小さなサイズ||{{Fontsize|xx-small|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|x-small|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - より小さなサイズ||{{Fontsize|x-small|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|small|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - 小さなサイズ||{{Fontsize|small|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|medium|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - Webブラウザの基準となるサイズ。サイズはWebブラウザによって異なる||{{Fontsize|medium|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|large|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - 大きなサイズ||{{Fontsize|large|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|x-large|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - より大きなサイズ||{{Fontsize|x-large|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|xx-large|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - もっとも大きなサイズ||{{Fontsize|xx-large|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|smaller|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - 要素に指定済みのサイズより1段階小さなサイズ||{{Fontsize|smaller|文字}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Fontsize|larger|文字}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; - 要素に指定済みのサイズより1段階大きなサイズ||{{Fontsize|larger|文字}}&lt;br /&gt;
|}&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
{{デフォルトソート:{{TEMPLATENAME}}}}&lt;br /&gt;
&amp;lt;!-- カテゴリは以下に追加してください --&amp;gt;&lt;br /&gt;
[[カテゴリ:レイアウト用テンプレート]]&lt;br /&gt;
[[カテゴリ:フォント関連テンプレート]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:TEMPLATENAME&amp;diff=6761</id>
		<title>テンプレート:TEMPLATENAME</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:TEMPLATENAME&amp;diff=6761"/>
		<updated>2025-03-30T08:15:23Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--(Template:TEMPLATENAME start:)&lt;br /&gt;
 --&amp;gt;{{safesubst:#ifeq:{{{require|{{{1|{{SUBPAGENAMEE}}}}}}}}|{{SUBPAGENAMEE}}&lt;br /&gt;
     | {{safesubst:#ifeq:{{safesubst:NAMESPACE}}|{{ns:Template}} | |{{safesubst:NAMESPACE}}:}}&amp;lt;!--&lt;br /&gt;
      --&amp;gt;{{safesubst:#ifeq:{{safesubst:SUBPAGENAMEE}}|{{{docpage|{{{override|doc}}}}}}&lt;br /&gt;
          | {{safesubst:BASEPAGENAME}}&lt;br /&gt;
          | {{safesubst:#switch:{{SUBPAGENAMEE}}&lt;br /&gt;
             |doc |sandbox |testcases = {{safesubst:BASEPAGENAME}}&lt;br /&gt;
             | {{safesubst:PAGENAME}}&lt;br /&gt;
    }}   }} }}&amp;lt;!--(Template:TEMPLATENAME ends)&lt;br /&gt;
--&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Ifnumber&amp;diff=6759</id>
		<title>テンプレート:Ifnumber</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Ifnumber&amp;diff=6759"/>
		<updated>2025-03-30T08:15:23Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#ifeq: {{lc:{{{1|}}}}} | e | {{{3|0}}} | {{#iferror:{{#expr:{{{1|}}}*0}}|{{{3|0}}}|{{{2|1}}}}} }}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Documentation/styles.css&amp;diff=6757</id>
		<title>モジュール:Documentation/styles.css</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Documentation/styles.css&amp;diff=6757"/>
		<updated>2025-03-30T08:15:23Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp-template}} */&lt;br /&gt;
.documentation,&lt;br /&gt;
.documentation-metadata {&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	background-color: #ecfcf4;&lt;br /&gt;
	clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation {&lt;br /&gt;
	margin: 1em 0 0 0;&lt;br /&gt;
	padding: 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-metadata {&lt;br /&gt;
	margin: 0.2em 0; /* same margin left-right as .documentation */&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
    padding: 0.4em 1em; /* same padding left-right as .documentation */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-startbox {&lt;br /&gt;
	padding-bottom: 3px;&lt;br /&gt;
	border-bottom: 1px solid #aaa;&lt;br /&gt;
	margin-bottom: 1ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-heading {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 125%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-clear { /* Don&#039;t want things to stick out where they shouldn&#039;t. */&lt;br /&gt;
	clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-toolbar {&lt;br /&gt;
	font-style: normal;&lt;br /&gt;
	font-size: 85%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@media screen {&lt;br /&gt;
    html.skin-theme-clientpref-night .documentation,&lt;br /&gt;
	html.skin-theme-clientpref-night .documentation-metadata {&lt;br /&gt;
	    background-color: #0b1e1c;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@media screen and (prefers-color-scheme: dark) {&lt;br /&gt;
    html.skin-theme-clientpref-os .documentation,&lt;br /&gt;
    html.skin-theme-clientpref-os .documentation-metadata {&lt;br /&gt;
        background-color: #0b1e1c;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/* [[カテゴリ:テンプレートスタイル]] */&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Documentation/config&amp;diff=6755</id>
		<title>モジュール:Documentation/config</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Documentation/config&amp;diff=6755"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----------------------------------------------------------------------------------------------------&lt;br /&gt;
--&lt;br /&gt;
--                               Configuration for Module:Documentation&lt;br /&gt;
--&lt;br /&gt;
-- Here you can set the values of the parameters and messages used in Module:Documentation to&lt;br /&gt;
-- localise it to your wiki and your language. Unless specified otherwise, values given here&lt;br /&gt;
-- should be string values.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Do not edit this line.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Protection template configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;protection-reason-edit&#039;]&lt;br /&gt;
-- The protection reason for edit-protected templates to pass to&lt;br /&gt;
-- [[Module:Protection banner]].&lt;br /&gt;
cfg[&#039;protection-reason-edit&#039;] = &#039;template&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Sandbox notice configuration&lt;br /&gt;
--&lt;br /&gt;
-- On sandbox pages the module can display a template notifying users that the current page is a&lt;br /&gt;
-- sandbox, and the location of test cases pages, etc. The module decides whether the page is a&lt;br /&gt;
-- sandbox or not based on the value of cfg[&#039;sandbox-subpage&#039;]. The following settings configure the&lt;br /&gt;
-- messages that the notices contains.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-notice-image&#039;]&lt;br /&gt;
-- The image displayed in the sandbox notice.&lt;br /&gt;
cfg[&#039;sandbox-notice-image&#039;] = &#039;[[File:Sandbox.svg|50px|alt=|link=]]&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;sandbox-notice-pagetype-template&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-pagetype-module&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-pagetype-other&#039;]&lt;br /&gt;
-- The page type of the sandbox page. The message that is displayed depends on the current subject&lt;br /&gt;
-- namespace. This message is used in either cfg[&#039;sandbox-notice-blurb&#039;] or&lt;br /&gt;
-- cfg[&#039;sandbox-notice-diff-blurb&#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;sandbox-notice-pagetype-template&#039;] = &#039;[[Wikipedia:テンプレートのサンドボックスとテストケース|テンプレート・サンドボックス]]ページ&#039;&lt;br /&gt;
cfg[&#039;sandbox-notice-pagetype-module&#039;] = &#039;[[Wikipedia:テンプレートのサンドボックスとテストケース|モジュール・サンドボックス]]ページ&#039;&lt;br /&gt;
cfg[&#039;sandbox-notice-pagetype-other&#039;] = &#039;サンドボックス・ページ&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;sandbox-notice-blurb&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-diff-blurb&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-diff-display&#039;]&lt;br /&gt;
-- Either cfg[&#039;sandbox-notice-blurb&#039;] or cfg[&#039;sandbox-notice-diff-blurb&#039;] is the opening sentence&lt;br /&gt;
-- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page&lt;br /&gt;
-- type, which is either cfg[&#039;sandbox-notice-pagetype-template&#039;],&lt;br /&gt;
-- cfg[&#039;sandbox-notice-pagetype-module&#039;] or cfg[&#039;sandbox-notice-pagetype-other&#039;] depending what&lt;br /&gt;
-- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between&lt;br /&gt;
-- the sandbox and the main template. The display value of the diff link is set by &lt;br /&gt;
-- cfg[&#039;sandbox-notice-compare-link-display&#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;sandbox-notice-blurb&#039;] = &#039;これは$2の$1です。__EXPECTUNUSEDTEMPLATE__&#039;&lt;br /&gt;
cfg[&#039;sandbox-notice-diff-blurb&#039;] = &#039;これは$2 ($3)の$1です。__EXPECTUNUSEDTEMPLATE__&#039;&lt;br /&gt;
cfg[&#039;sandbox-notice-compare-link-display&#039;] = &#039;差分&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-blurb&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-link-display&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-run-blurb&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-run-link-display&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-blurb&#039;] is a sentence notifying the user that there is a test cases page&lt;br /&gt;
-- corresponding to this sandbox that they can edit. $1 is a link to the test cases page.&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-link-display&#039;] is the display value for that link.&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-run-blurb&#039;] is a sentence notifying the user that there is a test cases page&lt;br /&gt;
-- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test&lt;br /&gt;
-- cases page, and $2 is a link to the page to run it.&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-run-link-display&#039;] is the display value for the link to run the test&lt;br /&gt;
-- cases.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;sandbox-notice-testcases-blurb&#039;] = &#039;対応する$1・サブページもご確認ください。&#039;&lt;br /&gt;
cfg[&#039;sandbox-notice-testcases-link-display&#039;] = &#039;テストケース&#039;&lt;br /&gt;
cfg[&#039;sandbox-notice-testcases-run-blurb&#039;] = &#039;対応する$1・サブページ ($2) もご確認ください。&#039;&lt;br /&gt;
cfg[&#039;sandbox-notice-testcases-run-link-display&#039;] = &#039;実行&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-category&#039;]&lt;br /&gt;
-- A category to add to all template sandboxes.&lt;br /&gt;
cfg[&#039;sandbox-category&#039;] = &#039;テンプレート・サンドボックス&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Start box configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;documentation-icon-wikitext&#039;]&lt;br /&gt;
-- The wikitext for the icon shown at the top of the template.&lt;br /&gt;
cfg[&#039;documentation-icon-wikitext&#039;] = &#039;[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the template namespace.&lt;br /&gt;
cfg[&#039;template-namespace-heading&#039;] = &#039;テンプレートの解説&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the module namespace.&lt;br /&gt;
cfg[&#039;module-namespace-heading&#039;] = &#039;モジュールの解説&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;file-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the file namespace.&lt;br /&gt;
cfg[&#039;file-namespace-heading&#039;] = &#039;要約&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;other-namespaces-heading&#039;]&lt;br /&gt;
-- The heading shown in other namespaces.&lt;br /&gt;
cfg[&#039;other-namespaces-heading&#039;] = &#039;解説&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;view-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;view&amp;quot; links.&lt;br /&gt;
cfg[&#039;view-link-display&#039;] = &#039;表示&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;edit-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg[&#039;edit-link-display&#039;] = &#039;編集&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;history-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;history&amp;quot; links.&lt;br /&gt;
cfg[&#039;history-link-display&#039;] = &#039;履歴&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;purge-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;purge&amp;quot; links.&lt;br /&gt;
cfg[&#039;purge-link-display&#039;] = &#039;キャッシュを破棄&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;create-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg[&#039;create-link-display&#039;] = &#039;作成&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Link box (end box) configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;transcluded-from-blurb&#039;]&lt;br /&gt;
-- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page.&lt;br /&gt;
cfg[&#039;transcluded-from-blurb&#039;] = &#039;この[[Help:テンプレートの説明文|解説]]は、$1から[[Help:テンプレート#テンプレートとは|呼び出されて]]います。&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;create-module-doc-blurb&#039;]&lt;br /&gt;
-- Notice displayed in the module namespace when the documentation subpage does not exist.&lt;br /&gt;
-- $1 is a link to create the documentation page with the preload cfg[&#039;module-preload&#039;] and the&lt;br /&gt;
-- display cfg[&#039;create-link-display&#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;create-module-doc-blurb&#039;] = &#039;この[[Wikipedia:Lua|Scribuntoモジュール]]の解説ページを$1することができます。&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Experiment blurb configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;experiment-blurb-template&#039;]&lt;br /&gt;
-- cfg[&#039;experiment-blurb-module&#039;]&lt;br /&gt;
-- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages.&lt;br /&gt;
-- It is only shown in the template and module namespaces. With the default English settings, it&lt;br /&gt;
-- might look like this:&lt;br /&gt;
--&lt;br /&gt;
-- Editors can experiment in this template&#039;s sandbox (edit | diff) and testcases (edit) pages.&lt;br /&gt;
--&lt;br /&gt;
-- In this example, &amp;quot;sandbox&amp;quot;, &amp;quot;edit&amp;quot;, &amp;quot;diff&amp;quot;, &amp;quot;testcases&amp;quot;, and &amp;quot;edit&amp;quot; would all be links.&lt;br /&gt;
--&lt;br /&gt;
-- There are two versions, cfg[&#039;experiment-blurb-template&#039;] and cfg[&#039;experiment-blurb-module&#039;], depending&lt;br /&gt;
-- on what namespace we are in.&lt;br /&gt;
-- &lt;br /&gt;
-- Parameters:&lt;br /&gt;
--&lt;br /&gt;
-- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&#039;sandbox-link-display&#039;] (cfg[&#039;sandbox-edit-link-display&#039;] | cfg[&#039;compare-link-display&#039;])&lt;br /&gt;
-- &lt;br /&gt;
-- If the sandbox doesn&#039;t exist, it is in the format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&#039;sandbox-link-display&#039;] (cfg[&#039;sandbox-create-link-display&#039;] | cfg[&#039;mirror-link-display&#039;])&lt;br /&gt;
-- &lt;br /&gt;
-- The link for cfg[&#039;sandbox-create-link-display&#039;] link preloads the page with cfg[&#039;template-sandbox-preload&#039;]&lt;br /&gt;
-- or cfg[&#039;module-sandbox-preload&#039;], depending on the current namespace. The link for cfg[&#039;mirror-link-display&#039;]&lt;br /&gt;
-- loads a default edit summary of cfg[&#039;mirror-edit-summary&#039;].&lt;br /&gt;
--&lt;br /&gt;
-- $2 is a link to the test cases page. If the test cases page exists, it is in the following format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&#039;testcases-link-display&#039;] (cfg[&#039;testcases-edit-link-display&#039;] | cfg[&#039;testcases-run-link-display&#039;])&lt;br /&gt;
--&lt;br /&gt;
-- If the test cases page doesn&#039;t exist, it is in the format:&lt;br /&gt;
-- &lt;br /&gt;
--     cfg[&#039;testcases-link-display&#039;] (cfg[&#039;testcases-create-link-display&#039;])&lt;br /&gt;
--&lt;br /&gt;
-- If the test cases page doesn&#039;t exist, the link for cfg[&#039;testcases-create-link-display&#039;] preloads the&lt;br /&gt;
-- page with cfg[&#039;template-testcases-preload&#039;] or cfg[&#039;module-testcases-preload&#039;], depending on the current&lt;br /&gt;
-- namespace.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;experiment-blurb-template&#039;] = &amp;quot;編集者は、このテンプレートを$1と$2で試すことができます。（[[Wikipedia:テンプレートのサンドボックスとテストケース|解説]]）&amp;quot;&lt;br /&gt;
cfg[&#039;experiment-blurb-module&#039;] = &amp;quot;編集者は、このモジュールを$1と$2で試すことができます。（[[Wikipedia:テンプレートのサンドボックスとテストケース|解説]]）&amp;quot;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Sandbox link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-subpage&#039;]&lt;br /&gt;
-- The name of the template subpage typically used for sandboxes.&lt;br /&gt;
cfg[&#039;sandbox-subpage&#039;] = &#039;sandbox&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-sandbox-preload&#039;]&lt;br /&gt;
-- Preload file for template sandbox pages.&lt;br /&gt;
cfg[&#039;template-sandbox-preload&#039;] = &#039;Template:Documentation/preload-sandbox&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-sandbox-preload&#039;]&lt;br /&gt;
-- Preload file for Lua module sandbox pages.&lt;br /&gt;
cfg[&#039;module-sandbox-preload&#039;] = &#039;Template:Documentation/preload-module-sandbox&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;sandbox&amp;quot; links.&lt;br /&gt;
cfg[&#039;sandbox-link-display&#039;] = &#039;サンドボックス&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-edit-link-display&#039;]&lt;br /&gt;
-- The text to display for sandbox &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg[&#039;sandbox-edit-link-display&#039;] = &#039;編集&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-create-link-display&#039;]&lt;br /&gt;
-- The text to display for sandbox &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg[&#039;sandbox-create-link-display&#039;] = &#039;作成&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;compare-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;compare&amp;quot; links.&lt;br /&gt;
cfg[&#039;compare-link-display&#039;] = &#039;差分&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;mirror-edit-summary&#039;]&lt;br /&gt;
-- The default edit summary to use when a user clicks the &amp;quot;mirror&amp;quot; link. $1 is a wikilink to the&lt;br /&gt;
-- template page.&lt;br /&gt;
cfg[&#039;mirror-edit-summary&#039;] = &#039;$1のサンドボックスバージョンを作成&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;mirror-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;mirror&amp;quot; links.&lt;br /&gt;
cfg[&#039;mirror-link-display&#039;] = &#039;複製&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;mirror-link-preload&#039;]&lt;br /&gt;
-- The page to preload when a user clicks the &amp;quot;mirror&amp;quot; link.&lt;br /&gt;
cfg[&#039;mirror-link-preload&#039;] = &#039;Template:Documentation/mirror&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Test cases link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-subpage&#039;]&lt;br /&gt;
-- The name of the template subpage typically used for test cases.&lt;br /&gt;
cfg[&#039;testcases-subpage&#039;] = &#039;testcases&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-testcases-preload&#039;]&lt;br /&gt;
-- Preload file for template test cases pages.&lt;br /&gt;
cfg[&#039;template-testcases-preload&#039;] = &#039;Template:Documentation/preload-testcases&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-testcases-preload&#039;]&lt;br /&gt;
-- Preload file for Lua module test cases pages.&lt;br /&gt;
cfg[&#039;module-testcases-preload&#039;] = &#039;Template:Documentation/preload-module-testcases&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;testcases&amp;quot; links.&lt;br /&gt;
cfg[&#039;testcases-link-display&#039;] = &#039;テストケース&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-edit-link-display&#039;]&lt;br /&gt;
-- The text to display for test cases &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg[&#039;testcases-edit-link-display&#039;] = &#039;編集&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-run-link-display&#039;]&lt;br /&gt;
-- The text to display for test cases &amp;quot;run&amp;quot; links.&lt;br /&gt;
cfg[&#039;testcases-run-link-display&#039;] = &#039;作動&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-create-link-display&#039;]&lt;br /&gt;
-- The text to display for test cases &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg[&#039;testcases-create-link-display&#039;] = &#039;作成&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Add categories blurb configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;add-categories-blurb&#039;]&lt;br /&gt;
-- Text to direct users to add categories to the /doc subpage. Not used if the &amp;quot;content&amp;quot; or&lt;br /&gt;
-- &amp;quot;docname fed&amp;quot; arguments are set, as then it is not clear where to add the categories. $1 is a&lt;br /&gt;
-- link to the /doc subpage with a display value of cfg[&#039;doc-link-display&#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;add-categories-blurb&#039;] = &#039;$1のサブページにカテゴリを追加してください。&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;doc-link-display&#039;]&lt;br /&gt;
-- The text to display when linking to the /doc subpage.&lt;br /&gt;
cfg[&#039;doc-link-display&#039;] = &#039;/doc&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Subpages link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;subpages-blurb&#039;]&lt;br /&gt;
-- The &amp;quot;Subpages of this template&amp;quot; blurb. $1 is a link to the main template&#039;s subpages with a&lt;br /&gt;
-- display value of cfg[&#039;subpages-link-display&#039;]. In the English version this blurb is simply&lt;br /&gt;
-- the link followed by a period, and the link display provides the actual text.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;subpages-blurb&#039;] = &#039;$1&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;subpages-link-display&#039;]&lt;br /&gt;
-- The text to display for the &amp;quot;subpages of this page&amp;quot; link. $1 is cfg[&#039;template-pagetype&#039;],&lt;br /&gt;
-- cfg[&#039;module-pagetype&#039;] or cfg[&#039;default-pagetype&#039;], depending on whether the current page is in&lt;br /&gt;
-- the template namespace, the module namespace, or another namespace.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;subpages-link-display&#039;] = &#039;この$1のサブページ一覧。&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-pagetype&#039;]&lt;br /&gt;
-- The pagetype to display for template pages.&lt;br /&gt;
cfg[&#039;template-pagetype&#039;] = &#039;テンプレート&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-pagetype&#039;]&lt;br /&gt;
-- The pagetype to display for Lua module pages.&lt;br /&gt;
cfg[&#039;module-pagetype&#039;] = &#039;モジュール&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;default-pagetype&#039;]&lt;br /&gt;
-- The pagetype to display for pages other than templates or Lua modules.&lt;br /&gt;
cfg[&#039;default-pagetype&#039;] = &#039;ページ&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Doc link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;doc-subpage&#039;]&lt;br /&gt;
-- The name of the subpage typically used for documentation pages.&lt;br /&gt;
cfg[&#039;doc-subpage&#039;] = &#039;doc&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;file-docpage-preload&#039;]&lt;br /&gt;
-- Preload file for documentation page in the file namespace.&lt;br /&gt;
cfg[&#039;file-docpage-preload&#039;] = &#039;Template:Documentation/preload-filespace&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;docpage-preload&#039;]&lt;br /&gt;
-- Preload file for template documentation pages in all namespaces.&lt;br /&gt;
cfg[&#039;docpage-preload&#039;] = &#039;Template:Documentation/preload&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-preload&#039;]&lt;br /&gt;
-- Preload file for Lua module documentation pages.&lt;br /&gt;
cfg[&#039;module-preload&#039;] = &#039;Template:Documentation/preload-module-doc&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Print version configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;print-subpage&#039;]&lt;br /&gt;
-- The name of the template subpage used for print versions.&lt;br /&gt;
cfg[&#039;print-subpage&#039;] = &#039;Print&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;print-link-display&#039;]&lt;br /&gt;
-- The text to display when linking to the /Print subpage.&lt;br /&gt;
cfg[&#039;print-link-display&#039;] = &#039;/Print&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;print-blurb&#039;]&lt;br /&gt;
-- Text to display if a /Print subpage exists. $1 is a link to the subpage with&lt;br /&gt;
-- a display value of cfg[&#039;print-link-display&#039;].&lt;br /&gt;
cfg[&#039;print-blurb&#039;] = &#039;$1にこのテンプレートは[[:en:Help:Books/for experts#Improving the book layout|印刷用バージョンがあります]]。&#039;&lt;br /&gt;
	.. &#039;もしこのテンプレートを更新した時は、印刷用バージョンも更新してください。&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;display-print-category&#039;]&lt;br /&gt;
-- Set to true to enable output of cfg[&#039;print-category&#039;] if a /Print subpage exists.&lt;br /&gt;
-- This should be a boolean value (either true or false).&lt;br /&gt;
cfg[&#039;display-print-category&#039;] = true&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;print-category&#039;]&lt;br /&gt;
-- Category to output if cfg[&#039;display-print-category&#039;] is set to true, and a /Print subpage exists.&lt;br /&gt;
cfg[&#039;print-category&#039;] = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- HTML and CSS configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;templatestyles&#039;]&lt;br /&gt;
-- The name of the TemplateStyles page where CSS is kept.&lt;br /&gt;
-- Sandbox CSS will be at Module:Documentation/sandbox/styles.css when needed.&lt;br /&gt;
cfg[&#039;templatestyles&#039;] = &#039;Module:Documentation/styles.css&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;container&#039;]&lt;br /&gt;
-- Class which can be used to set flex or grid CSS on the&lt;br /&gt;
-- two child divs documentation and documentation-metadata&lt;br /&gt;
cfg[&#039;container&#039;] = &#039;documentation-container&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;main-div-classes&#039;]&lt;br /&gt;
-- Classes added to the main HTML &amp;quot;div&amp;quot; tag.&lt;br /&gt;
cfg[&#039;main-div-classes&#039;] = &#039;documentation&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;main-div-heading-class&#039;]&lt;br /&gt;
-- Class for the main heading for templates and modules and assoc. talk spaces&lt;br /&gt;
cfg[&#039;main-div-heading-class&#039;] = &#039;documentation-heading&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;start-box-class&#039;]&lt;br /&gt;
-- Class for the start box&lt;br /&gt;
cfg[&#039;start-box-class&#039;] = &#039;documentation-startbox&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;start-box-link-classes&#039;]&lt;br /&gt;
-- Classes used for the [view][edit][history] or [create] links in the start box.&lt;br /&gt;
-- mw-editsection-like is per [[Wikipedia:Village pump (technical)/Archive 117]]&lt;br /&gt;
cfg[&#039;start-box-link-classes&#039;] = &#039;mw-editsection-like plainlinks&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;end-box-class&#039;]&lt;br /&gt;
-- Class for the end box.&lt;br /&gt;
cfg[&#039;end-box-class&#039;] = &#039;documentation-metadata&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;end-box-plainlinks&#039;]&lt;br /&gt;
-- Plainlinks&lt;br /&gt;
cfg[&#039;end-box-plainlinks&#039;] = &#039;plainlinks&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;toolbar-class&#039;]&lt;br /&gt;
-- Class added for toolbar links.&lt;br /&gt;
cfg[&#039;toolbar-class&#039;] = &#039;documentation-toolbar&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;clear&#039;]&lt;br /&gt;
-- Just used to clear things.&lt;br /&gt;
cfg[&#039;clear&#039;] = &#039;documentation-clear&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Tracking category configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;display-strange-usage-category&#039;]&lt;br /&gt;
-- Set to true to enable output of cfg[&#039;strange-usage-category&#039;] if the module is used on a /doc subpage&lt;br /&gt;
-- or a /testcases subpage. This should be a boolean value (either true or false).&lt;br /&gt;
cfg[&#039;display-strange-usage-category&#039;] = true&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;strange-usage-category&#039;]&lt;br /&gt;
-- Category to output if cfg[&#039;display-strange-usage-category&#039;] is set to true and the module is used on a&lt;br /&gt;
-- /doc subpage or a /testcases subpage.&lt;br /&gt;
cfg[&#039;strange-usage-category&#039;] = &#039;((documentation))の異常な使用があるページ&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- End configuration&lt;br /&gt;
--&lt;br /&gt;
-- Don&#039;t edit anything below this line.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
return cfg&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Documentation&amp;diff=6753</id>
		<title>モジュール:Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Documentation&amp;diff=6753"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements {{documentation}}.&lt;br /&gt;
&lt;br /&gt;
-- Get required modules.&lt;br /&gt;
local getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
local messageBox = require(&#039;Module:Message box&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Get the config table.&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Documentation/config&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Often-used functions.&lt;br /&gt;
local ugsub = mw.ustring.gsub&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--&lt;br /&gt;
-- These are defined as local functions, but are made available in the p&lt;br /&gt;
-- table for testing purposes.&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function message(cfgKey, valArray, expectType)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Gets a message from the cfg table and formats it if appropriate.&lt;br /&gt;
	-- The function raises an error if the value from the cfg table is not&lt;br /&gt;
	-- of the type expectType. The default type for expectType is &#039;string&#039;.&lt;br /&gt;
	-- If the table valArray is present, strings such as $1, $2 etc. in the&lt;br /&gt;
	-- message are substituted with values from the table keys [1], [2] etc.&lt;br /&gt;
	-- For example, if the message &amp;quot;foo-message&amp;quot; had the value &#039;Foo $2 bar $1.&#039;,&lt;br /&gt;
	-- message(&#039;foo-message&#039;, {&#039;baz&#039;, &#039;qux&#039;}) would return &amp;quot;Foo qux bar baz.&amp;quot;&lt;br /&gt;
	--]]&lt;br /&gt;
	local msg = cfg[cfgKey]&lt;br /&gt;
	expectType = expectType or &#039;string&#039;&lt;br /&gt;
	if type(msg) ~= expectType then&lt;br /&gt;
		error(&#039;メッセージ: cfg.&#039; .. cfgKey .. &#039;の入力エラー。（想定：&#039; .. expectType .. &#039;、実際：&#039; .. type(msg) .. &#039;）&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if not valArray then&lt;br /&gt;
		return msg&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function getMessageVal(match)&lt;br /&gt;
		match = tonumber(match)&lt;br /&gt;
		return valArray[match] or error(&#039;メッセージ: メッセージ設定で$&#039; .. match .. &#039;キーの値が見つかりませんでした。&#039; .. cfgKey, 4)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ugsub(msg, &#039;$([1-9][0-9]*)&#039;, getMessageVal)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.message = message&lt;br /&gt;
&lt;br /&gt;
local function makeWikilink(page, display)&lt;br /&gt;
	if display then&lt;br /&gt;
		return mw.ustring.format(&#039;[[%s|%s]]&#039;, page, display)&lt;br /&gt;
	else&lt;br /&gt;
		return mw.ustring.format(&#039;[[%s]]&#039;, page)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeWikilink = makeWikilink&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(cat, sort)&lt;br /&gt;
	local catns = mw.site.namespaces[14].name&lt;br /&gt;
	return makeWikilink(catns .. &#039;:&#039; .. cat, sort)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeCategoryLink = makeCategoryLink&lt;br /&gt;
&lt;br /&gt;
local function makeUrlLink(url, display)&lt;br /&gt;
	return mw.ustring.format(&#039;[%s %s]&#039;, url, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeUrlLink = makeUrlLink&lt;br /&gt;
&lt;br /&gt;
local function makeToolbar(...)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local lim = select(&#039;#&#039;, ...)&lt;br /&gt;
	if lim &amp;lt; 1 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, lim do&lt;br /&gt;
		ret[#ret + 1] = select(i, ...)&lt;br /&gt;
	end&lt;br /&gt;
	-- &#039;documentation-toolbar&#039;&lt;br /&gt;
	return &#039;&amp;lt;span class=&amp;quot;&#039; .. message(&#039;toolbar-class&#039;) .. &#039;&amp;quot;&amp;gt;(&#039;&lt;br /&gt;
		.. table.concat(ret, &#039; &amp;amp;#124; &#039;) .. &#039;)&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
p.makeToolbar = makeToolbar&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Argument processing&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = getArgs(frame, {&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
				if type(value) == &#039;string&#039; then&lt;br /&gt;
					value = value:match(&#039;^%s*(.-)%s*$&#039;) -- Remove whitespace.&lt;br /&gt;
					if key == &#039;heading&#039; or value ~= &#039;&#039; then&lt;br /&gt;
						return value&lt;br /&gt;
					else&lt;br /&gt;
						return nil&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					return value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
		return p[funcName](args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Entry points&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.nonexistent(frame)&lt;br /&gt;
	if mw.title.getCurrentTitle().subpageText == &#039;testcases&#039; then&lt;br /&gt;
		return frame:expandTemplate{title = &#039;module test cases notice&#039;}&lt;br /&gt;
	else&lt;br /&gt;
		return p.main(frame)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = makeInvokeFunc(&#039;_main&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- This function defines logic flow for the module.&lt;br /&gt;
	-- @args - table of arguments passed by the user&lt;br /&gt;
	--]]&lt;br /&gt;
	local env = p.getEnvironment(args)&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	root&lt;br /&gt;
		:wikitext(p._getModuleWikitext(args, env))&lt;br /&gt;
		:wikitext(p.protectionTemplate(env))&lt;br /&gt;
		:wikitext(p.sandboxNotice(args, env))&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			-- &#039;documentation-container&#039;&lt;br /&gt;
			:addClass(message(&#039;container&#039;))&lt;br /&gt;
			:newline()&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				-- &#039;documentation&#039;&lt;br /&gt;
				:addClass(message(&#039;main-div-classes&#039;))&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(p._startBox(args, env))&lt;br /&gt;
				:wikitext(p._content(args, env))&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					-- &#039;documentation-clear&#039;&lt;br /&gt;
					:addClass(message(&#039;clear&#039;))&lt;br /&gt;
					:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
			:wikitext(p._endBox(args, env))&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(p.addTrackingCategories(env))&lt;br /&gt;
	-- &#039;Module:Documentation/styles.css&#039;&lt;br /&gt;
	return mw.getCurrentFrame():extensionTag (&lt;br /&gt;
		&#039;templatestyles&#039;, &#039;&#039;, {src=cfg[&#039;templatestyles&#039;]&lt;br /&gt;
	}) .. tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Environment settings&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.getEnvironment(args)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Returns a table with information about the environment, including title&lt;br /&gt;
	-- objects and other namespace- or path-related data.&lt;br /&gt;
	-- @args - table of arguments passed by the user&lt;br /&gt;
	--&lt;br /&gt;
	-- Title objects include:&lt;br /&gt;
	-- env.title - the page we are making documentation for (usually the current title)&lt;br /&gt;
	-- env.templateTitle - the template (or module, file, etc.)&lt;br /&gt;
	-- env.docTitle - the /doc subpage.&lt;br /&gt;
	-- env.sandboxTitle - the /sandbox subpage.&lt;br /&gt;
	-- env.testcasesTitle - the /testcases subpage.&lt;br /&gt;
	-- env.printTitle - the print version of the template, located at the /Print subpage.&lt;br /&gt;
	--&lt;br /&gt;
	-- Data includes:&lt;br /&gt;
	-- env.protectionLevels - the protection levels table of the title object.&lt;br /&gt;
	-- env.subjectSpace - the number of the title&#039;s subject namespace.&lt;br /&gt;
	-- env.docSpace - the number of the namespace the title puts its documentation in.&lt;br /&gt;
	-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.&lt;br /&gt;
	-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.&lt;br /&gt;
	-- &lt;br /&gt;
	-- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value&lt;br /&gt;
	-- returned will be nil.&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	local env, envFuncs = {}, {}&lt;br /&gt;
&lt;br /&gt;
	-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value&lt;br /&gt;
	-- returned by that function is memoized in the env table so that we don&#039;t call any of the functions&lt;br /&gt;
	-- more than once. (Nils won&#039;t be memoized.)&lt;br /&gt;
	setmetatable(env, {&lt;br /&gt;
		__index = function (t, key)&lt;br /&gt;
			local envFunc = envFuncs[key]&lt;br /&gt;
			if envFunc then&lt;br /&gt;
				local success, val = pcall(envFunc)&lt;br /&gt;
				if success then&lt;br /&gt;
					env[key] = val -- Memoise the value.&lt;br /&gt;
					return val&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	})	&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.title()&lt;br /&gt;
		-- The title object for the current page, or a test page passed with args.page.&lt;br /&gt;
		local title&lt;br /&gt;
		local titleArg = args.page&lt;br /&gt;
		if titleArg then&lt;br /&gt;
			title = mw.title.new(titleArg)&lt;br /&gt;
		else&lt;br /&gt;
			title = mw.title.getCurrentTitle()&lt;br /&gt;
		end&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.templateTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- The template (or module, etc.) title object.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;sandbox-subpage&#039; --&amp;gt; &#039;sandbox&#039;&lt;br /&gt;
		-- &#039;testcases-subpage&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		local subjectSpace = env.subjectSpace&lt;br /&gt;
		local title = env.title&lt;br /&gt;
		local subpage = title.subpageText&lt;br /&gt;
		if subpage == message(&#039;sandbox-subpage&#039;) or subpage == message(&#039;testcases-subpage&#039;) then&lt;br /&gt;
			return mw.title.makeTitle(subjectSpace, title.baseText)&lt;br /&gt;
		else&lt;br /&gt;
			return mw.title.makeTitle(subjectSpace, title.text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object of the /doc subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;doc-subpage&#039; --&amp;gt; &#039;doc&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		local title = env.title&lt;br /&gt;
		local docname = args[1] -- User-specified doc page.&lt;br /&gt;
		local docpage&lt;br /&gt;
		if docname then&lt;br /&gt;
			docpage = docname&lt;br /&gt;
		else&lt;br /&gt;
			docpage = env.docpageBase .. &#039;/&#039; .. message(&#039;doc-subpage&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		return mw.title.new(docpage)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.sandboxTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /sandbox subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;sandbox-subpage&#039; --&amp;gt; &#039;sandbox&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		return mw.title.new(env.docpageBase .. &#039;/&#039; .. message(&#039;sandbox-subpage&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.testcasesTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /testcases subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;testcases-subpage&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		return mw.title.new(env.docpageBase .. &#039;/&#039; .. message(&#039;testcases-subpage&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.printTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /Print subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;print-subpage&#039; --&amp;gt; &#039;Print&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		return env.templateTitle:subPageTitle(message(&#039;print-subpage&#039;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.protectionLevels()&lt;br /&gt;
		-- The protection levels table of the title object.&lt;br /&gt;
		return env.title.protectionLevels&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.subjectSpace()&lt;br /&gt;
		-- The subject namespace number.&lt;br /&gt;
		return mw.site.namespaces[env.title.namespace].subject.id&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docSpace()&lt;br /&gt;
		-- The documentation namespace number. For most namespaces this is the&lt;br /&gt;
		-- same as the subject namespace. However, pages in the Article, File,&lt;br /&gt;
		-- MediaWiki or Category namespaces must have their /doc, /sandbox and&lt;br /&gt;
		-- /testcases pages in talk space.&lt;br /&gt;
		local subjectSpace = env.subjectSpace&lt;br /&gt;
		if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then&lt;br /&gt;
			return subjectSpace + 1&lt;br /&gt;
		else&lt;br /&gt;
			return subjectSpace&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docpageBase()&lt;br /&gt;
		-- The base page of the /doc, /sandbox, and /testcases subpages.&lt;br /&gt;
		-- For some namespaces this is the talk page, rather than the template page.&lt;br /&gt;
		local templateTitle = env.templateTitle&lt;br /&gt;
		local docSpace = env.docSpace&lt;br /&gt;
		local docSpaceText = mw.site.namespaces[docSpace].name&lt;br /&gt;
		-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.&lt;br /&gt;
		return docSpaceText .. &#039;:&#039; .. templateTitle.text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.compareUrl()&lt;br /&gt;
		-- Diff link between the sandbox and the main template using [[Special:ComparePages]].&lt;br /&gt;
		local templateTitle = env.templateTitle&lt;br /&gt;
		local sandboxTitle = env.sandboxTitle&lt;br /&gt;
		if templateTitle.exists and sandboxTitle.exists then&lt;br /&gt;
			local compareUrl = mw.uri.fullUrl(&lt;br /&gt;
				&#039;Special:ComparePages&#039;,&lt;br /&gt;
				{ page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText}&lt;br /&gt;
			)&lt;br /&gt;
			return tostring(compareUrl)&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end		&lt;br /&gt;
&lt;br /&gt;
	return env&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Auxiliary templates&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.getModuleWikitext = makeInvokeFunc(&#039;_getModuleWikitext&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._getModuleWikitext(args, env)&lt;br /&gt;
	local currentTitle = mw.title.getCurrentTitle()&lt;br /&gt;
	if currentTitle.contentModel ~= &#039;Scribunto&#039; then return end&lt;br /&gt;
	pcall(require, currentTitle.prefixedText) -- if it fails, we don&#039;t care&lt;br /&gt;
	local moduleWikitext =  package.loaded[&amp;quot;Module:Module wikitext&amp;quot;]&lt;br /&gt;
	if moduleWikitext then&lt;br /&gt;
		return moduleWikitext.main()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sandboxNotice(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Generates a sandbox notice for display above sandbox pages.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;sandbox-notice-image&#039; --&amp;gt; &#039;[[Image:Sandbox.svg|50px|alt=|link=]]&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-blurb&#039; --&amp;gt; &#039;This is the $1 for $2.&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-diff-blurb&#039; --&amp;gt; &#039;This is the $1 for $2 ($3).&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-pagetype-template&#039; --&amp;gt; &#039;[[Wikipedia:Template test cases|template sandbox]] page&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-pagetype-module&#039; --&amp;gt; &#039;[[Wikipedia:Template test cases|module sandbox]] page&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-pagetype-other&#039; --&amp;gt; &#039;sandbox page&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-compare-link-display&#039; --&amp;gt; &#039;diff&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-testcases-blurb&#039; --&amp;gt; &#039;See also the companion subpage for $1.&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-testcases-link-display&#039; --&amp;gt; &#039;test cases&#039;&lt;br /&gt;
	-- &#039;sandbox-category&#039; --&amp;gt; &#039;Template sandboxes&#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local sandboxTitle = env.sandboxTitle&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not (subjectSpace and title and sandboxTitle and templateTitle&lt;br /&gt;
		and mw.title.equals(title, sandboxTitle)) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Build the table of arguments to pass to {{ombox}}. We need just two fields, &amp;quot;image&amp;quot; and &amp;quot;text&amp;quot;.&lt;br /&gt;
	local omargs = {}&lt;br /&gt;
	omargs.image = message(&#039;sandbox-notice-image&#039;)&lt;br /&gt;
	-- Get the text. We start with the opening blurb, which is something like&lt;br /&gt;
	-- &amp;quot;This is the template sandbox for [[Template:Foo]] (diff).&amp;quot;&lt;br /&gt;
	local text = &#039;&#039;&lt;br /&gt;
	local pagetype&lt;br /&gt;
	if subjectSpace == 10 then&lt;br /&gt;
		pagetype = message(&#039;sandbox-notice-pagetype-template&#039;)&lt;br /&gt;
	elseif subjectSpace == 828 then&lt;br /&gt;
		pagetype = message(&#039;sandbox-notice-pagetype-module&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		pagetype = message(&#039;sandbox-notice-pagetype-other&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local templateLink = makeWikilink(templateTitle.prefixedText)&lt;br /&gt;
	local compareUrl = env.compareUrl&lt;br /&gt;
	if compareUrl then&lt;br /&gt;
		local compareDisplay = message(&#039;sandbox-notice-compare-link-display&#039;)&lt;br /&gt;
		local compareLink = makeUrlLink(compareUrl, compareDisplay)&lt;br /&gt;
		text = text .. message(&#039;sandbox-notice-diff-blurb&#039;, {pagetype, templateLink, compareLink})&lt;br /&gt;
	else&lt;br /&gt;
		text = text .. message(&#039;sandbox-notice-blurb&#039;, {pagetype, templateLink})&lt;br /&gt;
	end&lt;br /&gt;
	-- Get the test cases page blurb if the page exists. This is something like&lt;br /&gt;
	-- &amp;quot;See also the companion subpage for [[Template:Foo/testcases|test cases]].&amp;quot;&lt;br /&gt;
	local testcasesTitle = env.testcasesTitle&lt;br /&gt;
	if testcasesTitle and testcasesTitle.exists then&lt;br /&gt;
		if testcasesTitle.contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			local testcasesLinkDisplay = message(&#039;sandbox-notice-testcases-link-display&#039;)&lt;br /&gt;
			local testcasesRunLinkDisplay = message(&#039;sandbox-notice-testcases-run-link-display&#039;)&lt;br /&gt;
			local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)&lt;br /&gt;
			local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)&lt;br /&gt;
			text = text .. &#039;&amp;lt;br /&amp;gt;&#039; .. message(&#039;sandbox-notice-testcases-run-blurb&#039;, {testcasesLink, testcasesRunLink})&lt;br /&gt;
		else&lt;br /&gt;
			local testcasesLinkDisplay = message(&#039;sandbox-notice-testcases-link-display&#039;)&lt;br /&gt;
			local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)&lt;br /&gt;
			text = text .. &#039;&amp;lt;br /&amp;gt;&#039; .. message(&#039;sandbox-notice-testcases-blurb&#039;, {testcasesLink})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Add the sandbox to the sandbox category.&lt;br /&gt;
	omargs.text = text .. makeCategoryLink(message(&#039;sandbox-category&#039;))&lt;br /&gt;
&lt;br /&gt;
	-- &#039;documentation-clear&#039;&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. message(&#039;clear&#039;) .. &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
		.. require(&#039;Module:Message box&#039;).main(&#039;ombox&#039;, omargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.protectionTemplate(env)&lt;br /&gt;
	-- Generates the padlock icon in the top right.&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;protection-template&#039; --&amp;gt; &#039;pp-template&#039;&lt;br /&gt;
	-- &#039;protection-template-args&#039; --&amp;gt; {docusage = &#039;yes&#039;}&lt;br /&gt;
	local protectionLevels = env.protectionLevels&lt;br /&gt;
	if not protectionLevels then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local editProt = protectionLevels.edit and protectionLevels.edit[1]&lt;br /&gt;
	local moveProt = protectionLevels.move and protectionLevels.move[1]&lt;br /&gt;
	if editProt then&lt;br /&gt;
		-- The page is edit-protected.&lt;br /&gt;
		return require(&#039;Module:Protection banner&#039;)._main{&lt;br /&gt;
			message(&#039;protection-reason-edit&#039;), small = true&lt;br /&gt;
		}&lt;br /&gt;
	elseif moveProt and moveProt ~= &#039;autoconfirmed&#039; then&lt;br /&gt;
		-- The page is move-protected but not edit-protected. Exclude move&lt;br /&gt;
		-- protection with the level &amp;quot;autoconfirmed&amp;quot;, as this is equivalent to&lt;br /&gt;
		-- no move protection at all.&lt;br /&gt;
		return require(&#039;Module:Protection banner&#039;)._main{&lt;br /&gt;
			action = &#039;move&#039;, small = true&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Start box&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.startBox = makeInvokeFunc(&#039;_startBox&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._startBox(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- This function generates the start box.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make&lt;br /&gt;
	-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox&lt;br /&gt;
	-- which generate the box HTML.&lt;br /&gt;
	--]]&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local links&lt;br /&gt;
	local content = args.content&lt;br /&gt;
	if not content or args[1] then&lt;br /&gt;
		-- No need to include the links if the documentation is on the template page itself.&lt;br /&gt;
		local linksData = p.makeStartBoxLinksData(args, env)&lt;br /&gt;
		if linksData then&lt;br /&gt;
			links = p.renderStartBoxLinks(linksData)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Generate the start box html.&lt;br /&gt;
	local data = p.makeStartBoxData(args, env, links)&lt;br /&gt;
	if data then&lt;br /&gt;
		return p.renderStartBox(data)&lt;br /&gt;
	else&lt;br /&gt;
		-- User specified no heading.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeStartBoxLinksData(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Does initial processing of data to make the [view] [edit] [history] [purge] links.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;view-link-display&#039; --&amp;gt; &#039;view&#039;&lt;br /&gt;
	-- &#039;edit-link-display&#039; --&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;history-link-display&#039; --&amp;gt; &#039;history&#039;&lt;br /&gt;
	-- &#039;purge-link-display&#039; --&amp;gt; &#039;purge&#039;&lt;br /&gt;
	-- &#039;file-docpage-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-filespace&#039;&lt;br /&gt;
	-- &#039;module-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-module-doc&#039;&lt;br /&gt;
	-- &#039;docpage-preload&#039; --&amp;gt; &#039;Template:Documentation/preload&#039;&lt;br /&gt;
	-- &#039;create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not title or not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if docTitle.isRedirect then&lt;br /&gt;
		docTitle = docTitle.redirectTarget&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local data = {}&lt;br /&gt;
	data.title = title&lt;br /&gt;
	data.docTitle = docTitle&lt;br /&gt;
	-- View, display, edit, and purge links if /doc exists.&lt;br /&gt;
	data.viewLinkDisplay = message(&#039;view-link-display&#039;)&lt;br /&gt;
	data.editLinkDisplay = message(&#039;edit-link-display&#039;)&lt;br /&gt;
	data.historyLinkDisplay = message(&#039;history-link-display&#039;)&lt;br /&gt;
	data.purgeLinkDisplay = message(&#039;purge-link-display&#039;)&lt;br /&gt;
	-- Create link if /doc doesn&#039;t exist.&lt;br /&gt;
	local preload = args.preload&lt;br /&gt;
	if not preload then&lt;br /&gt;
		if subjectSpace == 6 then -- File namespace&lt;br /&gt;
			preload = message(&#039;file-docpage-preload&#039;)&lt;br /&gt;
		elseif subjectSpace == 828 then -- Module namespace&lt;br /&gt;
			preload = message(&#039;module-preload&#039;)&lt;br /&gt;
		else&lt;br /&gt;
			preload = message(&#039;docpage-preload&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	data.preload = preload&lt;br /&gt;
	data.createLinkDisplay = message(&#039;create-link-display&#039;)&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderStartBoxLinks(data)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the [view][edit][history][purge] or [create] links from the data table.&lt;br /&gt;
	-- @data - a table of data generated by p.makeStartBoxLinksData&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	local function escapeBrackets(s)&lt;br /&gt;
		-- Escapes square brackets with HTML entities.&lt;br /&gt;
		s = s:gsub(&#039;%[&#039;, &#039;&amp;amp;#91;&#039;) -- Replace square brackets with HTML entities.&lt;br /&gt;
		s = s:gsub(&#039;%]&#039;, &#039;&amp;amp;#93;&#039;)&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret&lt;br /&gt;
	local docTitle = data.docTitle&lt;br /&gt;
	local title = data.title&lt;br /&gt;
	if docTitle.exists then&lt;br /&gt;
		local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay)&lt;br /&gt;
		local editLink = makeUrlLink(docTitle:fullUrl{action = &#039;edit&#039;}, data.editLinkDisplay)&lt;br /&gt;
		local historyLink = makeUrlLink(docTitle:fullUrl{action = &#039;history&#039;}, data.historyLinkDisplay)&lt;br /&gt;
		local purgeLink = makeUrlLink(title:fullUrl{action = &#039;purge&#039;}, data.purgeLinkDisplay)&lt;br /&gt;
		ret = &#039;[%s] [%s] [%s] [%s]&#039;&lt;br /&gt;
		ret = escapeBrackets(ret)&lt;br /&gt;
		ret = mw.ustring.format(ret, viewLink, editLink, historyLink, purgeLink)&lt;br /&gt;
	else&lt;br /&gt;
		local createLink = makeUrlLink(docTitle:fullUrl{action = &#039;edit&#039;, preload = data.preload}, data.createLinkDisplay)&lt;br /&gt;
		ret = &#039;[%s]&#039;&lt;br /&gt;
		ret = escapeBrackets(ret)&lt;br /&gt;
		ret = mw.ustring.format(ret, createLink)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeStartBoxData(args, env, links)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- @links - a string containing the [view][edit][history][purge] links - could be nil if there&#039;s an error.&lt;br /&gt;
	--&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;documentation-icon-wikitext&#039; --&amp;gt; &#039;[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]&#039;&lt;br /&gt;
	-- &#039;template-namespace-heading&#039; --&amp;gt; &#039;Template documentation&#039;&lt;br /&gt;
	-- &#039;module-namespace-heading&#039; --&amp;gt; &#039;Module documentation&#039;&lt;br /&gt;
	-- &#039;file-namespace-heading&#039; --&amp;gt; &#039;Summary&#039;&lt;br /&gt;
	-- &#039;other-namespaces-heading&#039; --&amp;gt; &#039;Documentation&#039;&lt;br /&gt;
	-- &#039;testcases-create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not subjectSpace then&lt;br /&gt;
		-- Default to an &amp;quot;other namespaces&amp;quot; namespace, so that we get at least some output&lt;br /&gt;
		-- if an error occurs.&lt;br /&gt;
		subjectSpace = 2&lt;br /&gt;
	end&lt;br /&gt;
	local data = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Heading&lt;br /&gt;
	local heading = args.heading -- Blank values are not removed.&lt;br /&gt;
	if heading == &#039;&#039; then&lt;br /&gt;
		-- Don&#039;t display the start box if the heading arg is defined but blank.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if heading then&lt;br /&gt;
		data.heading = heading&lt;br /&gt;
	elseif subjectSpace == 10 then -- Template namespace&lt;br /&gt;
		data.heading = message(&#039;documentation-icon-wikitext&#039;) .. &#039; &#039; .. message(&#039;template-namespace-heading&#039;)&lt;br /&gt;
	elseif subjectSpace == 828 then -- Module namespace&lt;br /&gt;
		data.heading = message(&#039;documentation-icon-wikitext&#039;) .. &#039; &#039; .. message(&#039;module-namespace-heading&#039;)&lt;br /&gt;
	elseif subjectSpace == 6 then -- File namespace&lt;br /&gt;
		data.heading = message(&#039;file-namespace-heading&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		data.heading = message(&#039;other-namespaces-heading&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Heading CSS&lt;br /&gt;
	local headingStyle = args[&#039;heading-style&#039;]&lt;br /&gt;
	if headingStyle then&lt;br /&gt;
		data.headingStyleText = headingStyle&lt;br /&gt;
	else&lt;br /&gt;
		-- &#039;documentation-heading&#039;&lt;br /&gt;
		data.headingClass = message(&#039;main-div-heading-class&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Data for the [view][edit][history][purge] or [create] links.&lt;br /&gt;
	if links then&lt;br /&gt;
		-- &#039;mw-editsection-like plainlinks&#039;&lt;br /&gt;
		data.linksClass = message(&#039;start-box-link-classes&#039;)&lt;br /&gt;
		data.links = links&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderStartBox(data)&lt;br /&gt;
	-- Renders the start box html.&lt;br /&gt;
	-- @data - a table of data generated by p.makeStartBoxData.&lt;br /&gt;
	local sbox = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	sbox&lt;br /&gt;
		-- &#039;documentation-startbox&#039;&lt;br /&gt;
		:addClass(message(&#039;start-box-class&#039;))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag(&#039;span&#039;)&lt;br /&gt;
			:addClass(data.headingClass)&lt;br /&gt;
			:cssText(data.headingStyleText)&lt;br /&gt;
			:wikitext(data.heading)&lt;br /&gt;
	local links = data.links&lt;br /&gt;
	if links then&lt;br /&gt;
		sbox:tag(&#039;span&#039;)&lt;br /&gt;
			:addClass(data.linksClass)&lt;br /&gt;
			:attr(&#039;id&#039;, data.linksId)&lt;br /&gt;
			:wikitext(links)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(sbox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Documentation content&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.content = makeInvokeFunc(&#039;_content&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._content(args, env)&lt;br /&gt;
	-- Displays the documentation contents&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	local content = args.content&lt;br /&gt;
	if not content and docTitle and docTitle.exists then&lt;br /&gt;
		content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText}&lt;br /&gt;
	end&lt;br /&gt;
	-- The line breaks below are necessary so that &amp;quot;=== Headings ===&amp;quot; at the start and end&lt;br /&gt;
	-- of docs are interpreted correctly.&lt;br /&gt;
	return &#039;\n&#039; .. (content or &#039;&#039;) .. &#039;\n&#039; &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.contentTitle = makeInvokeFunc(&#039;_contentTitle&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._contentTitle(args, env)&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not args.content and docTitle and docTitle.exists then&lt;br /&gt;
		return docTitle.prefixedText&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- End box&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.endBox = makeInvokeFunc(&#039;_endBox&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._endBox(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- This function generates the end box (also known as the link box).&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	--]=]&lt;br /&gt;
	&lt;br /&gt;
	-- Get environment data.&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not subjectSpace or not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	-- Check whether we should output the end box at all. Add the end&lt;br /&gt;
	-- box by default if the documentation exists or if we are in the&lt;br /&gt;
	-- user, module or template namespaces.&lt;br /&gt;
	local linkBox = args[&#039;link box&#039;]&lt;br /&gt;
	if linkBox == &#039;off&#039;&lt;br /&gt;
		or not (&lt;br /&gt;
			docTitle.exists&lt;br /&gt;
			or subjectSpace == 2&lt;br /&gt;
			or subjectSpace == 828&lt;br /&gt;
			or subjectSpace == 10&lt;br /&gt;
		)&lt;br /&gt;
	then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Assemble the link box.&lt;br /&gt;
	local text = &#039;&#039;&lt;br /&gt;
	if linkBox then&lt;br /&gt;
		text = text .. linkBox&lt;br /&gt;
	else&lt;br /&gt;
		text = text .. (p.makeDocPageBlurb(args, env) or &#039;&#039;) -- &amp;quot;This documentation is transcluded from [[Foo]].&amp;quot; &lt;br /&gt;
		if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then&lt;br /&gt;
			-- We are in the user, template or module namespaces.&lt;br /&gt;
			-- Add sandbox and testcases links.&lt;br /&gt;
			-- &amp;quot;Editors can experiment in this template&#039;s sandbox and testcases pages.&amp;quot;&lt;br /&gt;
			text = text .. (p.makeExperimentBlurb(args, env) or &#039;&#039;) .. &#039;&amp;lt;br /&amp;gt;&#039;&lt;br /&gt;
			if not args.content and not args[1] then&lt;br /&gt;
				-- &amp;quot;Please add categories to the /doc subpage.&amp;quot;&lt;br /&gt;
				-- Don&#039;t show this message with inline docs or with an explicitly specified doc page,&lt;br /&gt;
				-- as then it is unclear where to add the categories.&lt;br /&gt;
				text = text .. (p.makeCategoriesBlurb(args, env) or &#039;&#039;)&lt;br /&gt;
			end&lt;br /&gt;
			text = text .. &#039; &#039; .. (p.makeSubpagesBlurb(args, env) or &#039;&#039;) --&amp;quot;Subpages of this template&amp;quot;&lt;br /&gt;
			local printBlurb = p.makePrintBlurb(args, env) -- Two-line blurb about print versions of templates.&lt;br /&gt;
			if printBlurb then&lt;br /&gt;
				text = text .. &#039;&amp;lt;br /&amp;gt;&#039; .. printBlurb&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local box = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	box:attr(&#039;role&#039;, &#039;note&#039;)&lt;br /&gt;
		-- &#039;documentation-metadata&#039;&lt;br /&gt;
		:addClass(message(&#039;end-box-class&#039;))&lt;br /&gt;
		-- &#039;plainlinks&#039;&lt;br /&gt;
		:addClass(message(&#039;end-box-plainlinks&#039;))&lt;br /&gt;
		:wikitext(text)&lt;br /&gt;
		:done()&lt;br /&gt;
&lt;br /&gt;
	return &#039;\n&#039; .. tostring(box)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeDocPageBlurb(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Makes the blurb &amp;quot;This documentation is transcluded from [[Template:Foo]] (edit, history)&amp;quot;.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;edit-link-display&#039; --&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;history-link-display&#039; --&amp;gt; &#039;history&#039;&lt;br /&gt;
	-- &#039;transcluded-from-blurb&#039; --&amp;gt; &lt;br /&gt;
	-- &#039;The above [[Wikipedia:Template documentation|documentation]] &lt;br /&gt;
	-- is [[Help:Transclusion|transcluded]] from $1.&#039;&lt;br /&gt;
	-- &#039;module-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-module-doc&#039;&lt;br /&gt;
	-- &#039;create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	-- &#039;create-module-doc-blurb&#039; --&amp;gt;&lt;br /&gt;
	-- &#039;You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].&#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local ret&lt;br /&gt;
	if docTitle.exists then&lt;br /&gt;
		-- /doc exists; link to it.&lt;br /&gt;
		local docLink = makeWikilink(docTitle.prefixedText)&lt;br /&gt;
		local editUrl = docTitle:fullUrl{action = &#039;edit&#039;}&lt;br /&gt;
		local editDisplay = message(&#039;edit-link-display&#039;)&lt;br /&gt;
		local editLink = makeUrlLink(editUrl, editDisplay)&lt;br /&gt;
		local historyUrl = docTitle:fullUrl{action = &#039;history&#039;}&lt;br /&gt;
		local historyDisplay = message(&#039;history-link-display&#039;)&lt;br /&gt;
		local historyLink = makeUrlLink(historyUrl, historyDisplay)&lt;br /&gt;
		ret = message(&#039;transcluded-from-blurb&#039;, {docLink})&lt;br /&gt;
			.. &#039; &#039;&lt;br /&gt;
			.. makeToolbar(editLink, historyLink)&lt;br /&gt;
			.. &#039;&amp;lt;br /&amp;gt;&#039;&lt;br /&gt;
	elseif env.subjectSpace == 828 then&lt;br /&gt;
		-- /doc does not exist; ask to create it.&lt;br /&gt;
		local createUrl = docTitle:fullUrl{action = &#039;edit&#039;, preload = message(&#039;module-preload&#039;)}&lt;br /&gt;
		local createDisplay = message(&#039;create-link-display&#039;)&lt;br /&gt;
		local createLink = makeUrlLink(createUrl, createDisplay)&lt;br /&gt;
		ret = message(&#039;create-module-doc-blurb&#039;, {createLink})&lt;br /&gt;
			.. &#039;&amp;lt;br /&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeExperimentBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Renders the text &amp;quot;Editors can experiment in this template&#039;s sandbox (edit | diff) and testcases (edit) pages.&amp;quot;&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;sandbox-link-display&#039; --&amp;gt; &#039;sandbox&#039;&lt;br /&gt;
	-- &#039;sandbox-edit-link-display&#039; --&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;compare-link-display&#039; --&amp;gt; &#039;diff&#039;&lt;br /&gt;
	-- &#039;module-sandbox-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-module-sandbox&#039;&lt;br /&gt;
	-- &#039;template-sandbox-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-sandbox&#039;&lt;br /&gt;
	-- &#039;sandbox-create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	-- &#039;mirror-edit-summary&#039; --&amp;gt; &#039;Create sandbox version of $1&#039;&lt;br /&gt;
	-- &#039;mirror-link-display&#039; --&amp;gt; &#039;mirror&#039;&lt;br /&gt;
	-- &#039;mirror-link-preload&#039; --&amp;gt; &#039;Template:Documentation/mirror&#039;&lt;br /&gt;
	-- &#039;sandbox-link-display&#039; --&amp;gt; &#039;sandbox&#039;&lt;br /&gt;
	-- &#039;testcases-link-display&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
	-- &#039;testcases-edit-link-display&#039;--&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;template-sandbox-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-sandbox&#039;&lt;br /&gt;
	-- &#039;testcases-create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	-- &#039;testcases-link-display&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
	-- &#039;testcases-edit-link-display&#039; --&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;module-testcases-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-module-testcases&#039;&lt;br /&gt;
	-- &#039;template-testcases-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-testcases&#039;&lt;br /&gt;
	-- &#039;experiment-blurb-module&#039; --&amp;gt; &#039;Editors can experiment in this module&#039;s $1 and $2 pages.&#039;&lt;br /&gt;
	-- &#039;experiment-blurb-template&#039; --&amp;gt; &#039;Editors can experiment in this template&#039;s $1 and $2 pages.&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	local sandboxTitle = env.sandboxTitle&lt;br /&gt;
	local testcasesTitle = env.testcasesTitle&lt;br /&gt;
	local templatePage = templateTitle.prefixedText&lt;br /&gt;
	if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Make links.&lt;br /&gt;
	local sandboxLinks, testcasesLinks&lt;br /&gt;
	if sandboxTitle.exists then&lt;br /&gt;
		local sandboxPage = sandboxTitle.prefixedText&lt;br /&gt;
		local sandboxDisplay = message(&#039;sandbox-link-display&#039;)&lt;br /&gt;
		local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay)&lt;br /&gt;
		local sandboxEditUrl = sandboxTitle:fullUrl{action = &#039;edit&#039;}&lt;br /&gt;
		local sandboxEditDisplay = message(&#039;sandbox-edit-link-display&#039;)&lt;br /&gt;
		local sandboxEditLink = makeUrlLink(sandboxEditUrl, sandboxEditDisplay)&lt;br /&gt;
		local compareUrl = env.compareUrl&lt;br /&gt;
		local compareLink&lt;br /&gt;
		if compareUrl then&lt;br /&gt;
			local compareDisplay = message(&#039;compare-link-display&#039;)&lt;br /&gt;
			compareLink = makeUrlLink(compareUrl, compareDisplay)&lt;br /&gt;
		end&lt;br /&gt;
		sandboxLinks = sandboxLink .. &#039; &#039; .. makeToolbar(sandboxEditLink, compareLink)&lt;br /&gt;
	else&lt;br /&gt;
		local sandboxPreload&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			sandboxPreload = message(&#039;module-sandbox-preload&#039;)&lt;br /&gt;
		else&lt;br /&gt;
			sandboxPreload = message(&#039;template-sandbox-preload&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local sandboxCreateUrl = sandboxTitle:fullUrl{action = &#039;edit&#039;, preload = sandboxPreload}&lt;br /&gt;
		local sandboxCreateDisplay = message(&#039;sandbox-create-link-display&#039;)&lt;br /&gt;
		local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay)&lt;br /&gt;
		local mirrorSummary = message(&#039;mirror-edit-summary&#039;, {makeWikilink(templatePage)})&lt;br /&gt;
		local mirrorPreload = message(&#039;mirror-link-preload&#039;)&lt;br /&gt;
		local mirrorUrl = sandboxTitle:fullUrl{action = &#039;edit&#039;, preload = mirrorPreload, summary = mirrorSummary}&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			mirrorUrl = sandboxTitle:fullUrl{action = &#039;edit&#039;, preload = templateTitle.prefixedText, summary = mirrorSummary}&lt;br /&gt;
		end&lt;br /&gt;
		local mirrorDisplay = message(&#039;mirror-link-display&#039;)&lt;br /&gt;
		local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay)&lt;br /&gt;
		sandboxLinks = message(&#039;sandbox-link-display&#039;) .. &#039; &#039; .. makeToolbar(sandboxCreateLink, mirrorLink)&lt;br /&gt;
	end&lt;br /&gt;
	if testcasesTitle.exists then&lt;br /&gt;
		local testcasesPage = testcasesTitle.prefixedText&lt;br /&gt;
		local testcasesDisplay = message(&#039;testcases-link-display&#039;)&lt;br /&gt;
		local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay)&lt;br /&gt;
		local testcasesEditUrl = testcasesTitle:fullUrl{action = &#039;edit&#039;}&lt;br /&gt;
		local testcasesEditDisplay = message(&#039;testcases-edit-link-display&#039;)&lt;br /&gt;
		local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay)&lt;br /&gt;
		-- for Modules, add testcases run link if exists&lt;br /&gt;
		if testcasesTitle.contentModel == &amp;quot;Scribunto&amp;quot; and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then&lt;br /&gt;
			local testcasesRunLinkDisplay = message(&#039;testcases-run-link-display&#039;)&lt;br /&gt;
			local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)&lt;br /&gt;
			testcasesLinks = testcasesLink .. &#039; &#039; .. makeToolbar(testcasesEditLink, testcasesRunLink)&lt;br /&gt;
		else&lt;br /&gt;
			testcasesLinks = testcasesLink .. &#039; &#039; .. makeToolbar(testcasesEditLink)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local testcasesPreload&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			testcasesPreload = message(&#039;module-testcases-preload&#039;)&lt;br /&gt;
		else&lt;br /&gt;
			testcasesPreload = message(&#039;template-testcases-preload&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local testcasesCreateUrl = testcasesTitle:fullUrl{action = &#039;edit&#039;, preload = testcasesPreload}&lt;br /&gt;
		local testcasesCreateDisplay = message(&#039;testcases-create-link-display&#039;)&lt;br /&gt;
		local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay)&lt;br /&gt;
		testcasesLinks = message(&#039;testcases-link-display&#039;) .. &#039; &#039; .. makeToolbar(testcasesCreateLink)&lt;br /&gt;
	end&lt;br /&gt;
	local messageName&lt;br /&gt;
	if subjectSpace == 828 then&lt;br /&gt;
		messageName = &#039;experiment-blurb-module&#039;&lt;br /&gt;
	else&lt;br /&gt;
		messageName = &#039;experiment-blurb-template&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return message(messageName, {sandboxLinks, testcasesLinks})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeCategoriesBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the text &amp;quot;Please add categories to the /doc subpage.&amp;quot;&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;doc-link-display&#039; --&amp;gt; &#039;/doc&#039;&lt;br /&gt;
	-- &#039;add-categories-blurb&#039; --&amp;gt; &#039;Please add categories to the $1 subpage.&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local docPathLink = makeWikilink(docTitle.prefixedText, message(&#039;doc-link-display&#039;))&lt;br /&gt;
	return message(&#039;add-categories-blurb&#039;, {docPathLink})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeSubpagesBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the &amp;quot;Subpages of this template&amp;quot; link.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;template-pagetype&#039; --&amp;gt; &#039;template&#039;&lt;br /&gt;
	-- &#039;module-pagetype&#039; --&amp;gt; &#039;module&#039;&lt;br /&gt;
	-- &#039;default-pagetype&#039; --&amp;gt; &#039;page&#039;&lt;br /&gt;
	-- &#039;subpages-link-display&#039; --&amp;gt; &#039;Subpages of this $1&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	if not subjectSpace or not templateTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local pagetype&lt;br /&gt;
	if subjectSpace == 10 then&lt;br /&gt;
		pagetype = message(&#039;template-pagetype&#039;)&lt;br /&gt;
	elseif subjectSpace == 828 then&lt;br /&gt;
		pagetype = message(&#039;module-pagetype&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		pagetype = message(&#039;default-pagetype&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local subpagesLink = makeWikilink(&lt;br /&gt;
		&#039;Special:PrefixIndex/&#039; .. templateTitle.prefixedText .. &#039;/&#039;,&lt;br /&gt;
		message(&#039;subpages-link-display&#039;, {pagetype})&lt;br /&gt;
	)&lt;br /&gt;
	return message(&#039;subpages-blurb&#039;, {subpagesLink})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makePrintBlurb(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Generates the blurb displayed when there is a print version of the template available.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	--&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;print-link-display&#039; --&amp;gt; &#039;/Print&#039;&lt;br /&gt;
	-- &#039;print-blurb&#039; --&amp;gt; &#039;A [[Help:Books/for experts#Improving the book layout|print version]]&#039;&lt;br /&gt;
	--		.. &#039; of this template exists at $1.&#039;&lt;br /&gt;
	--		.. &#039; If you make a change to this template, please update the print version as well.&#039;&lt;br /&gt;
	-- &#039;display-print-category&#039; --&amp;gt; true&lt;br /&gt;
	-- &#039;print-category&#039; --&amp;gt; &#039;Templates with print versions&#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local printTitle = env.printTitle&lt;br /&gt;
	if not printTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local ret&lt;br /&gt;
	if printTitle.exists then&lt;br /&gt;
		local printLink = makeWikilink(printTitle.prefixedText, message(&#039;print-link-display&#039;))&lt;br /&gt;
		ret = message(&#039;print-blurb&#039;, {printLink})&lt;br /&gt;
		local displayPrintCategory = message(&#039;display-print-category&#039;, nil, &#039;boolean&#039;)&lt;br /&gt;
		if displayPrintCategory then&lt;br /&gt;
			ret = ret .. makeCategoryLink(message(&#039;print-category&#039;))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Tracking categories&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.addTrackingCategories(env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Check if {{documentation}} is transcluded on a /doc or /testcases page.&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;display-strange-usage-category&#039; --&amp;gt; true&lt;br /&gt;
	-- &#039;doc-subpage&#039; --&amp;gt; &#039;doc&#039;&lt;br /&gt;
	-- &#039;testcases-subpage&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
	-- &#039;strange-usage-category&#039; --&amp;gt; &#039;Wikipedia pages with strange ((documentation)) usage&#039;&lt;br /&gt;
	-- &lt;br /&gt;
	-- /testcases pages in the module namespace are not categorised, as they may have&lt;br /&gt;
	-- {{documentation}} transcluded automatically.&lt;br /&gt;
	--]]&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not title or not subjectSpace then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	local ret = &#039;&#039;&lt;br /&gt;
	if message(&#039;display-strange-usage-category&#039;, nil, &#039;boolean&#039;)&lt;br /&gt;
		and (&lt;br /&gt;
			subpage == message(&#039;doc-subpage&#039;)&lt;br /&gt;
			or subjectSpace ~= 828 and subpage == message(&#039;testcases-subpage&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	then&lt;br /&gt;
		ret = ret .. makeCategoryLink(message(&#039;strange-usage-category&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Documentation&amp;diff=6751</id>
		<title>テンプレート:Documentation</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Documentation&amp;diff=6751"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Sandbox_other&amp;diff=6749</id>
		<title>テンプレート:Sandbox other</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Sandbox_other&amp;diff=6749"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:{{#ifeq:{{#invoke:String|sublength|s={{SUBPAGENAME}}|i=0|len=7}}|sandbox|1}}{{#ifeq:{{SUBPAGENAME}}|doc|1}}{{#invoke:String|match|{{PAGENAME}}|/sandbox/styles.css$|plain=false|nomatch=}}|{{{1|}}}|{{{2|}}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Documentation_subpage&amp;diff=6747</id>
		<title>テンプレート:Documentation subpage</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Documentation_subpage&amp;diff=6747"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{&lt;br /&gt;
  #ifeq: {{lc:{{SUBPAGENAME}}}} | {{{override|doc}}}&lt;br /&gt;
  | &amp;lt;!-- doc page --&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;{{&lt;br /&gt;
    #ifeq: {{{doc-notice|show}}} | show&lt;br /&gt;
    | &amp;lt;!-- doc-notice show --&amp;gt;{{Ombox&lt;br /&gt;
| type = notice&lt;br /&gt;
| image = [[File:Edit-copy green.svg|40px]]&lt;br /&gt;
| text =  &#039;&#039;&#039;これは{{{1|[[{{SUBJECTSPACE}}:{{BASEPAGENAME}}]]}}}の[[Help:テンプレートの説明文|解説]][[Help:サブページ|サブページ]]です。&#039;&#039;&#039;&amp;lt;br /&amp;gt;使用方法、[[Help:カテゴリ|カテゴリ]]、およびその他{{{種類|{{ #if: {{SUBJECTSPACE}} |{{SUBJECTSPACE ja}}ページ|記事}}}}}自体に含まれない情報を収容しています。&lt;br /&gt;
}}&lt;br /&gt;
    | &amp;lt;!-- doc-notice hide --&amp;gt;&lt;br /&gt;
  }}&amp;lt;includeonly&amp;gt;&lt;br /&gt;
  |&amp;lt;!-- not doc --&amp;gt;&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;includeonly&amp;gt;{{&lt;br /&gt;
  #ifeq: {{SUBPAGENAME}} | doc&lt;br /&gt;
  | {{&lt;br /&gt;
    #ifeq: {{NAMESPACE}} | {{ns:10}}&lt;br /&gt;
    | [[Category:テンプレート文書|{{PAGENAME}}]]&lt;br /&gt;
    }}&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:IsNum&amp;diff=6745</id>
		<title>テンプレート:IsNum</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:IsNum&amp;diff=6745"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#転送 [[Template:Ifnumber]]&lt;br /&gt;
{{pp-template}}&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Protection_banner/config&amp;diff=6743</id>
		<title>モジュール:Protection banner/config</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Protection_banner/config&amp;diff=6743"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides configuration data for [[Module:Protection banner]].&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--&lt;br /&gt;
--                                BANNER DATA&lt;br /&gt;
--&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Banner data consists of six fields:&lt;br /&gt;
-- * text - the main protection text that appears at the top of protection&lt;br /&gt;
--   banners.&lt;br /&gt;
-- * explanation - the text that appears below the main protection text, used&lt;br /&gt;
--   to explain the details of the protection.&lt;br /&gt;
-- * tooltip - the tooltip text you see when you move the mouse over a small&lt;br /&gt;
--   padlock icon.&lt;br /&gt;
-- * link - the page that the small padlock icon links to.&lt;br /&gt;
-- * alt - the alt text for the small padlock icon. This is also used as tooltip&lt;br /&gt;
--   text for the large protection banners.&lt;br /&gt;
-- * image - the padlock image used in both protection banners and small padlock&lt;br /&gt;
--   icons.&lt;br /&gt;
--&lt;br /&gt;
-- The module checks in three separate tables to find a value for each field.&lt;br /&gt;
-- First it checks the banners table, which has values specific to the reason&lt;br /&gt;
-- for the page being protected. Then the module checks the defaultBanners&lt;br /&gt;
-- table, which has values specific to each protection level. Finally, the&lt;br /&gt;
-- module checks the masterBanner table, which holds data for protection&lt;br /&gt;
-- templates to use if no data has been found in the previous two tables.&lt;br /&gt;
--&lt;br /&gt;
-- The values in the banner data can take parameters. These are specified&lt;br /&gt;
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name&lt;br /&gt;
-- enclosed in curly braces).&lt;br /&gt;
--&lt;br /&gt;
--                          Available parameters:&lt;br /&gt;
--&lt;br /&gt;
-- ${CURRENTVERSION} - a link to the page history or the move log, with the&lt;br /&gt;
-- display message &amp;quot;current-version-edit-display&amp;quot; or&lt;br /&gt;
-- &amp;quot;current-version-move-display&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- ${EDITREQUEST} - a link to create an edit request for the current page.&lt;br /&gt;
--&lt;br /&gt;
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. &amp;quot;Please discuss any changes&lt;br /&gt;
-- on the talk page; you may submit a request to ask an administrator to make&lt;br /&gt;
-- an edit if it is minor or supported by consensus.&amp;quot;&lt;br /&gt;
--&lt;br /&gt;
-- ${IMAGELINK} - a link to set the image to, depending on the protection&lt;br /&gt;
-- action and protection level.&lt;br /&gt;
--&lt;br /&gt;
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry&lt;br /&gt;
-- is set. E.g. &amp;quot;Editing of this page by new or unregistered users is currently &lt;br /&gt;
-- disabled until dd Month YYYY.&amp;quot;&lt;br /&gt;
--&lt;br /&gt;
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation&lt;br /&gt;
-- so that it can be used in run-on sentences.&lt;br /&gt;
--&lt;br /&gt;
-- ${PAGETYPE} - the type of the page, e.g. &amp;quot;article&amp;quot; or &amp;quot;template&amp;quot;.&lt;br /&gt;
-- Defined in the cfg.pagetypes table.&lt;br /&gt;
--&lt;br /&gt;
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.&lt;br /&gt;
-- &amp;quot;Editing of this page by new or unregistered users is currently disabled&amp;quot;&lt;br /&gt;
--&lt;br /&gt;
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the&lt;br /&gt;
-- template.&lt;br /&gt;
--&lt;br /&gt;
-- ${PROTECTIONLEVEL} - the protection level, e.g. &amp;quot;fully protected&amp;quot; or&lt;br /&gt;
-- &amp;quot;semi-protected&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,&lt;br /&gt;
-- depending on the protection action.&lt;br /&gt;
--&lt;br /&gt;
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links&lt;br /&gt;
-- straight to that talk page section.&lt;br /&gt;
--&lt;br /&gt;
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to&lt;br /&gt;
-- create a blurb like &amp;quot;This template is semi-protected&amp;quot;, or &amp;quot;This article is&lt;br /&gt;
-- move-protected until DD Month YYYY&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- ${VANDAL} - links for the specified username (or the root page name)&lt;br /&gt;
-- using Module:Vandal-m.&lt;br /&gt;
--&lt;br /&gt;
--                                 Functions&lt;br /&gt;
--&lt;br /&gt;
-- For advanced users, it is possible to use Lua functions instead of strings&lt;br /&gt;
-- in the banner config tables. Using functions gives flexibility that is not&lt;br /&gt;
-- possible just by using parameters. Functions take two arguments, the&lt;br /&gt;
-- protection object and the template arguments, and they must output a string.&lt;br /&gt;
--&lt;br /&gt;
-- For example:&lt;br /&gt;
--&lt;br /&gt;
-- text = function (protectionObj, args)&lt;br /&gt;
--     if protectionObj.level == &#039;autoconfirmed&#039; then&lt;br /&gt;
--         return &#039;foo&#039;&lt;br /&gt;
--     else&lt;br /&gt;
--         return &#039;bar&#039;&lt;br /&gt;
--     end&lt;br /&gt;
-- end&lt;br /&gt;
--&lt;br /&gt;
-- Some protection object properties and methods that may be useful:&lt;br /&gt;
-- protectionObj.action - the protection action&lt;br /&gt;
-- protectionObj.level - the protection level&lt;br /&gt;
-- protectionObj.reason - the protection reason&lt;br /&gt;
-- protectionObj.expiry - the expiry. Nil if unset, the string &amp;quot;indef&amp;quot; if set&lt;br /&gt;
--     to indefinite, and the protection time in unix time if temporary.&lt;br /&gt;
-- protectionObj.protectionDate - the protection date in unix time, or nil if&lt;br /&gt;
--     unspecified.&lt;br /&gt;
-- protectionObj.bannerConfig - the banner config found by the module. Beware&lt;br /&gt;
--     of editing the config field used by the function, as it could create an&lt;br /&gt;
--     infinite loop.&lt;br /&gt;
-- protectionObj:isProtected - returns a boolean showing whether the page is&lt;br /&gt;
--     protected.&lt;br /&gt;
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is&lt;br /&gt;
--     temporary.&lt;br /&gt;
-- protectionObj:isIncorrect - returns a boolean showing whether the protection&lt;br /&gt;
--     template is incorrect.&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- The master banner data, used if no values have been found in banners or&lt;br /&gt;
-- defaultBanners.&lt;br /&gt;
masterBanner = {&lt;br /&gt;
	text = &#039;${INTROBLURB}&#039;,&lt;br /&gt;
	explanation = &#039;${EXPLANATIONBLURB}&#039;,&lt;br /&gt;
	tooltip = &#039;${TOOLTIPBLURB}&#039;,&lt;br /&gt;
	link = &#039;${IMAGELINK}&#039;,&lt;br /&gt;
	alt = &#039;${PROTECTIONLEVEL}されたページ&#039;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-- The default banner data. This holds banner data for different protection&lt;br /&gt;
-- levels.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
defaultBanners = {&lt;br /&gt;
	edit = {},&lt;br /&gt;
	move = {},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = {&lt;br /&gt;
			alt = &#039;Page protected with pending changes&#039;,&lt;br /&gt;
			tooltip = &#039;All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users&#039;,&lt;br /&gt;
			image = &#039;Pending-protection-shackle.svg&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	upload = {}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-- The banner data. This holds banner data for different protection reasons.&lt;br /&gt;
-- In fact, the reasons specified in this table control which reasons are&lt;br /&gt;
-- valid inputs to the first positional parameter.&lt;br /&gt;
--&lt;br /&gt;
-- There is also a non-standard &amp;quot;description&amp;quot; field that can be used for items&lt;br /&gt;
-- in this table. This is a description of the protection reason for use in the&lt;br /&gt;
-- module documentation.&lt;br /&gt;
--&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
banners = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		--blp = {&lt;br /&gt;
		--	description = &#039;For pages protected to promote compliance with the&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:Biographies of living persons&#039;&lt;br /&gt;
		--		.. &#039;|biographies of living persons]] policy&#039;,&lt;br /&gt;
		--	text = &#039;${INTROFRAGMENT} to promote compliance with&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:Biographies of living persons&#039;&lt;br /&gt;
		--		.. &amp;quot;|Wikipedia&#039;s&amp;amp;nbsp;policy on&amp;amp;nbsp;the&amp;amp;nbsp;biographies&amp;quot;&lt;br /&gt;
		--		.. &#039; of&amp;amp;nbsp;living&amp;amp;nbsp;people]].&#039;,&lt;br /&gt;
		--	tooltip = &#039;${TOOLTIPFRAGMENT} to promote compliance with the policy on&#039;&lt;br /&gt;
		--		.. &#039; biographies of living persons&#039;,&lt;br /&gt;
		--},&lt;br /&gt;
		dmca = {&lt;br /&gt;
			description = &#039;[[デジタルミレニアム著作権法]]に基づく削除要求があったため、&#039;&lt;br /&gt;
				.. &#039;保護されたページ&#039;,&lt;br /&gt;
			explanation = function (protectionObj, args)&lt;br /&gt;
				local ret = &#039;この${PAGETYPE}の内容に関して、[[デジタルミレニアム著作権法]]&#039;&lt;br /&gt;
					.. &#039;(DMCA)に基づく権利所有者への通知があったため、&#039;&lt;br /&gt;
					.. &#039;ウィキメディア財団は問題となった個所を削除した上で、&#039;&lt;br /&gt;
					.. &#039;このページの編集を制限しました。&#039;&lt;br /&gt;
				if args.notice then&lt;br /&gt;
					ret = ret .. &#039;財団が受理した通知のコピーは &#039;&lt;br /&gt;
						.. args.notice .. &#039; にあります。&#039;&lt;br /&gt;
				end&lt;br /&gt;
				ret = ret .. &#039;異議申し立て方法など詳細な情報については&#039;&lt;br /&gt;
					.. &#039;[[Wikipedia:事務局行動]]および${TALKPAGE}をご覧ください。&amp;lt;br /&amp;gt;&#039;&lt;br /&gt;
					.. &amp;quot;&#039;&#039;&#039;編集制限が解除されるまで、&amp;quot;&lt;br /&gt;
					.. &amp;quot;このお知らせを除去しないでください。&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
				return ret&lt;br /&gt;
			end,&lt;br /&gt;
			image = &#039;Office-protection-shackle-WMFlogo.svg&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		dispute = {&lt;br /&gt;
			description = &#039;[[Wikipedia:編集合戦|編集合戦]]により保護されたページ&#039;,&lt;br /&gt;
			text = &#039;[[Wikipedia:編集合戦|編集合戦]]が発生したため、${INTROBLURB}&#039;,&lt;br /&gt;
			explanation = &amp;quot;${CURRENTVERSION}の内容が&#039;&#039;&#039;適切とは限りません&#039;&#039;&#039;。&amp;quot;&lt;br /&gt;
				.. &#039;詳しくは[[Wikipedia:保護の方針|保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;問題となった個所について意見がある場合は、&#039;&lt;br /&gt;
				.. &#039;${TALKPAGE}で議論するよう心がけてください。&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:合意形成|合意が形成]]され、保護を解除できる状態になった場合は&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|保護の解除を依頼]]してください。&#039;,&lt;br /&gt;
			tooltip = &#039;編集合戦が発生したため、${TOOLTIPBLURB}&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		--ecp = {&lt;br /&gt;
		--	description = &#039;For articles in topic areas authorized by&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:Arbitration Committee|ArbCom]] or&#039;&lt;br /&gt;
		--		.. &#039; meets the criteria for community use&#039;,&lt;br /&gt;
		--	tooltip = &#039;This ${PAGETYPE} is extended-confirmed protected&#039;,&lt;br /&gt;
		--	alt = &#039;Extended-protected ${PAGETYPE}&#039;,&lt;br /&gt;
		--},&lt;br /&gt;
		--mainpage = {&lt;br /&gt;
		--	description = &#039;For pages protected for being displayed on the [[Main Page]]&#039;,&lt;br /&gt;
		--	text = &#039;This file is currently&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:This page is protected|protected]] from&#039;&lt;br /&gt;
		--		.. &#039; editing because it is currently or will soon be displayed&#039;&lt;br /&gt;
		--		.. &#039; on the [[Main Page]].&#039;,&lt;br /&gt;
		--	explanation = &#039;Images on the Main Page are protected due to their high&#039;&lt;br /&gt;
		--		.. &#039; visibility. Please discuss any necessary changes on the ${TALKPAGE}.&#039;&lt;br /&gt;
		--		.. &#039;&amp;lt;br /&amp;gt;&amp;lt;span style=&amp;quot;font-size:90%;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
		--		.. &amp;quot;&#039;&#039;&#039;Administrators:&#039;&#039;&#039; Once this image is definitely off the Main Page,&amp;quot;&lt;br /&gt;
		--		.. &#039; please unprotect this file, or reduce to semi-protection,&#039;&lt;br /&gt;
		--		.. &#039; as appropriate.&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
		--},&lt;br /&gt;
		office = {&lt;br /&gt;
			description = &#039;[[Wikipedia:事務局行動|事務局行動]]により保護されたページ&#039;,&lt;br /&gt;
			text = function (protectionObj, args)&lt;br /&gt;
				local ret = &#039;現在この${PAGETYPE}は[[Wikipedia:事務局行動|&#039;&lt;br /&gt;
					.. &#039;ウィキメディア財団事務局]]の監視下にあり、&#039;&lt;br /&gt;
				if protectionObj.protectionDate then&lt;br /&gt;
					ret = ret .. &#039;${PROTECTIONDATE}以降、&#039;&lt;br /&gt;
				end&lt;br /&gt;
				return ret .. &#039;保護されています。&#039;&lt;br /&gt;
			end,&lt;br /&gt;
			explanation = &amp;quot;もしあなたがこのページを編集できたとしても、加筆・修正を行う前に&amp;quot;&lt;br /&gt;
				.. &amp;quot;${TALKPAGE}で議論するよう心がけてください。&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
				.. &amp;quot;&#039;&#039;&#039;ウィキメディア財団の許可があるまで、このページの保護を&amp;quot;&lt;br /&gt;
				.. &amp;quot;解除しないでください。&#039;&#039;&#039;&amp;quot;,&lt;br /&gt;
			image = &#039;Office-protection-shackle-WMFlogo.svg&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		permanent = {&lt;br /&gt;
			description = &#039;半永久的に保護されているページ&#039;,&lt;br /&gt;
			text = function (protectionObj, args)&lt;br /&gt;
				if protectionObj.level == &#039;sysop&#039; then&lt;br /&gt;
					return &#039;この${PAGETYPE}は、半永久的に編集[[Wikipedia:保護|保護]]されています。&#039;&lt;br /&gt;
				elseif protectionObj.level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
					return &#039;この${PAGETYPE}は、[[Wikipedia:利用者#拡張承認された利用者|&#039;&lt;br /&gt;
					.. &#039;拡張承認された利用者]]以外の編集を半永久的に[[Wikipedia:保護|禁止]]しています。&#039;&lt;br /&gt;
				else&lt;br /&gt;
					return &#039;この${PAGETYPE}は、[[Wikipedia:利用者#新規利用者|新規利用者]]&#039;&lt;br /&gt;
					.. &#039;および[[Wikipedia:利用者#IP利用者|未登録利用者]]からの編集を&#039;&lt;br /&gt;
					.. &#039;半永久的に[[Wikipedia:保護|禁止]]しています。&#039;&lt;br /&gt;
				end&lt;br /&gt;
			end,&lt;br /&gt;
			explanation = function (protectionObj, args)&lt;br /&gt;
				if protectionObj.level == &#039;sysop&#039; then&lt;br /&gt;
					return &#039;詳しくは[[Wikipedia:保護の方針#半永久的な保護|保護の方針]]および&#039;&lt;br /&gt;
					.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
					.. &#039;変更が必要なときは${TALKPAGE}で議論し、[[Wikipedia:合意形成|合意形成]]後に&#039;&lt;br /&gt;
					.. &#039;[[Wikipedia:管理者伝言板/保護ページ編集|保護編集依頼]]を行ってください。&#039;&lt;br /&gt;
				elseif protectionObj.level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
					return &#039;詳しくは[[Wikipedia:拡張半保護の方針#半永久的な拡張半保護|拡張半保護の方針]]および&#039;&lt;br /&gt;
					.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
					.. &#039;この${PAGETYPE}を編集することができない場合、${TALKPAGE}にて&#039;&lt;br /&gt;
					.. &#039;&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;{{[[Template:拡張半保護編集依頼|拡張半保護編集依頼]]}}&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
					.. &#039;を用いて[[Wikipedia:拡張半保護の方針#拡張半保護されたページの編集|編集を依頼]]するか、&#039;&lt;br /&gt;
					.. &#039;[[Wikipedia:管理者伝言板/拡張承認の申請|拡張承認の申請]]をしてください。&#039;&lt;br /&gt;
				else&lt;br /&gt;
					return &#039;詳しくは[[Wikipedia:半保護の方針#半永久的な半保護|半保護の方針]]および&#039;&lt;br /&gt;
					.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
					.. &#039;この${PAGETYPE}を編集することができない場合、${TALKPAGE}にて&#039;&lt;br /&gt;
					.. &#039;&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;{{[[Template:半保護編集依頼|半保護編集依頼]]}}&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
					.. &#039;を用いて[[Wikipedia:半保護の方針#半保護されたページの編集|編集を依頼]]してください。&#039;&lt;br /&gt;
				end&lt;br /&gt;
			end,&lt;br /&gt;
			tooltip = &#039;半永久的に${PROTECTIONLEVEL}されている${PAGETYPE}&#039;,&lt;br /&gt;
			alt = &#039;半永久的に${PROTECTIONLEVEL}されている${PAGETYPE}&#039;,&lt;br /&gt;
			image = function (protectionObj)&lt;br /&gt;
				if protectionObj.level == &#039;sysop&#039; then&lt;br /&gt;
					return &#039;Edit Semi-permanent Protection.svg&#039;&lt;br /&gt;
				elseif protectionObj.level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
					return &#039;Edit Semi-permanent Extended Semi-protection.svg&#039;&lt;br /&gt;
				else&lt;br /&gt;
					return &#039;Edit Semi-permanent Semi-protection.svg&#039;&lt;br /&gt;
				end&lt;br /&gt;
			end,&lt;br /&gt;
		},&lt;br /&gt;
		reset = {&lt;br /&gt;
			description = &#039;[[Wikipedia:事務局行動|事務局行動]]により、内容が&#039;&lt;br /&gt;
				.. &#039;縮小された上で保護されたページ&#039;,&lt;br /&gt;
 			text = function (protectionObj, args)&lt;br /&gt;
				local ret = &#039;現在この${PAGETYPE}は[[Wikipedia:事務局行動|&#039;&lt;br /&gt;
					.. &#039;ウィキメディア財団事務局]]の監視下にあり、&#039;&lt;br /&gt;
				if protectionObj.protectionDate then&lt;br /&gt;
					ret = ret .. &#039;${PROTECTIONDATE}以降、&#039;&lt;br /&gt;
				end&lt;br /&gt;
				return ret .. &#039;保護されています。&#039;&lt;br /&gt;
			end,&lt;br /&gt;
			explanation = &#039;この${PAGETYPE}には最小限の内容しかないため、&#039;&lt;br /&gt;
				.. &#039;[[WP:NPOV|中立的な観点]]や[[WP:V|検証可能性]]といった方針に&#039;&lt;br /&gt;
				.. &#039;適合する形で、全面的に改稿されることが望まれています。&#039;&lt;br /&gt;
				.. &amp;quot;もしあなたがこのページを編集できたとしても、加筆・修正を行う前に&amp;quot;&lt;br /&gt;
				.. &amp;quot;${TALKPAGE}で議論するよう心がけてください。&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
				.. &#039;この${PAGETYPE}が保護される以前の版に書かれていた内容は&#039;&lt;br /&gt;
				.. &#039;復帰させないでください。&#039;&lt;br /&gt;
				.. &#039;ノートページで議論を行う際も同様です。&amp;lt;br /&amp;gt;&#039;&lt;br /&gt;
				.. &amp;quot;&#039;&#039;&#039;ウィキメディア財団の許可があるまで、このページの保護を&amp;quot;&lt;br /&gt;
				.. &amp;quot;解除したり、このお知らせを除去しないでください。&#039;&#039;&#039;&amp;quot;,&lt;br /&gt;
			image = &#039;Office-protection-shackle-WMFlogo.svg&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		--sock = {&lt;br /&gt;
		--	description = &#039;For pages protected due to&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:Sock puppetry|sock puppetry]]&#039;,&lt;br /&gt;
		--	text = &#039;${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:Blocking policy|blocked]] or&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:Banning policy|banned users]]&#039;&lt;br /&gt;
		--		.. &#039; from editing it.&#039;,&lt;br /&gt;
		--	tooltip = &#039;${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from&#039;&lt;br /&gt;
		--		.. &#039; editing it&#039;,&lt;br /&gt;
		--},&lt;br /&gt;
		template = {&lt;br /&gt;
			description = &#039;[[Wikipedia:影響が特に大きいテンプレート|&#039;&lt;br /&gt;
				.. &#039;影響が特に大きいテンプレート・モジュール]]&#039;,&lt;br /&gt;
			text = &#039;この[[Wikipedia:影響が特に大きいテンプレート|&#039;&lt;br /&gt;
				.. &#039;影響が特に大きい${PAGETYPE}]]は、[[Wikipedia:荒らし|荒らし]]を予防するために&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLEVEL}されています。&#039;,&lt;br /&gt;
			explanation = function (protectionObj, args)&lt;br /&gt;
				if protectionObj.level == &#039;sysop&#039; then&lt;br /&gt;
					return &#039;詳しくは[[Wikipedia:保護の方針#半永久的な保護|保護の方針]]および&#039;&lt;br /&gt;
					.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
					.. &#039;変更が必要なときは${TALKPAGE}で議論し、[[Wikipedia:合意形成|合意形成]]後に&#039;&lt;br /&gt;
					.. &#039;[[Wikipedia:管理者伝言板/保護ページ編集|保護編集依頼]]を行ってください。&#039;&lt;br /&gt;
				elseif protectionObj.level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
					return &#039;詳しくは[[Wikipedia:拡張半保護の方針#半永久的な拡張半保護|拡張半保護の方針]]および&#039;&lt;br /&gt;
					.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
					.. &#039;この${PAGETYPE}を編集することができない場合、${TALKPAGE}にて&#039;&lt;br /&gt;
					.. &#039;&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;{{[[Template:拡張半保護編集依頼|拡張半保護編集依頼]]}}&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
					.. &#039;を用いて[[Wikipedia:拡張半保護の方針#拡張半保護されたページの編集|編集を依頼]]するか、&#039;&lt;br /&gt;
					.. &#039;[[Wikipedia:管理者伝言板/拡張承認の申請|拡張承認の申請]]をしてください。&#039;&lt;br /&gt;
				else&lt;br /&gt;
					return &#039;詳しくは[[Wikipedia:半保護の方針#半永久的な半保護|半保護の方針]]および&#039;&lt;br /&gt;
					.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
					.. &#039;この${PAGETYPE}を編集することができない場合、${TALKPAGE}にて&#039;&lt;br /&gt;
					.. &#039;&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;{{[[Template:半保護編集依頼|半保護編集依頼]]}}&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
					.. &#039;を用いて[[Wikipedia:半保護の方針#半保護されたページの編集|編集を依頼]]してください。&#039;&lt;br /&gt;
				end&lt;br /&gt;
			end,&lt;br /&gt;
			tooltip = &#039;この影響が特に大きい${PAGETYPE}は、&#039;&lt;br /&gt;
				.. &#039;荒らしを予防するために${PROTECTIONLEVEL}されています。&#039;,&lt;br /&gt;
			alt = &#039;半永久的に${PROTECTIONLEVEL}されている${PAGETYPE}&#039;,&lt;br /&gt;
			image = function (protectionObj)&lt;br /&gt;
				if protectionObj.level == &#039;sysop&#039; then&lt;br /&gt;
					return &#039;Edit Semi-permanent Protection.svg&#039;&lt;br /&gt;
				elseif protectionObj.level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
					return &#039;Edit Semi-permanent Extended Semi-protection.svg&#039;&lt;br /&gt;
				else&lt;br /&gt;
					return &#039;Edit Semi-permanent Semi-protection.svg&#039;&lt;br /&gt;
				end&lt;br /&gt;
			end,&lt;br /&gt;
		},&lt;br /&gt;
		--usertalk = {&lt;br /&gt;
		--	description = &#039;For pages protected against disruptive edits by a&#039;&lt;br /&gt;
		--		.. &#039; particular user&#039;,&lt;br /&gt;
		--	text = &#039;${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,&#039;&lt;br /&gt;
		--		.. &#039; such as abusing the&#039;&lt;br /&gt;
		--		.. &#039; &amp;amp;#123;&amp;amp;#123;[[Template:unblock|unblock]]&amp;amp;#125;&amp;amp;#125; template.&#039;,&lt;br /&gt;
		--	explanation = &#039;If you cannot edit this user talk page and you need to&#039;&lt;br /&gt;
		--		.. &#039; make a change or leave a message, you can&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:Requests for page protection&#039;&lt;br /&gt;
		--		.. &#039;#Current requests for edits to a protected page&#039;&lt;br /&gt;
		--		.. &#039;|request an edit]],&#039;&lt;br /&gt;
		--		.. &#039; [[Wikipedia:Requests for page protection&#039;&lt;br /&gt;
		--		.. &#039;#Current requests for reduction in protection level&#039;&lt;br /&gt;
		--		.. &#039;|request unprotection]],&#039;&lt;br /&gt;
		--		.. &#039; [[Special:Userlogin|log in]],&#039;&lt;br /&gt;
		--		.. &#039; or [[Special:UserLogin/signup|create an account]].&#039;,&lt;br /&gt;
		--},&lt;br /&gt;
		vandalism = {&lt;br /&gt;
			description = &#039;[[Wikipedia:荒らし|荒らし]]行為により保護されたページ&#039;,&lt;br /&gt;
			text = &#039;度重なる[[Wikipedia:荒らし|荒らし]]行為のため、${INTROBLURB}&#039;,&lt;br /&gt;
			tooltip = &#039;度重なる荒らし行為のため、${TOOLTIPBLURB}&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		dispute = {&lt;br /&gt;
			description = &#039;[[Wikipedia:編集合戦#移動合戦|移動合戦]]により保護されたページ&#039;,&lt;br /&gt;
			text = &#039;[[Wikipedia:編集合戦#移動合戦|移動合戦]]が発生したため、${INTROFRAGMENT}&#039;,&lt;br /&gt;
			explanation = &amp;quot;${CURRENTVERSION}が&#039;&#039;&#039;適切とは限りません&#039;&#039;&#039;。&amp;quot;&lt;br /&gt;
				.. &#039;詳しくは[[Wikipedia:保護の方針|保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;ページ名について意見がある場合は${TALKPAGE}で議論し、&#039;&lt;br /&gt;
				.. &#039;必要に応じて[[Wikipedia:ページの改名]]に従い、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:改名提案|改名の提案]]をしてください。&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:合意形成|合意が形成]]され、保護を解除できる状態になった場合は&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|保護の解除を依頼]]してください。&#039;,&lt;br /&gt;
			tooltip = &#039;移動合戦が発生したため、${TOOLTIPBLURB}&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		vandalism = {&lt;br /&gt;
			description = &#039;[[Wikipedia:荒らし#移動荒らし|移動荒らし]]行為により保護されたページ&#039;,&lt;br /&gt;
			text = &#039;度重なる[[Wikipedia:荒らし#移動荒らし|移動荒らし]]行為のため、${INTROFRAGMENT}&#039;,&lt;br /&gt;
			tooltip = &#039;度重なる移動荒らし行為のため、${TOOLTIPBLURB}&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {},&lt;br /&gt;
	upload = {}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--&lt;br /&gt;
--                            GENERAL DATA TABLES&lt;br /&gt;
--&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection blurbs&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table produces the protection blurbs available with the&lt;br /&gt;
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and&lt;br /&gt;
-- protection level, and is checked by the module in the following order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level&lt;br /&gt;
-- 2. page&#039;s protection action, default protection level&lt;br /&gt;
-- 3. &amp;quot;edit&amp;quot; protection action, default protection level&lt;br /&gt;
--&lt;br /&gt;
-- It is possible to use banner parameters inside this table.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
protectionBlurbs = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		default = &#039;この${PAGETYPE}は編集[[Wikipedia:保護|保護]]されています&#039;,&lt;br /&gt;
		autoconfirmed = &#039;この${PAGETYPE}は[[Wikipedia:利用者#新規利用者|新規利用者]]&#039;&lt;br /&gt;
			.. &#039;および[[Wikipedia:利用者#IP利用者|未登録利用者]]からの編集を[[Wikipedia:保護|禁止]]しています&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;この${PAGETYPE}は[[Wikipedia:利用者#拡張承認された利用者|&#039;&lt;br /&gt;
			.. &#039;拡張承認された利用者]]以外の編集を[[Wikipedia:保護|禁止]]しています&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = &#039;この${PAGETYPE}は[[Help:ページの移動|移動]][[Wikipedia:保護|保護]]されています&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;この${PAGETYPE}は[[Wikipedia:利用者#拡張承認された利用者|&#039;&lt;br /&gt;
			.. &#039;拡張承認された利用者]]以外の[[Help:ページの移動|移動]]を[[Wikipedia:保護|禁止]]しています&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = &#039;All edits made to this ${PAGETYPE} by&#039;&lt;br /&gt;
			.. &#039; [[Wikipedia:User access levels#New users|new]] or&#039;&lt;br /&gt;
			.. &#039; [[Wikipedia:User access levels#Unregistered users|unregistered]]&#039;&lt;br /&gt;
			.. &#039; users are currently&#039;&lt;br /&gt;
			.. &#039; [[Wikipedia:Pending changes|subject to review]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = &#039;この${PAGETYPE}は[[Wikipedia:ファイルのアップロード|アップロード]]&#039;&lt;br /&gt;
			.. &#039;[[Wikipedia:保護|保護]]されています&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;この${PAGETYPE}は[[Wikipedia:利用者#拡張承認された利用者|&#039;&lt;br /&gt;
			.. &#039;拡張承認された利用者]]以外の[[Wikipedia:ファイルのアップロード|アップロード]]を&#039;&lt;br /&gt;
			.. &#039;[[Wikipedia:保護|禁止]]しています&#039;,&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Explanation blurbs&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table produces the explanation blurbs available with the&lt;br /&gt;
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,&lt;br /&gt;
-- protection level, and whether the page is a talk page or not. If the page is&lt;br /&gt;
-- a talk page it will have a talk key of &amp;quot;talk&amp;quot;; otherwise it will have a talk&lt;br /&gt;
-- key of &amp;quot;subject&amp;quot;. The table is checked in the following order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level, page&#039;s talk key&lt;br /&gt;
-- 2. page&#039;s protection action, page&#039;s protection level, default talk key&lt;br /&gt;
-- 3. page&#039;s protection action, default protection level, page&#039;s talk key&lt;br /&gt;
-- 4. page&#039;s protection action, default protection level, default talk key&lt;br /&gt;
--&lt;br /&gt;
-- It is possible to use banner parameters inside this table.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
explanationBlurbs = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		autoconfirmed = {&lt;br /&gt;
			subject = &#039;詳しくは[[Wikipedia:半保護の方針|半保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。この${PAGETYPE}を編集することができない場合、${TALKPAGE}&#039;&lt;br /&gt;
				.. &#039;にて&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;{{[[Template:半保護編集依頼|半保護編集依頼]]}}&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
				.. &#039;を用いて[[Wikipedia:半保護の方針#半保護されたページの編集|編集を依頼]]してください。&#039;&lt;br /&gt;
				.. &#039;半保護を解除しても問題ない状態になった場合、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|半保護の解除を依頼]]してください。&#039;,&lt;br /&gt;
			default = &#039;詳しくは[[Wikipedia:半保護の方針|半保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;半保護を解除しても問題ない状態になった場合、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|半保護の解除を依頼]]してください。&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		extendedconfirmed = {&lt;br /&gt;
			subject = &#039;詳しくは[[Wikipedia:拡張半保護の方針|拡張半保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。この${PAGETYPE}を編集することができない場合、${TALKPAGE}&#039;&lt;br /&gt;
				.. &#039;にて&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;{{[[Template:拡張半保護編集依頼|拡張半保護編集依頼]]}}&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
				.. &#039;を用いて[[Wikipedia:拡張半保護の方針#拡張半保護されたページの編集|編集を依頼]]するか、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:管理者伝言板/拡張承認の申請|拡張承認の申請]]を&#039;&lt;br /&gt;
				.. &#039;してください。拡張半保護を解除しても問題ない状態になった場合、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|拡張半保護の解除を依頼]]してください。&#039;,&lt;br /&gt;
			default = &#039;詳しくは[[Wikipedia:拡張半保護の方針|拡張半保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;拡張半保護を解除しても問題ない状態になった場合、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|拡張半保護の解除を依頼]]してください。&#039;&lt;br /&gt;
		},&lt;br /&gt;
		default = {&lt;br /&gt;
			subject = &#039;詳しくは[[Wikipedia:保護の方針|保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;変更が必要なときは${TALKPAGE}で議論し、[[Wikipedia:合意形成|合意形成]]後に&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:管理者伝言板/保護ページ編集|保護編集依頼]]を行ってください。&#039;&lt;br /&gt;
				.. &#039;合意が形成されるなど、保護を解除できる状態になった場合は&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|保護の解除を依頼]]してください。&#039;,&lt;br /&gt;
			default = &#039;詳しくは[[Wikipedia:保護の方針|保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;合意が形成されるなど、保護を解除できる状態になった場合は&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|保護の解除を依頼]]してください。&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		extendedconfirmed = {&lt;br /&gt;
			subject = &#039;詳しくは[[Wikipedia:拡張半保護の方針|拡張半保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;ページを移動できない場合は、${TALKPAGE}にて&#039;&lt;br /&gt;
				.. &#039;&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;{{[[Template:拡張半保護編集依頼|拡張半保護編集依頼]]}}&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
				.. &#039;を用いて[[Wikipedia:拡張半保護の方針#拡張半保護されたページの編集|移動を依頼]]するか、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:管理者伝言板/拡張承認の申請|拡張承認の申請]]を&#039;&lt;br /&gt;
				.. &#039;してください。移動拡張半保護を解除しても問題ない状態になった場合、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|移動拡張半保護の解除を依頼]]してください。&#039;,&lt;br /&gt;
			default = &#039;詳しくは[[Wikipedia:拡張半保護の方針|拡張半保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;移動拡張半保護を解除しても問題ない状態になった場合、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|移動拡張半保護の解除を依頼]]してください。&#039;&lt;br /&gt;
		},&lt;br /&gt;
		default = {&lt;br /&gt;
			subject = &#039;詳しくは[[Wikipedia:保護の方針|保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;移動が必要なときは${TALKPAGE}で議論し、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:合意形成|合意形成]]後に&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:移動依頼|移動依頼]]で依頼してください。&#039;&lt;br /&gt;
				.. &#039;合意が形成されるなど、移動保護を解除できる状態になった場合は&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|移動保護の解除を依頼]]してください。&#039;,&lt;br /&gt;
			default = &#039;詳しくは[[Wikipedia:保護の方針|保護の方針]]および&#039;&lt;br /&gt;
				.. &#039;${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;合意が形成されるなど、移動保護を解除できる状態になった場合は&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|移動保護の解除を依頼]]してください。&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = {&lt;br /&gt;
			default = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
				.. &#039; Edits to this ${PAGETYPE} by new and unregistered users&#039;&lt;br /&gt;
				.. &#039; will not be visible to readers until they are accepted by&#039;&lt;br /&gt;
				.. &#039; a reviewer. To avoid the need for your edits to be&#039;&lt;br /&gt;
				.. &#039; reviewed, you may&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection&#039;&lt;br /&gt;
				.. &#039;#Current requests for reduction in protection level&#039;&lt;br /&gt;
				.. &#039;|request unprotection]], [[Special:Userlogin|log in]], or&#039;&lt;br /&gt;
				.. &#039; [[Special:UserLogin/signup|create an account]].&#039;&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = {&lt;br /&gt;
			default = &#039;詳しくは${PROTECTIONLOG}をご覧ください。&#039;&lt;br /&gt;
				.. &#039;編集保護されていない場合は、&#039;&lt;br /&gt;
				.. &#039;ファイルの説明を編集することができます。&#039;&lt;br /&gt;
				.. &#039;アップロード保護を解除しても問題ない状態になった場合、&#039;&lt;br /&gt;
				.. &#039;[[Wikipedia:保護解除依頼|アップロード保護の解除を依頼]]してください。&#039;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection levels&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which&lt;br /&gt;
-- produces a short label for different protection levels. It is sorted by&lt;br /&gt;
-- protection action and protection level, and is checked in the following&lt;br /&gt;
-- order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level&lt;br /&gt;
-- 2. page&#039;s protection action, default protection level&lt;br /&gt;
-- 3. &amp;quot;edit&amp;quot; protection action, default protection level&lt;br /&gt;
--&lt;br /&gt;
-- It is possible to use banner parameters inside this table.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
protectionLevels = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		default = &#039;保護&#039;,&lt;br /&gt;
		templateeditor = &#039;template-protected&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;拡張半保護&#039;,&lt;br /&gt;
		autoconfirmed = &#039;半保護&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = &#039;移動保護&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;移動拡張半保護&#039;&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = &#039;アップロード保護&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;アップロード拡張半保護&#039;&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Images&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table lists different padlock images for each protection action and&lt;br /&gt;
-- protection level. It is used if an image is not specified in any of the&lt;br /&gt;
-- banner data tables, and if the page does not satisfy the conditions for using&lt;br /&gt;
-- the [&#039;image-filename-indef&#039;] image. It is checked in the following order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level&lt;br /&gt;
-- 2. page&#039;s protection action, default protection level&lt;br /&gt;
images = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		default = &#039;Edit Protection.svg&#039;,&lt;br /&gt;
		templateeditor = &#039;Template-protection-shackle.svg&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;Edit Extended Semi-protection.svg&#039;,&lt;br /&gt;
		autoconfirmed = &#039;Edit Semi-protection.svg&#039;&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = &#039;Move-protection-shackle.svg&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;Move Extended Semi-protection.svg&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = &#039;Pending-protection-shackle.svg&#039;&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = &#039;Upload Protection.svg&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;Upload Extended Semi-protection.svg&#039;,&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-- Pages with a reason specified in this table will show the special &amp;quot;indef&amp;quot;&lt;br /&gt;
-- padlock, defined in the &#039;image-filename-indef&#039; message, if no expiry is set.&lt;br /&gt;
indefImageReasons = {&lt;br /&gt;
	template = true&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Image links&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table provides the data for the ${IMAGELINK} parameter, which gets&lt;br /&gt;
-- the image link for small padlock icons based on the page&#039;s protection action&lt;br /&gt;
-- and protection level. It is checked in the following order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level&lt;br /&gt;
-- 2. page&#039;s protection action, default protection level&lt;br /&gt;
-- 3. &amp;quot;edit&amp;quot; protection action, default protection level&lt;br /&gt;
--&lt;br /&gt;
-- It is possible to use banner parameters inside this table.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
imageLinks = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		default = &#039;Wikipedia:保護の方針&#039;,&lt;br /&gt;
		templateeditor = &#039;Wikipedia:Protection policy#template&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;Wikipedia:拡張半保護の方針&#039;,&lt;br /&gt;
		autoconfirmed = &#039;Wikipedia:半保護の方針&#039;&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = &#039;Wikipedia:保護の方針&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;Wikipedia:拡張半保護の方針&#039;&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = &#039;Wikipedia:Protection policy#pending&#039;&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = &#039;&#039;&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Padlock indicator names&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table provides the &amp;quot;name&amp;quot; attribute for the &amp;lt;indicator&amp;gt; extension tag&lt;br /&gt;
-- with which small padlock icons are generated. All indicator tags on a page&lt;br /&gt;
-- are displayed in alphabetical order based on this attribute, and with&lt;br /&gt;
-- indicator tags with duplicate names, the last tag on the page wins.&lt;br /&gt;
-- The attribute is chosen based on the protection action; table keys must be a&lt;br /&gt;
-- protection action name or the string &amp;quot;default&amp;quot;.&lt;br /&gt;
padlockIndicatorNames = {&lt;br /&gt;
	move = &#039;pp-move&#039;,&lt;br /&gt;
	autoreview = &#039;pp-autoreview&#039;,&lt;br /&gt;
	upload = &#039;pp-upload&#039;,&lt;br /&gt;
	default = &#039;pp-default&#039;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection categories&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- The protection categories are stored in the protectionCategories table.&lt;br /&gt;
-- Keys to this table are made up of the following strings:&lt;br /&gt;
--&lt;br /&gt;
-- 1. the expiry date&lt;br /&gt;
-- 2. the namespace&lt;br /&gt;
-- 3. the protection reason (e.g. &amp;quot;dispute&amp;quot; or &amp;quot;vandalism&amp;quot;)&lt;br /&gt;
-- 4. the protection level (e.g. &amp;quot;sysop&amp;quot; or &amp;quot;autoconfirmed&amp;quot;)&lt;br /&gt;
-- 5. the action (e.g. &amp;quot;edit&amp;quot; or &amp;quot;move&amp;quot;)&lt;br /&gt;
-- &lt;br /&gt;
-- When the module looks up a category in the table, first it will will check to&lt;br /&gt;
-- see a key exists that corresponds to all five parameters. For example, a&lt;br /&gt;
-- user page semi-protected from vandalism for two weeks would have the key&lt;br /&gt;
-- &amp;quot;temp-user-vandalism-autoconfirmed-edit&amp;quot;. If no match is found, the module&lt;br /&gt;
-- changes the first part of the key to &amp;quot;all&amp;quot; and checks the table again. It&lt;br /&gt;
-- keeps checking increasingly generic key combinations until it finds the&lt;br /&gt;
-- field, or until it reaches the key &amp;quot;all-all-all-all-all&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- The module uses a binary matrix to determine the order in which to search.&lt;br /&gt;
-- This is best demonstrated by a table. In this table, the &amp;quot;0&amp;quot; values&lt;br /&gt;
-- represent &amp;quot;all&amp;quot;, and the &amp;quot;1&amp;quot; values represent the original data (e.g.&lt;br /&gt;
-- &amp;quot;indef&amp;quot; or &amp;quot;file&amp;quot; or &amp;quot;vandalism&amp;quot;).&lt;br /&gt;
--&lt;br /&gt;
--        expiry    namespace reason   level     action&lt;br /&gt;
-- order&lt;br /&gt;
-- 1      1         1         1        1         1&lt;br /&gt;
-- 2      0         1         1        1         1&lt;br /&gt;
-- 3      1         0         1        1         1&lt;br /&gt;
-- 4      0         0         1        1         1&lt;br /&gt;
-- 5      1         1         0        1         1&lt;br /&gt;
-- 6      0         1         0        1         1&lt;br /&gt;
-- 7      1         0         0        1         1&lt;br /&gt;
-- 8      0         0         0        1         1&lt;br /&gt;
-- 9      1         1         1        0         1&lt;br /&gt;
-- 10     0         1         1        0         1&lt;br /&gt;
-- 11     1         0         1        0         1&lt;br /&gt;
-- 12     0         0         1        0         1&lt;br /&gt;
-- 13     1         1         0        0         1&lt;br /&gt;
-- 14     0         1         0        0         1&lt;br /&gt;
-- 15     1         0         0        0         1&lt;br /&gt;
-- 16     0         0         0        0         1&lt;br /&gt;
-- 17     1         1         1        1         0&lt;br /&gt;
-- 18     0         1         1        1         0&lt;br /&gt;
-- 19     1         0         1        1         0&lt;br /&gt;
-- 20     0         0         1        1         0&lt;br /&gt;
-- 21     1         1         0        1         0&lt;br /&gt;
-- 22     0         1         0        1         0&lt;br /&gt;
-- 23     1         0         0        1         0&lt;br /&gt;
-- 24     0         0         0        1         0&lt;br /&gt;
-- 25     1         1         1        0         0&lt;br /&gt;
-- 26     0         1         1        0         0&lt;br /&gt;
-- 27     1         0         1        0         0&lt;br /&gt;
-- 28     0         0         1        0         0&lt;br /&gt;
-- 29     1         1         0        0         0&lt;br /&gt;
-- 30     0         1         0        0         0&lt;br /&gt;
-- 31     1         0         0        0         0&lt;br /&gt;
-- 32     0         0         0        0         0&lt;br /&gt;
--&lt;br /&gt;
-- In this scheme the action has the highest priority, as it is the last&lt;br /&gt;
-- to change, and the expiry has the least priority, as it changes the most.&lt;br /&gt;
-- The priorities of the expiry, the protection level and the action are&lt;br /&gt;
-- fixed, but the priorities of the reason and the namespace can be swapped&lt;br /&gt;
-- through the use of the cfg.bannerDataNamespaceHasPriority table.&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- If the reason specified to the template is listed in this table,&lt;br /&gt;
-- namespace data will take priority over reason data in the protectionCategories&lt;br /&gt;
-- table.&lt;br /&gt;
reasonsWithNamespacePriority = {&lt;br /&gt;
	vandalism = true,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-- The string to use as a namespace key for the protectionCategories table for each&lt;br /&gt;
-- namespace number.&lt;br /&gt;
categoryNamespaceKeys = {&lt;br /&gt;
	[  2] = &#039;user&#039;,&lt;br /&gt;
	[  3] = &#039;user&#039;,&lt;br /&gt;
	[  4] = &#039;project&#039;,&lt;br /&gt;
	[  6] = &#039;file&#039;,&lt;br /&gt;
	[  8] = &#039;mediawiki&#039;,&lt;br /&gt;
	[ 10] = &#039;template&#039;,&lt;br /&gt;
	[ 12] = &#039;project&#039;,&lt;br /&gt;
	[ 14] = &#039;category&#039;,&lt;br /&gt;
	[100] = &#039;portal&#039;,&lt;br /&gt;
	[828] = &#039;module&#039;,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
protectionCategories = {&lt;br /&gt;
	[&#039;all|all|all|all|all&#039;]                  = &#039;編集保護中のページ&#039;,&lt;br /&gt;
	--[&#039;all|all|office|all|all&#039;]               = &#039;Wikipedia Office-protected pages&#039;,&lt;br /&gt;
	--[&#039;all|all|reset|all|all&#039;]                = &#039;Wikipedia Office-protected pages&#039;,&lt;br /&gt;
	--[&#039;all|all|dmca|all|all&#039;]                 = &#039;Wikipedia Office-protected pages&#039;,&lt;br /&gt;
	[&#039;all|all|permanent|all|all&#039;]            = &#039;保護運用中のページ&#039;,&lt;br /&gt;
	--[&#039;all|all|mainpage|all|all&#039;]             = &#039;Wikipedia fully-protected main page files&#039;,&lt;br /&gt;
	--[&#039;all|all|ecp|extendedconfirmed|all&#039;]    = &#039;編集拡張半保護中のページ&#039;,&lt;br /&gt;
	[&#039;all|all|all|extendedconfirmed|edit&#039;]    = &#039;編集拡張半保護中のページ&#039;,&lt;br /&gt;
	[&#039;all|all|all|autoconfirmed|edit&#039;]       = &#039;編集半保護中のページ&#039;,&lt;br /&gt;
	--[&#039;indef|all|all|autoconfirmed|edit&#039;]     = &#039;Wikipedia indefinitely semi-protected pages&#039;,&lt;br /&gt;
	--[&#039;all|all|blp|autoconfirmed|edit&#039;]       = &#039;Wikipedia indefinitely semi-protected biographies of living people&#039;,&lt;br /&gt;
	--[&#039;temp|all|blp|autoconfirmed|edit&#039;]      = &#039;Wikipedia temporarily semi-protected biographies of living people&#039;,&lt;br /&gt;
	--[&#039;all|all|dispute|autoconfirmed|edit&#039;]   = &#039;Wikipedia pages semi-protected due to dispute&#039;,&lt;br /&gt;
	--[&#039;all|all|sock|autoconfirmed|edit&#039;]      = &#039;Wikipedia pages semi-protected from banned users&#039;,&lt;br /&gt;
	--[&#039;all|all|vandalism|autoconfirmed|edit&#039;] = &#039;Wikipedia pages semi-protected against vandalism&#039;,&lt;br /&gt;
	--[&#039;all|category|all|autoconfirmed|edit&#039;]  = &#039;Wikipedia semi-protected categories&#039;,&lt;br /&gt;
	--[&#039;all|file|all|autoconfirmed|edit&#039;]      = &#039;Wikipedia semi-protected files&#039;,&lt;br /&gt;
	--[&#039;all|portal|all|autoconfirmed|edit&#039;]    = &#039;Wikipedia semi-protected portals&#039;,&lt;br /&gt;
	--[&#039;all|project|all|autoconfirmed|edit&#039;]   = &#039;Wikipedia semi-protected project pages&#039;,&lt;br /&gt;
	--[&#039;all|talk|all|autoconfirmed|edit&#039;]      = &#039;Wikipedia semi-protected talk pages&#039;,&lt;br /&gt;
	[&#039;all|template|all|sysop|edit&#039;]          = &#039;編集保護中のテンプレート&#039;,&lt;br /&gt;
	[&#039;all|template|all|autoconfirmed|edit&#039;]  = &#039;編集半保護中のテンプレート&#039;,&lt;br /&gt;
	--[&#039;all|user|all|autoconfirmed|edit&#039;]      = &#039;Wikipedia semi-protected user and user talk pages&#039;,&lt;br /&gt;
	--[&#039;all|template|all|templateeditor|edit&#039;] = &#039;Wikipedia template-protected templates&#039;,&lt;br /&gt;
	--[&#039;all|all|blp|sysop|edit&#039;]               = &#039;Wikipedia indefinitely protected biographies of living people&#039;,&lt;br /&gt;
	--[&#039;temp|all|blp|sysop|edit&#039;]              = &#039;Wikipedia temporarily protected biographies of living people&#039;,&lt;br /&gt;
	--[&#039;all|all|dispute|sysop|edit&#039;]           = &#039;Wikipedia pages protected due to dispute&#039;,&lt;br /&gt;
	--[&#039;all|all|sock|sysop|edit&#039;]              = &#039;Wikipedia pages protected from banned users&#039;,&lt;br /&gt;
	--[&#039;all|all|vandalism|sysop|edit&#039;]         = &#039;Wikipedia pages protected against vandalism&#039;,&lt;br /&gt;
	--[&#039;all|category|all|sysop|edit&#039;]          = &#039;Wikipedia fully protected categories&#039;,&lt;br /&gt;
	--[&#039;all|file|all|sysop|edit&#039;]              = &#039;Wikipedia fully-protected files&#039;,&lt;br /&gt;
	--[&#039;all|project|all|sysop|edit&#039;]           = &#039;Wikipedia fully-protected project pages&#039;,&lt;br /&gt;
	--[&#039;all|talk|all|sysop|edit&#039;]              = &#039;Wikipedia fully-protected talk pages&#039;,&lt;br /&gt;
	--[&#039;all|user|all|sysop|edit&#039;]              = &#039;Wikipedia fully protected user and user talk pages&#039;,&lt;br /&gt;
	[&#039;all|module|all|sysop|edit&#039;]            = &#039;編集保護中のモジュール&#039;,&lt;br /&gt;
	--[&#039;all|module|all|templateeditor|edit&#039;]   = &#039;Wikipedia template-protected modules&#039;,&lt;br /&gt;
	[&#039;all|module|all|autoconfirmed|edit&#039;]    = &#039;編集半保護中のモジュール&#039;,&lt;br /&gt;
	[&#039;all|all|all|sysop|move&#039;]               = &#039;移動保護中のページ&#039;,&lt;br /&gt;
	[&#039;all|all|all|extendedconfirmed|move&#039;]   = &#039;移動拡張半保護中のページ&#039;,&lt;br /&gt;
	--[&#039;indef|all|all|sysop|move&#039;]             = &#039;Wikipedia indefinitely move-protected pages&#039;,&lt;br /&gt;
	--[&#039;all|all|dispute|sysop|move&#039;]           = &#039;Wikipedia pages move-protected due to dispute&#039;,&lt;br /&gt;
	--[&#039;all|all|vandalism|sysop|move&#039;]         = &#039;Wikipedia pages move-protected due to vandalism&#039;,&lt;br /&gt;
	--[&#039;all|portal|all|sysop|move&#039;]            = &#039;Wikipedia move-protected portals&#039;,&lt;br /&gt;
	--[&#039;all|portal|all|sysop|move&#039;]            = &#039;Wikipedia move-protected portals&#039;,&lt;br /&gt;
	--[&#039;all|project|all|sysop|move&#039;]           = &#039;Wikipedia move-protected project pages&#039;,&lt;br /&gt;
	--[&#039;all|talk|all|sysop|move&#039;]              = &#039;Wikipedia move-protected talk pages&#039;,&lt;br /&gt;
	[&#039;all|template|all|sysop|move&#039;]          = &#039;移動保護中のテンプレート&#039;,&lt;br /&gt;
	--[&#039;all|user|all|sysop|move&#039;]              = &#039;Wikipedia move-protected user and user talk pages&#039;,&lt;br /&gt;
	--[&#039;all|all|all|autoconfirmed|autoreview&#039;] = &#039;Wikipedia pending changes protected pages&#039;,&lt;br /&gt;
	[&#039;all|file|all|all|upload&#039;]              = &#039;アップロード保護中のファイル&#039;,&lt;br /&gt;
	[&#039;all|file|all|extendedconfirmed|upload&#039;]= &#039;アップロード拡張半保護中のファイル&#039;,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Expiry category config&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table configures the expiry category behaviour for each protection&lt;br /&gt;
-- action.&lt;br /&gt;
-- * If set to true, setting that action will always categorise the page if&lt;br /&gt;
--   an expiry parameter is not set.&lt;br /&gt;
-- * If set to false, setting that action will never categorise the page.&lt;br /&gt;
-- * If set to nil, the module will categorise the page if:&lt;br /&gt;
--   1) an expiry parameter is not set, and&lt;br /&gt;
--   2) a reason is provided, and&lt;br /&gt;
--   3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck&lt;br /&gt;
--      table.&lt;br /&gt;
&lt;br /&gt;
expiryCheckActions = {&lt;br /&gt;
	edit = nil,&lt;br /&gt;
	move = false,&lt;br /&gt;
	autoreview = true,&lt;br /&gt;
	upload = false&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
reasonsWithoutExpiryCheck = {&lt;br /&gt;
	blp = true,&lt;br /&gt;
	template = true,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Pagetypes&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table produces the page types available with the ${PAGETYPE} parameter.&lt;br /&gt;
-- Keys are namespace numbers, or the string &amp;quot;default&amp;quot; for the default value.&lt;br /&gt;
pagetypes = {&lt;br /&gt;
	-- [0] = &#039;記事&#039;,&lt;br /&gt;
	[6] = &#039;ファイル&#039;,&lt;br /&gt;
	[10] = &#039;テンプレート&#039;,&lt;br /&gt;
	[14] = &#039;カテゴリ&#039;,&lt;br /&gt;
	[828] = &#039;モジュール&#039;,&lt;br /&gt;
	[1] = &#039;ノートページ&#039;,&lt;br /&gt;
	[3] = &#039;会話ページ&#039;,&lt;br /&gt;
	[5] = &#039;ノートページ&#039;,&lt;br /&gt;
	[7] = &#039;ノートページ&#039;,&lt;br /&gt;
	[9] = &#039;ノートページ&#039;,&lt;br /&gt;
	[11] = &#039;ノートページ&#039;,&lt;br /&gt;
	[13] = &#039;ノートページ&#039;,&lt;br /&gt;
	[15] = &#039;ノートページ&#039;,&lt;br /&gt;
	[101] = &#039;ノートページ&#039;,&lt;br /&gt;
	[103] = &#039;ノートページ&#039;,&lt;br /&gt;
	[829] = &#039;ノートページ&#039;,&lt;br /&gt;
	[2301] = &#039;ノートページ&#039;,&lt;br /&gt;
	[2303] = &#039;ノートページ&#039;,&lt;br /&gt;
	default = &#039;ページ&#039;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Strings marking indefinite protection&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table contains values passed to the expiry parameter that mean the page&lt;br /&gt;
-- is protected indefinitely.&lt;br /&gt;
indefStrings = {&lt;br /&gt;
	[&#039;indef&#039;] = true,&lt;br /&gt;
	[&#039;indefinite&#039;] = true,&lt;br /&gt;
	[&#039;indefinitely&#039;] = true,&lt;br /&gt;
	[&#039;infinite&#039;] = true,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Group hierarchy&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table maps each group to all groups that have a superset of the original&lt;br /&gt;
-- group&#039;s page editing permissions.&lt;br /&gt;
hierarchy = {&lt;br /&gt;
	sysop = {},&lt;br /&gt;
	eliminator = {&#039;sysop&#039;},&lt;br /&gt;
	reviewer = {&#039;sysop&#039;},&lt;br /&gt;
	filemover = {&#039;sysop&#039;},&lt;br /&gt;
	templateeditor = {&#039;sysop&#039;},&lt;br /&gt;
	extendedconfirmed = {&#039;sysop&#039;},&lt;br /&gt;
	autoconfirmed = {&#039;eliminator&#039;, &#039;reviewer&#039;, &#039;filemover&#039;, &#039;templateeditor&#039;, &#039;extendedconfirmed&#039;},&lt;br /&gt;
	user = {&#039;autoconfirmed&#039;},&lt;br /&gt;
	[&#039;*&#039;] = {&#039;user&#039;}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Wrapper templates and their default arguments&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table contains wrapper templates used with the module, and their&lt;br /&gt;
-- default arguments. Templates specified in this table should contain the&lt;br /&gt;
-- following invocation, and no other template content:&lt;br /&gt;
--&lt;br /&gt;
-- {{#invoke:Protection banner|main}}&lt;br /&gt;
--&lt;br /&gt;
-- If other content is desired, it can be added between&lt;br /&gt;
-- &amp;lt;noinclude&amp;gt;...&amp;lt;/noinclude&amp;gt; tags.&lt;br /&gt;
--&lt;br /&gt;
-- When a user calls one of these wrapper templates, they will use the&lt;br /&gt;
-- default arguments automatically. However, users can override any of the&lt;br /&gt;
-- arguments.&lt;br /&gt;
wrappers = {&lt;br /&gt;
	[&#039;Template:Pp&#039;]                         = {},&lt;br /&gt;
	[&#039;Template:Pp-extended&#039;]                = {&#039;ecp&#039;},&lt;br /&gt;
	[&#039;Template:Pp-blp&#039;]                     = {&#039;blp&#039;},&lt;br /&gt;
	-- we don&#039;t need Template:Pp-create&lt;br /&gt;
	[&#039;Template:Pp-dispute&#039;]                 = {&#039;dispute&#039;},&lt;br /&gt;
	[&#039;Template:Pp-main-page&#039;]               = {&#039;mainpage&#039;},&lt;br /&gt;
	[&#039;Template:Pp-move&#039;]                    = {action = &#039;move&#039;},&lt;br /&gt;
	[&#039;Template:Pp-move-dispute&#039;]            = {&#039;dispute&#039;, action = &#039;move&#039;},&lt;br /&gt;
	-- we don&#039;t need Template:Pp-move-indef&lt;br /&gt;
	[&#039;Template:Pp-move-vandalism&#039;]          = {&#039;vandalism&#039;, action = &#039;move&#039;},&lt;br /&gt;
	[&#039;Template:Pp-office&#039;]                  = {&#039;office&#039;},&lt;br /&gt;
	[&#039;Template:Pp-office-dmca&#039;]             = {&#039;dmca&#039;},&lt;br /&gt;
	[&#039;Template:Pp-pc&#039;]                      = {action = &#039;autoreview&#039;, small = true},&lt;br /&gt;
	[&#039;Template:Pp-pc1&#039;]                     = {action = &#039;autoreview&#039;, small = true},&lt;br /&gt;
	[&#039;Template:保護運用&#039;]                   = {&#039;permanent&#039;, small = true},&lt;br /&gt;
	[&#039;Template:Pp-reset&#039;]                   = {&#039;reset&#039;},&lt;br /&gt;
	[&#039;Template:Pp-semi-indef&#039;]              = {small = true},&lt;br /&gt;
	[&#039;Template:Pp-sock&#039;]                    = {&#039;sock&#039;},&lt;br /&gt;
	[&#039;Template:Pp-template&#039;]                = {&#039;template&#039;, small = true},&lt;br /&gt;
	[&#039;Template:Pp-upload&#039;]                  = {action = &#039;upload&#039;},&lt;br /&gt;
	[&#039;Template:Pp-usertalk&#039;]                = {&#039;usertalk&#039;},&lt;br /&gt;
	[&#039;Template:Pp-vandalism&#039;]               = {&#039;vandalism&#039;},&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- &lt;br /&gt;
--                                 MESSAGES&lt;br /&gt;
-- &lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
msg = {&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Intro blurb and intro fragment&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages specify what is produced by the ${INTROBLURB} and&lt;br /&gt;
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the&lt;br /&gt;
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use&lt;br /&gt;
-- intro-blurb-noexpiry or intro-fragment-noexpiry.&lt;br /&gt;
-- It is possible to use banner parameters in these messages.&lt;br /&gt;
[&#039;intro-blurb-expiry&#039;] = &#039;${PROTECTIONBLURB}（${EXPIRY}まで）。&#039;,&lt;br /&gt;
[&#039;intro-blurb-noexpiry&#039;] = &#039;${PROTECTIONBLURB}。&#039;,&lt;br /&gt;
[&#039;intro-fragment-expiry&#039;] = &#039;${PROTECTIONBLURB}（${EXPIRY}まで）。&#039;,&lt;br /&gt;
[&#039;intro-fragment-noexpiry&#039;] = &#039;${PROTECTIONBLURB}。&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Tooltip blurb&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.&lt;br /&gt;
-- If the protection is temporary the tooltip-blurb-expiry message is used, and&lt;br /&gt;
-- if not the tooltip-blurb-noexpiry message is used.&lt;br /&gt;
-- It is possible to use banner parameters in these messages.&lt;br /&gt;
[&#039;tooltip-blurb-expiry&#039;] = &#039;この${PAGETYPE}は${EXPIRY}まで${PROTECTIONLEVEL}されています。&#039;,&lt;br /&gt;
[&#039;tooltip-blurb-noexpiry&#039;] = &#039;この${PAGETYPE}は${PROTECTIONLEVEL}されています。&#039;,&lt;br /&gt;
[&#039;tooltip-fragment-expiry&#039;] = &#039;この${PAGETYPE}は${EXPIRY}まで${PROTECTIONLEVEL}されており、&#039;,&lt;br /&gt;
[&#039;tooltip-fragment-noexpiry&#039;] = &#039;この${PAGETYPE}は${PROTECTIONLEVEL}されており、&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Special explanation blurb&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages&lt;br /&gt;
-- in the MediaWiki namespace.&lt;br /&gt;
-- It is possible to use banner parameters in this message.&lt;br /&gt;
[&#039;explanation-blurb-nounprotect&#039;] = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
	.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
	.. &#039; Please discuss any changes on the ${TALKPAGE}; you&#039;&lt;br /&gt;
	.. &#039; may ${EDITREQUEST} to ask an&#039;&lt;br /&gt;
	.. &#039; [[Wikipedia:Administrators|administrator]] to make an edit if it&#039;&lt;br /&gt;
	.. &#039; is [[Help:Minor edit#When to mark an edit as a minor edit&#039;&lt;br /&gt;
	.. &#039;|uncontroversial]] or supported by [[Wikipedia:Consensus&#039;&lt;br /&gt;
	.. &#039;|consensus]].&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection log display values&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages determine the display values for the protection log link&lt;br /&gt;
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.&lt;br /&gt;
-- It is possible to use banner parameters in these messages.&lt;br /&gt;
[&#039;protection-log-display&#039;] = &#039;保護記録&#039;,&lt;br /&gt;
[&#039;pc-log-display&#039;] = &#039;pending changes log&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Current version display values&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages determine the display values for the page history link&lt;br /&gt;
-- or the move log link produced by the ${CURRENTVERSION} parameter.&lt;br /&gt;
-- It is possible to use banner parameters in these messages.&lt;br /&gt;
[&#039;current-version-move-display&#039;] = &#039;現在のページ名&#039;,&lt;br /&gt;
[&#039;current-version-edit-display&#039;] = &#039;現行版&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Talk page&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This message determines the display value of the talk page link produced&lt;br /&gt;
-- with the ${TALKPAGE} parameter.&lt;br /&gt;
-- It is possible to use banner parameters in this message.&lt;br /&gt;
[&#039;talk-page-link-display&#039;] = &#039;ノートページ&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Edit requests&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This message determines the display value of the edit request link produced&lt;br /&gt;
-- with the ${EDITREQUEST} parameter.&lt;br /&gt;
-- It is possible to use banner parameters in this message.&lt;br /&gt;
[&#039;edit-request-display&#039;] = &#039;submit an edit request&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Expiry date format&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This is the format for the blurb expiry date. It should be valid input for&lt;br /&gt;
-- the first parameter of the #time parser function.&lt;br /&gt;
[&#039;expiry-date-format&#039;] = &#039;Y年Fj日&amp;quot; (&amp;quot;D&amp;quot;) &amp;quot;H:i&amp;quot; (&amp;quot;e&amp;quot;)&amp;quot;&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Tracking categories&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages determine which tracking categories the module outputs.&lt;br /&gt;
[&#039;tracking-category-incorrect&#039;] = &#039;不適切な保護テンプレートのあるページ&#039;,&lt;br /&gt;
[&#039;tracking-category-mismatch&#039;] = &#039;保護理由と保護レベルが合致していないページ&#039;,	-- 日本語版独自&lt;br /&gt;
[&#039;tracking-category-template&#039;] = &#039;Wikipedia template-protected pages other than templates and modules&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Images&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These are images that are not defined by their protection action and protection level.&lt;br /&gt;
[&#039;image-filename-indef&#039;] = &#039;Edit Protection.svg&#039;,&lt;br /&gt;
[&#039;image-filename-default&#039;] = &#039;Transparent.gif&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- End messages&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- End configuration&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Effective_protection_expiry&amp;diff=6741</id>
		<title>モジュール:Effective protection expiry</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Effective_protection_expiry&amp;diff=6741"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Returns the expiry of a restriction of an action on a given title, or unknown if it cannot be known.&lt;br /&gt;
-- If no title is specified, the title of the page being displayed is used.&lt;br /&gt;
function p._main(action, pagename)&lt;br /&gt;
	local title&lt;br /&gt;
	if type(pagename) == &#039;table&#039; and pagename.prefixedText then&lt;br /&gt;
		title = pagename&lt;br /&gt;
	elseif pagename then&lt;br /&gt;
		title = mw.title.new(pagename)&lt;br /&gt;
	else&lt;br /&gt;
		title = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
	pagename = title.prefixedText&lt;br /&gt;
	if action == &#039;autoreview&#039; then&lt;br /&gt;
		local stabilitySettings = mw.ext.FlaggedRevs.getStabilitySettings(title)&lt;br /&gt;
		return stabilitySettings and stabilitySettings.expiry or &#039;unknown&#039;&lt;br /&gt;
	elseif action ~= &#039;edit&#039; and action ~= &#039;move&#039; and action ~= &#039;create&#039; and action ~= &#039;upload&#039; then&lt;br /&gt;
		error( &#039;第1引数にはedit、move、create、upload、autoreviewのどれかを指定してください&#039;, 2 )&lt;br /&gt;
	end&lt;br /&gt;
	local rawExpiry = mw.getCurrentFrame():callParserFunction(&#039;PROTECTIONEXPIRY&#039;, action, pagename)&lt;br /&gt;
	if rawExpiry == &#039;infinity&#039; then&lt;br /&gt;
		return &#039;infinity&#039;&lt;br /&gt;
	elseif rawExpiry == &#039;&#039; then&lt;br /&gt;
		return &#039;unknown&#039;&lt;br /&gt;
	else&lt;br /&gt;
		local year, month, day, hour, minute, second = rawExpiry:match(&lt;br /&gt;
			&#039;^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$&#039;&lt;br /&gt;
		)&lt;br /&gt;
		if year then&lt;br /&gt;
			return string.format(&lt;br /&gt;
				&#039;%s-%s-%sT%s:%s:%s&#039;,&lt;br /&gt;
				year, month, day, hour, minute, second&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			error(&#039;[[モジュール:Effective protection expiry]]のエラー; 有効期限のタイムスタンプの書式が不正です&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
setmetatable(p, { __index = function(t, k)&lt;br /&gt;
	return function(frame)&lt;br /&gt;
		return t._main(k, frame.args[1])&lt;br /&gt;
	end&lt;br /&gt;
end })&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Effective_protection_level&amp;diff=6739</id>
		<title>モジュール:Effective protection level</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Effective_protection_level&amp;diff=6739"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Returns the permission required to perform a given action on a given title.&lt;br /&gt;
-- If no title is specified, the title of the page being displayed is used.&lt;br /&gt;
function p._main(action, pagename)&lt;br /&gt;
	local title&lt;br /&gt;
	if type(pagename) == &#039;table&#039; and pagename.prefixedText then&lt;br /&gt;
		title = pagename&lt;br /&gt;
	elseif pagename then&lt;br /&gt;
		title = mw.title.new(pagename)&lt;br /&gt;
	else&lt;br /&gt;
		title = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
	pagename = title.prefixedText&lt;br /&gt;
	if action == &#039;autoreview&#039; then&lt;br /&gt;
		local level = mw.ext.FlaggedRevs.getStabilitySettings(title)&lt;br /&gt;
		level = level and level.autoreview&lt;br /&gt;
		if level == &#039;review&#039; then&lt;br /&gt;
			return &#039;reviewer&#039;&lt;br /&gt;
		elseif level ~= &#039;&#039; then&lt;br /&gt;
			return level&lt;br /&gt;
		else&lt;br /&gt;
			return nil -- not &#039;*&#039;. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not &#039;&#039;, as that would mean PC-protected but nobody can review&lt;br /&gt;
		end&lt;br /&gt;
	elseif action ~= &#039;edit&#039; and action ~= &#039;move&#039; and action ~= &#039;create&#039; and action ~= &#039;upload&#039; and action ~= &#039;undelete&#039; then&lt;br /&gt;
		error( &#039;第1引数にはedit、move、create、upload、undelete、autoreviewのどれかを指定してください&#039;, 2 )&lt;br /&gt;
	end&lt;br /&gt;
	if title.namespace == 8 then -- MediaWiki namespace&lt;br /&gt;
		if title.text:sub(-3) == &#039;.js&#039; or title.text:sub(-4) == &#039;.css&#039; or title.contentModel == &#039;javascript&#039; or title.contentModel == &#039;css&#039; then -- site JS or CSS page&lt;br /&gt;
			return &#039;interfaceadmin&#039;&lt;br /&gt;
		else -- any non-JS/CSS MediaWiki page&lt;br /&gt;
			return &#039;sysop&#039;&lt;br /&gt;
		end&lt;br /&gt;
	elseif title.namespace == 2 and title.isSubpage then&lt;br /&gt;
		if title.contentModel == &#039;javascript&#039; or title.contentModel == &#039;css&#039; then -- user JS or CSS page&lt;br /&gt;
			return &#039;interfaceadmin&#039;&lt;br /&gt;
		elseif title.contentModel == &#039;json&#039; then -- user JSON page&lt;br /&gt;
			return &#039;sysop&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if action == &#039;undelete&#039; then&lt;br /&gt;
		return &#039;eliminator&#039; -- 英語版では&#039;sysop&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local level = title.protectionLevels[action] and title.protectionLevels[action][1]&lt;br /&gt;
	if level == &#039;sysop&#039; or level == &#039;editprotected&#039; then&lt;br /&gt;
		return &#039;sysop&#039;&lt;br /&gt;
	elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page&lt;br /&gt;
		return &#039;sysop&#039;&lt;br /&gt;
	elseif level == &#039;templateeditor&#039; then&lt;br /&gt;
		return &#039;templateeditor&#039;&lt;br /&gt;
	elseif action == &#039;move&#039; then&lt;br /&gt;
		local blacklistentry = mw.ext.TitleBlacklist.test(&#039;edit&#039;, pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.&lt;br /&gt;
		if blacklistentry and not blacklistentry.params.autoconfirmed then&lt;br /&gt;
			return &#039;templateeditor&#039;&lt;br /&gt;
		elseif title.namespace == 6 then&lt;br /&gt;
			return &#039;eliminator&#039; -- 英語版では&#039;filemover&#039;&lt;br /&gt;
		elseif level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
			return &#039;extendedconfirmed&#039;&lt;br /&gt;
		else&lt;br /&gt;
			return &#039;autoconfirmed&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)&lt;br /&gt;
	if blacklistentry then&lt;br /&gt;
		if not blacklistentry.params.autoconfirmed then&lt;br /&gt;
			return &#039;sysop&#039; -- 英語版では&#039;templateeditor&#039;&lt;br /&gt;
		elseif level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
			return &#039;extendedconfirmed&#039;&lt;br /&gt;
		else&lt;br /&gt;
			return &#039;autoconfirmed&#039;&lt;br /&gt;
		end&lt;br /&gt;
	elseif level == &#039;editsemiprotected&#039; then -- create-semiprotected pages return this for some reason&lt;br /&gt;
		return &#039;autoconfirmed&#039;&lt;br /&gt;
	elseif level then&lt;br /&gt;
		return level&lt;br /&gt;
	elseif action == &#039;upload&#039; then&lt;br /&gt;
		return &#039;autoconfirmed&#039;&lt;br /&gt;
	-- 英語版とは異なり、日本語版では現在のところIPユーザーでも記事等を作成可能なので、以下はコメントアウト&lt;br /&gt;
	-- elseif action == &#039;create&#039; and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts&lt;br /&gt;
	-- return &#039;user&#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;*&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
setmetatable(p, { __index = function(t, k)&lt;br /&gt;
	return function(frame)&lt;br /&gt;
		return t._main(k, frame.args[1])&lt;br /&gt;
	end&lt;br /&gt;
end })&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:File_link&amp;diff=6737</id>
		<title>モジュール:File link</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:File_link&amp;diff=6737"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides a library for formatting file wikilinks.&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	checkType(&#039;_main&#039;, 1, args, &#039;table&#039;)&lt;br /&gt;
&lt;br /&gt;
	-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our&lt;br /&gt;
	-- own function to get the right error level.&lt;br /&gt;
	local function checkArg(key, val, level)&lt;br /&gt;
		if type(val) ~= &#039;string&#039; then&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&amp;quot;&#039;_main&#039;関数における&#039;%s&#039;引数のタイプエラー（想定：文字列、実際：%s）&amp;quot;,&lt;br /&gt;
				key, type(val)&lt;br /&gt;
			), level)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret = {}&lt;br /&gt;
&lt;br /&gt;
	-- Adds a positional parameter to the buffer.&lt;br /&gt;
	local function addPositional(key)&lt;br /&gt;
		local val = args[key]&lt;br /&gt;
		if not val then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		checkArg(key, val, 4)&lt;br /&gt;
		ret[#ret + 1] = val&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Adds a named parameter to the buffer. We assume that the parameter name&lt;br /&gt;
	-- is the same as the argument key.&lt;br /&gt;
	local function addNamed(key)&lt;br /&gt;
		local val = args[key]&lt;br /&gt;
		if not val then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		checkArg(key, val, 4)&lt;br /&gt;
		ret[#ret + 1] = key .. &#039;=&#039; .. val&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Filename&lt;br /&gt;
	checkArg(&#039;file&#039;, args.file, 3)&lt;br /&gt;
	ret[#ret + 1] = &#039;File:&#039; .. args.file&lt;br /&gt;
&lt;br /&gt;
	-- Format&lt;br /&gt;
	if args.format then&lt;br /&gt;
		checkArg(&#039;format&#039;, args.format)&lt;br /&gt;
		if args.formatfile then&lt;br /&gt;
			checkArg(&#039;formatfile&#039;, args.formatfile)&lt;br /&gt;
			ret[#ret + 1] = args.format .. &#039;=&#039; .. args.formatfile&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = args.format&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Border&lt;br /&gt;
	if yesno(args.border) then&lt;br /&gt;
		ret[#ret + 1] = &#039;border&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	addPositional(&#039;location&#039;)&lt;br /&gt;
	addPositional(&#039;alignment&#039;)&lt;br /&gt;
	addPositional(&#039;size&#039;)&lt;br /&gt;
	addNamed(&#039;upright&#039;)&lt;br /&gt;
	addNamed(&#039;link&#039;)&lt;br /&gt;
	addNamed(&#039;alt&#039;)&lt;br /&gt;
	addNamed(&#039;page&#039;)&lt;br /&gt;
	addNamed(&#039;class&#039;)&lt;br /&gt;
	addNamed(&#039;lang&#039;)&lt;br /&gt;
	addNamed(&#039;start&#039;)&lt;br /&gt;
	addNamed(&#039;end&#039;)&lt;br /&gt;
	addNamed(&#039;thumbtime&#039;)&lt;br /&gt;
	addPositional(&#039;caption&#039;)&lt;br /&gt;
&lt;br /&gt;
	return string.format(&#039;[[%s]]&#039;, table.concat(ret, &#039;|&#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local origArgs = require(&#039;Module:Arguments&#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = &#039;Template:File link&#039;&lt;br /&gt;
	})&lt;br /&gt;
	if not origArgs.file then&lt;br /&gt;
		error(&amp;quot;[[Template:File link]]のエラー: &#039;file&#039;引数が未入力です&amp;quot;, 0)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Copy the arguments that were passed to a new table to avoid looking up&lt;br /&gt;
	-- every possible parameter in the frame object.&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for k, v in pairs(origArgs) do&lt;br /&gt;
		-- Make _BLANK a special argument to add a blank parameter. For use in&lt;br /&gt;
		-- conditional templates etc. it is useful for blank arguments to be&lt;br /&gt;
		-- ignored, but we still need a way to specify them so that we can do&lt;br /&gt;
		-- things like [[File:Example.png|link=]].&lt;br /&gt;
		if v == &#039;_BLANK&#039; then&lt;br /&gt;
			v = &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Protection_banner&amp;diff=6735</id>
		<title>モジュール:Protection banner</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Protection_banner&amp;diff=6735"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements {{pp-meta}} and its daughter templates such as&lt;br /&gt;
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.&lt;br /&gt;
&lt;br /&gt;
-- Initialise necessary modules.&lt;br /&gt;
require(&#039;strict&#039;)&lt;br /&gt;
local makeFileLink = require(&#039;Module:File link&#039;)._main&lt;br /&gt;
local effectiveProtectionLevel = require(&#039;Module:Effective protection level&#039;)._main&lt;br /&gt;
local effectiveProtectionExpiry = require(&#039;Module:Effective protection expiry&#039;)._main&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily initialise modules and objects we don&#039;t always need.&lt;br /&gt;
local getArgs, makeMessageBox, lang&lt;br /&gt;
&lt;br /&gt;
-- Set constants.&lt;br /&gt;
local CONFIG_MODULE = &#039;モジュール:Protection banner/config&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(cat, sort)&lt;br /&gt;
	if cat then&lt;br /&gt;
		return string.format(&lt;br /&gt;
			&#039;[[%s:%s|%s]]&#039;,&lt;br /&gt;
			mw.site.namespaces[14].name,&lt;br /&gt;
			cat,&lt;br /&gt;
			sort&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Validation function for the expiry and the protection date&lt;br /&gt;
local function validateDate(dateString, dateType)&lt;br /&gt;
	if not lang then&lt;br /&gt;
		lang = mw.language.getContentLanguage()&lt;br /&gt;
	end&lt;br /&gt;
	local success, result = pcall(lang.formatDate, lang, &#039;U&#039;, dateString)&lt;br /&gt;
	if success then&lt;br /&gt;
		result = tonumber(result)&lt;br /&gt;
		if result then&lt;br /&gt;
			return result&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	error(string.format(&lt;br /&gt;
		&#039;invalid %s: %s&#039;,&lt;br /&gt;
		dateType,&lt;br /&gt;
		tostring(dateString)&lt;br /&gt;
	), 4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeFullUrl(page, query, display)&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&#039;[%s %s]&#039;,&lt;br /&gt;
		tostring(mw.uri.fullUrl(page, query)),&lt;br /&gt;
		display&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given a directed graph formatted as node -&amp;gt; table of direct successors,&lt;br /&gt;
-- get a table of all nodes reachable from a given node (though always&lt;br /&gt;
-- including the given node).&lt;br /&gt;
local function getReachableNodes(graph, start)&lt;br /&gt;
	local toWalk, retval = {[start] = true}, {}&lt;br /&gt;
	while true do&lt;br /&gt;
		-- Can&#039;t use pairs() since we&#039;re adding and removing things as we&#039;re iterating&lt;br /&gt;
		local k = next(toWalk) -- This always gets the &amp;quot;first&amp;quot; key&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return retval&lt;br /&gt;
		end&lt;br /&gt;
		toWalk[k] = nil&lt;br /&gt;
		retval[k] = true&lt;br /&gt;
		for _,v in ipairs(graph[k]) do&lt;br /&gt;
			if not retval[v] then&lt;br /&gt;
				toWalk[v] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Protection = {}&lt;br /&gt;
Protection.__index = Protection&lt;br /&gt;
&lt;br /&gt;
Protection.supportedActions = {&lt;br /&gt;
	edit = true,&lt;br /&gt;
	move = true,&lt;br /&gt;
	autoreview = true,&lt;br /&gt;
	upload = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Protection.bannerConfigFields = {&lt;br /&gt;
	&#039;text&#039;,&lt;br /&gt;
	&#039;explanation&#039;,&lt;br /&gt;
	&#039;tooltip&#039;,&lt;br /&gt;
	&#039;alt&#039;,&lt;br /&gt;
	&#039;link&#039;,&lt;br /&gt;
	&#039;image&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Protection.new(args, cfg, title)&lt;br /&gt;
	local obj = {}&lt;br /&gt;
	obj._cfg = cfg&lt;br /&gt;
	obj.title = title or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set action&lt;br /&gt;
	if not args.action then&lt;br /&gt;
		obj.action = &#039;edit&#039;&lt;br /&gt;
	elseif Protection.supportedActions[args.action] then&lt;br /&gt;
		obj.action = args.action&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;invalid action: %s&#039;,&lt;br /&gt;
			tostring(args.action)&lt;br /&gt;
		), 3)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set level&lt;br /&gt;
	obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)&lt;br /&gt;
	if not obj.level or (obj.action == &#039;move&#039; and obj.level == &#039;autoconfirmed&#039;) then&lt;br /&gt;
		-- Users need to be autoconfirmed to move pages anyway, so treat&lt;br /&gt;
		-- semi-move-protected pages as unprotected.&lt;br /&gt;
		obj.level = &#039;*&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set expiry&lt;br /&gt;
	local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)&lt;br /&gt;
	if effectiveExpiry == &#039;infinity&#039; then&lt;br /&gt;
		obj.expiry = &#039;indef&#039;&lt;br /&gt;
	elseif effectiveExpiry ~= &#039;unknown&#039; then&lt;br /&gt;
		obj.expiry = validateDate(effectiveExpiry, &#039;expiry date&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set reason&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		obj.reason = mw.ustring.lower(args[1])&lt;br /&gt;
		if obj.reason:find(&#039;|&#039;) then&lt;br /&gt;
			error(&#039;reasons cannot contain the pipe character (&amp;quot;|&amp;quot;)&#039;, 3)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set protection date&lt;br /&gt;
	if args.date then&lt;br /&gt;
		obj.protectionDate = validateDate(args.date, &#039;protection date&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Set banner config&lt;br /&gt;
	do&lt;br /&gt;
		obj.bannerConfig = {}&lt;br /&gt;
		local configTables = {}&lt;br /&gt;
		if cfg.banners[obj.action] then&lt;br /&gt;
			configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]&lt;br /&gt;
		end&lt;br /&gt;
		if cfg.defaultBanners[obj.action] then&lt;br /&gt;
			configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]&lt;br /&gt;
			configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default&lt;br /&gt;
		end&lt;br /&gt;
		configTables[#configTables + 1] = cfg.masterBanner&lt;br /&gt;
		for i, field in ipairs(Protection.bannerConfigFields) do&lt;br /&gt;
			for j, t in ipairs(configTables) do&lt;br /&gt;
				if t[field] then&lt;br /&gt;
					obj.bannerConfig[field] = t[field]&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return setmetatable(obj, Protection)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isProtected()&lt;br /&gt;
	return self.level ~= &#039;*&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isTemporary()&lt;br /&gt;
	return type(self.expiry) == &#039;number&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:makeProtectionCategory()&lt;br /&gt;
	local cfg = self._cfg&lt;br /&gt;
	local title = self.title&lt;br /&gt;
	&lt;br /&gt;
	-- Exit if the page is not protected.&lt;br /&gt;
	if not self:isProtected() then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Get the expiry key fragment.&lt;br /&gt;
	local expiryFragment&lt;br /&gt;
	if self.expiry == &#039;indef&#039; then&lt;br /&gt;
		expiryFragment = self.expiry&lt;br /&gt;
	elseif type(self.expiry) == &#039;number&#039; then&lt;br /&gt;
		expiryFragment = &#039;temp&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the namespace key fragment.&lt;br /&gt;
	local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]&lt;br /&gt;
	if not namespaceFragment and title.namespace % 2 == 1 then&lt;br /&gt;
			namespaceFragment = &#039;talk&#039;&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	-- Define the order that key fragments are tested in. This is done with an&lt;br /&gt;
	-- array of tables containing the value to be tested, along with its&lt;br /&gt;
	-- position in the cfg.protectionCategories table.&lt;br /&gt;
	local order = {&lt;br /&gt;
		{val = expiryFragment,    keypos = 1},&lt;br /&gt;
		{val = namespaceFragment, keypos = 2},&lt;br /&gt;
		{val = self.reason,       keypos = 3},&lt;br /&gt;
		{val = self.level,        keypos = 4},&lt;br /&gt;
		{val = self.action,       keypos = 5}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- The old protection templates used an ad-hoc protection category system,&lt;br /&gt;
	-- with some templates prioritising namespaces in their categories, and&lt;br /&gt;
	-- others prioritising the protection reason. To emulate this in this module&lt;br /&gt;
	-- we use the config table cfg.reasonsWithNamespacePriority to set the&lt;br /&gt;
	-- reasons for which namespaces have priority over protection reason.&lt;br /&gt;
	-- If we are dealing with one of those reasons, move the namespace table to&lt;br /&gt;
	-- the end of the order table, i.e. give it highest priority. If not, the&lt;br /&gt;
	-- reason should have highest priority, so move that to the end of the table&lt;br /&gt;
	-- instead.&lt;br /&gt;
	--]]&lt;br /&gt;
	table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))&lt;br /&gt;
 &lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define the attempt order. Inactive subtables (subtables with nil &amp;quot;value&amp;quot;&lt;br /&gt;
	-- fields) are moved to the end, where they will later be given the key&lt;br /&gt;
	-- &amp;quot;all&amp;quot;. This is to cut down on the number of table lookups in&lt;br /&gt;
	-- cfg.protectionCategories, which grows exponentially with the number of&lt;br /&gt;
	-- non-nil keys. We keep track of the number of active subtables with the&lt;br /&gt;
	-- noActive parameter.&lt;br /&gt;
	--]]&lt;br /&gt;
	local noActive, attemptOrder&lt;br /&gt;
	do&lt;br /&gt;
		local active, inactive = {}, {}&lt;br /&gt;
		for i, t in ipairs(order) do&lt;br /&gt;
			if t.val then&lt;br /&gt;
				active[#active + 1] = t&lt;br /&gt;
			else&lt;br /&gt;
				inactive[#inactive + 1] = t&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		noActive = #active&lt;br /&gt;
		attemptOrder = active&lt;br /&gt;
		for i, t in ipairs(inactive) do&lt;br /&gt;
			attemptOrder[#attemptOrder + 1] = t&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	--[[&lt;br /&gt;
	-- Check increasingly generic key combinations until we find a match. If a&lt;br /&gt;
	-- specific category exists for the combination of key fragments we are&lt;br /&gt;
	-- given, that match will be found first. If not, we keep trying different&lt;br /&gt;
	-- key fragment combinations until we match using the key&lt;br /&gt;
	-- &amp;quot;all-all-all-all-all&amp;quot;.&lt;br /&gt;
	--&lt;br /&gt;
	-- To generate the keys, we index the key subtables using a binary matrix&lt;br /&gt;
	-- with indexes i and j. j is only calculated up to the number of active&lt;br /&gt;
	-- subtables. For example, if there were three active subtables, the matrix&lt;br /&gt;
	-- would look like this, with 0 corresponding to the key fragment &amp;quot;all&amp;quot;, and&lt;br /&gt;
	-- 1 corresponding to other key fragments.&lt;br /&gt;
	-- &lt;br /&gt;
	--   j 1  2  3&lt;br /&gt;
	-- i  &lt;br /&gt;
	-- 1   1  1  1&lt;br /&gt;
	-- 2   0  1  1&lt;br /&gt;
	-- 3   1  0  1&lt;br /&gt;
	-- 4   0  0  1&lt;br /&gt;
	-- 5   1  1  0&lt;br /&gt;
	-- 6   0  1  0&lt;br /&gt;
	-- 7   1  0  0&lt;br /&gt;
	-- 8   0  0  0&lt;br /&gt;
	-- &lt;br /&gt;
	-- Values of j higher than the number of active subtables are set&lt;br /&gt;
	-- to the string &amp;quot;all&amp;quot;.&lt;br /&gt;
	--&lt;br /&gt;
	-- A key for cfg.protectionCategories is constructed for each value of i.&lt;br /&gt;
	-- The position of the value in the key is determined by the keypos field in&lt;br /&gt;
	-- each subtable.&lt;br /&gt;
	--]]&lt;br /&gt;
	local cats = cfg.protectionCategories&lt;br /&gt;
	for i = 1, 2^noActive do&lt;br /&gt;
		local key = {}&lt;br /&gt;
		for j, t in ipairs(attemptOrder) do&lt;br /&gt;
			if j &amp;gt; noActive then&lt;br /&gt;
				key[t.keypos] = &#039;all&#039;&lt;br /&gt;
			else&lt;br /&gt;
				local quotient = i / 2 ^ (j - 1)&lt;br /&gt;
				quotient = math.ceil(quotient)&lt;br /&gt;
				if quotient % 2 == 1 then&lt;br /&gt;
					key[t.keypos] = t.val&lt;br /&gt;
				else&lt;br /&gt;
					key[t.keypos] = &#039;all&#039;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		key = table.concat(key, &#039;|&#039;)&lt;br /&gt;
		local attempt = cats[key]&lt;br /&gt;
		if attempt then&lt;br /&gt;
			return makeCategoryLink(attempt, title.text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isIncorrect()&lt;br /&gt;
	local expiry = self.expiry&lt;br /&gt;
	return not self:isProtected()&lt;br /&gt;
		or type(expiry) == &#039;number&#039; and expiry &amp;lt; os.time()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 日本語版独自&lt;br /&gt;
function Protection:isMismatched()&lt;br /&gt;
	return self.reason == &#039;dispute&#039; and self.level ~= &#039;sysop&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isTemplateProtectedNonTemplate()&lt;br /&gt;
	local action, namespace = self.action, self.title.namespace&lt;br /&gt;
	return self.level == &#039;templateeditor&#039;&lt;br /&gt;
		and (&lt;br /&gt;
			(action ~= &#039;edit&#039; and action ~= &#039;move&#039;)&lt;br /&gt;
			or (namespace ~= 10 and namespace ~= 828)&lt;br /&gt;
		)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:makeCategoryLinks()&lt;br /&gt;
	local msg = self._cfg.msg&lt;br /&gt;
	local ret = { self:makeProtectionCategory() }&lt;br /&gt;
	if self:isIncorrect() then&lt;br /&gt;
		ret[#ret + 1] = makeCategoryLink(&lt;br /&gt;
			msg[&#039;tracking-category-incorrect&#039;],&lt;br /&gt;
			self.title.text&lt;br /&gt;
		)&lt;br /&gt;
	elseif self:isMismatched() then&lt;br /&gt;
		ret[#ret + 1] = makeCategoryLink(&lt;br /&gt;
			msg[&#039;tracking-category-mismatch&#039;],&lt;br /&gt;
			self.title.text&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	if self:isTemplateProtectedNonTemplate() then&lt;br /&gt;
		ret[#ret + 1] = makeCategoryLink(&lt;br /&gt;
			msg[&#039;tracking-category-template&#039;],&lt;br /&gt;
			self.title.text&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Blurb class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Blurb = {}&lt;br /&gt;
Blurb.__index = Blurb&lt;br /&gt;
&lt;br /&gt;
Blurb.bannerTextFields = {&lt;br /&gt;
	text = true,&lt;br /&gt;
	explanation = true,&lt;br /&gt;
	tooltip = true,&lt;br /&gt;
	alt = true,&lt;br /&gt;
	link = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Blurb.new(protectionObj, args, cfg)&lt;br /&gt;
	return setmetatable({&lt;br /&gt;
		_cfg = cfg,&lt;br /&gt;
		_protectionObj = protectionObj,&lt;br /&gt;
		_args = args&lt;br /&gt;
	}, Blurb)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Private methods --&lt;br /&gt;
&lt;br /&gt;
function Blurb:_formatDate(num)&lt;br /&gt;
	-- Formats a Unix timestamp into dd Month, YYYY format.&lt;br /&gt;
	lang = lang or mw.language.getContentLanguage()&lt;br /&gt;
	local success, date = pcall(&lt;br /&gt;
		lang.formatDate,&lt;br /&gt;
		lang,&lt;br /&gt;
		self._cfg.msg[&#039;expiry-date-format&#039;] or &#039;j F Y&#039;,&lt;br /&gt;
		&#039;@&#039; .. tostring(num)&lt;br /&gt;
	)&lt;br /&gt;
	if success then&lt;br /&gt;
		return date&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_getExpandedMessage(msgKey)&lt;br /&gt;
	return self:_substituteParameters(self._cfg.msg[msgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_substituteParameters(msg)&lt;br /&gt;
	if not self._params then&lt;br /&gt;
		local parameterFuncs = {}&lt;br /&gt;
&lt;br /&gt;
		parameterFuncs.CURRENTVERSION     = self._makeCurrentVersionParameter&lt;br /&gt;
		parameterFuncs.EDITREQUEST        = self._makeEditRequestParameter&lt;br /&gt;
		parameterFuncs.EXPIRY             = self._makeExpiryParameter&lt;br /&gt;
		parameterFuncs.EXPLANATIONBLURB   = self._makeExplanationBlurbParameter&lt;br /&gt;
		parameterFuncs.IMAGELINK          = self._makeImageLinkParameter&lt;br /&gt;
		parameterFuncs.INTROBLURB         = self._makeIntroBlurbParameter&lt;br /&gt;
		parameterFuncs.INTROFRAGMENT      = self._makeIntroFragmentParameter&lt;br /&gt;
		parameterFuncs.PAGETYPE           = self._makePagetypeParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONBLURB    = self._makeProtectionBlurbParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONDATE     = self._makeProtectionDateParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONLEVEL    = self._makeProtectionLevelParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONLOG      = self._makeProtectionLogParameter&lt;br /&gt;
		parameterFuncs.TALKPAGE           = self._makeTalkPageParameter&lt;br /&gt;
		parameterFuncs.TOOLTIPBLURB       = self._makeTooltipBlurbParameter&lt;br /&gt;
		parameterFuncs.TOOLTIPFRAGMENT    = self._makeTooltipFragmentParameter&lt;br /&gt;
		parameterFuncs.VANDAL             = self._makeVandalTemplateParameter&lt;br /&gt;
		&lt;br /&gt;
		self._params = setmetatable({}, {&lt;br /&gt;
			__index = function (t, k)&lt;br /&gt;
				local param&lt;br /&gt;
				if parameterFuncs[k] then&lt;br /&gt;
					param = parameterFuncs[k](self)&lt;br /&gt;
				end&lt;br /&gt;
				param = param or &#039;&#039;&lt;br /&gt;
				t[k] = param&lt;br /&gt;
				return param&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	msg = msg:gsub(&#039;${(%u+)}&#039;, self._params)&lt;br /&gt;
	return msg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeCurrentVersionParameter()&lt;br /&gt;
	-- A link to the page history or the move log, depending on the kind of&lt;br /&gt;
	-- protection.&lt;br /&gt;
	local pagename = self._protectionObj.title.prefixedText&lt;br /&gt;
	if self._protectionObj.action == &#039;move&#039; then&lt;br /&gt;
		-- We need the move log link.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&#039;Special:Log&#039;,&lt;br /&gt;
			{type = &#039;move&#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&#039;current-version-move-display&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		-- We need the history link.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			pagename,&lt;br /&gt;
			{action = &#039;history&#039;},&lt;br /&gt;
			self:_getExpandedMessage(&#039;current-version-edit-display&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeEditRequestParameter()&lt;br /&gt;
	local mEditRequest = require(&#039;Module:Submit an edit request&#039;)&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	&lt;br /&gt;
	-- Get the edit request type.&lt;br /&gt;
	local requestType&lt;br /&gt;
	if action == &#039;edit&#039; then&lt;br /&gt;
		if level == &#039;autoconfirmed&#039; then&lt;br /&gt;
			requestType = &#039;semi&#039;&lt;br /&gt;
		elseif level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
			requestType = &#039;extended&#039;&lt;br /&gt;
		elseif level == &#039;templateeditor&#039; then&lt;br /&gt;
			requestType = &#039;template&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	requestType = requestType or &#039;full&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- Get the display value.&lt;br /&gt;
	local display = self:_getExpandedMessage(&#039;edit-request-display&#039;)&lt;br /&gt;
&lt;br /&gt;
	return mEditRequest._link{type = requestType, display = display}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeExpiryParameter()&lt;br /&gt;
	local expiry = self._protectionObj.expiry&lt;br /&gt;
	if type(expiry) == &#039;number&#039; then&lt;br /&gt;
		return self:_formatDate(expiry)&lt;br /&gt;
	else&lt;br /&gt;
		return expiry&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeExplanationBlurbParameter()&lt;br /&gt;
	-- Cover special cases first.&lt;br /&gt;
	if self._protectionObj.title.namespace == 8 then&lt;br /&gt;
		-- MediaWiki namespace&lt;br /&gt;
		return self:_getExpandedMessage(&#039;explanation-blurb-nounprotect&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get explanation blurb table keys&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local talkKey = self._protectionObj.title.isTalkPage and &#039;talk&#039; or &#039;subject&#039;&lt;br /&gt;
&lt;br /&gt;
	-- Find the message in the explanation blurb table and substitute any&lt;br /&gt;
	-- parameters.&lt;br /&gt;
	local explanations = self._cfg.explanationBlurbs&lt;br /&gt;
	local msg&lt;br /&gt;
	if explanations[action][level] and explanations[action][level][talkKey] then&lt;br /&gt;
		msg = explanations[action][level][talkKey]&lt;br /&gt;
	elseif explanations[action][level] and explanations[action][level].default then&lt;br /&gt;
		msg = explanations[action][level].default&lt;br /&gt;
	elseif explanations[action].default and explanations[action].default[talkKey] then&lt;br /&gt;
		msg = explanations[action].default[talkKey]&lt;br /&gt;
	elseif explanations[action].default and explanations[action].default.default then&lt;br /&gt;
		msg = explanations[action].default.default&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;could not find explanation blurb for action &amp;quot;%s&amp;quot;, level &amp;quot;%s&amp;quot; and talk key &amp;quot;%s&amp;quot;&#039;,&lt;br /&gt;
			action,&lt;br /&gt;
			level,&lt;br /&gt;
			talkKey&lt;br /&gt;
		), 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeImageLinkParameter()&lt;br /&gt;
	local imageLinks = self._cfg.imageLinks&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if imageLinks[action][level] then&lt;br /&gt;
		msg = imageLinks[action][level]&lt;br /&gt;
	elseif imageLinks[action].default then&lt;br /&gt;
		msg = imageLinks[action].default&lt;br /&gt;
	else&lt;br /&gt;
		msg = imageLinks.edit.default&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeIntroBlurbParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&#039;intro-blurb-expiry&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&#039;intro-blurb-noexpiry&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeIntroFragmentParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&#039;intro-fragment-expiry&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&#039;intro-fragment-noexpiry&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makePagetypeParameter()&lt;br /&gt;
	local pagetypes = self._cfg.pagetypes&lt;br /&gt;
	return pagetypes[self._protectionObj.title.namespace]&lt;br /&gt;
		or pagetypes.default&lt;br /&gt;
		or error(&#039;no default pagetype defined&#039;, 8)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionBlurbParameter()&lt;br /&gt;
	local protectionBlurbs = self._cfg.protectionBlurbs&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if protectionBlurbs[action][level] then&lt;br /&gt;
		msg = protectionBlurbs[action][level]&lt;br /&gt;
	elseif protectionBlurbs[action].default then&lt;br /&gt;
		msg = protectionBlurbs[action].default&lt;br /&gt;
	elseif protectionBlurbs.edit.default then&lt;br /&gt;
		msg = protectionBlurbs.edit.default&lt;br /&gt;
	else&lt;br /&gt;
		error(&#039;no protection blurb defined for protectionBlurbs.edit.default&#039;, 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionDateParameter()&lt;br /&gt;
	local protectionDate = self._protectionObj.protectionDate&lt;br /&gt;
	if type(protectionDate) == &#039;number&#039; then&lt;br /&gt;
		return self:_formatDate(protectionDate)&lt;br /&gt;
	else&lt;br /&gt;
		return protectionDate&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionLevelParameter()&lt;br /&gt;
	local protectionLevels = self._cfg.protectionLevels&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if protectionLevels[action][level] then&lt;br /&gt;
		msg = protectionLevels[action][level]&lt;br /&gt;
	elseif protectionLevels[action].default then&lt;br /&gt;
		msg = protectionLevels[action].default&lt;br /&gt;
	elseif protectionLevels.edit.default then&lt;br /&gt;
		msg = protectionLevels.edit.default&lt;br /&gt;
	else&lt;br /&gt;
		error(&#039;no protection level defined for protectionLevels.edit.default&#039;, 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionLogParameter()&lt;br /&gt;
	local pagename = self._protectionObj.title.prefixedText&lt;br /&gt;
	if self._protectionObj.action == &#039;autoreview&#039; then&lt;br /&gt;
		-- We need the pending changes log.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&#039;Special:Log&#039;,&lt;br /&gt;
			{type = &#039;stable&#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&#039;pc-log-display&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		-- We need the protection log.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&#039;Special:Log&#039;,&lt;br /&gt;
			{type = &#039;protect&#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&#039;protection-log-display&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTalkPageParameter()&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&#039;[[%s:%s#%s|%s]]&#039;,&lt;br /&gt;
		mw.site.namespaces[self._protectionObj.title.namespace].talk.name,&lt;br /&gt;
		self._protectionObj.title.text,&lt;br /&gt;
		self._args.section or &#039;top&#039;,&lt;br /&gt;
		self:_getExpandedMessage(&#039;talk-page-link-display&#039;)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTooltipBlurbParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&#039;tooltip-blurb-expiry&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&#039;tooltip-blurb-noexpiry&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTooltipFragmentParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&#039;tooltip-fragment-expiry&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&#039;tooltip-fragment-noexpiry&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeVandalTemplateParameter()&lt;br /&gt;
	return require(&#039;Module:Vandal-m&#039;)._main{&lt;br /&gt;
		self._args.user or self._protectionObj.title.baseText&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Public methods --&lt;br /&gt;
&lt;br /&gt;
function Blurb:makeBannerText(key)&lt;br /&gt;
	-- Validate input.&lt;br /&gt;
	if not key or not Blurb.bannerTextFields[key] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;&amp;quot;%s&amp;quot; is not a valid banner config field&#039;,&lt;br /&gt;
			tostring(key)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Generate the text.&lt;br /&gt;
	local msg = self._protectionObj.bannerConfig[key]&lt;br /&gt;
	if type(msg) == &#039;string&#039; then&lt;br /&gt;
		return self:_substituteParameters(msg)&lt;br /&gt;
	elseif type(msg) == &#039;function&#039; then&lt;br /&gt;
		msg = msg(self._protectionObj, self._args)&lt;br /&gt;
		if type(msg) ~= &#039;string&#039; then&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&#039;bad output from banner config function with key &amp;quot;%s&amp;quot;&#039;&lt;br /&gt;
					.. &#039; (expected string, got %s)&#039;,&lt;br /&gt;
				tostring(key),&lt;br /&gt;
				type(msg)&lt;br /&gt;
			), 4)&lt;br /&gt;
		end&lt;br /&gt;
		return self:_substituteParameters(msg)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- BannerTemplate class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local BannerTemplate = {}&lt;br /&gt;
BannerTemplate.__index = BannerTemplate&lt;br /&gt;
&lt;br /&gt;
function BannerTemplate.new(protectionObj, cfg)&lt;br /&gt;
	local obj = {}&lt;br /&gt;
	obj._cfg = cfg&lt;br /&gt;
&lt;br /&gt;
	-- Set the image filename.&lt;br /&gt;
	local imageFilename = protectionObj.bannerConfig.image&lt;br /&gt;
	if imageFilename then&lt;br /&gt;
		&lt;br /&gt;
		-- 日本語版独自の条件分岐&lt;br /&gt;
		if type(imageFilename) == &#039;string&#039; then&lt;br /&gt;
			obj._imageFilename = imageFilename&lt;br /&gt;
		elseif type(imageFilename) == &#039;function&#039; then&lt;br /&gt;
			obj._imageFilename = imageFilename(protectionObj)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- If an image filename isn&#039;t specified explicitly in the banner config,&lt;br /&gt;
		-- generate it from the protection status and the namespace.&lt;br /&gt;
		local action = protectionObj.action&lt;br /&gt;
		local level = protectionObj.level&lt;br /&gt;
		local namespace = protectionObj.title.namespace&lt;br /&gt;
		local reason = protectionObj.reason&lt;br /&gt;
		&lt;br /&gt;
		-- Deal with special cases first.&lt;br /&gt;
		if (&lt;br /&gt;
			namespace == 10&lt;br /&gt;
			or namespace == 828&lt;br /&gt;
			or reason and obj._cfg.indefImageReasons[reason]&lt;br /&gt;
			)&lt;br /&gt;
			and action == &#039;edit&#039;&lt;br /&gt;
			and level == &#039;sysop&#039;&lt;br /&gt;
			and not protectionObj:isTemporary()&lt;br /&gt;
		then&lt;br /&gt;
			-- Fully protected modules and templates get the special red &amp;quot;indef&amp;quot;&lt;br /&gt;
			-- padlock.&lt;br /&gt;
			obj._imageFilename = obj._cfg.msg[&#039;image-filename-indef&#039;]&lt;br /&gt;
		else&lt;br /&gt;
			-- Deal with regular protection types.&lt;br /&gt;
			local images = obj._cfg.images&lt;br /&gt;
			if images[action] then&lt;br /&gt;
				if images[action][level] then&lt;br /&gt;
					obj._imageFilename = images[action][level]&lt;br /&gt;
				elseif images[action].default then&lt;br /&gt;
					obj._imageFilename = images[action].default&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return setmetatable(obj, BannerTemplate)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function BannerTemplate:renderImage()&lt;br /&gt;
	local filename = self._imageFilename&lt;br /&gt;
		or self._cfg.msg[&#039;image-filename-default&#039;]&lt;br /&gt;
		or &#039;Transparent.gif&#039;&lt;br /&gt;
	return makeFileLink{&lt;br /&gt;
		file = filename,&lt;br /&gt;
		size = (self.imageSize or &#039;x20&#039;) .. &#039;px&#039;,	-- 日本語版独自の変更&lt;br /&gt;
		alt = self._imageAlt,&lt;br /&gt;
		link = self._imageLink,&lt;br /&gt;
		caption = self.imageCaption&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Banner class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Banner = setmetatable({}, BannerTemplate)&lt;br /&gt;
Banner.__index = Banner&lt;br /&gt;
&lt;br /&gt;
function Banner.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
	local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn&#039;t need the blurb.&lt;br /&gt;
	obj.imageSize = 40	-- 日本語版独自の変更: フィールド名&lt;br /&gt;
	obj.imageCaption = blurbObj:makeBannerText(&#039;alt&#039;) -- Large banners use the alt text for the tooltip.&lt;br /&gt;
	obj._reasonText = blurbObj:makeBannerText(&#039;text&#039;)&lt;br /&gt;
	obj._explanationText = blurbObj:makeBannerText(&#039;explanation&#039;)&lt;br /&gt;
	obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.&lt;br /&gt;
	return setmetatable(obj, Banner)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:__tostring()&lt;br /&gt;
	-- Renders the banner.&lt;br /&gt;
	makeMessageBox = makeMessageBox or require(&#039;Module:Message box&#039;).main&lt;br /&gt;
	local reasonText = self._reasonText or error(&#039;no reason text set&#039;, 2)&lt;br /&gt;
	local explanationText = self._explanationText&lt;br /&gt;
	local mbargs = {&lt;br /&gt;
		page = self._page,&lt;br /&gt;
		type = &#039;protection&#039;,&lt;br /&gt;
		image = self:renderImage(),&lt;br /&gt;
		text = string.format(&lt;br /&gt;
			&amp;quot;&#039;&#039;&#039;%s&#039;&#039;&#039;%s&amp;quot;,&lt;br /&gt;
			reasonText,&lt;br /&gt;
			explanationText and &#039;&amp;lt;br /&amp;gt;&#039; .. explanationText or &#039;&#039;&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
	return makeMessageBox(&#039;mbox&#039;, mbargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Padlock class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Padlock = setmetatable({}, BannerTemplate)&lt;br /&gt;
Padlock.__index = Padlock&lt;br /&gt;
&lt;br /&gt;
function Padlock.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
	local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn&#039;t need the blurb.&lt;br /&gt;
	obj.imageSize = &#039;x20&#039;	-- 日本語版独自の変更: フィールド名、高さのみ指定&lt;br /&gt;
	obj.imageCaption = blurbObj:makeBannerText(&#039;tooltip&#039;)&lt;br /&gt;
	obj._imageAlt = blurbObj:makeBannerText(&#039;alt&#039;)&lt;br /&gt;
	obj._imageLink = blurbObj:makeBannerText(&#039;link&#039;)&lt;br /&gt;
	obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]&lt;br /&gt;
		or cfg.padlockIndicatorNames.default&lt;br /&gt;
		or &#039;pp-default&#039;&lt;br /&gt;
	return setmetatable(obj, Padlock)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Padlock:__tostring()&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- The nowiki tag helps prevent whitespace at the top of articles.&lt;br /&gt;
	return frame:extensionTag{name = &#039;nowiki&#039;} .. frame:extensionTag{&lt;br /&gt;
		name = &#039;indicator&#039;,&lt;br /&gt;
		args = {name = self._indicatorName},&lt;br /&gt;
		content = self:renderImage()&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- This is used for testing purposes.&lt;br /&gt;
	return {&lt;br /&gt;
		Protection = Protection,&lt;br /&gt;
		Blurb = Blurb,&lt;br /&gt;
		BannerTemplate = BannerTemplate,&lt;br /&gt;
		Banner = Banner,&lt;br /&gt;
		Padlock = Padlock,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, cfg, title)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	cfg = cfg or require(CONFIG_MODULE)&lt;br /&gt;
&lt;br /&gt;
	local protectionObj = Protection.new(args, cfg, title)&lt;br /&gt;
&lt;br /&gt;
	local ret = {}&lt;br /&gt;
&lt;br /&gt;
	-- If a page&#039;s edit protection is equally or more restrictive than its&lt;br /&gt;
	-- protection from some other action, then don&#039;t bother displaying anything&lt;br /&gt;
	-- for the other action (except categories).&lt;br /&gt;
	if protectionObj.action == &#039;edit&#039; or&lt;br /&gt;
		args.demolevel or&lt;br /&gt;
		not getReachableNodes(&lt;br /&gt;
			cfg.hierarchy,&lt;br /&gt;
			protectionObj.level&lt;br /&gt;
		)[effectiveProtectionLevel(&#039;edit&#039;, protectionObj.title)]&lt;br /&gt;
	then&lt;br /&gt;
		-- Initialise the blurb object&lt;br /&gt;
		local blurbObj = Blurb.new(protectionObj, args, cfg)&lt;br /&gt;
	&lt;br /&gt;
		-- Render the banner&lt;br /&gt;
		if protectionObj:isProtected() then&lt;br /&gt;
			ret[#ret + 1] = tostring(&lt;br /&gt;
				(yesno(args.small) and Padlock or Banner)&lt;br /&gt;
				.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the categories&lt;br /&gt;
	if yesno(args.category) ~= false then&lt;br /&gt;
		ret[#ret + 1] = protectionObj:makeCategoryLinks()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(ret)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, cfg)&lt;br /&gt;
	cfg = cfg or require(CONFIG_MODULE)&lt;br /&gt;
&lt;br /&gt;
	-- Find default args, if any.&lt;br /&gt;
	local parent = frame.getParent and frame:getParent()&lt;br /&gt;
	local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)]&lt;br /&gt;
&lt;br /&gt;
	-- Find user args, and use the parent frame if we are being called from a&lt;br /&gt;
	-- wrapper template.&lt;br /&gt;
	getArgs = getArgs or require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	local userArgs = getArgs(frame, {&lt;br /&gt;
		parentOnly = defaultArgs,&lt;br /&gt;
		frameOnly = not defaultArgs&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	-- Build the args table. User-specified args overwrite default args.&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for k, v in pairs(defaultArgs or {}) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(userArgs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return p._main(args, cfg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Arguments&amp;diff=6733</id>
		<title>モジュール:Arguments</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Arguments&amp;diff=6733"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&#039;t have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &#039;string&#039; or tp == &#039;number&#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame&#039;s availability. If we weren&#039;t&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &#039;table&#039; and type(frame.getParent) == &#039;function&#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame&#039;s title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &#039;table&#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn&#039;t set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don&#039;t have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &#039;function&#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &#039;valueFunc&#039;&amp;quot;&lt;br /&gt;
					.. &#039;(function expected, got &#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &#039;)&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are &#039;s&#039; (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &#039;h&#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &#039;s&#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; the table is read-only&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; overwriting existing arguments is not permitted&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn&#039;t looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &#039;string&#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won&#039;t cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Yesno&amp;diff=6731</id>
		<title>モジュール:Yesno</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Yesno&amp;diff=6731"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Function allowing for consistent treatment of boolean-like wikitext input.&lt;br /&gt;
-- It works similarly to the template {{yesno}}.&lt;br /&gt;
&lt;br /&gt;
return function (val, default)&lt;br /&gt;
	-- If your wiki uses non-ascii characters for any of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc., you&lt;br /&gt;
	-- should replace &amp;quot;val:lower()&amp;quot; with &amp;quot;mw.ustring.lower(val)&amp;quot; in the&lt;br /&gt;
	-- following line.&lt;br /&gt;
	val = type(val) == &#039;string&#039; and val:lower() or val&lt;br /&gt;
	if val == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif val == true &lt;br /&gt;
		or val == &#039;yes&#039;&lt;br /&gt;
		or val == &#039;y&#039;&lt;br /&gt;
		or val == &#039;true&#039;&lt;br /&gt;
		or val == &#039;t&#039;&lt;br /&gt;
		or val == &#039;on&#039;&lt;br /&gt;
		or tonumber(val) == 1&lt;br /&gt;
	then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif val == false&lt;br /&gt;
		or val == &#039;no&#039;&lt;br /&gt;
		or val == &#039;n&#039;&lt;br /&gt;
		or val == &#039;false&#039;&lt;br /&gt;
		or val == &#039;f&#039;&lt;br /&gt;
		or val == &#039;off&#039;&lt;br /&gt;
		or tonumber(val) == 0&lt;br /&gt;
	then&lt;br /&gt;
		return false&lt;br /&gt;
	else&lt;br /&gt;
		return default&lt;br /&gt;
	end&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Message_box&amp;diff=6729</id>
		<title>モジュール:Message box</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Message_box&amp;diff=6729"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;)&lt;br /&gt;
local getArgs&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
local CONFIG_MODULE = &#039;Module:Message box/configuration&#039;&lt;br /&gt;
local DEMOSPACES = {talk = &#039;tmbox&#039;, image = &#039;imbox&#039;, file = &#039;imbox&#039;, category = &#039;cmbox&#039;, article = &#039;ambox&#039;, main = &#039;ambox&#039;}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getTitleObject(...)&lt;br /&gt;
	-- Get the title object, passing the function through pcall&lt;br /&gt;
	-- in case we are over the expensive function count limit.&lt;br /&gt;
	local success, title = pcall(mw.title.new, ...)&lt;br /&gt;
	if success then&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function union(t1, t2)&lt;br /&gt;
	-- Returns the union of two arrays.&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for i, v in ipairs(t1) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for i, v in ipairs(t2) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k in pairs(vals) do&lt;br /&gt;
		table.insert(ret, k)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(ret)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArgNums(args, prefix)&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = mw.ustring.match(tostring(k), &#039;^&#039; .. prefix .. &#039;([1-9]%d*)$&#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			table.insert(nums, tonumber(num))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Box class definition&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local MessageBox = {}&lt;br /&gt;
MessageBox.__index = MessageBox&lt;br /&gt;
&lt;br /&gt;
function MessageBox.new(boxType, args, cfg)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	local obj = {}&lt;br /&gt;
&lt;br /&gt;
	-- Set the title object and the namespace.&lt;br /&gt;
	obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set the config for our box type.&lt;br /&gt;
	obj.cfg = cfg[boxType]&lt;br /&gt;
	if not obj.cfg then&lt;br /&gt;
		local ns = obj.title.namespace&lt;br /&gt;
		-- boxType is &amp;quot;mbox&amp;quot; or invalid input&lt;br /&gt;
		if args.demospace and args.demospace ~= &#039;&#039; then&lt;br /&gt;
			-- implement demospace parameter of mbox&lt;br /&gt;
			local demospace = string.lower(args.demospace)&lt;br /&gt;
			if DEMOSPACES[demospace] then&lt;br /&gt;
				-- use template from DEMOSPACES&lt;br /&gt;
				obj.cfg = cfg[DEMOSPACES[demospace]]&lt;br /&gt;
			elseif string.find( demospace, &#039;talk&#039; ) then&lt;br /&gt;
				-- demo as a talk page&lt;br /&gt;
				obj.cfg = cfg.tmbox&lt;br /&gt;
			else&lt;br /&gt;
				-- default to ombox&lt;br /&gt;
				obj.cfg = cfg.ombox&lt;br /&gt;
			end&lt;br /&gt;
		elseif ns == 0 then&lt;br /&gt;
			obj.cfg = cfg.ambox -- main namespace&lt;br /&gt;
		elseif ns == 6 then&lt;br /&gt;
			obj.cfg = cfg.imbox -- file namespace&lt;br /&gt;
		elseif ns == 14 then&lt;br /&gt;
			obj.cfg = cfg.cmbox -- category namespace&lt;br /&gt;
		else&lt;br /&gt;
			local nsTable = mw.site.namespaces[ns]&lt;br /&gt;
			if nsTable and nsTable.isTalk then&lt;br /&gt;
				obj.cfg = cfg.tmbox -- any talk namespace&lt;br /&gt;
			else&lt;br /&gt;
				obj.cfg = cfg.ombox -- other namespaces or invalid input&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the arguments, and remove all blank arguments except for the ones&lt;br /&gt;
	-- listed in cfg.allowBlankParams.&lt;br /&gt;
	do&lt;br /&gt;
		local newArgs = {}&lt;br /&gt;
		for k, v in pairs(args) do&lt;br /&gt;
			if v ~= &#039;&#039; then&lt;br /&gt;
				newArgs[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for i, param in ipairs(obj.cfg.allowBlankParams or {}) do&lt;br /&gt;
			newArgs[param] = args[param]&lt;br /&gt;
		end&lt;br /&gt;
		obj.args = newArgs&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define internal data structure.&lt;br /&gt;
	obj.categories = {}&lt;br /&gt;
	obj.classes = {}&lt;br /&gt;
	-- For lazy loading of [[Module:Category handler]].&lt;br /&gt;
	obj.hasCategories = false&lt;br /&gt;
&lt;br /&gt;
	return setmetatable(obj, MessageBox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addCat(ns, cat, sort)&lt;br /&gt;
	if not cat then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if sort then&lt;br /&gt;
		cat = string.format(&#039;[[Category:%s|%s]]&#039;, cat, sort)&lt;br /&gt;
	else&lt;br /&gt;
		cat = string.format(&#039;[[Category:%s]]&#039;, cat)&lt;br /&gt;
	end&lt;br /&gt;
	self.hasCategories = true&lt;br /&gt;
	self.categories[ns] = self.categories[ns] or {}&lt;br /&gt;
	table.insert(self.categories[ns], cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(self.classes, class)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setParameters()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Get type data.&lt;br /&gt;
	self.type = args.type&lt;br /&gt;
	local typeData = cfg.types[self.type]&lt;br /&gt;
	self.invalidTypeError = cfg.showInvalidTypeError&lt;br /&gt;
		and self.type&lt;br /&gt;
		and not typeData&lt;br /&gt;
	typeData = typeData or cfg.types[cfg.default]&lt;br /&gt;
	self.typeClass = typeData.class&lt;br /&gt;
	self.typeImage = typeData.image&lt;br /&gt;
	self.typeImageNeedsLink = typeData.imageNeedsLink&lt;br /&gt;
&lt;br /&gt;
	-- Find if the box has been wrongly substituted.&lt;br /&gt;
	self.isSubstituted = cfg.substCheck and args.subst == &#039;SUBST&#039;&lt;br /&gt;
&lt;br /&gt;
	-- Find whether we are using a small message box.&lt;br /&gt;
	self.isSmall = cfg.allowSmall and (&lt;br /&gt;
		cfg.smallParam and args.small == cfg.smallParam&lt;br /&gt;
		or not cfg.smallParam and yesno(args.small)&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	-- Add attributes, classes and styles.&lt;br /&gt;
	self.id = args.id&lt;br /&gt;
	self.name = args.name&lt;br /&gt;
	if self.name then&lt;br /&gt;
		self:addClass(&#039;box-&#039; .. string.gsub(self.name,&#039; &#039;,&#039;_&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	if yesno(args.plainlinks) ~= false then&lt;br /&gt;
		self:addClass(&#039;plainlinks&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	for _, class in ipairs(cfg.classes or {}) do&lt;br /&gt;
		self:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self:addClass(cfg.smallClass or &#039;mbox-small&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	self:addClass(self.typeClass)&lt;br /&gt;
	self:addClass(args.class)&lt;br /&gt;
	self.style = args.style&lt;br /&gt;
	self.attrs = args.attrs&lt;br /&gt;
&lt;br /&gt;
	-- Set text style.&lt;br /&gt;
	self.textstyle = args.textstyle&lt;br /&gt;
&lt;br /&gt;
	-- Find if we are on the template page or not. This functionality is only&lt;br /&gt;
	-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory&lt;br /&gt;
	-- and cfg.templateCategoryRequireName are set.&lt;br /&gt;
	self.useCollapsibleTextFields = cfg.useCollapsibleTextFields&lt;br /&gt;
	if self.useCollapsibleTextFields&lt;br /&gt;
		or cfg.templateCategory&lt;br /&gt;
		and cfg.templateCategoryRequireName&lt;br /&gt;
	then&lt;br /&gt;
		if self.name then&lt;br /&gt;
			local templateName = mw.ustring.match(&lt;br /&gt;
				self.name,&lt;br /&gt;
				&#039;^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$&#039;&lt;br /&gt;
			) or self.name&lt;br /&gt;
			templateName = &#039;Template:&#039; .. templateName&lt;br /&gt;
			self.templateTitle = getTitleObject(templateName)&lt;br /&gt;
		end&lt;br /&gt;
		self.isTemplatePage = self.templateTitle&lt;br /&gt;
			and mw.title.equals(self.title, self.templateTitle)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Process data for collapsible text fields. At the moment these are only&lt;br /&gt;
	-- used in {{ambox}}.&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- Get the self.issue value.&lt;br /&gt;
		if self.isSmall and args.smalltext then&lt;br /&gt;
			self.issue = args.smalltext&lt;br /&gt;
		else&lt;br /&gt;
			local sect&lt;br /&gt;
			if args.sect == &#039;&#039; then&lt;br /&gt;
				sect = &#039;This &#039; .. (cfg.sectionDefault or &#039;page&#039;)&lt;br /&gt;
			elseif type(args.sect) == &#039;string&#039; then&lt;br /&gt;
				sect = &#039;This &#039; .. args.sect&lt;br /&gt;
			end&lt;br /&gt;
			local issue = args.issue&lt;br /&gt;
			issue = type(issue) == &#039;string&#039; and issue ~= &#039;&#039; and issue or nil&lt;br /&gt;
			local text = args.text&lt;br /&gt;
			text = type(text) == &#039;string&#039; and text or nil&lt;br /&gt;
			local issues = {}&lt;br /&gt;
			table.insert(issues, sect)&lt;br /&gt;
			table.insert(issues, issue)&lt;br /&gt;
			table.insert(issues, text)&lt;br /&gt;
			self.issue = table.concat(issues, &#039; &#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get the self.talk value.&lt;br /&gt;
		local talk = args.talk&lt;br /&gt;
		-- Show talk links on the template page or template subpages if the talk&lt;br /&gt;
		-- parameter is blank.&lt;br /&gt;
		if talk == &#039;&#039;&lt;br /&gt;
			and self.templateTitle&lt;br /&gt;
			and (&lt;br /&gt;
				mw.title.equals(self.templateTitle, self.title)&lt;br /&gt;
				or self.title:isSubpageOf(self.templateTitle)&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			talk = &#039;#&#039;&lt;br /&gt;
		elseif talk == &#039;&#039; then&lt;br /&gt;
			talk = nil&lt;br /&gt;
		end&lt;br /&gt;
		if talk then&lt;br /&gt;
			-- If the talk value is a talk page, make a link to that page. Else&lt;br /&gt;
			-- assume that it&#039;s a section heading, and make a link to the talk&lt;br /&gt;
			-- page of the current page with that section heading.&lt;br /&gt;
			local talkTitle = getTitleObject(talk)&lt;br /&gt;
			local talkArgIsTalkPage = true&lt;br /&gt;
			if not talkTitle or not talkTitle.isTalkPage then&lt;br /&gt;
				talkArgIsTalkPage = false&lt;br /&gt;
				talkTitle = getTitleObject(&lt;br /&gt;
					self.title.text,&lt;br /&gt;
					mw.site.namespaces[self.title.namespace].talk.id&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
			if talkTitle and talkTitle.exists then&lt;br /&gt;
                local talkText&lt;br /&gt;
                if self.isSmall then&lt;br /&gt;
                    local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. &#039;#&#039; .. talk)&lt;br /&gt;
                    talkText = string.format(&#039;([[%s|ノート]])&#039;, talkLink)&lt;br /&gt;
                else&lt;br /&gt;
                    talkText = &#039;関連議論は&#039;&lt;br /&gt;
                    if talkArgIsTalkPage then&lt;br /&gt;
                        talkText = string.format(&lt;br /&gt;
                            &#039;%s [[%s|%s]]に存在するかもしれません。&#039;,&lt;br /&gt;
                            talkText,&lt;br /&gt;
                            talk,&lt;br /&gt;
                            talkTitle.prefixedText&lt;br /&gt;
                        )&lt;br /&gt;
                    else&lt;br /&gt;
                        talkText = string.format(&lt;br /&gt;
                            &#039;%s[[%s#%s|ノートページ]]に存在するかもしれません。&#039;,&lt;br /&gt;
                            talkText,&lt;br /&gt;
                            talkTitle.prefixedText,&lt;br /&gt;
                            talk&lt;br /&gt;
                        )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
				self.talk = talkText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get other values.&lt;br /&gt;
		self.fix = args.fix ~= &#039;&#039; and args.fix or nil&lt;br /&gt;
		local date&lt;br /&gt;
		if args.date and args.date ~= &#039;&#039; then&lt;br /&gt;
			date = args.date&lt;br /&gt;
		elseif args.date == &#039;&#039; and self.isTemplatePage then&lt;br /&gt;
			date = lang:formatDate(&#039;Y年F&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if date then&lt;br /&gt;
			self.date = string.format(&amp;quot; &amp;lt;span class=&#039;date-container&#039;&amp;gt;&amp;lt;i&amp;gt;(&amp;lt;span class=&#039;date&#039;&amp;gt;%s&amp;lt;/span&amp;gt;)&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;, date)&lt;br /&gt;
		end&lt;br /&gt;
		self.info = args.info&lt;br /&gt;
		if yesno(args.removalnotice) then&lt;br /&gt;
			self.removalNotice = cfg.removalNotice&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the non-collapsible text field. At the moment this is used by all box&lt;br /&gt;
	-- types other than ambox, and also by ambox when small=yes.&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self.text = args.smalltext or args.text&lt;br /&gt;
	else&lt;br /&gt;
		self.text = args.text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the below row.&lt;br /&gt;
	self.below = cfg.below and args.below&lt;br /&gt;
&lt;br /&gt;
	-- General image settings.&lt;br /&gt;
	self.imageCellDiv = not self.isSmall and cfg.imageCellDiv&lt;br /&gt;
	self.imageEmptyCell = cfg.imageEmptyCell&lt;br /&gt;
&lt;br /&gt;
	-- Left image settings.&lt;br /&gt;
	local imageLeft = self.isSmall and args.smallimage or args.image&lt;br /&gt;
	if cfg.imageCheckBlank and imageLeft ~= &#039;blank&#039; and imageLeft ~= &#039;none&#039;&lt;br /&gt;
		or not cfg.imageCheckBlank and imageLeft ~= &#039;none&#039;&lt;br /&gt;
	then&lt;br /&gt;
		self.imageLeft = imageLeft&lt;br /&gt;
		if not imageLeft then&lt;br /&gt;
			local imageSize = self.isSmall&lt;br /&gt;
				and (cfg.imageSmallSize or &#039;30x30px&#039;)&lt;br /&gt;
				or &#039;40x40px&#039;&lt;br /&gt;
			self.imageLeft = string.format(&#039;[[File:%s|%s%s|alt=]]&#039;, self.typeImage&lt;br /&gt;
				or &#039;Information icon4.svg&#039;, imageSize, self.typeImageNeedsLink and &amp;quot;&amp;quot; or &amp;quot;|link=&amp;quot; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Right image settings.&lt;br /&gt;
	local imageRight = self.isSmall and args.smallimageright or args.imageright&lt;br /&gt;
	if not (cfg.imageRightNone and imageRight == &#039;none&#039;) then&lt;br /&gt;
		self.imageRight = imageRight&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- set templatestyles&lt;br /&gt;
	self.base_templatestyles = cfg.templatestyles&lt;br /&gt;
	self.templatestyles = args.templatestyles&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setMainspaceCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	if not cfg.allowMainspaceCategories then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for _, prefix in ipairs{&#039;cat&#039;, &#039;category&#039;, &#039;all&#039;} do&lt;br /&gt;
		args[prefix .. &#039;1&#039;] = args[prefix]&lt;br /&gt;
		nums = union(nums, getArgNums(args, prefix))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- The following is roughly equivalent to the old {{Ambox/category}}.&lt;br /&gt;
	local date = args.date&lt;br /&gt;
	date = type(date) == &#039;string&#039; and date&lt;br /&gt;
	local preposition = &#039;/&#039;&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		local mainCat = args[&#039;cat&#039; .. tostring(num)]&lt;br /&gt;
			or args[&#039;category&#039; .. tostring(num)]&lt;br /&gt;
		local allCat = args[&#039;all&#039; .. tostring(num)]&lt;br /&gt;
		mainCat = type(mainCat) == &#039;string&#039; and mainCat&lt;br /&gt;
		allCat = type(allCat) == &#039;string&#039; and allCat&lt;br /&gt;
		if mainCat and date and date ~= &#039;&#039; then&lt;br /&gt;
			local catTitle = string.format(&#039;%s%s%s&#039;, mainCat, preposition, date)&lt;br /&gt;
			self:addCat(0, catTitle)&lt;br /&gt;
			catTitle = getTitleObject(&#039;Category:&#039; .. catTitle)&lt;br /&gt;
			if not catTitle or not catTitle.exists then&lt;br /&gt;
				self:addCat(0, &#039;貼り付け日が正しくないテンプレートのある記事&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif mainCat and (not date or date == &#039;&#039;) then&lt;br /&gt;
			self:addCat(0, mainCat)&lt;br /&gt;
		end&lt;br /&gt;
		if allCat then&lt;br /&gt;
			self:addCat(0, allCat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setTemplateCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Add template categories.&lt;br /&gt;
	if cfg.templateCategory then&lt;br /&gt;
		if cfg.templateCategoryRequireName then&lt;br /&gt;
			if self.isTemplatePage then&lt;br /&gt;
				self:addCat(10, cfg.templateCategory)&lt;br /&gt;
			end&lt;br /&gt;
		elseif not self.title.isSubpage then&lt;br /&gt;
			self:addCat(10, cfg.templateCategory)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add template error categories.&lt;br /&gt;
	if cfg.templateErrorCategory then&lt;br /&gt;
		local templateErrorCategory = cfg.templateErrorCategory&lt;br /&gt;
		local templateCat, templateSort&lt;br /&gt;
		if not self.name and not self.title.isSubpage then&lt;br /&gt;
			templateCat = templateErrorCategory&lt;br /&gt;
		elseif self.isTemplatePage then&lt;br /&gt;
			local paramsToCheck = cfg.templateErrorParamsToCheck or {}&lt;br /&gt;
			local count = 0&lt;br /&gt;
			for i, param in ipairs(paramsToCheck) do&lt;br /&gt;
				if not args[param] then&lt;br /&gt;
					count = count + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if count &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = tostring(count)&lt;br /&gt;
			end&lt;br /&gt;
			if self.categoryNums and #self.categoryNums &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = &#039;C&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addCat(10, templateCat, templateSort)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setAllNamespaceCategories()&lt;br /&gt;
	-- Set categories for all namespaces.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		local allSort = (self.title.namespace == 0 and &#039;Main:&#039; or &#039;&#039;) .. self.title.prefixedText&lt;br /&gt;
		self:addCat(&#039;all&#039;, &#039;パラメータの修正が必要なメッセージボックス&#039;, allSort)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSubstituted then&lt;br /&gt;
		self:addCat(&#039;all&#039;, &#039;正しく置き換えられていないテンプレートがあるページ&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setCategories()&lt;br /&gt;
	if self.title.namespace == 0 then&lt;br /&gt;
		self:setMainspaceCategories()&lt;br /&gt;
	elseif self.title.namespace == 10 then&lt;br /&gt;
		self:setTemplateCategories()&lt;br /&gt;
	end&lt;br /&gt;
	self:setAllNamespaceCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:renderCategories()&lt;br /&gt;
	if not self.hasCategories then&lt;br /&gt;
		-- No categories added, no need to pass them to Category handler so,&lt;br /&gt;
		-- if it was invoked, it would return the empty string.&lt;br /&gt;
		-- So we shortcut and return the empty string.&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- Convert category tables to strings and pass them through&lt;br /&gt;
	-- [[Module:Category handler]].&lt;br /&gt;
	return require(&#039;Module:Category handler&#039;)._main{&lt;br /&gt;
		main = table.concat(self.categories[0] or {}),&lt;br /&gt;
		template = table.concat(self.categories[10] or {}),&lt;br /&gt;
		all = table.concat(self.categories.all or {}),&lt;br /&gt;
		nocat = self.args.nocat,&lt;br /&gt;
		page = self.args.page&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:export()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
	-- Add the subst check error.&lt;br /&gt;
	if self.isSubstituted and self.name then&lt;br /&gt;
		root:tag(&#039;b&#039;)&lt;br /&gt;
			:addClass(&#039;error&#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&#039;テンプレート&amp;lt;code&amp;gt;%s[[Template:%s|%s]]%s&amp;lt;/code&amp;gt;が正しく置き換えられませんでした。&#039;,&lt;br /&gt;
				mw.text.nowiki(&#039;{{&#039;), self.name, self.name, mw.text.nowiki(&#039;}}&#039;)&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	root:wikitext(frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;,&lt;br /&gt;
		args = { src = self.base_templatestyles },&lt;br /&gt;
	})&lt;br /&gt;
	-- Add support for a single custom templatestyles sheet. Undocumented as&lt;br /&gt;
	-- need should be limited and many templates using mbox are substed; we&lt;br /&gt;
	-- don&#039;t want to spread templatestyles sheets around to arbitrary places&lt;br /&gt;
	if self.templatestyles then&lt;br /&gt;
		root:wikitext(frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;,&lt;br /&gt;
			args = { src = self.templatestyles },&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Create the box table.&lt;br /&gt;
	local boxTable = root:tag(&#039;table&#039;)&lt;br /&gt;
	boxTable:attr(&#039;id&#039;, self.id or nil)&lt;br /&gt;
	for i, class in ipairs(self.classes or {}) do&lt;br /&gt;
		boxTable:addClass(class or nil)&lt;br /&gt;
	end&lt;br /&gt;
	boxTable&lt;br /&gt;
		:cssText(self.style or nil)&lt;br /&gt;
		:attr(&#039;role&#039;, &#039;presentation&#039;)&lt;br /&gt;
&lt;br /&gt;
	if self.attrs then&lt;br /&gt;
		boxTable:attr(self.attrs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the left-hand image.&lt;br /&gt;
	local row = boxTable:tag(&#039;tr&#039;)&lt;br /&gt;
	if self.imageLeft then&lt;br /&gt;
		local imageLeftCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-image&#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageLeftCell so that the image&lt;br /&gt;
			-- is inside it. Divs use style=&amp;quot;width: 52px;&amp;quot;, which limits the&lt;br /&gt;
			-- image width to 52px. If any images in a div are wider than that,&lt;br /&gt;
			-- they may overlap with the text or cause other display problems.&lt;br /&gt;
			imageLeftCell = imageLeftCell:tag(&#039;div&#039;):addClass(&#039;mbox-image-div&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageLeftCell:wikitext(self.imageLeft or nil)&lt;br /&gt;
	elseif self.imageEmptyCell then&lt;br /&gt;
		-- Some message boxes define an empty cell if no image is specified, and&lt;br /&gt;
		-- some don&#039;t. The old template code in templates where empty cells are&lt;br /&gt;
		-- specified gives the following hint: &amp;quot;No image. Cell with some width&lt;br /&gt;
		-- or padding necessary for text cell to have 100% width.&amp;quot;&lt;br /&gt;
		row:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(&#039;mbox-empty-cell&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the text.&lt;br /&gt;
	local textCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-text&#039;)&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- The message box uses advanced text parameters that allow things to be&lt;br /&gt;
		-- collapsible. At the moment, only ambox uses this.&lt;br /&gt;
		textCell:cssText(self.textstyle or nil)&lt;br /&gt;
		local textCellDiv = textCell:tag(&#039;div&#039;)&lt;br /&gt;
		textCellDiv&lt;br /&gt;
			:addClass(&#039;mbox-text-span&#039;)&lt;br /&gt;
			:wikitext(self.issue or nil)&lt;br /&gt;
		if (self.talk or self.fix) then&lt;br /&gt;
			textCellDiv:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:wikitext(self.talk and (&#039; &#039; .. self.talk) or nil)&lt;br /&gt;
				:wikitext(self.fix and (&#039; &#039; .. self.fix) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		textCellDiv:wikitext(self.date and (&#039; &#039; .. self.date) or nil)&lt;br /&gt;
		if self.info and not self.isSmall then&lt;br /&gt;
			textCellDiv&lt;br /&gt;
				:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:wikitext(self.info and (&#039; &#039; .. self.info) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		if self.removalNotice then&lt;br /&gt;
			textCellDiv:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:tag(&#039;i&#039;)&lt;br /&gt;
					:wikitext(string.format(&amp;quot; (%s)&amp;quot;, self.removalNotice))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Default text formatting - anything goes.&lt;br /&gt;
		textCell&lt;br /&gt;
			:cssText(self.textstyle or nil)&lt;br /&gt;
			:wikitext(self.text or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the right-hand image.&lt;br /&gt;
	if self.imageRight then&lt;br /&gt;
		local imageRightCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-imageright&#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageRightCell so that the image&lt;br /&gt;
			-- is inside it.&lt;br /&gt;
			imageRightCell = imageRightCell:tag(&#039;div&#039;):addClass(&#039;mbox-image-div&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageRightCell&lt;br /&gt;
			:wikitext(self.imageRight or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the below row.&lt;br /&gt;
	if self.below then&lt;br /&gt;
		boxTable:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:attr(&#039;colspan&#039;, self.imageRight and &#039;3&#039; or &#039;2&#039;)&lt;br /&gt;
				:addClass(&#039;mbox-text&#039;)&lt;br /&gt;
				:cssText(self.textstyle or nil)&lt;br /&gt;
				:wikitext(self.below or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add error message for invalid type parameters.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		root:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(&#039;mbox-invalid-type&#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&#039;このメッセージボックスには無効な&amp;quot;type=%s&amp;quot;というパラメータが指定されているため修正が必要です。&#039;,&lt;br /&gt;
				self.type or &#039;&#039;&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add categories.&lt;br /&gt;
	root:wikitext(self:renderCategories() or nil)&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p, mt = {}, {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- For testing.&lt;br /&gt;
	return {&lt;br /&gt;
		MessageBox = MessageBox&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(boxType, args, cfgTables)&lt;br /&gt;
	local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))&lt;br /&gt;
	box:setParameters()&lt;br /&gt;
	box:setCategories()&lt;br /&gt;
	return box:export()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mt.__index(t, k)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		if not getArgs then&lt;br /&gt;
			getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
		end&lt;br /&gt;
		return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return setmetatable(p, mt)&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:String&amp;diff=6727</id>
		<title>モジュール:String</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:String&amp;diff=6727"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
&lt;br /&gt;
This module is intended to provide access to basic string functions.&lt;br /&gt;
&lt;br /&gt;
Most of the functions provided here can be invoked with named parameters,&lt;br /&gt;
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will&lt;br /&gt;
automatically remove any leading or trailing whitespace from the parameter.&lt;br /&gt;
Depending on the intended use, it may be advantageous to either preserve or&lt;br /&gt;
remove such whitespace.&lt;br /&gt;
&lt;br /&gt;
Global options&lt;br /&gt;
    ignore_errors: If set to &#039;true&#039; or 1, any error condition will result in&lt;br /&gt;
        an empty string being returned rather than an error message.&lt;br /&gt;
&lt;br /&gt;
    error_category: If an error occurs, specifies the name of a category to&lt;br /&gt;
        include with the error message.  The default category is&lt;br /&gt;
        [Category:モジュールStringのエラー].&lt;br /&gt;
&lt;br /&gt;
    no_category: If set to &#039;true&#039; or 1, no category will be added if an error&lt;br /&gt;
        is generated.&lt;br /&gt;
&lt;br /&gt;
Unit tests for this module are available at Module:String/tests.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local str = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
len&lt;br /&gt;
&lt;br /&gt;
This function returns the length of the target string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|len|target_string|}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|len|s=target_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string whose length to report&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.&lt;br /&gt;
]]&lt;br /&gt;
function str.len( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;s&#039;} )&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;&lt;br /&gt;
	return mw.ustring.len( s )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
sub&lt;br /&gt;
&lt;br /&gt;
This function returns a substring of the target string at specified indices.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|sub|target_string|start_index|end_index}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to return a subset of&lt;br /&gt;
    i: The fist index of the substring to return, defaults to 1.&lt;br /&gt;
    j: The last index of the string to return, defaults to the last character.&lt;br /&gt;
&lt;br /&gt;
The first character of the string is assigned an index of 1.  If either i or j&lt;br /&gt;
is a negative value, it is interpreted the same as selecting a character by&lt;br /&gt;
counting from the end of the string.  Hence, a value of -1 is the same as&lt;br /&gt;
selecting the last character of the string.&lt;br /&gt;
&lt;br /&gt;
If the requested indices are out of range for the given string, an error is&lt;br /&gt;
reported.&lt;br /&gt;
]]&lt;br /&gt;
function str.sub( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, { &#039;s&#039;, &#039;i&#039;, &#039;j&#039; } )&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;&lt;br /&gt;
	local i = tonumber( new_args[&#039;i&#039;] ) or 1&lt;br /&gt;
	local j = tonumber( new_args[&#039;j&#039;] ) or -1&lt;br /&gt;
&lt;br /&gt;
	local len = mw.ustring.len( s )&lt;br /&gt;
&lt;br /&gt;
	-- Convert negatives for range checking&lt;br /&gt;
	if i &amp;lt; 0 then&lt;br /&gt;
		i = len + i + 1&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; 0 then&lt;br /&gt;
		j = len + j + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if i &amp;gt; len or j &amp;gt; len or i &amp;lt; 1 or j &amp;lt; 1 then&lt;br /&gt;
		return str._error( &#039;String subset index out of range&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; i then&lt;br /&gt;
		return str._error( &#039;String subset indices out of order&#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( s, i, j )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function implements that features of {{str sub old}} and is kept in order&lt;br /&gt;
to maintain these older templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.sublength( frame )&lt;br /&gt;
	local i = tonumber( frame.args.i ) or 0&lt;br /&gt;
	local len = tonumber( frame.args.len )&lt;br /&gt;
	return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
_match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern. It is exported for use in other modules&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
strmatch = require(&amp;quot;Module:String&amp;quot;)._match&lt;br /&gt;
sresult = strmatch( s, pattern, start, match, plain, nomatch )&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* http://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This sub-routine is exported for use in other modules&lt;br /&gt;
function str._match( s, pattern, start, match_index, plain_flag, nomatch )&lt;br /&gt;
	if s == &#039;&#039; then&lt;br /&gt;
		return str._error( &#039;Target string is empty&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if pattern == &#039;&#039; then&lt;br /&gt;
		return str._error( &#039;Pattern string is empty&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	start = tonumber(start) or 1&lt;br /&gt;
	if math.abs(start) &amp;lt; 1 or math.abs(start) &amp;gt; mw.ustring.len( s ) then&lt;br /&gt;
		return str._error( &#039;Requested start is out of range&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if match_index == 0 then&lt;br /&gt;
		return str._error( &#039;Match index is out of range&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if plain_flag then&lt;br /&gt;
		pattern = str._escapePattern( pattern )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
	if match_index == 1 then&lt;br /&gt;
		-- Find first match is simple case&lt;br /&gt;
		result = mw.ustring.match( s, pattern, start )&lt;br /&gt;
	else&lt;br /&gt;
		if start &amp;gt; 1 then&lt;br /&gt;
			s = mw.ustring.sub( s, start )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local iterator = mw.ustring.gmatch(s, pattern)&lt;br /&gt;
		if match_index &amp;gt; 0 then&lt;br /&gt;
			-- Forward search&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				match_index = match_index - 1&lt;br /&gt;
				if match_index == 0 then&lt;br /&gt;
					result = w&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- Reverse search&lt;br /&gt;
			local result_table = {}&lt;br /&gt;
			local count = 1&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				result_table[count] = w&lt;br /&gt;
				count = count + 1&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			result = result_table[ count + match_index ]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if result == nil then&lt;br /&gt;
		if nomatch == nil then&lt;br /&gt;
			return str._error( &#039;Match not found&#039; )&lt;br /&gt;
		else&lt;br /&gt;
			return nomatch&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return result&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index&lt;br /&gt;
    |match=match_number|plain=plain_flag|nomatch=nomatch_output}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from each string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
If the match_number or start_index are out of range for the string being queried, then&lt;br /&gt;
this function generates an error.  An error is also generated if no match is found.&lt;br /&gt;
If one adds the parameter ignore_errors=true, then the error will be suppressed and&lt;br /&gt;
an empty string will be returned on any failure.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* http://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This is the entry point for #invoke:String|match&lt;br /&gt;
function str.match( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;s&#039;, &#039;pattern&#039;, &#039;start&#039;, &#039;match&#039;, &#039;plain&#039;, &#039;nomatch&#039;} )&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;&lt;br /&gt;
	local start = tonumber( new_args[&#039;start&#039;] ) or 1&lt;br /&gt;
	local plain_flag = str._getBoolean( new_args[&#039;plain&#039;] or false )&lt;br /&gt;
	local pattern = new_args[&#039;pattern&#039;] or &#039;&#039;&lt;br /&gt;
	local match_index = math.floor( tonumber(new_args[&#039;match&#039;]) or 1 )&lt;br /&gt;
	local nomatch = new_args[&#039;nomatch&#039;]&lt;br /&gt;
&lt;br /&gt;
	return str._match( s, pattern, start, match_index, plain_flag, nomatch )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
pos&lt;br /&gt;
&lt;br /&gt;
This function returns a single character from the target string at position pos.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|pos|target_string|index_value}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|target=target_string|pos=index_value}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    target: The string to search&lt;br /&gt;
    pos: The index for the character to return&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
The first character has an index value of 1.&lt;br /&gt;
&lt;br /&gt;
If one requests a negative value, this function will select a character by counting backwards&lt;br /&gt;
from the end of the string.  In other words pos = -1 is the same as asking for the last character.&lt;br /&gt;
&lt;br /&gt;
A requested value of zero, or a value greater than the length of the string returns an error.&lt;br /&gt;
]]&lt;br /&gt;
function str.pos( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;target&#039;, &#039;pos&#039;} )&lt;br /&gt;
	local target_str = new_args[&#039;target&#039;] or &#039;&#039;&lt;br /&gt;
	local pos = tonumber( new_args[&#039;pos&#039;] ) or 0&lt;br /&gt;
&lt;br /&gt;
	if pos == 0 or math.abs(pos) &amp;gt; mw.ustring.len( target_str ) then&lt;br /&gt;
		return str._error( &#039;String index out of range&#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( target_str, pos, pos )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
str_find&lt;br /&gt;
&lt;br /&gt;
This function duplicates the behavior of {{str_find}}, including all of its quirks.&lt;br /&gt;
This is provided in order to support existing templates, but is NOT RECOMMENDED for&lt;br /&gt;
new code and templates.  New code is recommended to use the &amp;quot;find&amp;quot; function instead.&lt;br /&gt;
&lt;br /&gt;
Returns the first index in &amp;quot;source&amp;quot; that is a match to &amp;quot;target&amp;quot;.  Indexing is 1-based,&lt;br /&gt;
and the function returns -1 if the &amp;quot;target&amp;quot; string is not present in &amp;quot;source&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Important Note: If the &amp;quot;target&amp;quot; string is empty / missing, this function returns a&lt;br /&gt;
value of &amp;quot;1&amp;quot;, which is generally unexpected behavior, and must be accounted for&lt;br /&gt;
separatetly.&lt;br /&gt;
]]&lt;br /&gt;
function str.str_find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;target&#039;} )&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;&lt;br /&gt;
	local target_str = new_args[&#039;target&#039;] or &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if target_str == &#039;&#039; then&lt;br /&gt;
		return 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, target_str, 1, true )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = -1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
find&lt;br /&gt;
&lt;br /&gt;
This function allows one to search for a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    target: The string or pattern to find within source&lt;br /&gt;
    start: The index within the source string to start the search, defaults to 1&lt;br /&gt;
    plain: Boolean flag indicating that target should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the parameter.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
This function returns the first index &amp;gt;= &amp;quot;start&amp;quot; where &amp;quot;target&amp;quot; can be found&lt;br /&gt;
within &amp;quot;source&amp;quot;.  Indices are 1-based.  If &amp;quot;target&amp;quot; is not found, then this&lt;br /&gt;
function returns 0.  If either &amp;quot;source&amp;quot; or &amp;quot;target&amp;quot; are missing / empty, this&lt;br /&gt;
function also returns 0.&lt;br /&gt;
&lt;br /&gt;
This function should be safe for UTF-8 strings.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;target&#039;, &#039;start&#039;, &#039;plain&#039; } )&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;&lt;br /&gt;
	local pattern = new_args[&#039;target&#039;] or &#039;&#039;&lt;br /&gt;
	local start_pos = tonumber(new_args[&#039;start&#039;]) or 1&lt;br /&gt;
	local plain = new_args[&#039;plain&#039;] or true&lt;br /&gt;
&lt;br /&gt;
	if source_str == &#039;&#039; or pattern == &#039;&#039; then&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	plain = str._getBoolean( plain )&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, pattern, start_pos, plain )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
replace&lt;br /&gt;
&lt;br /&gt;
This function allows one to replace a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|&lt;br /&gt;
   count=replacement_count|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    pattern: The string or pattern to find within source&lt;br /&gt;
    replace: The replacement text&lt;br /&gt;
    count: The number of occurences to replace, defaults to all.&lt;br /&gt;
    plain: Boolean flag indicating that pattern should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;pattern&#039;, &#039;replace&#039;, &#039;count&#039;, &#039;plain&#039; } )&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;&lt;br /&gt;
	local pattern = new_args[&#039;pattern&#039;] or &#039;&#039;&lt;br /&gt;
	local replace = new_args[&#039;replace&#039;] or &#039;&#039;&lt;br /&gt;
	local count = tonumber( new_args[&#039;count&#039;] )&lt;br /&gt;
	local plain = new_args[&#039;plain&#039;] or true&lt;br /&gt;
&lt;br /&gt;
	if source_str == &#039;&#039; or pattern == &#039;&#039; then&lt;br /&gt;
		return source_str&lt;br /&gt;
	end&lt;br /&gt;
	plain = str._getBoolean( plain )&lt;br /&gt;
&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern( pattern )&lt;br /&gt;
		replace = mw.ustring.gsub( replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot; ) --Only need to escape replacement sequences.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
&lt;br /&gt;
	if count ~= nil then&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace, count )&lt;br /&gt;
	else&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    simple function to pipe string.rep to templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.rep( frame )&lt;br /&gt;
	local repetitions = tonumber( frame.args[2] )&lt;br /&gt;
	if not repetitions then&lt;br /&gt;
		return str._error( &#039;function rep expects a number as second parameter, received &amp;quot;&#039; .. ( frame.args[2] or &#039;&#039; ) .. &#039;&amp;quot;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return string.rep( frame.args[1] or &#039;&#039;, repetitions )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
escapePattern&lt;br /&gt;
&lt;br /&gt;
This function escapes special characters from a Lua string pattern. See [1]&lt;br /&gt;
for details on how patterns work.&lt;br /&gt;
&lt;br /&gt;
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|escapePattern|pattern_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    pattern_string: The pattern string to escape.&lt;br /&gt;
]]&lt;br /&gt;
function str.escapePattern( frame )&lt;br /&gt;
	local pattern_str = frame.args[1]&lt;br /&gt;
	if not pattern_str then&lt;br /&gt;
		return str._error( &#039;No pattern string specified&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	local result = str._escapePattern( pattern_str )&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
count&lt;br /&gt;
This function counts the number of occurrences of one string in another.&lt;br /&gt;
]]&lt;br /&gt;
function str.count(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {&#039;source&#039;, &#039;pattern&#039;, &#039;plain&#039;})&lt;br /&gt;
	local source = args.source or &#039;&#039;&lt;br /&gt;
	local pattern = args.pattern or &#039;&#039;&lt;br /&gt;
	local plain = str._getBoolean(args.plain or true)&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern(pattern)&lt;br /&gt;
	end&lt;br /&gt;
	local _, count = mw.ustring.gsub(source, pattern, &#039;&#039;)&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
endswith&lt;br /&gt;
This function determines whether a string ends with another string.&lt;br /&gt;
]]&lt;br /&gt;
function str.endswith(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {&#039;source&#039;, &#039;pattern&#039;})&lt;br /&gt;
	local source = args.source or &#039;&#039;&lt;br /&gt;
	local pattern = args.pattern or &#039;&#039;&lt;br /&gt;
	if pattern == &#039;&#039; then&lt;br /&gt;
		-- All strings end with the empty string.&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
join&lt;br /&gt;
&lt;br /&gt;
Join all non empty arguments together; the first argument is the separator.&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|join|sep|one|two|three}}&lt;br /&gt;
]]&lt;br /&gt;
function str.join(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	local sep&lt;br /&gt;
	for _, v in ipairs( frame.args ) do&lt;br /&gt;
		if sep then&lt;br /&gt;
			if v ~= &#039;&#039; then&lt;br /&gt;
				table.insert(args, v)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			sep = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( args, sep or &#039;&#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that populates the argument list given that user may need to use a mix of&lt;br /&gt;
named and unnamed parameters.  This is relevant because named parameters are not&lt;br /&gt;
identical to unnamed parameters due to string trimming, and when dealing with strings&lt;br /&gt;
we sometimes want to either preserve or remove that whitespace depending on the application.&lt;br /&gt;
]]&lt;br /&gt;
function str._getParameters( frame_args, arg_list )&lt;br /&gt;
	local new_args = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	local value&lt;br /&gt;
&lt;br /&gt;
	for _, arg in ipairs( arg_list ) do&lt;br /&gt;
		value = frame_args[arg]&lt;br /&gt;
		if value == nil then&lt;br /&gt;
			value = frame_args[index]&lt;br /&gt;
			index = index + 1&lt;br /&gt;
		end&lt;br /&gt;
		new_args[arg] = value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return new_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function to handle error messages.&lt;br /&gt;
]]&lt;br /&gt;
function str._error( error_str )&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local error_category = frame.args.error_category or &#039;モジュールStringのエラー&#039;&lt;br /&gt;
	local ignore_errors = frame.args.ignore_errors or false&lt;br /&gt;
	local no_category = frame.args.no_category or false&lt;br /&gt;
&lt;br /&gt;
	if str._getBoolean(ignore_errors) then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local error_str = &#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;モジュールStringのエラー: &#039; .. error_str .. &#039;&amp;lt;/strong&amp;gt;&#039;&lt;br /&gt;
	if error_category ~= &#039;&#039; and not str._getBoolean( no_category ) then&lt;br /&gt;
		error_str = &#039;[[Category:&#039; .. error_category .. &#039;]]&#039; .. error_str&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return error_str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper Function to interpret boolean strings&lt;br /&gt;
]]&lt;br /&gt;
function str._getBoolean( boolean_str )&lt;br /&gt;
	local boolean_value&lt;br /&gt;
&lt;br /&gt;
	if type( boolean_str ) == &#039;string&#039; then&lt;br /&gt;
		boolean_str = boolean_str:lower()&lt;br /&gt;
		if boolean_str == &#039;false&#039; or boolean_str == &#039;no&#039; or boolean_str == &#039;0&#039;&lt;br /&gt;
				or boolean_str == &#039;&#039; then&lt;br /&gt;
			boolean_value = false&lt;br /&gt;
		else&lt;br /&gt;
			boolean_value = true&lt;br /&gt;
		end&lt;br /&gt;
	elseif type( boolean_str ) == &#039;boolean&#039; then&lt;br /&gt;
		boolean_value = boolean_str&lt;br /&gt;
	else&lt;br /&gt;
		error( &#039;No boolean value found&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return boolean_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that escapes all pattern characters so that they will be treated&lt;br /&gt;
as plain text.&lt;br /&gt;
]]&lt;br /&gt;
function str._escapePattern( pattern_str )&lt;br /&gt;
	return mw.ustring.gsub( pattern_str, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$%]])&amp;quot;, &amp;quot;%%%1&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return str&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Fontsize&amp;diff=6725</id>
		<title>テンプレート:Fontsize</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88:Fontsize&amp;diff=6725"/>
		<updated>2025-03-30T08:15:22Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: 1版 をインポートしました&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size:{{{1}}}{{#ifeq:{{IsNum|{{{1}}}}}|1|px}}&amp;quot;&amp;gt;{{{2}}}&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=KDE_Plasma_Transparent&amp;diff=6719</id>
		<title>KDE Plasma Transparent</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=KDE_Plasma_Transparent&amp;diff=6719"/>
		<updated>2025-03-30T04:28:29Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|Debian GNU/Linux Customize Tips|frame=1}}&lt;br /&gt;
&lt;br /&gt;
Linuxのデスクトップ環境としてKDEを使用しているとき、アプリケーションウィンドウやタスクバー(パネル)を半透明にするには何をどう設定すべきか、というメモ。&lt;br /&gt;
&lt;br /&gt;
グローバルな視点では「KDEといえば半透明」なのだが、あまりにマニアックだなぁ。&lt;br /&gt;
&lt;br /&gt;
==「デスクトップ環境」とは==&lt;br /&gt;
&lt;br /&gt;
現代のコンピュータは[https://en.wikipedia.org/wiki/Command-line_interface CLI (Command-Line Interface)]が基本だ。キーボードなどの入力装置からOSを経由してCPUに演算命令(コマンド)をキャラクタ(文字列)で入力し、演算結果はディスプレイやプリンタに文字列で出力される。よって、コマンドや演算結果の読み方を知らなければ、そのコンピュータは使えないことになる。スーパーコンピュータや組込コンピュータはCLIのみの場合が多く、これらは専任のエンジニアしか扱えない。&lt;br /&gt;
&lt;br /&gt;
このままでは市井の人々はコンピュータを使えないので、コマンドの入力と演算結果の出力を文字列ではない方法で提供する方法が考案された。それが[https://en.wikipedia.org/wiki/Graphical_user_interface GUI (Graphical User Interface)]である。ディスプレイに表示されるボタンや画像を視覚から選択することでOSを経由してCPUにコマンドを文字列で入力でき、それから得られた演算結果である文字列を適切に映像化してディスプレイに表示するものだ。これが実用化されてはじめて、市井の人々でも(ある程度は)使えるようになった。PCはもちろん、スマートフォンが最たる例だろう。&lt;br /&gt;
&lt;br /&gt;
この「GUIを実現するためのソフトウェアパッケージ」が[https://en.wikipedia.org/wiki/Desktop_environment デスクトップ環境]である。&lt;br /&gt;
&lt;br /&gt;
==Linuxではデスクトップ環境が変更できる==&lt;br /&gt;
&lt;br /&gt;
WindowsやmacOSのデスクトップ環境は、WindowsならMicrosoftの、macOSならAppleの、御仕着せのもの以外に変更できない&amp;lt;ref name=&amp;quot;win&amp;quot; /&amp;gt;。彼らにとってOSとデスクトップ環境は一体化された不可分の商品で、彼等が考えた組合せが所謂ユーザエクスペリエンスを提供するにあたってベストだと考えているからだが、これが原因でインストールできるハードウェアに制限が掛かる。一般にGUIはCLIよりハードウェアが高性能でなければならないうえ、CPU以外に映像を処理・表示するための[https://en.wikipedia.org/wiki/Graphics_processing_unit Graphics Processing Unit (GPU)]でも、彼らが開発したデスクトップ環境を支障なく機能させるために最低限のスペックを規定しなければならないからだ。&lt;br /&gt;
&lt;br /&gt;
それに対して、Linuxのデスクトップ環境は多種多様な選択肢があり、ユーザの好みやハードウェアのスペックに応じていくらでも変更できる。Linuxは(基本的に)商品ではないうえ、その核心たるKernelは『OS機能を提供することに徹して』おり、デスクトップ環境とは無関係だからだ。もっと言えば、Kernelとデスクトップ環境の作者はまったくの別人で、Kernelから見たデスクトップ環境は「OS上で動いているソフトウェアのひとつ」でしかない。Kernelとデスクトップ環境をどう組合せるかはユーザの自由だ&amp;lt;ref name=&amp;quot;gui&amp;quot; /&amp;gt;。これがWindowsやmacOSと決定的に違う点であり、個人が日常生活で使うPCはこうでなければ面白くない。&lt;br /&gt;
&lt;br /&gt;
ただ、その挙動もいくらでも変更できるため、いったん変更し始めると沼に嵌るため要注意である。&lt;br /&gt;
&lt;br /&gt;
世に数多あるLinuxディストリビューションでデスクトップ環境を構築する際にデフォルトで選択されるのは、軽快な動作で有名な[https://en.wikipedia.org/wiki/GNOME GNOME]や[https://en.wikipedia.org/wiki/LXDE LXDE]だ。これらは実装されているハードウェアが比較的ロースペックなノートPCでも問題なく機能することを目標に開発されているため、余程古くなければ、大抵の市販PCで問題なく機能する。謂わば「Windowsの対抗馬」であろう。それ以外では、Linux Kernel産みの親である[https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds]がGNOMEのバグに嫌気が差して一時使用していたことで知られる[https://en.wikipedia.org/wiki/Xfce Xfce]も軽快さで人気がある。&lt;br /&gt;
&lt;br /&gt;
が、[https://en.wikipedia.org/wiki/KDE KDE]は、それらとは対極の美麗さで夙に知られる。実用一辺倒なWindowsにはない開発指向&amp;lt;ref name=&amp;quot;ope&amp;quot; /&amp;gt;で、さりとてmacOSとも異なる美麗さの演出に、管理人を含む根強いファンが多いが、美麗さを演出するためにCPUの演算量やグラフィック用メモリの消費量が多くなることから、KDEに実装されている様々な効果(エフェクト)を使うにはGNOMEやLXDEよりハイスペックなハードウェアが必要&amp;lt;ref name=&amp;quot;kde&amp;quot; /&amp;gt;になる。しかし、ここ最近のハードウェアは安価なモデルでも高性能なので、KDEの様々なエフェクトを同時に有効にしたとて、描画でモタついたりコマ落ちしたりすることはほぼ無くなった。「時代がようやくKDEに追い付いた」だけなのかもしれないが、いずれにしろ、良い時代になったものだ。&lt;br /&gt;
&lt;br /&gt;
==「KDEならTransparentでしょ」==&lt;br /&gt;
&lt;br /&gt;
そんなKDEで代表的なエフェクトが&#039;&#039;&#039;Transparent:透過&#039;&#039;&#039;だ。即ち、文字はそのままだが、アプリケーションウィンドウだけを半透明に設定するエフェクトで、ユーザの目に応じて透明度を調整すると、アプリケーションウィンドウに表示される文字の可読性を維持しつつ、背景や、背後のアプリケーションウィンドウの文字だけが鮮やかに浮かぶ環境が構築できる。&lt;br /&gt;
&lt;br /&gt;
これは実に有用なエフェクトで、例えばWebブラウザで調べた複数のコマンドラインを順番にコンソールに入力する際、いちいち {{keypress|ALT}} + {{keypress|TAB}} を押下してWebブラウザとターミナルエミュレータのウィンドウを行き来してコマンドラインをコピペするのではなく、ターミナルエミュレータの背景として透けて見えているWebブラウザのコマンドラインをそのまま確認しながら入力できるので便利なのだ。&lt;br /&gt;
&lt;br /&gt;
また、副次的な効果だが、画面の一部を無粋に占拠しているタスクバー(KDEではパネルという)をも完全に透明化できるため、壁紙に設定した画像をディスプレイの隅々まで鑑賞できるようになる。&lt;br /&gt;
&lt;br /&gt;
ではなぜ「KDEならTransparentでしょ」と謂われるのか。それは、画像透過処理が[http://www.sm.rim.or.jp/~shishido/toumei.html CPUリソースを莫迦食いする]、かなりの演算量だからだ。よって、カラフルな背景を設定した状態で半透明を維持したウィンドウを動かそうものなら、それに連れてリアルタイムで透過処理を走らせる必要があるためCPU演算量が跳ね上がり&amp;lt;ref name=&amp;quot;cpu&amp;quot; /&amp;gt;、貧弱なCPUでは処理が追い付かずフリーズする&amp;lt;ref name=&amp;quot;freeze&amp;quot; /&amp;gt;。つまり、ハイスペックなハードウェアが必須となり、先述の目標と真っ向から対立するため、GNOMEやLXDEでは意図的に実装しておらず、Xfceでは設定できるものの正面切ってユーザに勧めていないが、KDEは当初からある程度ハイスペックなハードウェアで使用することを想定しているため、Transparentを公式にサポートしている。このあたりは[https://en.wikipedia.org/wiki/Chicken_or_the_egg 「鶏が先か、卵が先か」の関係]といえなくもないが、GNOMEやLXDEの初心者がユーザコミュニティに「ウィンドウをTransparentにできないの？」と質問しようものなら、開発者や古参のユーザから「TransparentにしたいならKDEに乗り換えてくれ！」と呆れられたり、Transparentを設定していないKDEユーザが、設定済のKDEユーザから「折角のKDEなんだから、Transparentを設定しないと勿体無いよ」とまで謂われる所以がここにあるのは間違いない。&lt;br /&gt;
&lt;br /&gt;
下記は、管理人なりのKDE Plasma 5でのTransparentの設定である。なお、画面が白色で明るいと目が疲れる&amp;lt;ref name=&amp;quot;kelvin&amp;quot; /&amp;gt;ため、管理人のデスクトップ環境はデフォルトでダーク(黒色)設定、ターミナルエミュレータも黒色透け背景に信頼と伝統のアンバー(琥珀色)文字で設定している。&lt;br /&gt;
&lt;br /&gt;
#タスクバーのウィジェットに[https://www.pling.com/p/1338479/ Panel Transparency Button]を追加後、ノブをONに倒して、タスクバー(パネル)を完全に透明化する&lt;br /&gt;
#Kvantumをインストールする&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;# apt install kvantum&amp;lt;/code&amp;gt;&lt;br /&gt;
#Kvantum用テーマの[https://store.kde.org/p/1820725 Black-Colors]から&amp;lt;code&amp;gt;Black-BlueBerry.tar.gz&amp;lt;/code&amp;gt;をダウンロードし解凍する&lt;br /&gt;
#アプリケーションランチャーから[設定]→[Kvantum マネージャー]を起動し、解凍した&amp;lt;code&amp;gt;Black-BlueBerry.tar.gz&amp;lt;/code&amp;gt;をインストールする&lt;br /&gt;
#同じウィンドウで[アクティブなテーマの設定]を選択、[Compositing &amp;amp; General Look]タブにある&amp;lt;code&amp;gt;Reduce window opacity by&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt;に、&amp;lt;code&amp;gt;Reduce menu opacity by&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt;に、それぞれ設定する。&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;win&amp;quot;&amp;gt;いちおうWindowsは[https://en.wikipedia.org/wiki/Windows_Registry レジストリ]を弄れば多少変更できるものの、とてもではないが一般ユーザ向けではない。裏を返せば、デスクトップ環境が妙に変わっている場合は、外部から侵入したコンピュータウィルスが(自身の存在をアピールするため)変更させたとを疑うべきですらある。特に、タスクバーが突然(半)透明になった場合は、ウィルス感染を疑って問題ない。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;gui&amp;quot;&amp;gt;これには当然「デスクトップ環境をインストールしない自由」も含まれる。というか、数十億台の[https://en.wikipedia.org/wiki/Android_(operating_system) Android]スマートフォンが普及する以前は、Linuxをインストールしたコンピュータにデスクトップ(GUI)環境をインストールすること自体が珍しがられた。それまでLinuxの主戦場だったサーバ用途ではデスクトップ環境は不要だからだ。管理人も自宅でLinuxサーバを運用し始めて20年ほど経つが、サーバにデスクトップ環境なんぞインストールしたことは無い。あくまで日常使用するクライアントPCでの話だ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ope&amp;quot;&amp;gt;操作体系はWindowsデスクトップ環境の影響が大きい。これはGNOMEやLXDEでも同じだ。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;kde&amp;quot;&amp;gt;使用しているディスプレイが大画面だったり複数枚だったりすると描画のスピードが追い付かずフリーズする場合があるようだが、それでも、Windowsが要求するハードウェアスペックよりは低性能でまったく問題無い。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cpu&amp;quot;&amp;gt;管理人の手許の環境では、ウィンドウを半透明に設定した[https://en.wikipedia.org/wiki/Dolphin_(file_manager) Dolphin]をぐりぐり動かすだけで、ディスプレイサーバとクライアント間の通信プロトコルであるWaylandのCPU使用率が2%台から30%台まで急騰する。これは、半透明なウィンドウがぐりぐり動く → 半透明の領域がディスプレイのリフレッシュレートに応じて変わる → 該当する領域を透過処理させる画像をリフレッシュレートに応じた枚数だけ演算・作成し続ける → 作成した画像がディスプレイサーバとクライアントの間で送信され続ける、という因果関係に依る。ディスプレイの解像度がWQHD(2560×1440)、RGBレンジがFull(16,777,216色)、リフレッシュレートが60Hzなので、秒間60枚、大きさがWQHDで16,777,216色を使用している画像の一部に透過処置を実行後、1枚も欠けることなく連続してディスプレイサーバに送信しているのだから至極当然だろう。30%台で収まっていることのほうが不思議なぐらいだが、これはひとえにハードウェアの進歩の賜物だろう。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;freeze&amp;quot;&amp;gt;そのため現在でもKDEの半透明を設定するオプションに「移動中のウィンドウは半透明にしない」という項目がある。これをONに倒すと、移動しているウィンドウの背景は直前の状態から変更されず、移動し終わった位置で背景の透過処理が走る。つまり、移動中のウィンドウに透過処理を実行しないため、CPUに優しい。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;kelvin&amp;quot;&amp;gt;ディスプレイの[https://en.wikipedia.org/wiki/Color_temperature 色温度]は6500Kだが、[https://en.wikipedia.org/wiki/Brightness 明度]は40%まで減光している。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=HP-91&amp;diff=6699</id>
		<title>HP-91</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=HP-91&amp;diff=6699"/>
		<updated>2025-03-02T04:50:34Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Pathnav|メインページ|RPN電卓|所有するRPN電卓本体|frame=1}}&lt;br /&gt;
&lt;br /&gt;
1976年3月1日〜1979年1月1日に販売された、HPでは初の、充電池で駆動できるプリンタ付き机上設置型の科学・数学向けRPN関数電卓。[[HP-45/HP-46|HP-46]]の純然たる後継にあたり、プリンタを機械式からサーマルプリンタに置き換えた機種である。ROMとRAMは第二世代にあたるWoodstockシリーズ向けに開発されたアーキテクチャを流用することで大幅なコストダウンを実現した。コードネームはFelix(ラテン語で「幸運」)。&lt;br /&gt;
&lt;br /&gt;
実装された関数は[[HP-45/HP-46]]と同じだが、購入者からの意見を踏まえ、関数としては時分秒の加減算&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {H.MS+}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {H.MS-}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、線形回帰&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {L.R.}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;と推定&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\hat{y}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;が、機能としてはユーザ用レジスタを6個(R&amp;lt;sub&amp;gt;&amp;amp;bull;0&amp;lt;/sub&amp;gt;〜R&amp;lt;sub&amp;gt;&amp;amp;bull;5&amp;lt;/sub&amp;gt;)&amp;lt;ref name=&amp;quot;bullet&amp;quot; /&amp;gt;、全レジスタ(R&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;〜R&amp;lt;sub&amp;gt;9&amp;lt;/sub&amp;gt;とR&amp;lt;sub&amp;gt;&amp;amp;bull;0&amp;lt;/sub&amp;gt;〜R&amp;lt;sub&amp;gt;&amp;amp;bull;5&amp;lt;/sub&amp;gt;)のクリア&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {CLEAR}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、レジスタ(R&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;〜R&amp;lt;sub&amp;gt;9&amp;lt;/sub&amp;gt;)のクリア&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {CL REG}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、レジスタ(R&amp;lt;sub&amp;gt;&amp;amp;bull;0&amp;lt;/sub&amp;gt;〜R&amp;lt;sub&amp;gt;&amp;amp;bull;5&amp;lt;/sub&amp;gt;)のクリア&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {CL} \Sigma&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;、数値表示に所謂ENGモードを追加実装している。&lt;br /&gt;
__TOC__&lt;br /&gt;
===机上設置型で唯一、プログラミング機能が未実装===&lt;br /&gt;
本機(と兄弟機種で金融・財務向けのプリンタ付き机上設置型RPN関数電卓である[http://www.hp-collection.org/calculators/92a.html HP-92])は、HPの机上設置型RPN関数電卓で唯一、プログラミング機能が実装されていない。それ以前に販売していた机上設置型はもちろん、本機発売の2年前には可搬型である[[HP-65]]にプログラミング機能を実装して好評を博したにもかかわらず、本機に無いということは、「敢えて省いた」と捉えるべきだろう。その明確な理由は不明だが、管理人は「本機が[[HP-45/HP-46|HP-46]]の純然たる後継機種だから」と推測している。[[HP-45/HP-46|HP-46]]は純正オプションを購入しないと7セグLEDによる数値の表示ができないうえ、印字中はもちろん待機中も常に活字ドラムがモータで回転しているため大きな音を発する機械式プリンタが不評だったのだろうか。「プログラミングは不要だがプリンタ付きのRPN関数電卓が欲しい」というユーザ層が購入する[[HP-45/HP-46|HP-46]]の需要を本機で満たそうとしたようだ。&lt;br /&gt;
&lt;br /&gt;
尤も、本機はあまり売れなかったようで、発売当初は定価を500ドル(約150,000円)に設定したものの、しばらくすると15％引きの425ドル(約117,000円)に、最終的には35％引きの325ドル(約63,700円)まで値下げされ、製品寿命もHP製関数電卓では異常に短い1年10ヶ月で迎えている&amp;lt;ref name=&amp;quot;eol&amp;quot; /&amp;gt;。その理由は、[[HP-35]]を皮切りにHP自身が作り出した「関数電卓＝可搬型」という市場動向もあって机上設置型の需要が漸減傾向だったこともあるが、そんなことよりも、本機を発売した僅か4ヶ月後の1976年7月1日に、プログラミング可能でより高性能な[[HP-67/HP-97]]を発売したことが大きい。特に、[[HP-67/HP-97|HP-67]]の定価を本機より50ドル安い450ドル(約132,750円)に設定したのは「何かの間違いではないか？」と今でも思う。翌1977年にようやくパーソナルコンピュータなるものが[https://en.wikipedia.org/wiki/Apple_II Apple II]として形になりつつあったものの、その定価は最小構成でも1,298ドル(約354,000円)という高嶺の花だったこの当時、科学者やエンジニアが近似値求解のために購入する関数電卓に実装されていて欲しい機能の優先度としてプリンタとプログラミングを比較すると、どうしてもプリンタの優先度は下がるからだ。即ち、1976年時点で既に、HP製のRPN関数電卓を求めるようなハイブロウな購入層には「プログラミング機能が必須」という思考が根付いていた証拠のひとつとして挙がるほど、本機の売行きは悪かったのだ。[[HP-67/HP-97]]が終売までの約5年半/約8年半、値下げせず定価を維持できたほど売行きが好調だったという事実も含め、このあたりの市場動向を当時のHPのマーケティング部門が読み誤ったと断じて良かろう。その後、HP製RPN関数電卓のプログラミング機能は、[[HP-67/HP-97]]での実装を基礎とし、ちょうど3年後の1979年7月1日に発売した[http://www.hp-collection.org/calculators/41c.html HP-41C]をはじめとするHP-41シリーズで大幅に発展・改良、大好評を以て受け容れられたことで購入者が増え、その副次的効果としてユーザコミュニティによるアプリケーションパックや周辺機器が同人製品として続々と市場に投入、それが呼び水となって更なる購入者を獲得して裾野が広がり…という好循環が、[[HP-41CX]]の終売となった1990年11月1日まで11年5ヶ月続く絶頂期を迎えることになる。&lt;br /&gt;
&lt;br /&gt;
先述の理由により、本機がeBayをはじめとするオークションサイトへ出品されるのは非常に稀で、少ないながらもコンスタントに出品される[[HP-67/HP-97|HP-97]]とは雲泥の差がある。出品されたとしても、サーマルプリンタは〝故障してるのが当たり前〟&amp;lt;ref name=&amp;quot;failure&amp;quot; /&amp;gt;なので、購入後に、RPN電卓マニアが売っている部品&amp;lt;ref name=&amp;quot;repair&amp;quot; /&amp;gt;を購入し自分で修理するか、有償で請け負うRPN電卓マニアに修理を依頼するかしないと、サーマルプリンタは使えないと考えるべきである。管理人はサーマルプリンタ修理済の2台を所有している。&lt;br /&gt;
&lt;br /&gt;
サーマルプリンタに装填できる純正感熱ロール紙(HP 9270-0513)は既に製造停止となっているものの、〝幅2インチ&amp;amp;frac14;＝57.15mm〟〝直径45mm〟を満たす市販の感熱ロール紙であれば転用できる。管理人が調べる限り、三栄電機製プリンタ[http://www.sanei-elec.co.jp/products/printer-sm1-21/ SM1-21]の専用補充品である[http://www.printy-net.jp/html/roll/p-57-45a.html P-57-45A]が、幅はまったく同じ、直径はほぼ同じなので、使用している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tan\frac{355}{226} \mbox{ [rad]}= {\color{Red}-7}507225.705\ (\varepsilon\!_R=1.33\times10^{-3})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\left (\frac{\ln 884736744}{\pi}\right )^2 = 42.99999997&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|スタック||3+1段&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|プロセッサクロック周波数||180kHz (Woodstock)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|使用電池||HP 82033A (4.8V 750mAh 充電池:中身はSC(Sub-C)形Ni-Cd充電池×4個直列)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造期間||1976年〜1978年&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|製造国||アメリカ → シンガポール、ブラジル&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot; style=&amp;quot;white-space: nowrap; background-color:#EEEEEE;&amp;quot;|1976年発売当時の定価||500ドル (約150,000円)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==脚注==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;bullet&amp;quot;&amp;gt;添え字の数字の前に[https://en.wikipedia.org/wiki/Bullet_(typography) ビュレット]を配したこの表記法は[https://literature.hpcalc.org/community/hp91-oh-en.pdf 附属マニュアル]に従った。増設された6個のレジスタ(R&amp;lt;sub&amp;gt;&amp;amp;bull;0&amp;lt;/sub&amp;gt;〜R&amp;lt;sub&amp;gt;&amp;amp;bull;5&amp;lt;/sub&amp;gt;)への数値の記憶手順が&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {STO}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;〜&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;5&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;だからである。即ち、それまであった10個のレジスタ(R&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;〜R&amp;lt;sub&amp;gt;9&amp;lt;/sub&amp;gt;)への数値の記憶手順は&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;\text {STO}&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;〜&amp;amp;nbsp;{{keypress|&amp;lt;math&amp;gt;9&amp;lt;/math&amp;gt;}}&amp;amp;nbsp;である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;eol&amp;quot;&amp;gt;製品寿命が1年9ヶ月だった機種としては、本機と同様、発売直後から販売不振で値下げを繰り返した[[HP-10]]も挙がるが、[[HP-10]]は四則演算のみの加算器方式電卓であるためHPの電卓の歴史でも例外扱いされており、HP製電卓の本分たる高級関数電卓にカテゴリを絞ると、本機の製品寿命が史上2番目に短い。最短は[[HP-10C/HP-11C/HP-15C|HP-10C]]の1年6ヶ月である。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;failure&amp;quot;&amp;gt;「ずっと同じ行に印字し続ける」「排紙ボタンを押下しても排紙できない」「新しい感熱ロール紙が装填できない」症状を指す。原因は、LF(ラインフィード)命令を受けて感熱ロール紙をプリンタヘッドまで1行毎繰り出す「紙送り機構」に組み込まれているプラスティック製の[https://en.wikipedia.org/wiki/Idler-wheel#Idler_gear 遊び歯車]の歯が、1巻80フィートのHP純正感熱ロール紙を2〜3巻印刷する程度の負荷で[https://en.wikipedia.org/wiki/Fatigue_(material) 疲労]折損するため。これにより紙送り機構が空転し、冒頭の症状を現す。ハッキリ言えば、この歯車の「素材の強度」と「回転数」と「回転トルク」の組み合わせが致命的に不適合であることを見抜けなかった、HPメカトロニクス設計陣のミスである。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;repair&amp;quot;&amp;gt;故障原因が「代替品を容易に製造できない半導体などの電子部品」ではなく「比較的容易かつ安価に製造できる歯車1枚」であることに気付いたマニアが、どうしても恢復させたい一心で、強度に優れたアルミや真鍮で代替となる歯車を製造、DIYで交換すれば恢復することが確認できたため、交換手順を無償で公開し、希望者には代替となる歯車を有償で頒布することで、(マニアの視点では)この故障は駆逐された。HPによる修理対応がとっくの昔に終了していることを理由にマニアの執念が起こさせた行動だが、素材をプラスティックからアルミや真鍮に代えたことで、もし現在でもHPが修理対応していたとしても、マニアによる修理のほうが製品寿命が延びるという珍奇な状況を呈するに至り、管理人を含む世界中のマニアは歓喜している。&amp;lt;br&amp;gt;ちなみにこのサーマルプリンタモジュール、プリンタ内蔵機種では[http://www.hp-collection.org/calculators/92a.html HP-92]と[[HP-67/HP-97|HP-97]]、周辺機器ではHP-41シリーズ用有線接続式サーマルプリンタの[[HP 82143A]]と[http://www.hpmuseum.net/display_item.php?hw=341 HP 82162A]にも流用されており、これらでもまったく同じ故障が発生する。&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=MediaWiki:Common.css&amp;diff=6695</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=MediaWiki:Common.css&amp;diff=6695"/>
		<updated>2025-02-23T01:33:18Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ここに記述したCSSはすべての外装に反映されます */&lt;br /&gt;
&lt;br /&gt;
#ca-nstab-main { display:none!important; } /*「ページタブ」を非表示とする*/&lt;br /&gt;
#ca-nstab-user { display: none !important; } /* 利用者ページタブ(個人の利用者ページのページタブ)を非表示とする*/&lt;br /&gt;
#ca-talk { display:none!important; }  /*「議論タブ」を非表示とする*/&lt;br /&gt;
#ca-history { display:none!important; }  /*「履歴表示タブ」を非表示とする*/&lt;br /&gt;
#ca-viewsource { display:none!important; }  /*「ソース表示タブ」を非表示とする*/&lt;br /&gt;
#ca-watch { display: none !important; }  /*「ウォッチリスト」を非表示とする*/&lt;br /&gt;
#ca-unwatch { display: none !important; }  /*「ウォッチリスト」を非表示とする*/&lt;br /&gt;
#ca-view { display:none!important; } /*「閲覧」タブを非表示とする */&lt;br /&gt;
#ca-protect { display:none!important; } /*「その他」→「保護」メニューを非表示とする*/&lt;br /&gt;
#footer-info-lastmod { display: none; }  /*「最終更新日時分」を非表示とする*/&lt;br /&gt;
#footer-places-privacy { display: none; }  /*「プライバシーポリシー」を非表示とする*/&lt;br /&gt;
#ca-viewsource { display: none !important; } /*「ビューソースタブ」を非表示とする。このタブは、ページの編集権限を持たないユーザーグループに属するユーザが利用する。*/&lt;br /&gt;
/* #footer-info-copyright { display: none; } */   /*「クリエイティブコモンズ」を非表示とする*/&lt;br /&gt;
/* #footer-places-about { display: none; } */   /*「概要」を非表示とする*/&lt;br /&gt;
/* #footer-places-disclaimer { display: none; } */   /*「免責事項」を非表示とする*/&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
	<entry>
		<id>https://www.tylor.jp/index.php?title=MediaWiki:Sidebar&amp;diff=6694</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://www.tylor.jp/index.php?title=MediaWiki:Sidebar&amp;diff=6694"/>
		<updated>2025-02-23T01:25:37Z</updated>

		<summary type="html">&lt;p&gt;Webmaster: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
/* ** recentchanges-url|recentchanges */&lt;br /&gt;
/* ** randompage-url|randompage */&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
/* * LANGUAGES */&lt;/div&gt;</summary>
		<author><name>Webmaster</name></author>
	</entry>
</feed>