コンピュータの最近のブログ記事

今勤務している会社に勤め始めて、特許調査の仕事を開始したのは約5年前だが、検索式の作成の効率がどうもよくないので、自分になり工夫して、Perlで検索式アセンブラを書いた。

私が業務中に特許調査用に書いたツールは、これ以外にも100個以上あるが、業務効率に一番利いているのは検索式アセンブラである。そこで、ブログでソースコードを公開して、興味がある人(いないと思うが)に使ってもらおうと思った。ただ、そのためにはこのプログラムの著作権が会社でなく、私になくてはならない。そこで一応念のため、部門長に確認して、私に著作権があると判断してもらったので、ソースコードを持ち帰ることにした。

とはいえ、会社の規則では、自分個人のメールに添付ファイルを送ったり、会社で自分のGoogle Driveに入ったりすることは禁止されているので、ソースコードを印刷してハードコピーのかたちで持ち帰ることにした。そうやって、自宅で地味に秀丸で書き写していたのだが、折角なので、木本裕紀著「業務に役立つPerl」技術評論社にあるような現代的スタイルに書き直すことにした。それでも、もともとが古臭いスタイルなので、書き直しても垢抜けなさはどうしようもない。ともかく、以下のようなコードである。


# 検索式アセンブラ

use strict;
use warnings;

# ソースファイルの指定
my @FF = qw/query1.txt query3.txt/;

foreach my $z (@FF)  {
  printf "%s",jpnqconv($z);  # サブルーチンの呼び出し
}

# 処理本体のサブルーチン
sub jpnqconv      {
 my $fi = shift;   #ソースファイル
 my $fo;           #出力ファイル	
 my $p;            #ポインタ

# 出力ファイルの用意
 if (( $p = index $fi,'.') > 0 )    {
   $fo = substr($fi,0,$p) . '_a.txt';
 }  else                            {
   $fo = $fi . '_a.txt';
 }
 
 my %PTN;
 undef %PTN;  #パターンマッチング用のhash
 
 open my $fin, "<$fi" or die "$fi not found.";
 open my $fout, ">$fo" or die "$fo file open error. ";
 
 my $L = 1;  # line counter
 my $s;
 my $t;
 my $u;
 my $i;
 my $x;
 my $R;
 
 while (<$fin>)                    {
   chomp;
  
  if ( substr($_,0,1) eq '#' )  {
    next;
  }
  
  if ( substr($_,0,1) eq ':' )                            {
   $L--;
   $s = $_;
   $t = sprintf "#%d",$L;
   $PTN{$s} = $t;
   $L++;
  } else                                                  {
     $u = substr($_,0,3);
     unless ( $u eq 'IC=' || $u eq 'FI=' ||
              $u eq 'UC=' || substr($_,0,4) eq 'CPC=' )      {  # /1や/2などの相対指定ラベルの置換
        for ( $i = 1; $i <= 9; $i++ )        {
            $s = sprintf "/%d",$i;
            $t = sprintf "#%d",$L - $i;
            $_ =~ s/$s/$t/g;
        }
        foreach $x (sort keys %PTN )         {        # :ABCのようなラベルの置換
            $_ =~ s/$x/$PTN{$x}/g;
        }
     } # end of unless
     
     printf $fout "%s\n",$_;
     $L++;
  }
 }  # end of while
 close $fin;
 close $fout;
 
 $R = sprintf "%s has been generated.\n",$fo;
 return $R;
 
} # end of subroutine

次に、このプログラムの処理を例示する。 以下が、JPNETのための、もとの検索式とする。

// sample query
IC=G06F*
FI=G06F*
T=/2+/1
:class
// 特許ステータス
STS=Z01+Z03
:sts
// キーワード
HTC=ハードディスク + HDD
UTC=(フラッシュ)<5W>(メモリ)
T=/2+/1
:keywords
T=:class&:sts&:keywords

ここで、/2や/1が相対位置ラベルであり、:classのように:で始まるのが絶対位置ラベルである。絶対位置ラベルの:は行頭になくてはならず、絶対位置ラベルの行には他に何も書いてはいけない。絶対位置ラベルは後置式であり、そのラベルの一つ上の行を示す。/2は例えば、2行上の検索式の位置を示す。/9から/1までが使える。

これの変換結果は、以下のとおりである。

// sample query
IC=G06F*
FI=G06F*
T=#2+#3
// 特許ステータス
STS=Z01+Z03
// キーワード
HTC=ハードディスク + HDD
UTC=(フラッシュ)<5W>(メモリ)
T=#8+#9
T=#4&#6&#10

この結果の式は、JPNETでそのまま走る。たったこれだけの機能であるが、式を書き直してJPNETで走らせて、その結果をみて式を改良していく、という目的には便利である。行番号のずれを全く気にしなくていいからである。検索式が長くなるほど、威力を発揮する。

かなり前、知り合いが私のスマホをみて、それでは画面が露出されているので、傷つくおそれがあるから、手帳タイプのスマホ・カバーを買った方がいいとアドバイスしてくれた。

