唯々諾々 (しません)

冷静な議論ができる方からのマサカリは大歓迎です。

クラスとインスタンスの違い (アルセウスとまわるオブジェクト指向プログラミング)

やって参りました、ポケモンと回るIT界隈。3回目の今回は「クラスとインスタンス」です。 私も完全に理解してますかと言われたらNoなので理性的なマサカリは大歓迎です。


クラスとインスタンス (オブジェクト) には様々なたとえ話があります。たい焼き器や車などです。しかしこれらにはそれぞれ問題があります; まずたい焼き器をクラスとするインスタンスであるたい焼きには「食べられる」以外のメソッドが考えにくくなります。メソッドまで含めてのクラスですから、これはすこし不十分と言わざるを得ません。次に車です。これは人によりますが、鋳型をクラスとして想像してしまい、1つの鋳型からは1つの車種しか作れないことからインスタンスとクラスの違いが不明瞭になってしまうことがあるのではないかと思っています (少なくとも私はそうでした)。

そこで私は考えました。ポケモンで説明しよう、と。

今回の案はこちらの動画と記事にインスパイアされております。

youtu.be

trance-cell.com

アルセウスポケモンを作る

ある日のこと、アルセウス社長は2022年発売のポケモンスカーレット・バイオレットの発売に向けてポケモンを新たにデザインしていました。アルセウス社長は賢いので、今までのポケモンもクラスを作ってそのインスタンスとして作成していました。次のようなクラスです。

class Pokemon:
    def __init__(self, pokemon_id, name, type1, type2, level, waza):
        self.pokemon_id = pokemon_id
        self.name = name
        self.type1 = type1
        self.type2 = type2
        self.level = level
        self.waza = waza  # waza: list, len(waza) == 4


    def self.act_waza1(self):
        # 1番目の技を繰り出す

    def self.generate(self):
        # 進化する

    def self.remember_waza(self):
        # 技を覚える

これがざっくりながら「Pokemon クラス」です。クラスは単体では実体をなしませんインスタンスとして初期化して (ポケモン界に生み出して) 初めて実体を持ちます。
例えばフシギダネを作る際には

Pochi = Pokemon(0, 'Bulbasaur', 'glass', 'poison',
5, ['たいあたり', 'なきごえ', 'つるのムチ', ''])

などとします。

しかし今回SVではテラスタイプというものが実装されるではありませんか、アルセウスは慌てて次のようにPokemon クラスを書き換えました。

class Pokemon_SV:
    def __init__(self, pokemon_id, name, type1, type2, tera_type, level, waza):
        self.pokemon_id = pokemon_id
        self.name = name
        self.type1 = type1
        self.type2 = type2
        self.tera_type = tera_type
        self.level = level
        self.waza = waza  # waza: list, len(waza) == 4


    def.self.terastal(self):
        # テラスタルする

    def self.act_waza1(self):
        # 1番目の技を繰り出す

    def self.generate(self):
        # 進化する

    def self.remember_waza(self):
        # 技を覚える

ラスタルに関する部分が増えていることにお気づきかと思います (ほんとは多分継承とかなんとか使ってベタ書きしないほうがいい)。SVでのポケモン (インスタンス) はすべてこの Pokemon_SV クラスを用いて作ることができます。これがクラスの利点です。

以上がざっくりながらクラスとインスタンスの違いとその利点でした。ご参考になれば幸いです。

乗っ取り等を防ぐためのセキュリティ覚書 (初級)

この記事で特定の人を責める意図は一切ございません。セキュリティにはある程度個人の自助努力も必要ですが、一番悪いのは攻撃した側です。

 

最近ハンドメイド界隈その他でTwitter等の乗っ取りが増えているようである。今までも偽アカウントやプレゼント企画に乗じてのDM個人情報聞き出しはあったが、今回は本来のアカウントを乗っ取られる被害が出始めているようである。自分のアカウントをそのような犯罪の温床にしないために、いくつか個人でできる対策がある。

