投稿者: 平石

  • 量子コンピュータ関連書籍を読んで(その5)

    5.そもそも量子コンピュータって、何だっけ
     その後、何冊か読んだが、今回は、

       「スッキリ!がってん! 量子コンピュータの本(森 貴洋、ISBN978-4-485-60043-6)」

    を読んで、知識を深めたことを中心に述べたいと思う。
     この本では、「量子コンピュータの基礎」を、「今のコンピュータ」から説き起こしている。
     そして、「量子ってなあに」との問いに答える形で、基礎の基礎を説いている。
     そこでは、「量子」の「子」についての説明もある。

     しかし、なぜ〝量〟子なのかの問いには答えていない。
     筆者は、その説明が、以前に読んだ本にあったのを思い出し、その本

       「りょうしりきがく for babies (作:クリス・フェリー/監訳者:村山 斉、ISBN978-4-7631-3766-1)」

    を再度読みなおしてみた。

    5.1 そもそも量子って、何だっけ
     「りょうしりきがく for babies」は、一冊丸々が、量子(りょうし、quantum)って、何だっけの説明である。
     要約すると、

       ● 物質は原子から構成される。
       ● 原子の中では中性子と陽子が核となり、その周りを電子が走りまわっている。
       ● 電子が走り回る複数の「レール」があって、電子はどれかのレール上にある。
       ● 核から遠いレールほど、電子のエネルギーが大きい
       ● 電子がエネルギーをもらうと、遠いレールに飛び上がる。
       ● 電子がエネルギーを失うと、近いレールに落っこちる。
       ● この、もらうエネルギー、失うエネルギーの量は、レール対が決まれば確定する。
       ● この、確定したエネルギー量のことを、「量子」と言う。

    となる。
     ここでは、「量子」の実体が何であるかは分からない。
     また、原子とか電子とかが量子なのか否かも分からない。

     この本(りょうしりきがく for babies)の解説とネット情報などによると、上記の内容(前期量子論)は、1905年頃までのことで、その後、「なぜ電子はレールを外れないか」などについての理論の発展があり、「量子力学」として結実した。
     量子力学の特徴は、「量子は『波』である」ということである。
     「波」と聞くと、名画「神奈川沖浪裏」みたいなダイナミックな波を想像したくなるかもしれないが、ちょっと(かなり?)違う。何も波のようには動いてはいないが、「周波数」、「波長」、「位相(phase:topologyとは無関係)」と言うべきものがそれぞれあり、「重ね合わせ」ということができる点などが波と同じなので、「波」という言葉を使っている。

     「量子ってなあに」が一応分かったので、先に進む。
     「量子コンピュータ関連書籍を読んで(その1、その2)」において、「量子を使っているから量子コンピュータと言う訳ではない」ということを述べたが、「スッキリ!がってん! 量子コンピュータの本」でも、そう述べている。
     そして、「『量子』は今のコンピュータをつくるうえでも重要なのだが、『データ』には『量子』を使っていない。『データ』に『量子』を使ったコンピュータ、それが量子コンピュータだ。」と述べている。
     では、「『データ』に『量子』を使う」とは、どういう意味だろうか。

    5.2 量子コンピュータでのデータ
     ここに書くことは、どこかの書物とかに書かれているものとは限らない。筆者が諸文献を読んで、理解した内容である。

    5.2.1 「0」と「1」
     まずは、コンピュータのデータの基本、「0」と「1」。

     「りょうしりきがく for babies」において「レール上にある」と描かれていたことを拡張して、「状態」という言葉を使用することにする。重ね合わせがある状態は「重ね合わせ状態」、重ね合わせが無い状態は「純粋状態」と呼ぶ。
     「りょうしりきがく for babies」においては、レールは3本あったので、「原子核と1電子の組」の純粋状態は3つ、「レール対に対応したエネルギー」の純粋状態も3つある。
     このように、2つ以上の純粋状態があるとき、そのうちの1つをどれでもよいので決めて「|0>」と名づける。これは、今のコンピュータにおける「0」あるいは「false」に相当する。「スッキリ!がってん!」では「上向き矢印」とも言っている。
     さらに、|0>以外の純粋状態の1つをどれでもよいので決めて「|1>」と名づける。これは「1」あるいは「true」に相当する。「スッキリ!がってん!」では「下向き矢印」。
     「『どれでもよいので』って、そんないい加減なことで良いのか?。」と言われそうだが、筆者の理解では、良いのである。
     今のコンピュータでも、何を「0」とし、何を「1」とするかは、かなりいい加減だと思う。
     なお、「<…|」、「|…>」は、ブラ-ケット記法と呼ばれるもので、「<…|」をブラ、「|…>」をケットと読む。両方で「ブラケット」となる訳である。これらは、量子力学を記述するのに便利な記法として作られたが、量子コンピュータの理論においては、ケットのみを使用し、ブラは使用しない。

     さて、「上向き矢印」と「下向き矢印」があるなら、「右向き矢印」とか「斜め上向き矢印」があっても良い。「スッキリ!がってん!」には、そう言う意味のことが書かれている。
     実は、筆者は当初、「矢印」とあるのは「ベクトル」のことだろうと思って読んでいた。ベクトルとは、「大きさ」と「向き」を持つ量で、「平行四辺形の法則」によって、足し算(合成)と、足し算の逆演算である引き算が定義できるものであると認識している。
     しかし、「スッキリ!がってん!」に書かれた内容は、平行四辺形の法則とは似ても似つかない。
     「反対の向きを向いた矢印は、重なればなくなってしまう。」との記述があるが、これは明らかにウソである。
     たとえば、上向き(|0>)と下向き(|1>)は、反対の向きを向いているが、重ねても無くならない。
     その説明の中に「ブロッホ球」という言葉があったので、ネットを検索してみた。そして、「どうもこれは、私の知っている『ベクトル』ではないらしい。『矢印』という言葉はスッキリしない。」と考えるようになった。
     さらに、「この『矢印』を『ブロッホ・ベクトル』と呼ぶ人もいるらしいが、合点できない。」と思う。

    5.2.2 「0」、「1」以外のデータを球面上の点として追加
     では、「矢印」、「ベクトル」でなく、なんという言葉を使ったらスッキリし、合点できるのだろうか。

     筆者は、「時計の針」、「計器の針」の「針(hand)」が良いと思う(「針」という言葉は、誰も使ってないようだ)。
     時計の針なら、|0>は「上向き」なので12時を指し、|1>は「下向き」なので6時を指す。「右向き」は3時、「左向き」は9時。
     しかし、「前向き」とか、「後ろ向き」とかもあるので、時計の針が指せるところ(=円周上)だけでは足りない。
     それで全体としては球になるので、「ブロッホ〝球〟」。「ブロッホ」は、これを考えた人の名前らしい。


     球面になるので、地球における緯度、経度に相当するものを考えることもできる。

     但し、緯度に相当するものは、赤道からの角度ではなく、北極(=|0>)からの角度を用いる。
     だから、北極点は90度でなく0度、赤道上の点は0度でなく90度、南極点は90度でなく180度である。
     北緯なのか、南緯なのかを考える必要は無いし、欧米人が不得手なマイナスの数を考える必要もない。

     また、経度に相当するものは、東経のみを用い、西経は用いない。
     日付変更線を越えても日付は変わらず、180度以上となり、さらに進んでいって、360度に達する。そこでやっと日付が変わる。
     東経なのか、西経なのかを考える必要は無いし、欧米人が不得手なマイナスの数を考える必要もない。
     経度は、位相を表すということになるようだ。

    5.2.3 ブロッホ球面上の点に対する演算
     こんなに素晴らしいデータ表現ができても、実際にこれを使って計算ができなければ、意味がない。

     「『どれでもよいので』って、そんないい加減なことで良いのか?。」と上述したが、ブロッホ球面を作るにはそれでよいが、実際に計算に使用することができるためには、やはり、条件がある。
     どうも、ブロッホ球面上からブロッホ球面上への移動は、ブロッホ球面の中心を通る直線を軸として回転するということになる必要があるらしい。
     例えば、9時と3時を結ぶ直線を軸として回転すると、|0>と、|1>は、入れ替わる。これは、NOT演算に似ているが、前向きと後ろ向きが入れ替わるので、NOTとは、ちょっと違う。
     

     「● 電子がエネルギーをもらうと、遠いレールに飛び上がる。」は、「|0>→|1>」だから、ブロッホ球面上での移動だけど、…
     これは、「すべてを|1>にする」という演算になるように思えるが、「位相」を考えると、それはあり得ないらしい。
     

       「『量子コンピュータ』超並列計算のからくり(竹内 繁樹、ISBN978-4-06-257469-3)」

    を読んで、筆者の拙い頭で考えたのは、
     遠いレールに飛び上がった電子は、すぐにエネルギーを放出して、元のレールに戻る。
     元のレールには、はじめからあった電子と、戻ってきた電子とが「混在」する。
     結果として、はじめからあった電子とは、異なった位相となる。
    ということである。

  • 量子コンピュータ関連書籍を読んで(その3、その4)

    3.量子コンピューター・シミュレーター
     なんだか、たくさんの本を読んだみたいなタイトルだが、実は、読了したと言えるのは、

       「先読み!IT×ビジネス講座 量子コンピューター(湊雄一郎、酒井麻里子、ISBN978-4-295-01737-0)」

    一冊だけである。他には、読みかけの本が何冊かあるが、それ等については、またの機会に。

     この本には、量子コンピューター・シミュレーターが紹介されている。
     そのURLは、

    http://qplat-education.devel-q.com/

    である。このリンクを開くと、下図のような量子コンピューター・シミュレーター画面が表示される。この画面の表示は、ブラウザ等によって微妙に異なるが、内容としては同じである。

    画面は、3つの領域に分かれている。  

    • 左は、「ゲート」の一覧である。
    • 中央は、「キュービット」に「ゲート」を配置した図である。
    • 右は、「計算」結果などを表示する。

     「キュービット」(「量子ビット」とも呼ばれる)は、左端に各キュービットの初期値である|0〉を持つ水平の線で表示される。
     キュービット上では、時間は左から右へ進む。
     量子コンピュータでも、繰り返し処理は可能であるが、これはシミュレータなので、時間は一方にしか進まない。
     値|0〉は、古典コンピュータにおける0(false、yes/noのno、偽)に当たる。
     1(true、yes/noのyes、真)に当たるのは、|1〉である。
     単に0、1と書かないのは、これらが「ベクトル量」とでも言うべきものだからである。

     「ゲート」を、ドラッグ&ドロップにより中央部に配置し、中央部右上の「EXECUTION」をクリックすると、「計算」が行われ、その結果が右部に表示される。
     だだし、ゲート種別名に「two」あるいは「three」と付いているものは、複数の「キュービット」にまたがって配置しなければいけないので、後述する調整操作が必要になることがある。
     「ゲート」は、古典コンピュータにおける「ゲート」との機能的な類似性からそう呼ばれる。
     しかし、古典コンピュータとは違って、「ゲート」は、いわば「『量子』の照射のしかた」である。
     「量子」を照射することによって、そろばん珠を指で弾いたのと同様に、キュービットが「値」を変える。

     「ゲート」一覧の一番下にある、measurement「M」ゲートは重要である。これは、「計算」をするゲートではなく、計算結果を「観測」する。だから、各「キュービット」の一番右に、一つずつ置かれることになる。

     この本に説明のある、他のゲートについて説明しておく。
       pauli gate「X」。これは、キュービットの値を反転させる(コインをひっくり返す)。
       one qubit gate「H」。「コインを回す」と表現されている。
          表が出るか裏が出るか、「観測」されるまで分からないということ。
       two qubit gate「CX」。2つのキュービットの値により、計算結果が決まる。
          配置すると、黒丸と四角に「X」が縦線で結んだ表示となる。
          1つ目のキュービット(control bit)の値は不変。
          2つ目(target bit)は1つ目が偽のときはそのまま、1つ目が真のときは反転。
          つまり、2つ目は両者の排他的論理和となる。
       tree qubit gate「CCX」。3つのキュービットの値により、計算結果が決まる。
          配置すると、黒丸2つと四角に「X」が縦線で結んだ表示となる。
          1つ目、2つ目のキュービット(control bit)の値は不変。
          3つ目(target bit)は、1つ目、2つ目がともに真のときにのみ反転する。

     ここで、「CX」や「CCX」のような、複数のキュービットにまたがるゲートのキュービットの指定方法について述べておく。
     「画面右の[Result]を[Detail]に切り替えたうえでブロックをダブルクリックすると云々」とある。
     例えば「CX」と「CCX」をドラッグ&ドロップにより配置し、[Detail]をクリック。下図のようになる。

     「CCX」をダブルクリックすると、下図のようになる。
     このとき表示される数値は、黒丸2つと四角に「X」の位置であるが、先頭のキュービットの番号は0、つまり「ゼロオリジン」となっている。

     実は、筆者がマウスでダブルクリックしたら、[Detail]は空白のままだった。
     しかし、パソコンに内蔵のポインティングデバイス(タッチパッド)でダブルクリックしたら、見事に表示された。
     この発見に至るまで、数か月にわたり、この本の著者、コンピュータ・ユニオンのソフトウェア・セクションの特に技術部の方々にご迷惑をおかけしたことをお詫び申し上げます。

     [Detail]に表示された、[control bit1]、[control bit2]、[target bit]の数値を書き換える。
     すると、対応する黒丸2つと四角に「X」が、指定されたキュービット上に移動する。
     これで、当該の「CCX」は、配置したいところに配置された。

     

     中央部左上の「Qubits:5」とあるのは、使用する「キュービット」の個数。この数値を変更すると、表示される「キュービット」の個数が変わる。
     その隣の「Shots:1000」は、計算回数。古典計算機上では、同じ計算を多数回行うことで、確率が求められるので。

     中央部右にあるポリバケツは、配置されているゲートをすべて捨てる。「ご破算で願いましては」ということ。

     ポリバケツの下に並んでいるのは、中央部の表示倍率の調整用。

     

     シミュレータの操作法が分かった(と思えた)ので、やってみる。
     上2ビットの足し算で、3ビット目が10の位、4ビット目が1の位。下図が、その結果。

     最下行に、[ [ “0101”, 264 ], [ “1001”, 254 ], [ “1110”, 248 ], [ “0000”, 234 ] ]とあるが、
    これは、
      計算結果="0101"となったのが、264件
      計算結果="1001"となったのが、254件
      計算結果="1110"となったのが、248件
      計算結果="0000"となったのが、234件
    という意味である。計算結果は「観測」されたものなので、ベクトル量ではなく、スカラー量である。
     ちゃんと計算できているもののみであることが確認できる。

     

    4.量子コンピューターはピアノ?
     筆者は、以前、「量子コンピュータはそろばん」と書いた(量子コンピュータ関連書籍を読んで(その1、その2))。
     しかし、この本には、「ピアノの鍵盤のようなものが並んでいて、それを演奏するようなイメージ」とある。

     ピアノとそろばんとでは、かなり違う。
     どちらが正しいのか、あるいはどちらも正しいのか。

     そろばんは、指ではじくことによって、たまを動かして計算する。
     ピアノは、指でくことによって音を出し、人間のたまに働きかける。
     やはり、ピアノとそろばんとでは、一見、違うように見えて、よく似ている。
     だから、きっと、どちらも正しい。

  • 量子コンピュータ関連書籍を読んで(その1、その2)

    1.電卓型とそろばん型
     量子コンピュータに関する文献を読んで、もしかして、情報処理システムには「電卓型」と「そろ ばん型」があるのではなかろうかと思うようになった。
     電卓型は、たとえば下図。

     「ここから上は出力」、「ここから下は入力」で示したように、入力場所と出力場所とが、きっちり と分かれている。

     人間の脳の細胞(ニューロン)も電卓型。入力場所と出力場所は分かれている(下図)。

     「そろばん型」は、適切な画像が無いが、要するに、入力と出力が分かれていない。

    上図は、筆者が小学生の時に買ってもらったもの。


     そして、古典コンピュータ(従来のコンピュータ、現在のコンピュータ)は概ね電卓型、量子コン ピュータは必ずそろばん型となるらしい。


     それは、量子コンピュータが、「波の重ね合わせ」を計算するものだからだと思われる。
     例えば、少量の放射性物質と、それが放射性崩壊したときにそれを検知する検知器と、検知器に連動して瓶を叩き割るハンマーとを箱に入れて蓋をする。放射性崩壊は量子現象なので、ふたを開ける前は、瓶が「割れている状態」と「割れていない状態」との、波としての重ね合わせになっている。
    蓋を取らなければ、割れているのか割れていないのか決まらない。蓋を取って箱の中の情報を外部に出力すると、割れているか否かが確定してしまう。つまり「割れていない」と「割れている」の両方があったものが、一方だけになってしまう。
     「量子コンピュータは、このような箱をたくさん並べたようなもの」という意味のことが、「でたらめの科学 サイコロから量子コンピューターまで(ISBN:978-4-02-295104-5)」に書かれている。なので、計算の途中で「波の重ね合わせ」でなくなってしまい、瓶が割れているか否かが確定しては、まずいのである。

     「ゼロからわかる量子コンピュータ(ISBN:978-4-06-528299-1)」に、下図がある。

     この図で水平線は同一の〝もの〟である。〝もの〟としては一つであるが、〝状態〟は、複数の状態の重ね合わせである。
     量子コンピュータのプログラミングは、上図のなどの「ゲート」を、どこに配置するかを考えることになる訳である。
     量子コンピュータにおける「ゲート」は、「偏光を当てる」とか「磁場をかける」などの操作である。そろばんにおける、指の動かし方に相当するものだと思う。
     そして、ややこしいことに、「一番上の瓶が割れていない状態と、二番目の瓶が割れている状態の重ね 合わせ」などというのもありうる。上図で縦につながった「ゲート」は、このような、複数の瓶の状態の 重ね合わせに対する操作であろう。
     ということは、古典コンピュータのプログラムが、基本的に1次元であるのに対し、量子コンピュー タのプログラムは、ほとんどの場合、2次元以上となるのではなかろうか。
     ちなみに、は、状態を表現するもので、左側に縦線、右側に閉じ括弧(〉)を書く。

     

    余談:
     テレビの時代劇を見ていたら、五珠が2つ、一珠が5つのそろばんが使われていました。
     ネットを検索すると、「もともと13世紀ころ中国で発明された算盤は、重量の単位で1斤=16両、面積の単位で1市頃=16市畝など、16進数が計算できるように、五珠が2つ、一珠が5つだった。」ということのようです。


    2.量子を使っているから量子コンピュータと言う訳ではないということ
     今日使われている、いわゆるノイマン型コンピュータは、「電子計算機」とも呼ばれている。「電気 計算機」とか「電動計算機」とか言うと、別のものになってしまう。つまり、電気を使用していることが 本質なのではなく、電子を使用していることが本質なのである。
     そして、電子は、量子の一種である。
     今日のコンピュータには、半導体が使われている。半導体にはn型半導体とp型半導体があって、それらの薄片を何層にも貼り合わせたものを使う。
     そして、電流は、p型半導体からn型半導体へは流れるが、n型半導体からp型半導体へは流れ ない。
    しかし、そのn型半導体のところにもう一つp型半導体をくっつけて、そのp型半導体からn型半導体に電流を流すと、流れなかったn型半導体からp型半導体への電流が流れる。
     この不思議な現象は、量子論によらなければ説明できない。そもそも、なぜn型半導体とp型半導体とが存在するのかが、量子論によらなければ説明できない。
     今日のコンピュータは、これらの量子現象を演算処理等に使っている。
     量子を使っているにもかかわらず、今日普通に使われているパソコンやスーパー・コンピュータ は、量子コンピュータではない。
     たとえば、「量子コンピュータの衝撃(ISBN:978-4-299-00338-6)」には、「古典コンピュータは電 子を使っているのに、何故量子コンピュータと呼ばないのか」という疑問が表明され、それなりの回 答を示している。しかし、「粒子の数が多くなると波のように見える」などと的外れなことを言ってい る。
     筆者は、この回答も含めた諸々の考察の末、「電子を個別処理するのが量子コンピュータ、 電子を集団で処理するのが古典コンピュータ」という結論に達した。

     

    【参考にした文献】(量子コンピュータ関連書籍+平石の一言.pdf)

  • canvasについて続編2―ミウラ折りのデモ

     何年か前、「スマホを2本指でスワイプすると、文字と画像が大きくできる。だけど、画面全体は元のサイズなので、端の方が途切れてしまう。画面も大きくなるようにできないものか。」というような会話をしました。

     ややあって、その会話と、何かで見た宇宙ステーションの発電パネルが宇宙空間で広がっていく映像とが私の頭の中で混ざってしまいました。宇宙ステーションの発電パネルは、打ち上げ時には小さく折りたたまれており、宇宙に飛び出て、ほとんど一瞬の間に、いっぱいに広がります。この折り方は、発案者三浦公亮氏の名前を採って「ミウラ折り」と呼ばれています。

     ミウラ折りは、下図の各辺で折り曲げる折り方です。各辺では折り曲げるけれど、各平行四辺形の内部では折り曲げません。そして、谷折りと山折りをうまく組み合わせることで、ほとんど瞬時に閉じたり開いたりできるのです。

         
       

     

     上図は、広げた状態の図ですが、右下の小さな赤丸の近くをクリックすると、少しだけ折った状態の図になります。そのまま、左ボタンを押したままマウスカーソルを動かすと、閉じたり開いたりできます。

     また、右側にある「軌跡の表示」ボタンをクリックすると、赤丸マークの動く軌跡が表示できます。これは、直線でも円でもありません(双曲線の一部ではなかろうかと思いますが、未確認です)。

     右下の「手動⇒自動」ボタンをクリックすると、閉じたり開いたりの動作を自動的に繰り返し表示するようになります。

     上図には、3×3=9枚のパネルが表示されています。左側に表示した縮小図の当該位置をクリックすることで、表示するパネルを2×3、3×2、あるいは2×2にすることができます。枚数が多すぎて複雑になって見づらい場合などに活用してください。

     もし動かない場合は、タイトル「canvasについて続編2―ミウラ折りのデモ」をクリックして単独表示にしてみてください。

    (これは、「canvasについて」の続編です。)

  • canvasについて続編―詰将棋をちゃんと動くようにしてみた

    canvasについて」に描いた詰将棋を、実際に動くようにしてみました。

    おかげでHTMLとJavascriptについて、大変勉強になりました。canvasを3枚重ねて使っているのですが、下手をすると、下にある「一覧表示 ▶︎ Webノウハウ, スタッフの日記, ブログ」とある箱まで重なってしまって、何やらわからないことになってしまうのに苦労しました。

     

    上図の駒をマウスでドラッグすると、将棋のルールに則って、動かすことができます。ぜひ、やってみてください。

    もし動かない場合は、タイトル「canvasについて続編―詰将棋をちゃんと動くようにしてみた」をクリックして単独表示にしてみてください。

    なお、canvasを重ねて使う方法については、けーちゃんのプログラム開発ノート【JavaScript】 Canvasでレイヤーを表現する(https://note.affi-sapo-sv.com/js-canvas-layer.php)を参考にさせていただきました。

     

     

  • canvasについて

    HTML5のcanvasについて調べてみました。

    それで、やあっとこんなことができるようになりました。

    上の枠内で、マウスのボタンを押しながら、マウスを動かしてみてください。 をクリックしてからやると、色が付きます。

    次に、詰将棋とかをやってみようと思い、絵は描くことができました。しかし、今回は、動作は断念しました。だから下図で「金」をドラッグしても、何も出ません。

    いろいろ研究してみれば、もっといろんなことができそうです。

    ただ、いちいち script を書かないといけないのが、ちょっと煩わしいです。

     

  • 「ャtト」って、こういうことだったんだ

     ネット上で時々見る意味不明の言葉「ャtト」について、ひょんなことから判明したので、ここに記しておくことにします。

     まず、その「ひょんなこと」について。
     現在開発中のシステムで、「予算実績管理表」というものをpdf出力するテストを行いました。ファイル名は、“予算実績管理表_~.pdf”としたつもりでした(「~」の部分は補足情報)。ところが、“落Z実績管理廟~.pdf”なるファイルができてしまいました。“予”が“落”、“算”が“Z”、“表_”が“廟”に文字化けしてしまった形です。
     ネットを探しても、対処方法が分からず、文字の順序を変えたり、前後に他の文字を入れたりすると、ということをいろいろ試してみて、ついに、“予”の後ろと“表”の後ろに“\”を入れると、期待した正しいファイル名になることが判明しました。

     「文字“表”の後ろに“\”」で、思い出したことがあります。
     かなり昔、ソースプログラムの“表”という文字の後ろには“\”を付けないと、文字化けしたり、コンパイルエラーになってしまったりというコンパイラがありました。
     これは、“表”という文字のShift-JISでのコードが「955c(16進表示)」で、2バイト目が「5c」つまり“\”と同じなので、エスケープ文字(“\n”(改行)などとして使われるもの)と判断されてしまうからです。そこで、“\”+「文字」の機能の一つである、「“\\”が“\”という文字1文字を表す」ということを利用します。つまり、“表”という文字の2バイト目がエスケープ文字の“\”、その後ろにさらに“\”を付けることによって、“\\”となり、「“\”という文字1文字」となって、最終的に“表\”は“表”となり、また、後続の文字もちゃんと正しく処理される訳です。

     そこで、“予”についても、2バイト目が「5c」なのではないかと調べました。その通りでした。
     さらに、2バイト目が「5c」のものを探してみると、“ソ”(835c)がありました。
     もし、“ソ”についても同様の文字化けが起き、“\”を付けると文字化けしないなら、文字化けの原因はこれであり、他の文字も、2バイト目が“\”だったらその後ろに“\”を追加することで、文字化けを防ぐことができると考えられます。
     そして、“ソ”を含む文字列として、“ソフトウェア”を用いることにして、実験。

     その実験結果のファイル名を見て、声を上げてしまいました。
     実験が成功したからでも、失敗したからでもありません。
     “ャtトウェア”となったからです(“ャ”は小さいカタカナ、拗音)。
     この、あちこちのサイトで見かける意味不明な文字列。ファイルをダウンロードするとファイル名中に見られることのある意味不明な文字列。ついに、その意味が、分かったからです。

     “ソ”は「835c」、“フ”は「8374」、「5c」がエスケープ文字“\”とみなされると、次の文字「83」あるいは「8374」は“\n”とかの“\”と組み合わせて特別な意味になる文字でないので、この“\”は無視されてしまい、「83 83 74」となります。「8383」は“ャ”、「74」は“t”なので、結果として、“ャtトウェア”となる訳です。

     おまけ。
     今回のきっかけとなった“予算”と“表_”については、
       予=975c、算=8e5a、結果として「97 8e 5a」=落Z
       表=955c、_=5f、結果として「95 5f」=廟
    となってしまっていました。
     対処としては、

      $fileName = mb_convert_encoding($fileName, "SJIS-WIN");

      header('Content-Disposition: attachment;filename="'.$fileName.'"');

    の間に、

      $fileName = str_replace('\\', '\\\\', $fileName);

    を入れました。“'\\'”とあるのは、“\”1つの意味。“'\'”としてしまうと“'”の意味になってしまいます。

  • MS-AccessでYes/No型項目をコンボボックスにすると不思議なことが

    あるMS-Accessのシステムのバージョンアップで、「あり」と「なし」を値とする項目が必要になったので、テーブルに当該の項目をYes/No型として追加しました。

    そして、その値を設定するフォームを作成して動作確認したところ、・・・

    コンピュータは 何かやってるんですが、フォーム上の表示では空白にしかならないんです。

    下図は、この事象の調査のためにいろいろやってみたものです。「対象の有無」とあるコンボボックスがその項目だと思ってください。

    ここでコンボボックスをクリックしてドロップダウンさせると、「あり」と「なし」が表示されます。

    ここで、「あり」を選択しても、コンボボックスの表示は空白のままなんです。

    これが「不思議なこと」とタイトルで言っていることです。

    よくよく目を凝らして、フォームの左端のレコードセレクタを見ると、鉛筆マークになっている。つまり、何かが変わったということです。

    そこで、テーブルの内容がどう変わったのか確認してみました。

    なんと!、値が「-1」になってるんです。

    「True」と「False」でも、「Yes」と「No」でもなく、「-1」と「0」なんですね。

    この項目のルックアップを確認すると、「True」と「False」にしていました。

    そこで、「-1」と「0」に直しました。

    そして、テーブルの内容を初期値に戻してフォームを表示してみると、下図の通り。目的通りの表示です。

    コンボボックスをドロップダウンしたときの表示はちゃんと現在の値に対応したところ:「なし」が選択され、「あり」を選択の結果も目的通りの結果でした。

    どうも、コンボボックスの値集合ソースでは、すべて文字列として処理されるみたいです。だから「True」と書くと「"True"」という文字列として処理されてしまう。そして、テーブル上の「-1」とは一致しないので空白表示になるようです。ところが、「あり」を選択して「"True"」を設定させようとすると、「"True"」を「-1」に変換してくれるわけです。「Yes」でも「-1」に変換してくれますが、「はい」だとエラーになります。この中途半端さが、いかにもMS-Accessらしいですね。

    という訳で、「Yes/No型の項目をコンボボックスで処理するときは、『-1』と『0』にすべし」と覚えておこう。

  • MS-Wordで「図形」で絵を描いてWebページにしたら絵が見えない!

     私は、技術研究と趣味と脳の老化防止のために、Webサイトを作ってます。

     そのサイトに、MS-Wordで作ったWebページを公開したら、一生懸命描いた絵が、まるっきり見えなくなるし、後ろの方は何行も空白が続くしで、かなり焦ってしまいました。とりあえず、絵は見えるようになったし、後ろの空白も無くせたので、後のために記録を残しておこうと思います。

    1.何をやったのか。

     1-1.MS-Wordで、「図形」を使って絵を描きました。

     1-2.これを「ファイル」の「名前を付けて保存」で、「Webページ」として保存。

     1-3.保存した結果をMicrosoft Edgeで読んでみる。なんと!。絵が無くて、前後の文は表示されて、後ろはずっと空白。

     

    2.どこがいけなかったか、試行錯誤。全部書くと大変なことになるので、うまく行ったことだけ書くことにする。

     2-1.「名前を付けて保存」で「ツール(L) ▼」に気づく。「▼」をクリックしてみる。

     2-2.「Webオプション(W)」とあるので、クリックしてみると、Webオプション設定ウィンドウが。下から2行目の「VMLを使ってグラフィックスをブラウザーに表示する」が怪しい。

     2-3.「VML云々」のチェックを外して保存してみる。

     2-4.Microsoft Edgeで読んでみると、めでたしめでたし。

     なお、この絵は、テストおよびこのブログへの投稿用に作ったものです。私のサイトの問題のページは下記です。

    囲碁を開集合による位相数学で説明してみる

  • 現金での出資を正味財産に反映させたい、借入金とその返済を予算化したいなど

     先だって、あるユーザから「現金での出資を正味財産に反映させたい」とのご質問がありました。

     また、かなり古い話ですが、別のユーザから「借入金とその返済を予算化したい」とのご質問がありました。

     これらは、いずれも「見返し勘定」という考え方で、対処できるのですが、すぐ忘れてしまうのでここに書いておきます。

     取引というものは、通常、2つの側面を持っています。これを「借方」と「貸方」という言葉で表現します。私見ですが、見返し勘定とは、ある取引は4つの側面を持っていると考えるのです。

     

     たとえば、「現金での出資」は、「現金が減る」という側面と、「出資金が増える」という側面があります。通常の仕訳では、これを、借方に出資金、貸方に現金とします。そして、正味財産は、相殺されて増減無しです。

     この「取引」に、あと2つの側面があります。その1つは「正味財産に反映させたい」という気持ちです。もう1つは「現金を支出した」という気持ちです。この2つは、実際に何かが動いたということではなく「気持ち」なのですが、後々まで残したいので、勘定科目として建てます。

     具体的に考えてみましょう。

     まず、「現金」はCcu会計/Web会計では、「科目コード=1101」として存在します。

     次に、「出資金」は、資産(権利が自分にある)で、固定的(すぐ返ってくるわけでない)なので、たとえば「1501」としましょう。

     「正味財産に反映させたい」は、Ccu会計/Web会計では、「科目コード=3000 資産見返し剰余金」があるので、その補助科目として定義することにします(独立の科目としても可)。

     「現金を支出した」は、支出なので、5000台で定義します。たとえば、「5501」で科目を定義し、補助科目を用いることにします。

     伝票は、下図の通り。

     なお、出資をやめて、出資金が返ってきたときのことを考慮して、「出資返戻収入」というような収入科目を設けることもできます。

     

     「借入金とその返済を予算化したい」は、「借入金」は資産でなく、負債であるところが異なりますが、ほぼ同様に対処できます。

     Ccu会計/Web会計では、負債科目である借入金についての予算は立てられませんが、「借入金収入」、「借入金返済」をそれぞれ収入科目、支出科目とすることで、予算化できるようになります。

     借入金の借り入れ、一部返済は、それぞれ、下図のようになります。