Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

EC-Council ECH (Certified Ethical Hacker)合格後のECEクレジットにカウントできたイベント

EC-Council CEH (Certified Ethical Hacker)試験に合格すると*1、以下のようなイベントが待っています。

  • ECE Membership Fee ($80/year)の支払い(1年間の猶予あり)
  • ECEクレジットの登録(120ポイント/3年)

ECEクレジットというのは、CISSPCPEクレジットや、PMP資格のPDUポイントみたいなもので、研修を受講したり、自主学習をしたりすることでポイントが貯まります……なんですが、どんな研修だったらポイントに算入されるのかはEC-Councilの判断で、判断基準も開示されていません。

試してみたところ、教育コースを提供する会社が主催していて、受講証明書も発行してもらえる研修なら、日本語のコースであってもポイントに算入できるようです。 その他にも、有志が行っている勉強会のたぐいも、やってみたら登録できました*2

この記事では、どんな研修や勉強会が登録できたかを記録しておきます。

法人等による研修

情報処理安全確保支援士オンライン講習

Event Description
教材が6つあるので、それぞれのタイトルを「/」で区切って列挙(半角「/」は入力できないので注意)。
Event Location
「eラーニング」と書いたらOKでした。
受講証明
集合講習向けに、eラーニングのサイトから受講証明書がダウンロードきるので、それを送付。

BrightTALKのwebinar

URL
https://www.brighttalk.com/mybrighttalk/knowledge-feed/
Event Description
Webinarの説明文をそのまま転記。コピペはできないのでがんばる
Event Location
「eラーニング」と書いたらOKでした。
受講証明
BrightTALKのKnowledge feedのページから「My viewing history」を選択すると、これまでに見たwebinarの一覧が表示される。そこから「Viewing Certificate」を桜花すると受講証明書がダウンロードできるので、それを送付。

有志による勉強会

Shibuya.XSS techtalk

URL
https://shibuyaxss.connpass.com/
Event Description
connpassのイベント画面から、「スピーカー」の内容(発表者とタイトル)を転記。英数字以外はコピペできないので気合でがんばる
受講証明
connpassのイベント画面のスクリーンショットを送付。開催日を過ぎてしまうと、イベント画面から「参加できます」的な表示が消えてしまうようなので、遅くとも開催日中にスクリーンショットを採っておいた方がいいかも。

Becks Japan

URL
https://becks.doorkeeper.jp/
Event Description
Doorkeeperのイベント画面から「トーク一覧」(発表者とタイトル)を転記。英数字以外はコピペできないので気合でがんばる
受講証明
Doorkeeperのイベントページで「申し込みの確認」ボタンを押すと、QRコード付きの参加票が表示されるので、そのスクリーンショットを送付。開催日を過ぎても表示できる。

#ssmjp

URL
https://ssmjp.connpass.com/
Event Description
connpassのイベント画面から「スケジュール」の内容(発表者とタイトル)を転記。英数字以外はコピペできないので気合でがんばる
受講証明
connpassのイベント画面から、受付番号を表示したページのスクリーンショットを送付。開催日を過ぎてしまうと、イベント画面から「参加できます」的な表示が消えてしまうので、遅くとも開催日中にスクリーンショットを採っておいた方がいいかも。

*1:研修や試験のときに説明された覚えがないんだけど、あります。会社のお金で研修や試験を受ける場合、会社側に伝えておいた方がいいかも。

*2:「Education Seminar/Conference/Event - 1 credit per hour」として登録

Bad designs in EC-Council ASPEN

Some of EC-Council ASPEN page designs are very annoying...

"Reset Password" screen

Detail:
The instruction says: "Password length should be 8-20, should consist a lower case letter(a-z), an uppercase letter(A-Z), a number(0-9) and a special character".
Expected Behavior:
The password like "Red-Sort-Ice-1" should not acceptable.
Actual Behavior:
The password like "Red-Sort-Ice-1" is not acceptable.
Note
I had to contact the support chat to reset my password.

"Manage My Events" screen