1. パスワードは推測されづらく、できる限りランダムなものを作り、違うサイトで使い回さないようにする。可能ならば紙ベースのみで確実に保存する。ブラウザに保存しない。

言わずもがなではあるが、実際これが一番難しい。私もぶっちゃけサボってChromeに覚えさせている。が、クレカやインターネットバンキング、その他仕事で重要なアカウントだけでも徹底する価値はある。大切にしてる本のタイトルや好きな一節をローマ字書きにするのも長さを稼いで覚えやすくする点では良い方法である。ただし推測されづらくすることをお忘れなく (月が綺麗ですね、などは意味がない)。
私も実はPCのパスワードを大学の実習の一環で破られたことがある (PC自体は大学のものだがアカウントは個人で作っていた)。その頃は私もセキュリティ意識が低く、名前+誕生日程度のクッソ弱弱パスワードだったのだが、1週間の間に見事に破られていた。それ以降PCのパスワードはもちろん、大体のパスワードはランダム生成させるようにしている。

2. 2要素認証、特にログイン時自分の電話番号等に通知が来るタイプの2要素認証を設定する。

2要素認証とは、例えば普段のIDとパスワードに加えて登録電話番号に6桁くらいの番号が届き、それを入力するタイプのログイン方法である。この場合、パスワードが突破された段階で登録電話番号に試行がいくつか飛んでくるのが見える (もしくは攻撃者が諦める) ため、その場ですべてのデバイスからサインアウトしてパスワードを変更するなど、対応の時間が少し稼げる。
私もたまにPayPayカードにログインしようとする試行が飛んでくるが、そもそもPayPayカードは作っていない。謎ではある。

3. Twitterで占いなど遊ぶときは慎重に

私も正直バカスカ遊んでいる。フォロワーが遊んでるとマジでなんも考えずに遊んでいるが、これも注意が必要である。特に「Twitterの内容から解析」タイプの占いは「フォロー・フォロワーを見る」「タイムラインを見て書き込む」などの権限ががっつり与えられていることが多いため、さらなる注意が必要である。これは悪意のない場合もある (以下の説明参照) が、どうしても必要な場合を除き書き込み権限は与えないに越したことはない。

magical.kuku.lu

作成者が信頼できるかどうか、本当に必要な機能かなどを吟味した上で許可することが必要である。あと定期的にアプリの連携解除をすることもリスクを下げる行動である。

4. 不審な添付ファイルを開かない。「実行ファイル」というものを知っておく。Word/Excelのマクロ機能の危険性を知っておく。

LINEやDiscordなどのチャット式コミュニケーションアプリが主流となり、「メールに添付ファイルでお送りする」ことも少なくなったが、相手から送られてくるファイルやメール、URLは広い意味ですべて添付ファイルとここでは呼ぼう。添付ファイルは開いただけでアウトのもの (ウイルスを仕込むwebサーバへのURLなど) から、実行したりマクロを有効にするまで異常性を発揮しないものまで様々あるが、とにかく開かないに越したことはない。セキュリティソフトも万能ではないため、相手からはなるべく相対的に安全な方法で情報を受け取ろう (テキストメッセージや画像単体など)。
また、見てるとどうやら「zipファイルを解凍し、中にあった実行ファイル (.bat, .exeなど) を実行してしまった」という例もあるようである。まず重要なのは、オーダーメイド依頼を含む通常の業務で実行ファイルが送られてくることはまずありえないと言っていいことである。実行ファイルというのは大体アプリだと思ってもらえばいいのだが、通常のアプリケーションと違って何も表示しないまま動かすこともできる。つまり気付かれないようにウイルスなりなんなりを仕込む事ができるのである。オーダメイド依頼等にそのようなファイルが必要である可能性はほぼ0と言っていいことは関係者の皆様にはご納得いただけるだろう。
拡張子はデフォルトでは表示されないこともある。絶対に表示させよう。

www.fmworld.net


