「電子立国日本」の現実

世の中、何事も自分の思い通りになるのであればこんな楽なことはない。ビジネス・仕事とあらば尚更だ。が、そんな理想的な展開こそ稀なのが浮世の常。それも組織・取引先あってのそれとあらば、どこかで現実的な「落としどころ」をネゴらない限りみな不幸になるだけである。

ところが世の中にはこんな当たり前の事を理解できないまま年を食い、周囲に無理を強いてはところ構わずキレる馬鹿がまだいる。こういうのが責任者とか管理者とかに任命された時、それはプロジェクトの失敗が約束された瞬間でもある。

こんなのを人の上に据える方も馬鹿だが、気の毒なのはその馬鹿らに服従を強いられる者達である。彼らの選択肢はふたつにひとつ。生活のため馬鹿になりきるか、その場を去り自分の頭で考えることのできるところへ向かうか。

電子立国日本、その象徴みたいに言われるメーカーで何十年にもわたって繰り返されている茶番がこれだ。管理とか報告とか承認とか、聞こえはいいがこんなもんどれも「保身のための証拠づくり」でしかない。中身は「無駄・無理・無茶」に「無知・無能」がついた5無だ。どいつもこいつもしょせんサラリーマン。こういう連中の人件費こそが開発費用の高騰、ひいては国際競争力の低下を招いたとずいぶん前に聞いた気がする。それを未だに引きずっているのであれば、ここに限らずこの業界この国に将来はない。

何事も自分の思い通りにはいかない。だから仕事も人生も、面白くて楽しいのである。こういう愚か者らびは言うだけムダだが。

 

イマ風なソフトウェアの常識を知らない・知ろうとしない・理解できない昭和の残党らの

なんと多いことか。参考までに以下、こういう役にたたない管理職xx長らの特徴を記す。

1. JavaとJavaScriptの区別がつかない

どちらも自分で書いた経験のないオッサンの大半がこれ。紛らわしい名称でスタートしたままのJavaScript側の責任も重いが。

2. プロセスとスレッドの違いがわからない

「プロセス=タスクですよ」まではいいが、スレッドの意味を理解していないので「割り込みハンドラみたいなもんですよ」でようやく納得する。全くの別物なんだが。

3. クラスって何? 連想配列って何?

「配列=ポインタ(=アドレス)」という認識でしかないところへ、キーがどうの値がこうのと言っても通用しない。クラス内のメソッドに至っては言わずもがな。

これらはほんの一例。だがそれだけでもこれがどんなに不幸なことか。あなたの周囲にもいませんか? こういう面倒な輩。

備忘録 : 循環するリスト

Pythonのリストは有限個の要素からなる配列だが、その終端を先頭に繋げて無限個のそれとして扱う場合を考える。つまり

item: List[int] = [0, 1, 2, 3, 4]

に対して、その3番目の要素から連続する5つをスライスでitem[3:8]とすると

[3, 4]

となってしまうのに対し、

[3, 4, 0, 1, 2]

というリストを得られるようにするにはどうしたら良いのか? 更にはスライスの開始位置を元の要素数以上でも良しとするには?

後者については「開始位置=開始位置を要素数で割った余り」とすれば○だが、面倒なのは前者。最初に考えたのは、先のスライスがエラーとならず終端までを返すという振る舞いを利用して「得られたリストの要素数が必要とするそれに満たない時は、その後ろに不足分を先頭から持ってくる」まで。だがこれだけだと、元の要素数を超えるスライス(上の例でいうとitem[3:22]とかの場合)に対応できない。そこで更に「得られたリストの要素数が必要とするそれに満たない時は、その後ろに不足分を先頭から繰り返し持ってくる」とすれば良い筈。

from typing import List

class CyclicList(object):

    def __init__(self, *, item: List[int]):
        self.item = item
        self.length: int = len(item)

    def extract(self, *, offset: int, width: int) -> List[int]:
        top: int = offset % self.length
        result: List[int] = self.item[top:top + width]
        length: int = len(result)

        while length < width:
            plus: List[int] = self.item[:width - length]
            result += plus
            length += len(plus)

        return result


if __name__ == '__main__':
    length: int = 5
    item: List[int] = [v for v in range(length)]

    cycle = CyclicList(item=item)

    for offset in range(length+2):
        for width in range(1, length+3):
            c = cycle.extract(offset=offset, width=width)
            print('offset %d width %d = %s' % (offset, width, c))