Detail:
The format string of "Event Date" and "Event Submission Date" should be congruous.
Expected Behavior:
Both of "Event Date" and "Event Submission Date" should be "2019-05-16" or "05-17-2019".
Actual Behavior:
"Event Date" looks like "2019-05-16", while "Event Submission Date" looks like "05-17-2019".

"Add Event" screen

Detail:
You should put event detail in "Add Event" screen.
Expected Behavior
You can use special characters like doller, slash, exclamation mark, question mark, hash sign, ampersand, etc.
Actual Behavior
You can use only minus(-), at(@), underscore(_), period(.), and comma(,) as special characters. You cannot use other special characters. YOU EVEN CANNOT USE NEWLINE! Note: also you cannot pasete non-ascii characters (e.g. Japanese) from clipboard, but you can put them from IME.

java.text.BreakIteratorによる文字数(grapheme)カウント

JIS X 0213など、シフトJISマイクロソフト コードページ932以外の文字をプログラム上で紙に印刷する場合には、入力された文字列を枠内に確実に収めるため、文字数を正しくカウントする必要があります。

JIS X 0213では複数のコードポイントで1文字を表す文字(合字)があります。このような場合、見た目の「1文字」を「grapheme」(書記素)と呼びます。印刷においては、書記素ひとつを「1文字」としてカウントする必要があるわけです。

さて、以下のサイト「文字数をカウントする7つの方法」では、java.text.BreakIteratorを使って書記素をカウントする方法を示しています。どうやらLINEで使われているカウントの方法らしい。 engineering.linecorp.com

ところが調べてみると、そのまま使うにはコーナーケースをカバーしきれていないようです……

https://repl.it/@satob/BreakIteratorTest

import java.text.BreakIterator;

class Main {
  public static void main(String[] args) {
    // (a) 一般的な非漢字「あ」
    //     (1書記素=1ユニット=1コードポイント)
    System.out.println("\u3042");
    // 1書記素とカウントすべきところ、正しく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u3042")); // -> 1

    // (b) サロゲートペア「𠮷」
    //     (1書記素=2ユニット=1コードポイント)
    System.out.println("\ud842\udfb7");
    // 1書記素とカウントすべきところ、正しく1書記素とカウントされる
    System.out.println(getGraphemeLength("\ud842\udfb7")); // -> 1

    // (c) 異体字セレクタつき文字「侮」
    //     (1書記素=2ユニット=2コードポイント)
    //     ただし2コードポイント目は異体字セレクタ(文字ではない)。
    System.out.println("\u4fae\ufe00");
    // 1書記素とカウントすべきところ、正しく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u4fae\ufe00")); // -> 1

    // (d) JIS X 0213合字「˥˩」
    //     (1書記素=2ユニット=2コードポイント)
    //     1文字目も2文字目も単独で書記素として意味をなす。
    System.out.println("\u02e5\u02e9");
    // 1書記素とカウントすべきところ、誤って2書記素とカウントされる
    System.out.println(getGraphemeLength("\u02e5\u02e9")); // -> 2

    // (e) JIS X 0213合字「カ゚」
    //     (1書記素=2ユニット=2コードポイント)
    //     2コードポイント目は合字用文字で、
    //     JIS X 0213非漢字に定義されている正しい合字の組み合わせ。
    System.out.println("\u30ab\u309a");
    // 1書記素とカウントすべきところ、正しく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u30ab\u309a")); // -> 1

    // (f) (e)の1コードポイント目と2コードポイント目を逆にしたもの
    //     JIS X 0213非漢字に定義されていない組み合わせ。
    //     2ユニット、2コードポイントだがJIS X 0213の文字としては不当。
    //     1コードポイント目は合字用文字だが、組み合わせる文字がないので
    //     表示時には合わせて2書記素ぶんの幅をとる。
    System.out.println("\u309a\u30ab");
    // 正しいは判断つかないが、ともかく2書記素とカウントされる
    System.out.println(getGraphemeLength("\u309a\u30ab")); // -> 2

    // (g) JIS X 0213にない合字「『ま』にマル」
    //     2ユニット、2コードポイントだがJIS X 0213の文字としては不当。
    //     フォントの実装上1書記素の幅で表示されるが、JIS X 0213の規格としては
    //     2書記素ぶんになるのでは?
    System.out.println("\u307e\u309a");
    // 正しいは判断つかないが、ともかく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u307e\u309a")); // -> 1
    
    // (h) (e)の2コードポイント目だけを単独でカウント
    //     1ユニット、1コードポイントだがJIS X 0213の文字としては不当。
    //     (f)の11コードポイント目と同様、表示時には1書記素ぶんの幅をとる。
    System.out.println("\u309a");
    // 正しいは判断つかないが、ともかく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u309a")); // -> 1

    // (i) (おまけ)ZWJを使った絵文字「👨<200d>👩<200d>👦」
    //     8ユニット、5コードポイント、1書記素。
    System.out.println("\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66");
    System.out.println(getGraphemeLength("\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66")); // -> 5
  }