まあそうだね、と思いつつ、なんか面倒なのでそのままにして、数か月がたったとき、通勤途中の駅でショッキングなシーンに出会った。私が電車を降りたとき、私に続いて降りた女性が手にスマホをもっていたのだが、スマホが手から滑り落ちて、電車とホームの狭い隙間に落ちてしまった。それをじっと見ているほど暇ではないので、そのまま私は立ち去ったが、スマホを落としただけなのにのストーリーが思い出されて、自分は駅ではスマホをもってうろうろしないようにしないと、と自戒した。

それでも、つい駅のホームでスマホで確認したいことがないとはいえない。それで、手帳タイプのスマホ・カバーなら、ストラップを付けたりして、裸のスマホをもっているより落としにくいと思った。それで、ある休日、手帳タイプのスマホ・カバーを買おうと、自宅近くのドコモ・ショップに行ってみた。すると、少なくとも3000円以上で、思ったより高いのでがっかりした。そこで、もしや、と思い、そこから歩いて10分程度のホームセンターに行ってみた。

そして、スマホ用品のコーナーに行ってみると、スマホ・カバーは全く置いてないようである。がっかりして、店を出ようとして、ん?と思ったのは、モバイルチャージャーを見つけたからである。電車の中でスマホのバッテリ残量が下がってくると、焦ることがあり、モバイルチャージャーがあればいいと何度も思った。百均にも乾電池式のモバイルチャージャーはあるが、電池は使い切ると邪魔になるので充電式がいいよね、と思いつつ、なかなか適当なのを見つけきれずにいた。まあ、あまり真剣に探したわけではないが。で、まさにこれが充電式のモバイルチャージャーなのだった。メーカーは、オーム電機。知らなかったが、ホームページでみると、充電器、USBメモリ、マウス、各種ケーブルなどの製品がある。そこにあったのは、フル充電でスマホの充電1回分と、2回分と、4回分の三種類である。4回分は3000円超で、2回分で1800円程度、1回分で1000円程度で、1回分は少なすぎるので、2回分を買った。

自宅で試してみると、このモバイルチャージャーは、厚みはスマホよりあるが、大きさはスマホの半分程度で、持ち歩くにも便利である。4目盛のLED表示があり、充電残量に応じて、表示が変わる。フル充電には約四時間かかった。フル充電した状態で、30%まで残量が減ったスマホに充電してみたら、普通にUSBケーブルで充電するのと同じ様子で安心した。スマホにフル充電したら、LED表示はきっちり2目盛まで下がった。仕様どおりでなかなか律儀である。

ちなみに、モバイルチャージャーにチャージするには、タイプBのUSBケーブルで、給電プラグにつなぐ。これがチャージ・インである。私は、コンセントに常に、USB給電用の装置を挿している。モバイルチャージャーには、タイプAのUSBポートがあり、ここからスマホなどに給電する。これがチャージ・アウトである。私のスマホの充電は、タイプCのUSBケーブルを使うので、モバイルチャージャーについてきたタイプBのUSBケーブルは使えないが、タイプCのUSBケーブルの予備のケーブルも、タイプBからタイプCへの変換プラグもあるので、どうにでもなる。もちろん、タイプBのUSBプレーヤーの充電にも使える。

なお、折角なのでやはり手帳タイプのスマホ・カバーを買おうと、ホームセンターから歩いて10分程度のコジマ電気に行ってみた。すると、ほとんどがiPhone用なのでがっかりしたが、探したらAndroid用もあった。あったのはいいが、機種依存で困ってしまった。機種によってカメラの位置など、微妙に違うかららしい。私が使っている機種のAQUOS用がなかなかなくて、AQUOS sense2というのがあったので、これですかね、と店員に聞いたら、それでは駄目でAQUOS senseなのだという。実にややこしい。色違いが2種類しかないので、仕方なく紺色の方を買った。税抜きで3200円程度と、ちょっと高かったが、仕方がないか。指を差し込んで、落としにくくする工夫があって、ありがたい。

結局、この日は、モバイルチャージャーと、手帳タイプのスマホ・カバーと、スマホ関係のグッズが買えて、満足な一日だった。

今まで何回も似たようなことを書いた気がするが、いかにも老人的に、また過去の記事の繰り返しのようなことを書いてみる。それは、私が仕事用に作成したツール群のことである。

すなわち、私は今の会社に入って特許調査の仕事を従事するようになったとき、できれば慣れたツールを使いたいと、外資系のときから使っているJP-NETの使用を部門長に申し出てみた。他の人は当時、PATOLISまたは、NRIサイバーパテントを使っていた。

一応私も、NRIサイバーパテントを使ってみたのだが、どうも私には慣れていないというか、使いにくいのだが、我慢していた。そんなとき、部門である面倒な特許調査の仕事がはいり、入社時にコンピュータ・プログラミングが得意と宣伝していたので、私にできないか、と打診がきた。それで、これはいいチャンスと、JP-NETとPerlの使用を許してもらえたら、なんとかしますよ、と豪語してみた。