さらに、実行ファイル相当で広く流通しているものとして、WordやExcelのマクロというものがある。うまく使えばもちろん便利なのだが、うまく使えばウイルスを仕込むこともできる。マクロも実行時に特に何も表示されないことが多いので恐ろしい限りである。*1マクロ付きの文章が来た場合、必要ならば相手にマクロを解除して送ってもらうよう依頼しよう。それで不審な言動をし始めたら黒である。関係を絶とう。

news.trendmicro.com

 

これ以外にもセキュリティについては様々な攻撃手法と対応策があるが、それはそれだけで国家試験が作れるくらいあるので、一気に知ろうとするのではなく、上の4つくらいを確実に行う・知ることが重要であると思われる。

最後に、国 (経済産業省) 主導のセキュリティ支援窓口であるIPAを紹介して締めようと思う。

相談窓口のほか、不幸にして被害にあった後のご報告も広く募っています。同じ攻撃手法で仲間が攻撃されるのを防ぐべく、ご一報いただけますと幸いです。*2

www.ipa.go.jp

www.ipa.go.jp

 

*1:なんでこんな危険ファイルが幅を利かせているのか割とマジで理解できない。.txtは相対的に良いぞ。

*2:筆者とIPAの間に利益相反関係はありません

ポケモンで学ぶRDB用語とセキュリティ 2

※本シリーズはフィクションであり、現実の実装とはなんら関係ありません。また間違いはいつでもご報告いただけますと幸いです。

さて、ポケモンという「もの」をインターネットで送る、あるいは送られるためにはwebの設定が必要である。このときに問題になるのは様々あるが、ここでは2つ取り上げよう。セッション管理とバグポケ (改造ポケモン) である。

セッション管理

ポケモン交換や配布においていちばん重要なのは多分これではないだろうか。セッション管理ができていないと「まだおくりもの受け取っていないのにもう受け取った扱いになっている」「相手のポケモンは届いてないのに自分のポケモンだけ行っちゃった」という泣くしかない構図が出来上がる。実はSVのDLCおくりものヒスイゾロアークの際にはこれが起こってしまったようであり、天下のポケモンが... とびっくりした覚えがある (もちろん推察なのでセッション管理以外の問題かもしれない)。自分の通信環境やバッテリーのせいならばぎりぎり自己責任とも言えなくもないが、サーバの混み合いのせいでこれはかわいそうである...

話がずれた。セッションとは通常一体として行われるべき複数ジョブのひとかたまりであり、1つのセッションは完了した状態かまったく始まっていない状態の2値を取ることが求められる。例えばふしぎなおくりものならば

1. ユーザがレポート後に通信を確立し、あいことば (パスワード) を送る。

2. サーバがパスワードを検証し、該当するポケモンなりわざマシンを送り返す。

3. 同一ユーザからの同一パスワードを拒否するよう設定する。

4. ユーザのローカル環境に変更が反映され、レポートされる。

のざっくり4ジョブが1セッションである。もちろんこれ以外をジョブにしたりセッション区切りを変更する可能性もあるが、少なくとも2〜4は1セッションになる必要がある。理由は上のヒスイゾロアークの例が物語っている。パスワードを送り、3まで行って4が完了していない段階で異常終了すると、ヒスイゾロアークがユーザのローカル、つまりボックスに存在しないまま3のロックがかかり、二度とヒスイゾロアークを受け取れなくなってしまうのである。

もっと万全を期すなら1を受信するサーバAと2、3を管理するサーバBは別立てにし、確実にセッション管理ができる帯域状況であるとAが判断してからAからBにユーザを繋ぎ変え、2〜4をセッションとして実行したほうが良さげである。しらんけど。

ユーザ同士の通信交換の際も同様である。

バグポケ

正規プレイヤーを悩ませるバグポケ。私はどうやら受け取ったことがないようだが、中古ロム開封を見ると出るわ出るわ、まぁ正規の方法で行った (?) 謎の場所シェイミくらいはギリ許容するにしても、どっから湧いたんやというような出自のポケモンが色違いや証のために生成されているのが現状である。