  public static int getGraphemeLength(String value) {
    BreakIterator it = BreakIterator.getCharacterInstance();
    it.setText(value);
    int count = 0;
    while (it.next() != BreakIterator.DONE) {
        count++;
    }
    return count;
  }
}

まとめると、JIS X 0213の範囲では以下のような挙動をするようです。2.がキツいな……

  1. サロゲートペア、IVSは正しく処理されている
  2. 1コードポイント目・2コードポイント目とも書記素として正当な組み合わせの合字が2書記素とカウントされてしまう
  3. JIS X 0213として不正な合字でも無理やりカウントしてしまう
  4. (おまけ)ZWJは1書記素としてカウントされてしまう

対策としては以下のような感じかと思います。

  • 文字列長チェックの前に、JIS X 0213として不正なコードポイントの並びがないか確認する
  • 1コードポイント目・2コードポイント目とも書記素として正当な組み合わせの合字が含まれている場合、文字列長から引き算する

学校で習う漢字の書き順はどう決まったのか

私の母は「自分(母)が学校で習った内容とは、漢字の書き順からして違ってたから、変なこと教えちゃいけないと思って」私に勉強を教えることはなかった。じゃぁ学校で習う漢字の書き順はどう決まったのか?という話。

学校で習う漢字の書き順は、文部省「筆順指導の手引き」(昭和33年3月, 博文堂出版)で定められたんだけど、その内容を読んでみて気づいたこと。原典にあたるって大事ね。

  • もともと、書家の先生の間でも漢字の筆順は一致しないことがあった(そのために文部省が筆順を定めた)。 例: http://d.hatena.ne.jp/kuzan/20080509/1210319941
  • 「この書き順がいちばんきれいに書ける」とは言っていない。「書写指導の教育的な観点」から筆順を一貫させるべき、と言っている。
  • 「ここに取りあげなかった筆順についても、これを謝りとするものでもなく、また否定しようとするものでもない」と明示されている。
  • 標準的な筆順で文字が書けることを目標にするのは3年生から。
  • 筆順は手書きの毛筆書体で示されているので、現代の基準では先生に直されてしまうような文字(点の位置がズレてる、とか)が多く見られる。
  • 筆順を示しているだけで、画数は示されていない。紙面の都合もあってか、一部の書き順は省略されている(たとえば「字」の4画目と5画目はまとめられている)。

「おサイダー」の話

日本人の知らない日本語」に、外来語の名詞で頭に「お」がついて丁寧語になるもの……と聞かれて「おビール」と答えるくだりがあった。「おビール」は水商売でよく使う言葉だからやめなさい……みたいな話だったと記憶している。妻に同じ質問をしてみて、帰ってきた答えは「おトイレ」。 ビールとトイレの他に、そんな語はそうないよな……と思っていたのだが、古川緑波「ロッパの悲食記」にある「清涼飲料」の話にこんなくだりがあった。

ビールや、サイダーに、「お」の字を附けたのは、何時の頃からであろうか。

https://www.aozora.gr.jp/cards/001558/files/52328_46436.html

どうやら昔は「おサイダー」という言い方もあったらしい。今はググっても能登の「しおサイダー」しか引っかからない……