なんか上司は怪訝そうだったが、そういうならと、両方の使用を特例のように許してくれた。私はその機会を捉えて、渾身の努力で、目標を達成した。これで晴れて公認になったので、それから今に至るまで、JP-NETとPerlを駆使し続ける日々が続いている。

そこで、フランスの自転車レースのツール・ド・フランスをもじって、ツール・ド・パテントと称して、ここに至るまでのツールの行程を述べてみる。

そこで私が目指したのは、検索式アセンブラである。すなわち、特許の検索式は、複数の行をもち、先の検索結果を後で呼び出すときは、行番号で呼び出さなくてはならない。ところが、検索式の行を追加したり、削除したりする度に、行番号が変わってしまう。特許検索システムの方である程度行番号変更による番号の振り直しの機能はあったりするが、対応できる場合はかなり限定されてしまう。そこで、行に適宜ラベルを付け、ラベルで検索式を記述できるようにした。これのプログラミングは、Perlの文字列置き換え機能を使うと極めて初歩的で、プログラミング的にはなにも見るべきものはないが、実務的には極めて有用であった。

というのは、検索式というのは、まず最初に簡単な式を書いて、件数など結果を見ながら、何十回も書き直すのだが、そこでいちいち行番号に配慮していたら、たまったものではない。アセンブラ・ライクに、ラベルで式を記述できると極めて楽である。このツールを駆使することで、多分今までの倍くらいの能率を達成できるようになった。

次に目指したのは、報告書の表作成ツールである。すなわち、特許の一覧表を報告書の一部として作成することがいつも必要なのだが、エクセルを開いていちいちエントリを打ち込むのはあまりに能率が悪い。

そこで、JP-NETのcsv出力を、所定の変換処理を含めて、tsvに変換するツールを作成した。変換処理とは例えば、20081203のような日付を2008/12/03と変換したり、20160033211のような出願番号を、特願2016-33211のように変換することを含む。これも、自明のようだが、件数が多いと、手で書いていたら大変である。また、tsvが便利なのは、一旦テキスト・エディタで開いて、クリップボードにコピーし、エクセルの表で一気に貼り付けられるからである。

Perlのツールの出番はこれだけではない。例えば、検索結果を出願人名で集計する場合、大抵の人はエクセルのピボット機能を使うらしいが、私はPerlのハッシュを使ったカウント機能を使うので、もっと柔軟性がある。また、出願人名特有の名寄せも、名寄せサブルーチンを作って、順次修正していけばよい。同様の機能は、バブルチャート用のデータを用意するためにも使用できる。

Perlのツールは、特許用だけでなく、単にファイルをタイムスタンプ・ベースでコピーするなど、一般ツールとしても作成した。

こうしていろいろ作成していたら、入社以来5年が経過して、作ったツールの数は300個を超えた。機能的に重複しているものも沢山ある。バグがあるものもある。ともかく、自分が作ったものでも、仕様が分からなくなったので、比較的仕事が暇なときに、主要な50個くらいのツールを選んで、ソースコードを眺めながら、使い方をノートに記していった。このノートは、仕事をする度に何度も参照している。ところが、ノートを作成した後も、かなり頻繁に追加のツールを作成しているので、仕様の文書化はなかなか追っつかない。

ここ数か月で、今までにないエクセルの機能の表をPerlで作成した。それは、縦30、横10くらいの表で、各々の行と列に、個別の機能が関与し、その各々に部分検索式がある。そして、個々のセルの検索集合は、部分検索式同士の共通部分となる。私はその個々のセルの共通部分毎に、JP-NETの機能における、DNOという拡張子のファイルとして個別にディスクに書き出した。DNOには、特許の公開番号や登録番号が独自のフォーマットで書かれており、私はその独自のフォーマットと、実際の特許公報の対応を解析し、別途ファルダに一括保存した特許公報へのリンクを生成した。この機能により、個々のセルに配置した、一つ以上のリンクから、特許公報を開くことができる。

ともかく、第二の定年がそんなに先ではないが、ここまでJP-NETとPerlを駆使して、効率的に仕事ができて幸いであった。こう書くと、私がツールだけを重視しているように思われるかもしれないが、私の信念は、特許実務であれ、特許調査であれ、特許業務は、技術の理解が8割であり、1割が法律及び記載フォームの知識であり、ツールはあくまでも補助である。

Windows Update

user-pic
0

今まで、Windows Updateというタイトルで、何度ブログを書いたか、記憶にないが、相当な数であることは確かである。

それでまた最近、屋上屋を重ねてみたくなった。この記事の前提として、Windows 10のOctober Updateがある。それは年に2回、春と秋にある恒例の大型アップデートなのだが、余りに重いので、毎回憂鬱になるほどである。それは、下手したら半日を要するほどである。