ローカルで楽しまれる分には生暖かい目で見ていられるのだが、これを交換に流すやつがいる。特にマジカル交換という良くも悪くも後腐れない方法で流されるという話はよく耳にする。これを防ぐ方法を考えよう。

これは伝説・幻ポケモンほど楽に対策できる。なぜなら特に彼らの色違いはいつどこでどのように配布・入手されたのかがほぼわかっており (ブロックルーチンがかかっていることが多い)、そいつのハッシュ化キー (昨日の議論参照) をデータベース化・計算すれば良いからである。

例えばダークライの色違いならば、メンバーズカードからの固定シンボルリセットしかないから、捕獲ユーザーのIDと捕獲日時から、色違いだろうがなんだろうがダークライハッシュ値は一意に定まる。サーバ内で交換に出されたダークライっぽいデータの捕獲者IDと捕獲日時から予定されるハッシュ値を計算し、ハッシュ値が合わなければ (あるいは明らかに出現しない場所での捕獲ならば) 弾けば良い。

ここでもハッシュ値の衝突発見困難性が役に立つ。種族を縛られた状態で捕獲ユーザIDと捕獲日時とタイムゾーンハッシュ値が整合するように生成するのは、いくら任意コード実行とはいえ難しいのではないだろうか。さらに一意ハッシュ化の方法が知らされていなければおそらく不可能と言って良い。

これがバグポケを防ぐ一種のファイアウォール構築である。なおA0改造などの場合、多少ハッシュ化を工夫する必要が出てくる。

改造はローカルだけにしようね!

 

明日に続くかは未定だけど色々勉強になるので続けたい...?

ポケモンで学ぶRDB用語とセキュリティ 1

※本シリーズはフィクションであり、現実の実装とはなんら関係ありません。また間違いはいつでもご報告いただけますと幸いです。

それは私のこんな単純な疑問とChatGPT-4 (以下チャーちゃん) の会話から始まった―

ワイ「投げたポケモンボールってどこ行ってるの? (バトル時のつもりだった)」
チャーちゃん「ポケモンの世界において、ポケモンボールを投げることでポケモンを捕まえることができます。しかし、ポケモンポールがどこへ行くのかは、ゲーム内の物語や設定で明確に説明されていません。
一般的な解釈では、捕まえたポケモンポケモンボールの中にデジタルデータ化され、
レーナーが持ち歩くことができる状態になります。トレーナーが6匹以上のポケモンを持っている場合、新しく捕まえたポケモンはボケモンボールごとポケモンセンターに送られ、そこで保管されます。
しかし、これはあくまでゲーム内での表現であり、現実世界でのポケモンポールの存在や挙動はありません。ゲームやアニメの世界観を楽しむための架空の設定です。」

 

真偽はともかくとして、ボールの中に入ること = 実体のデジタルデータ化であるという発想は面白い。しかもポケモンとくればボックスというデータベースの基礎があるではないか。これでRDBを理解してみよう、というのが、DBは秋しか無いことに気づいて急遽雑に申し込んだSC試験を4/16に控えwebとセキュリティとDBから逃げ回っているデータサイエンティスト見習いの発想であった...

ポケモンを一意に定めよう

まず重要なのはオブジェクト (今回なら存在するポケモンすべて) の一意化である。なんでもいいがなんかしらのキーで一意に定まるようになっていないオブジェクトはDBに載っけようがない。どこかの大学では学籍が2つに分裂していた。が、本来こんなことが起こるデータベースはデータベースではない (と思う)。

例えばこのようなものはどうだろうか: トレーナーID+ポケモン図鑑番号+捕獲日時とタイムゾーンの文字列をSHA256なりSHA3系256bit以上でハッシュ化する。トレーナーIDがヒスイから今まで被らずつけられているという前提には基づくが、これならばハッシュ関数衝突発見困難性により、バグらせなければ同じハッシュ値を持つ同種のポケモンはまずおらず、多分一意に定まると思ってよいだろう (しらんけど)。これで一意化はざっくり成功だ。