できた。

世界の中心で改めて「WindowsはXXX!」と叫ぶ

またかと言われそうだが、俺はWinがすかん。その理由はたくさんあるが、イチバンのそれがCP932とかいう内部エンコーディング。今回、久々にその地雷を踏んでしまった。足を離して木っ端微塵になる前に、自戒を込めてグチる。

普通な欧米人には理解できないであろう変な文字列(ex:日本語)をインターネットな世界で一緒くたに扱うのにUTF-8は、いまやごく普通であり常識である。そう、何もかもUTF-8でやっていればみんなハッピー、誰も困らないのである。実際AndroidもiOSもMacもLinuxもとっくにそうなっている。が、WinだけがいまだにCP932という「無意味どころか害でしかない」エンコーディングを改めようとしていない。結果、それをそのままファイルに書き出し→インターネットな処理系でそれを読む→機種依存文字の変換不可→DEAD … ある時期までは「よくある話」だった。

が、それって20年も前のこと。それをこの期に及んで食らうとは迂闊だった。更にタチが悪いのは、こういうのを「致命的な問題」と言っても、まず意味がその相手に通じないこと。「手遅れか!」と気づいた時はもう遅い。

まとめ:MSなServerとかSQLとかなシステム = 対人地雷。いずれ絶滅するが、それまでは探知に努め踏まないよう注意すること.。

Possible mission

20年以上も前に作られた「ある」システムの「ある」部分を作り直せとの命令が下った。ここで最初の難敵は「ビッグエンディアンなバイナリファイル×多数」。要はその当時のMotorolaな処理系(弔)がファイルに吐き出したCの構造体で、これをそのまま最新のリトルエンディアンな環境で編集せよというのである。

このような「どこの誰がいつ作ったのかわからんフォーマットへの後方互換」は、いちばんやりたくないところだが仕方ない。最初はそこ(読み書き)だけCで書いてPythonから呼ぼうかとも思ったが、エンディアンの整合を考えただけでウンザリ。何かいい手はないか? と調べていて行き着いたのがctypes.BigEndianStructure。こいつで構造体のメンバーを定義してインスタンスを作れば、エンディアンの違いを(殆ど)意識する事なくプログラミングができる。名称からしてそのものズバリな、こういうのをハナから使えるところはさすがPythonである。

ただ、だがしかし …

こういうのって、そもそもエンディアンの意味とCの構造体とが理解できてなきゃ無理=「書く」手間より「読む」手間の方がかかる。なので、Cプログラミングの経験のない若者には敷居が高い。するとやはり、このワタクシを始めとする「Cで稼いできた旧きエンジニア」ならではの仕事なのかなあ、と思うと複雑な心境。俺もビッグエンディアンと共に絶滅種入りか? … おおコワ!

「データクラス」への期待

これの続き。

Pythonのdictは柔軟で扱いやすいが、一方で値の型が把握しづらい(注1)。他人が書いたコードは言わずもがな、自分の書いたそれもすぐ忘れて「?」となる。またその入れ子やら新たなキーの追加や削除やらも容易だが、こういうの(注2)をやりだすと状況は更に悪化する。Cの構造体のようなカッチリとしたデータ構造を記述するにはどうしたら良いのか? Python3.7から導入された「データクラス」は、そうした要望に対する回答のひとつである。

何よりdictではできない「継承」が使えるだけでも有り難い。実をいうとその存在に気づくまで、俺は通常のクラスでこれをやっていた。そういう意味では「データクラス=データ保持に特化したクラス」と捉えて差し支えない(注3)が、便利な機能が多数盛り込まれているので「これからは遍くこれで」と考えている。

惜しいかな現時点ではクラス変数に不正な型を代入しても動いてしまうし、PyCharmでも警告が出ない。が、これらが実現されるのはそう遠い先の事ではないと思う。尤もそうなるともはやPythonは「動的片付き言語」と呼べなくなるのでは? だが、俺的にはその方がずっといい。

注1: 変数では有効なtypehintがdictのキーには使えない
注2: Pythonに限った話ではなくPHPとかJavascriptとかも同様である
注3: 実際データクラスはclassへのデコレータで記述する