その春秋定期アップデートの別の問題は、マンスリーの定期アップデートのふりをして、しれっとやって来ることである。

これに関して私には苦い思い出がある。子供の頃、母に連れられて耳鼻科に行った。母は、ちょっと喉の具合を見てもらうだけだというので、特に緊張してはいなかったのだが、突然、頭の中に閃光が走り、意識を失いそうになった。扁桃腺を切られたのである。

当時は、それが喉が腫れないようにするのに有効だと信じられていたようである。多分今は、そんな乱暴な手術はしないはずである。ともかく、そのあと痛くて、何日もまともに食べれなかった。子供心に冗談じゃないぜ、と思った。

戻って、ウェブをチェックしていると、今年の秋のアップデートであるOctober Updateは、なんでも、何かのファイルを勝手に消すという重大なバグがあって、リリースが見送られている、とあり、なんか嬉しくなった。このままお蔵入りになればいいと願った。

それでマンスリー・アップデートは、安心して実行してきたのだが、12月12日のマンスリー・アップデートでついに、奇襲攻撃でOctober Updateが来襲した。それは本当に、普通のOSのアップデートの貌をしており、全く見分けがつかない。なので、朝4時過ぎに起きてWindows Updateを開始し、出勤前に終えてしまおうと思った。

ところが、ダウンロードが異様に重い。しまった、と気づくのに数十分を要したがもう遅い。ついに、そのまま放置して出勤せざるを得なくなった。無意味に動揺したのはきっと、子供時代の扁桃腺の悪夢が蘇ったからだろう。

そしてなんとなく落ち着かない気持ちで1日仕事をして、帰宅してみると、とりあえず導入が終わっていて、ほっとした。ただ、再起動待ちで止まっていたけど、勝手にリブートしてくれればいいのに、と思った。

これでともかく安心だね、と思ったら、綾があった。再起動したらなんと、グーグル・ドライブとの同期が切れてしまって、うまく回復しない。これは困った、と思った。グーグル・ドライブは、スマホとパソコンを繋ぐ命綱なのである。それでともかく、グーグル・ドライブを設定するツールを再度走らせたら、アカウントやパスワードを再入力することなく、グーグル・ドライブの同期機能が回復した。

こんなことがあって、春秋大型アップデートに対する嫌悪感は解消されない。まあ、仕方ないか。

先日、読売新聞をみていて、ええっ、と驚いた記事があった。その内容を、読売新聞のウェブページから引用させて戴く。

政府は、各府省庁や自衛隊などが使用する情報通信機器から、安全保障上の懸念が指摘される中国通信機器大手の華為技術(ファーウェイ)と中興通訊(ZTE)の製品を事実上、排除する方針を固めた。10日にも各府省が申し合わせ、政府機関の調達の内規を改める。機密漏えいやサイバー攻撃を防ぐ狙いがある。
米国は8月に成立させた「国防権限法」により、政府機関や政府との取引企業で2社の機器やサービスの利用を禁じた。米政府は、2社の携帯電話や半導体にはウイルスなどが仕込まれ、中国による不正傍受やサイバー攻撃に利用されているとして、日本を含む同盟国に利用の自粛を要請していた。
これを踏まえ、日本政府は、国の安全保障の脅威になると判断した企業の製品やサービスは、購入しない仕組みとする。中国を過度に刺激しないよう2社を名指ししない方向だが、「現段階でファーウェイとZTEの2社は排除対象」(政府関係者)となる。国内企業の製品でも、2社の部品を使っていれば排除対象とする方向だ。

特許調査の仕事をしている私にとって、ファーウェイとZTEは、気になる会社である。すなわち、最近特に通信技術関係の特許を調査していて、ファーウェイとZTEは、外国出願人として、日本に一番多く特許出願しているように思われ、内容も充実している。付け加えると、ファーウェイは、特許公報上でファーウェイ、華為技術など十種類以上の表記の揺れがあって、特許調査人泣かせだったりする。

しかし、私が上記記事に驚いたのは、この新聞記事を読む直前にある家電通販大手のテレビCMを観たからである。そこでは、ファーウェイのスマホが格安で、機能もよい、とあったからである。

要するにファーウェイは日本のスマホ市場を必死で開拓しようとしている。そんなとき意図的にサイバー攻撃のボットを誘発するようなスマホを販売するだろうか、という素朴な疑問がある。

そもそもサイバーセキュリティーの問題を起こしているかどうかは、機器から送出されるパケットを統計的に解析すれば解る。そんな見え見えのことをファーウェイが仕掛けるだろうか。ただ、以前、中国製の検索エンジン、百度が情報漏洩の原因となっている、という話を以前聞いたことがある。

一方で、これは、中国製品を強硬に市場から駆逐しようとする米国政府の情報工作である、という説もある。そういえば、つい先日、カナダでファーウェイのCFOがハイテク製品のイランへの輸出の問題で拘束されたという報道もあった。