ポケモン図鑑ってなんだろう

そもそもポケモン図鑑も一種のRDBである。ポケモン図鑑 (ぜんこく) を設計してみよう。

ポケモン図鑑に必要な属性は次のとおりである。

1. 全国図鑑No.

2. 種族名

3. 持ちうるとくせいと夢特性

4. タイプ (いまのところ少なくとも1つ最大2つ)

5. メガシンカを持つ場合のタイプと名前など

6. リージョンフォームがある場合のタイプと名前など

7. 進化先進化前がある場合の関連性

8. 生息地

9. 地方図鑑番号

10. ビット絵 or 3Dモデル (色違い分も)

気が遠くなってきた。特に5はどうすべきかわからない。進化前と進化後という属性にすべきだろうか。しかしイーブイ系列が地獄である。テラスタイプはすべてのポケモンがすべてのタイプを取れることに現状なっているからトレーナーのボックスのほうの設計に盛り込もう。タイプやとくせいは別にDBを作って番号を振ったほうが良いのは間違いない。

トレーナーのボックスの実装

トレーナーのボックスはさっきの一意化のkeyとポケモンの全国番号だけ持っておけば使えるには使えるが、その他に次の属性がある。

1. (もう無くなったが) ポケルス感染履歴の有無

2. テラスタイプ

3. 持ち物

4. 努力値

5. 証・リボン

6. 色違いか否か

7. いつどこで出会ったか

8. 覚えているわざと覚えてきた技

9. 最初の持ち主

もう嫌になってきた。要件を書き出すだけでだいぶつらい。

これをインターネットで交換しよう。明日に続け!

"コンサル本"やレポートの書き方本の決定打 (多分)

タイトルは「凡百のコンサル本や書き方/考え方本読むなら黙ってこれ買え」にしようかと思いましたが戸田山先生の名誉にも関わるので少し抑えました (利害関係は皆無です)。コンサル本とかに全部目を通したわけでもないので...

結論から申し上げますと、コンサル本、書き方/考え方本を一冊でも買った経験のある方、もしくは今後Twitter文字数以上の文章を書く機会が一度でもある方は本当に黙ってこちらの本をご購入ください。アフィが嫌な方はググってでもいいので買ってください。コピペ用:「 論文の教室 戸田山和久
1400+税 円です。下手なランチより安いです。黒歴史サイトを運用したい低年齢層から嫌々レポートを書かされる大学生、社会人まで、本当に万人に自信を持っておすすめできます。

 

タイトルは「論文の教室」とはなっていますが、実際はメールを除く*1ほぼ全ての文章に活かせる文章の書き方と非常に明快な思考様式 (文章アウトラインの作り方) を紹介されています。噂のパラグラフ・ライティングも当然1章を割いて説明しています。

しかしこの本の本当にすごいところはそんなところではなくて、「この本自体に中毒性があり、読ませてくる」というところにあります。ご経験ありませんか、この手の書き方本やコンサル式思考様式本を買ったはいいし、言いたいことはわかるんだけどなんせ読む気力がな〜...... からの積ん読。私はあります。本職のある社会人ともなればなおさらでしょう。

私はこの本の最も古い版と高校1年から10年の付き合いですが、おそらく5回は読み返しています。漫画を読む感覚で読めちゃうんです。これは戸田山先生自身も意識されており、まえがきに

読者の皆さんには本書を最後まで読み通してもらいたい。そのために私は、できる限り読み物としても楽しい本になるように心がけた。これが、本書の第二の独自性と関係する。*2

と書かれています。ちなみにこの引用部の文章もまだ硬く、その本性を表していません。本文はもっとはっちゃけており、作文ヘタ夫くんが1本レポートを完成させるまでの涙ぐましい物語です。