また、以前にグーグルの検索エンジンが、中国から排除された、ということがあった。今回の措置をみると、コンピュータ・セキュリティは最早、国家の重点項目の一つになったことが明らかである。私は6年以上も前に、サイバー戦という記事を書いた。あれから、IT技術はかなり進歩したが、そこに書いたことのフレームワークはあまり変わっていないと思う。

ともかく、このような一連の事件は、世界でのファーウェイのスマホの販売に強いインパクトがあることは必至だろう。もう少し帰趨を見極めることにする。

私はたまたま、量子アニーリングを勉強したせいで、イジング・モデルに従う量子アニーリング方式が、量子コンピュータにおいて、従来よりある論理ゲート型よりも先行していると考えていた。なにしろ、NASA、USRA、グーグル、D-Waveなどの名だたる組織や企業が参画している。

しかし、少し前の記事だが、以下のようなBUSINESS INSIDERの記事をみると、それが正しいのかどうかわからなくなってきた。

慶應義塾大学と日本アイ・ビー・エムは2018年5月17日、慶應大理工学部矢上キャンパス(神奈川・横浜)の量子コンピューティングセンターが参画する国際連携の研究拠点「IBM Qネットワークハブ」を報道陣向けに公開した。
同ハブは研究者だけではなく一般企業も参加する産学共同による研究拠点になる。この日はじめて、発足当初の参画企業として、JSR社、三菱UFJ銀行、みずほフィナンシャルグループ、三菱ケミカルの4社の参画が明らかになった。慶應大は、今後どの企業も参加できるオープンな場にするとしている。
企業や大学の研究者らは今後、慶應大理工学部矢上キャンパスの施設「IBM Q HUB」から、IBMの商用量子コンピューター「IBM Qシステム」(米ニューヨーク州のIBM Thomas J. Watsonリサーチセンターに設置)にクラウド経由でアクセスし、量子コンピューター向けのソフトウェア開発や各種研究・実証を手がけていくことになる。
IBMはこれまでも「IBM Q Experience」としてクラウド経由で5量子ビットと16量子ビットの量子コンピューターの研究開発環境を提供してきた。今回慶應大が参画するIBM Qネットワークハブでは、一般公開はされていない最新20量子ビットの万能量子コンピューターが利用できるようになる。

上記記事の続きで、以下のような記述に私は改めて注目する。

IBM Q HUBの開設にあたり、慶應大理工学部長の伊藤公平氏は、今回の取り組みの優位性を次のように説明する。 「IBMが20量子ビットのゲート式量子コンピューターを完全公開してくれることをうれしく思う。ゲート式コンピューターは、すべての量子アルゴリズムが実行できる、文字通り"万能"の量子コンピューターです。(他の商用量子コンピューターで例がある)"量子アニーリング"装置は、一部の特化した問題のみが実行できるわけですが、万能量子コンピューターでは量子アニーリングも含めて、すべての量子アルゴリズムが実行できる。
今まで量子コンピューター用ソフトウエアやアルゴリズム開発で本物の量子コンピューターが使えることはありませんでした。(IBMはこれまで)5量子ビット(と16量子ビット)のものをQ Experienceとして完全公開していたが、今回は20量子ビット。それが実際に使えれば、学術に対するインパクトは多大なものになる。物理学、化学、数学、計算機化学など諸問題で使える」

どうも私が混乱するのは、量子アニーリングを読んで、従来の論理ゲート量子コンピューターは実用化するにはいろいろと課題があって実際にはまだ使えない、なので量子アニーリング方式がブレークスルーである、という認識だったからである。

そのために西森秀稔、大関真之著、「量子コンピュータが人工知能を加速する」日経BP社には、シミュレーテッド・アニーリングをハードウェア的に使用するとか、量子ビット同士を結ぶ結線をキメグラフを使用するとか具体的な手段がいろいろと書かれているのに、上記IBM Q HUBには「量子アニーリング"装置は、一部の特化した問題のみが実行できるわけですが、万能量子コンピューターでは量子アニーリングも含めて、すべての量子アルゴリズムが実行できる。」と、技術的根拠を示さないでただ選挙戦のように自分の優位を言い立てるだけである。

別の根拠として、少し前にあるきっかけで量子コンピュータの内外の特許を包括的に検索してみて、少なくとも日本で、量子アニーリング関係の特許は、グーグルやNTTなど何件かの特許があるのが分かったが、論理ゲート型量子コンピュータの特許はかなり昔のものを除き、ほとんど見かけられず、やはり最近のブレークスルーはないのかと思ったことがあったからである。

なので、慶應大でもIBMでもいいのだが、そのあたりのブレークスルーを、科学啓蒙書を出版するなどの方法により、説明してほしいと思うものである。

先日、とりあえず高次合成数を計算するプログラムを書いたのだが、あまりにナイーブというか計算に時間がかかるので、いろいろ調べたり、自分でも工夫してみて、計算速度を向上を図ってみた。以下にその工夫を列挙する。

  1. まず、ウェブで調べていて、なるほどと分かったのは、今の約数の数を計算する関数d(n)が問題ということである。それは、自然数Nを素因数分解を計算して、2a3b5cのようになったとすると、約数の数は、(a+1)(b+1)(c+1)になることを利用した。もともと素因数分解を計算するルーチンは使っていたので、これを流用するだけでよかった。これによる計算速度向上が最大であった。
  2. HCN(n)という関数で、nが奇数のときは、それが最大の約数の数を与えることはないので、nが偶数のときのみ、高次合成数のためのd(n)の比較を行うようにした。
  3. iという数が高次合成数かどうかを調べるループで、iがある値以上のとき、予め分かっている素因数分解の要素の値を利用して、例えば22×3×5×7で割り切れる数だけHCN(i)を適用することにした。これもかなり計算速度の向上に貢献するが、これはちょっとフェアでないというか後知恵をプログラムに組み込んでいるので、自分でもあまり感心できない。
ともかく以上の工夫を入れたプログラムのソースコードは、以下のとおりとなった。
#include <stdio.h>

int d(int n);
int HCN(int n);
void PF(int n);  // 素因数分解
int *Prime;

int main(void)      {
	
 FILE *fi;
 int i,n;
 int DIV = 4*3*5*7;
 int c = 0;
 i = 0;
 int Max_Prime = 100000000;
 int P_size = 5800000; // 一億までの素数をカバー
 
  if ( (fi = fopen("sieve_n.txt","rt")) == NULL ) return -1;
  Prime = new int[P_size];
   while ( c < Max_Prime + 10 )   {  // 余分に取っておく
   fscanf(fi,"%d",&c);
   if ( c >= 2 )  Prime[i++] = c;
 }

 fclose(fi);
 
printf("<html><body><ol>");

for ( i = 2; i < 1000; i++ )
 if (HCN(i) == 1 )  {
   printf("<li>%d = ",i);
   PF(i);
 }
 
 for ( i = 1000; i < 60000; i++ )  {
  if ((i%DIV) != 0 ) continue;
   if (HCN(i) == 1 )  {
     printf("<li>%d = ",i);
      PF(i);
   }
 }

DIV *= 11;
 
 for ( i = 60000; i < 800000; i++ )  {
  if ((i%DIV) != 0 ) continue;
   if (HCN(i) == 1 )  {
     printf("<li>%d = ",i);
      PF(i);
   }
 }
 
 DIV *= 13;
 
 for ( i = 800000; i < 10000000; i++ )  {
  if ((i%DIV) != 0 ) continue;
   if (HCN(i) == 1 )  {
     printf("<li>%d = ",i);
      PF(i);
   }
 }
printf("</ol></body></html>\n");

delete[] Prime;
return 1;
}

int d(int n)       {
int N = n;
int ret = 1;
int i = 0;
int j;
 while ( N > 1 )      {
  if (( N%Prime[i]) == 0 )  {
    j = 1;
    N /= Prime[i];
    while ( ( N%Prime[i]) == 0 ) {
	  N /= Prime[i];
      j++;
    }
    ret *= (j+1);
  }
  i++;
 }
 
 return ret;
}

int HCN(int n)  {
int N = d(n);

for (int i = 1; i <= n-1; i++ )  {
  if ((i%2) == 1 ) continue;  // 奇数をスキップ
  if ( d(i) >= N ) return 0;
}
	
return 1;
}

void PF(int n)       {
int N = n;
int i = 0;
int j;
 while ( N > 1 )      {
  if (( N%Prime[i]) == 0 )  {
    j = 1;
    N /= Prime[i];
    while ( ( N%Prime[i]) == 0 ) {
	  N /= Prime[i];
      j++;
    }
    printf("%d<sup>%d</sup> ",Prime[i],j);
  }
  i++;
 }
 printf("<br>\n");
 return;
}
また、計算結果は、以下のとおりである。なお、ナイーブな実装だと、1000000までの高次合成数の計算も、丸一日かけても終わらないのに、下記の実装だと10000000までの計算で、1時間くらいで終わる。まあまあのチューニングである。
  1. 2 = 21
  2. 4 = 22
  3. 6 = 21 31
  4. 12 = 22 31
  5. 24 = 23 31
  6. 36 = 22 32
  7. 48 = 24 31
  8. 60 = 22 31 51
  9. 120 = 23 31 51
  10. 180 = 22 32 51
  11. 240 = 24 31 51
  12. 360 = 23 32 51
  13. 720 = 24 32 51
  14. 840 = 23 31 51 71
  15. 1260 = 22 32 51 71
  16. 1680 = 24 31 51 71
  17. 2520 = 23 32 51 71
  18. 5040 = 24 32 51 71
  19. 7560 = 23 33 51 71
  20. 10080 = 25 32 51 71
  21. 15120 = 24 33 51 71
  22. 20160 = 26 32 51 71
  23. 25200 = 24 32 52 71
  24. 27720 = 23 32 51 71 111
  25. 45360 = 24 34 51 71
  26. 50400 = 25 32 52 71
  27. 55440 = 24 32 51 71 111
  28. 83160 = 23 33 51 71 111
  29. 110880 = 25 32 51 71 111
  30. 166320 = 24 33 51 71 111
  31. 221760 = 26 32 51 71 111
  32. 277200 = 24 32 52 71 111
  33. 332640 = 25 33 51 71 111
  34. 498960 = 24 34 51 71 111
  35. 554400 = 25 32 52 71 111
  36. 665280 = 26 33 51 71 111
  37. 720720 = 24 32 51 71 111 131
  38. 1081080 = 23 33 51 71 111 131
  39. 1441440 = 25 32 51 71 111 131
  40. 2162160 = 24 33 51 71 111 131
  41. 2882880 = 26 32 51 71 111 131
  42. 3603600 = 24 32 52 71 111 131
  43. 4324320 = 25 33 51 71 111 131
  44. 6486480 = 24 34 51 71 111 131
  45. 7207200 = 25 32 52 71 111 131
  46. 8648640 = 26 33 51 71 111 131