どんなに良いことが書いてあっても読まれない本は (少なくとも大衆書としては) 無いものと同じです。しかし読ませたところで中身が空っぽでは時間を返せという気分にもなります。その点でこの『論文の教室』は内容も詰まっておりかつ読み通せる、おそらく本邦無二の書き方指南書です。

とりあえずまえがきと第1章だけでも良いので読んでください。読んでなお文章の書き方本としてゴミだと思ったならば、批判*3のコメントをこちらに頂ければ、私が読んでその主張が合理的と感じた場合*4にはAmazonギフトカードで1500円分お返しいたします。その際はお送りいただいた文章の一部を経緯とともに戸田山先生にお送りする可能性もございます。ご同意の上ご送付ください。

 

メリットばかり書くのもアンフェアなので個人的に改善点だと思っている部分も最後に書いておきます。

  1. 本質的でない部分で出てくる単語が地味に難しい or 専門的である。
    例えばヘタ夫くんは動物に権利を認めるかどうかという昨今流行りの *5 テーマでのレポート作成を行うことになりますが、それに応じてピーター・シンガー (人名) やモードゥス・ポネンス (論証形式の例) など、聴き馴染みのない単語で、かつその後の説明にそこまで必要でない単語が少し出てきます。
    私は構わないのですが、世の中には知らないカタカナ語が出てくるとそこで本当に思考が固まるという人が少なからずいらっしゃるようです。彼らにこそこの本が届いてほしいというのが個人的に思うところですので、哲学者としての戸田山先生にはわずかばかり我慢いただけますと個人的にはより売れると思います (キラーフレーズ)。
  2. 真面目な話ししてるときに急に話が飛ぶ部分 (好き嫌いが分かれる)
    このブログを書くために最新版を買って久々に読んだのですが、大学と大学院で散々「結論から書け一言で言えるだろ一行で書け」と躾けられてきた"成果"か、ペイ・フォワードのくだりは少しイラッとしました (昔はそんなことなかった)。
    他のところは今のところ気にならないですし、それがこの本の特徴でもあるので悩ましいですね... (結論からの逃げは論文では禁止ですがここはブログですのでご寛恕いただき、これにて今回の記事を終わりとさせていただきたいと思います ())

*1:メールについてはそれまた色々めんどくさいので戸田山先生の教員人生40年で培われたアノ手コノ手で相手を動かすのメール術大公開が待たれるところです (割と本気で待っています)。

*2:戸田山和久 (2022年)『最新版 論文の教室 レポートから卒論まで』、NHK出版、p. 11

*3:非難ではない。

*4:作文へタ夫くんなんてベタだ、オヤジギャクが寒くて光熱費が平年より上がった、などの理由では受け付けませんのでご了承ください。

*5:第一版のときはそんなこともなかった... なちゅかしぃ

zoom入る君

定例のzoom会議、いつ入れば良いのかよくわからず、忘れるのも怖くてソワソワしている人、いませんか?私です。

そんなあなたに、予定時刻を指定するとその5分前〜3分前に自動でzoomに入ってくれるスクリプトPythonで書きました。

 

必要要件

・当日の時刻を指定するとその5分前〜3分前のランダムな時間に指定したURLを開いてくれる。

あればラッキーな要件

・日付も含めて指定できる。

・URLはテキストファイルなどで複数管理でき、都度選べる。

 

とりあえず必要要件だけなんとか満たしたものがこちらになります。pyinstallerでexec化して、execと同じディレクトリに入りたいURLだけ書いたurl.txtを置いてご利用ください。

ご利用はしなくていいんですが、Pythonの書き方わかってない (Pythonでなにか書くのは初めてです) ので、ご指導いただけるとありがたいです。

 

追記 (2022/10/30): 最近、モードレスダイアログなどへの書き換えを行っています。

参考文献: 

【Python/tkinter】新しいウィンドウを開く(モーダル、モードレスダイアログ) | イメージングソリューション

 

 

github.com