仕事で、エクセルのセルに、外部ファイルへのリンクを貼り付ける必要が出てきた。普通だったら、エクセルのもつ機能を使う。それは、所定のセル内をマウスの右ボタンでクリックする。すると、ポップアップ・メニューが現れるので、リンク→リンクの挿入をクリックして、リンクするファイルを選択する。

しかし、私はこんな機能は使わない。なぜなら、テキスティエだからである。テキスティエは、Perlなどのプログラムにより、HTMLファイルを生成し、そのHTMLファイル中に、a href=""のタグで、リンクすべきファイルを指定する。そして、ブラウザでそのHTMLファイルを開いてみて、正しく開けるか確認し、それでよければHTMLファイルをエクセルで開いて保存し直すことにより、リンク付きのエクセルとする。エクセルで開いて保存し直すと、どういう方法でリンクをつけたか、全く見分けがつかない。

ただ、テキスティエでなくても、私が担当した仕事では、所定のセル内をマウスの右ボタンでクリックする方法では、妥当な作業量でリンクが付けられないので、HTMLファイルを生成するよりない。なぜなら、私の場合、1000箇所以上リンクをつける必要があったからである。もし一箇所一分の作業時間だとしても、1000箇所以上あると、丸三日程度の時間がかかってしまう。私の方法だと、プログラミング作業を含めても、1時間程度で済む。ただ、それはPerlなどのスクリプト言語にある程度熟練していることが前提で、そうでないとかなり困難か、実質的に不可能に近くなる。

ところで、もっと具体的な話に移る。すなわち、特定のセルに置くべきリンクの数が多すぎる場合、私は、HTMLファイルを生成して、そこにリンクを置き、セルからはHTMLファイルを呼び出すようにした。すると、困ったことが起きた。すなわち、あるクライエントが、HTMLファイルからリンクでPDFのファイルを開こうとすると、エラーになるのだという。

それでよくみたら、<a href="Docs/sample.pdf">のようになっていて、リンクがきちんと相対指定になっていない。それで、<a href="./Docs/sample.pdf">と書き直して、これでどうですか、と聞いたらやはりエラーになるという。

そこで窮余の策で、HTMLファイルをエクセル・ファイルとして保存し直し、そのエクセル・ファイルにリンクを張るようにした。エクセルに保存し直すとき、リンクの問題をエクセルのプログラムがうまく丸め込んでくれるようなのだが、このあたりの内部構造はさっぱり分からないのだった。

ともかく、私はエクセルのマクロが苦手なので(エクセレントなマグロは好きだが)、こうやってお茶を濁して生きているのだった。

約三年前に、使っていたASUSのパソコンが調子が悪いので、買い換えようと町田のヨドバシカメラに行った。そこでASUSだけは避けようとして、たまたま店員に薦められたパソコンがASUSで、コスパがよかったのでつい買ったものの、ひどい目に遭って、結局エイサーのパソコンに落ち着いた経緯は、こちらに書いたとおりである。

で、私は基本的にウイルス・チェック・プログラムは、ソースネクストの、スーパーセキュリティゼロと決めているのだが、そのときは動転していて、薦められるままに、ウイルス・バスターを買った。多分、キャンペーンで割安になっていたのだろう。結局、三年契約でライセンスが3本もあるウイルス・バスターを買ってエイサーのパソコンに導入した。

ところが、また私は馬鹿なことをしてしまった。すなわち、バイオのパソコンが壊れて、レノボのWindows 10のパソコンに買い換えたとき、せっかくのウイルス・バスターの余剰ライセンスをうっかりして、ついスーパーセキュリティゼロを買って、導入してしまった。もしかして、うっかりというよりも、ライセンスの更新料を払いたくなかったのかもしれない。そもそも、スーパーセキュリティゼロは、更新料が要らないのが売りである。

そうしていると最近、ウイルス・バスターのトレンドマイクロ社から、更新期限が近づいていて、早めの更新なら早割がある、という。それに対して、うーん、と考えた。最近遭遇したスーパーセキュリティゼロのトラブルがなかったら、もしかして、更新しないでスーパーセキュリティゼロに置き換えたかもしれないが、あれを経験したことで、やはりリスク分散で、ウイルス・バスターも更新することにした。

それで、更新方法はどうするのかな、ウェブで調べなくては、と手を拱いているうち、渡りに船で、ウイルス・バスターの会社から更新用のハガキがきた。これによれば、コンビニにこのハガキを持っていって、所定の金額を払うだけでいいらしい。

そこである週末に、自宅から最寄りのセブンイレブンに行って、支払い手続きを済ませて自宅に帰るともう、パソコンに、ウイルス・バスターの会社から、更新完了通知のメールが来ていた。responsivenessを殊更重んじる私は感動して、ウイルス・バスターよ、見事じゃ、余は苦しゅうないぞ、また今度も更新して遣わせるぞ、と内心で呟いた。一体私は、何様なのだろうか。

今どき、車が運転できるなんて当たり前で、A級ライセンスでももっていない限り尊敬されるなんてことはありえないが、例えばアメリカの田舎にいて、たまたま運転できる人が他にいなくて、私だけが運転できるなら、それは有り難がられるだろう、私のような、運転偏差値30かもしれないヘボ・ドライバーでもである。実際、そんな田舎で運転ができる人がいないと、命に関わることがある。

これが運転でなくて、コンピュータのプログラミングとなると、私は流石に偏差値50より少し上だと自負しているが、それだって専門のプログラマからみると、ダサくてみていられないレベルだろう。

それで、私よりスキルのあるプログラマなんて世間に何十万人いるか何百万人いるか知らないが、ずっと特許部門にいるせいか、私よりプログラミングにスキルのある人は部門にせいぜい一人か二人くらいしかいなかった。

しかも、特許部門でのプログラミングなんて、ほとんどが四則演算レベルの単なる日常的業務アプリで面白くもなんともないので、そういう人も、必要があってもプログラミングを手助けしてくれず、仕方がないので私がなんのスキルもいらないような自明なコードをコツコツ書いていた。

ところが自明なコードであっても、例えば特許譲渡のようなビジネス・トランザクションではとても効果があった。なにしろ、数千件の特許のリストから、相手の問い合わせに応じて、Perlを使って、ほとんどリアルタイムにリストを切り出して送付し、契約上の疑問が生じると、夜遅くなって、チャットツールで米国の責任者に問い合わせて、瞬時に回答を得て、相手に応答する、という日々だった。ちなみに、私は契約の仕事はあまり経験がなく得意とはいえないが、契約書を読んだり、関連書籍を読んで勉強して問い合わせるうちに次第に、自分で判断していいことと、聞くべきことのトリアージはできるようになり、米国の責任者からも一応の信頼を得た。そうやって、実に効率的にプログラミングを活用して仕事していて、その成果は明らかで、米国の責任者にも随分褒められたのだが、どうも日本にいる同僚や上司にはいまいち受けなかった。

別に遊んでいると思われた訳ではないのだが、なにやっているか見えてないというか、特許譲渡の仕事なのになにツールで遊んでいるんだ、くらいにしか思われていなかったのかもしれない。私は実は、誠意のあるやりとりを通じて、特許譲渡の相手先からも大きな信頼を得ていたのだが。

それでいて私の周囲の人達は、ちょっとパソコンで困ったことがあったり、簡単なツールを作ってほしいときなど、簡単に私をinterruptした。

それでやっと分かったのは、私は手軽なコンビニ程度にしか認識されていなかったということである。それでちょっとムッときたのは、そりゃ私のプログラミングは大したレベルではないのだが、単なる趣味とはいえ、C++だけでも当時でも15年以上の経験があり、私が作った幾つかのツールは、部門の仕事の基幹を担っていた。

しかし、さらに分かったのは、そんなことはどうでもよくて、今さら分かってきたのは、私は自分のやってきたことに勿体をつけたり、自分を売り込んだりすることが極めて苦手ということである。ともかくshow upが重視される外資系にあっては、致命的に損な性格である。

それが分かっていても、頼まれるとホイホイと引き受けしまい、さらにコンビニ化してしまうのだった。

言い訳だが、ホイホイ仕事を受けていると、いつもスキルがアクティブで錆びにくい。

ま、いいか、そうやっていると、とりあえず居場所があって、とりあえず精神衛生にいい。そういえば私は、今まで一度も精神安定剤の類いを飲んだことがなく、不眠症の経験もない。ということで、天才バカボンではないけど、これでいいのだ。

月別 アーカイブ

このアーカイブについて

このページには、過去に書かれたブログ記事のうちコンピュータカテゴリに属しているものが含まれています。

次のカテゴリはスピリチュアルです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。