にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

このブログについて

文字・フォント・プログラム・技術・趣味などについて、Twitterでは書きづらい長い内容などをまとめるためのブログです。基本的には自分用のメモとして書いている部分が多いです。

リンク等

Pixiv http://pixiv.me/nixeneko
Tumblr http://nixeneko.tumblr.com/ 絵。Pixivアカウント持ってなくても見れます
Twitter https://twitter.com/nixeneko  
MediaMarker http://mediamarker.net/u/nixeneko/ 主に文字・言語関係の蔵書
GitHub https://github.com/nixeneko プログラム用、あまり使ってない
Amazon
欲しい物リスト
amazon.jp/registry/wishlist/1C43ZFBA4IL6Z プレゼントを下さい
ナナシスID ZhRYMnA
デレステID 421820148

同人誌(無料公開)

http://nixeneko.hatenablog.com/entry/c88_russian_alphabethttp://nixeneko.hatenablog.com/entry/c90_greek_latin_cyrillichttp://nixeneko.hatenablog.com/entry/20170811_dentyu

Adobe Illustrator CS6日本語版でタイ文字やアラビア文字を組む

Adobe CS6ソフトウェアを学生版の買い切りで購入して以来愛用しているが、InDesignはともかくIllustratorはタイ文字やアラビア文字といった複雑なテキスト配置を要する用字系(complex script)をまともに表示できなかったりと不満があった。しかし、Illustratorでも裏技的な方法でタイ文字やアラビア文字などを正しく表示することができるらしい。

Adobe InDesign CS6日本語版の多言語対応

Adobe InDesign CS6日本語版では「段落」パネルのメニューから「Adobe 多言語対応コンポーザー」が選択でき、それによってタイ文字やアラビア文字を一応まともに組むことができる。
f:id:nixeneko:20171213120147p:plain
文字を入力してみると次のようになる。
f:id:nixeneko:20171213160221p:plain
フォントはアラビア文字Times New Roman、タイ文字はAngsana New、ヒンディー語Adobe Devanagariを指定した。

ただし、「段落」パネルは書字方向の設定(RTL)に対応していない様で、RTL言語を組むための機能が揃っているとはいえないようだ。RLM (U+200F RIGHT-TO-LEFT MARK)を挿入することによって一応右横書きとして妥当な表示にはなるので、日本語の中にアラビア語を挿入するなどの場合には十分使えるのではないかと思う。

Adobe Illustrator CS6日本語版の多言語対応

一方、Adobe Illustrator CS6日本語版では多言語対応コンポーザーなどは選択できず、「Adobe 日本語コンポーザ―」のみとなっている。
f:id:nixeneko:20171213121442p:plain
これでは、アラビア文字のような右から左に書くもの(RTL)であったり、同じ文字が語中の位置に形が変わる書字系には対応できない。また、タイ文字の様に記号の位置調整が重要なものも正しく表示されない。次の画像が入力例である。
f:id:nixeneko:20171213155615p:plain
アラビア文字のひどさは言うまでもないが、タイ文字の2行目において、文字の上方で縦方向に2段積み重なっていた記号が重なってしまっている。また、ヒンディー語は母音の再配置ができていない。これでは使い物にならない。

World-Ready Comopser

ところで、調べていたら偶然、CS4以降のAdobeソフトウェア(InDesign, Photoshop, Illustrator)にはWorld-Ready Composerが実装されているということを知った。次の記事である。

これによると、ソフトウェアの中東版向けに右から左への横書きや語の位置による字形の置き換え(contextual substitution)のような機能が存在していたが、CS4からそれが中東版以外のソフトにもWorld-Ready Composerとして実装されたとのことである。

ただし、Illustratorなどにおいては、World-Ready ComposerはAPIとしては存在しているが、先に挙げたようにUIからアクセスすることはできない。とはいえ、実装自体はされているので、中東版のソフトウェアで作ったテキストエリアを含むファイルを開きコピペすることで、CS4のIllustratorでもWorld-Ready Composerを利用できるという。

前掲のWebサイトにおいて、World-Ready Composerを利用したテンプレートファイルが配布されている(“Templates for ID, Ai & PS”でページ内検索するとよい)。
これを開いてテキストエリアを新しいドキュメントにコピペするとWorld-Ready Composerが使えるようになる。


実際にIllustrator CS6 日本語版やってみたのが次である。
f:id:nixeneko:20171213155007p:plain
すごい! 完璧! ちなみに文字の再配置を要するデーヴナーグリー(ヒンディー語)などにも対応しているようである。
任意の用字系に対応している訳ではないので、前掲のブログ記事の中のリスト等で確認するとよいと思う。何にせよ、正しく組めているかは(分かる人が)自分の目で見て確認する必要があるだろう。

バージョンCC以降

さて、World-Ready Composerが実装されたのは、全世界的に機能を提供するためであるというのは想像に難くない。実際に、Adobe Illustrator CCにおいて、中東やインド言語のサポートが追加されている。

「環境設定」の「テキスト」から「インド言語のオプションを表示」をオンにすると「中東言語および南アジア言語コンポーザー」が利用できるようになるとのことである。

素晴らしい。CC契約しようかな……。


(20171213 16時追記: アラビア語をコピペミスってたので画像を修正。ちゃんと確認してないのがバレバレですね……。)

フォントのアウトラインを法線方向に太らせたり細らせたりしてみる

フォントのアウトラインの制御点を法線方向に沿って動かしたら文字の線をうまいこと太らせたり細らせたりできるのではないかと思ってやってみて、結果小さい移動量においてはそこそこになったように思う。

読まなくてもいい前書き

現在一般のコンピュータで使われているフォントは、文字を表す図形の輪郭をベクタフォーマットで収録したアウトラインフォントである。そのため、線の太さはアウトライン毎に固定され、線の太さを変えたければ別のアウトラインを用意するしかない*1
そこで、一つの書体のアウトラインを変形して文字の線の太さをうまいこと変化させられれば、太さの違う書体を用意しなくてもよいということになる*2


以下は、フォントのアウトラインの制御点を法線方向に沿って動かせばうまいこと太らせたり細らせたりできるんじゃないか!?と思いついたのでやってみたという記録である。恐らくこのような処理を実装しているソフトウェアはあるだろうし、これよりさらに良いアルゴリズムもあるだろうので、歪な車輪の再発明なのではという気はする。

ここで、アウトラインを「フォントの」と限定しているのは、アウトラインフォントに含まれるcontourがすべてclosed pathであり、open pathがないからという理由である。すなわち、contourによって表現される図形の外側と内側がはっきりとしているため、法線ベクトルを一意に定めることができる。

OpenTypeフォントではアウトラインを直線およびベジエ(Bézier)曲線の集合によって表現する。OpenTypeにはアウトラインデータの格納方式としてCFF形式とTrueType形式を選ぶことができるが、PostScript由来のCFFベースのもの(一般にこれが「OpenTypeフォント」と呼ばれる)では3次ベジエ曲線が使われ、TrueTypeベースのもの(これは一般に「TrueTypeフォント」とよばれている)は2次ベジエ曲線が曲線の表現に使われている。
この記事においてはTrueType形式のものについて扱うが、CFF形式の方でも同様に操作可能であると考えられる。

一続きの直線あるいはベジエ曲線によって表現される図形をcontourとよび、制御点列によって表現される。一つのグリフ(フォントによって描画を行う際の操作単位で、大抵は文字と一対一で対応付けられる)は0個以上のcontourからなる。

手法

一般に点に対して法線は求まらないが、ここでは、制御点の法線を、その制御点に隣接する2制御点とその制御点のなす2辺について、それぞれの単位法線ベクトルを足し合わせた方向のものとする。
つまり、 m個の制御点からなるあるcontourについて、制御点が \boldsymbol{p}_{k-1},\ \boldsymbol{p}_k,\ \boldsymbol{p}_{k+1} ( 0 \le k \le m-1)の順で並んでいたとき( \boldsymbol{p}_{-1} = \boldsymbol{p}_{m-1},\ \boldsymbol{p}_{m} = \boldsymbol{p}_{0}とする)、点 \boldsymbol{p}_{k}における法線ベクトル \boldsymbol{n}_{\boldsymbol{p}k}は、2点 \boldsymbol{p}_{k-1},  \boldsymbol{p}_{k}を通る直線の単位法線ベクトル \boldsymbol{n}_{k-1}と、2点 \boldsymbol{p}_{k},  \boldsymbol{p}_{k+1}を通る直線の単位法線ベクトル \boldsymbol{n}_{k}を用いて、
 \boldsymbol{n}_{\boldsymbol{p}k} = s(\boldsymbol{n}_{k-1} +  \boldsymbol{n}_{k} ),\ s > 0
と表せる。
なお、 s \displaystyle s = \frac{1}{\|\boldsymbol{n}_{k-1} + \boldsymbol{n}_{k}\|}と定めると単位ベクトルになる( \|\cdot\|ユークリッドノルムを指す)。
f:id:nixeneko:20171211190003p:plain
TrueTypeアウトラインにおいて、contourの制御点を順番にたどっていった時の右手側が塗りつぶされることになると決まっているので、 \boldsymbol{n}_{k} = (x_k,\ y_k)^\topとしたとき、 \boldsymbol{n}_{k}は、スクリーン座標系(左上原点)において次のように計算できる。
 \displaystyle \boldsymbol{n}_{k} =\frac{1}{\| n_k - n_{k-1} \|} (y_k - y_{k-1},\  x_{k-1} - x_k )^\top

ここで、フォントの座標系は左下原点だがスクリーン座標系は左上原点であり、y軸正方向が反転していることに気を付ける。

実験1

各頂点における単位法線ベクトルに沿って移動させ、色を変えて描画した図を次に示す。黒が元々のアウトラインであり、外側に移動させたものは緑~赤、内側に移動させたもの緑~青で描画している。
f:id:nixeneko:20171211230418p:plain
見ればわかる様に、頂点の前後の辺がなす角度に関わらず頂点の移動量が一定のため、全体として形が崩れていると感じられる。

実験2

次に、 s
 \displaystyle s = \frac{1}{1+\cos\theta} ( \thetaはその頂点を通る2辺の法線のなす角、上図参照)
とした場合の法線ベクトルの定数倍制御点を移動させてみる。
f:id:nixeneko:20171211231642p:plain
そうすると、移動量が大きい部分については自己交差して破綻している部分もあるが、小さい移動量においては割と全体的の形を保ったまま移動できているように思う。

ちなみに、 \displaystyle s = \frac{1}{1+\cos\theta}というのは、2辺の法線のなす角度が \theta = 0のときは \displaystyle s = \frac{1}{2} \displaystyle \theta = \frac{\pi}{2}のときは s = 1となるように定めた。

コード

描画に使用したPython 3コードを次に挙げる。描画に用いたフォントはM+フォントのmplus-1p-regular.ttfである。
フォントの読み込み~アウトラインの制御点列の抽出はFontToolsを利用した。
アウトラインの描画・画像の出力はPillowを利用した。
gist.github.com
制御点座標の操作はsetで表して泥臭くやったが、Google関わっているフォント系のライブラリにおいては制御点の表現に複素数型を使っていたし、あるいはNumPyのndarrayなどによって制御点を表すと座標計算が楽になるのではないかと思う。

考察

ベジエ曲線は凸包性(convex hull property)をもつ。凸包性とは、(n+1)個の制御点によって定義されるn次ベジエ曲線が(n+1)個の制御点の凸包(convex hull)の内部に含まれるという性質であり、要するに制御点がなす多角形によって曲線のだいたいの形が推測できるということで、これによって、ベジエ曲線の集まりで構成されるcontourについて、制御点のなす多角形(polygon)が均等に太るように動かすとそれによって表現されるベジエ曲線等もまあまあ均等に太るようになっている気がする。
何にせよ、ベジエ曲線(からなる図形)の操作に多角形の操作手法が適用できるというのは言えるのではないかと思われる。3DCGでオブジェクトをメッシュの法線方向に拡縮する手法があるので、それを適用してみてもいいかもしれない。

調べたら次のサイトが引っかかった。

このサイトによると、ベジエ曲線をオフセットした曲線を(同次)のベジエ曲線で表現することは不可能である、とのことであり、適当に近似するしかない。紹介されている手法では、適当にベジエ曲線を分割し、それらに対して法線方向に移動するというものである。

次のサイトでもいくつかの手法が紹介されているが、制御点を移動してみて、精度が十分でなかったら分割するという方針らしい。

結局、太らせたり細らせたりする方向にベジエ曲線を移動したものを同じ制御点数で正確に表現できないので、本手法では限界があるようではある。しかし、本手法で楽なのは、制御点の数が変化せず、また曲線を分割する必要がないため単純に前後の制御点をみて移動させるだけで済むという部分である。自己交差さえ何とかなれば何かに使えるかもしれない。

*1:2016年にリリースされたOpenType 1.8で導入されたvaribale fontではユーザーが書体の線の太さ等を動的に変えられるが、フォントデータには太さ等の違う2種類以上のアウトライン(に相当する)情報を含ませる必要がある。

*2:実際には、市販の書体ファミリー、特に極太書体では、字が潰れない様に部分的に細くしたりバランスを整えるために再配置したり要素を融合させたりといった調整を行っているため、機械的な太さの変更では一般に品質は低下すると考えられる。

OpenTypeフォントにSVGアニメーションを突っ込んでみる

Twitterを眺めてたらOpenType-SVGを実装した話が流れてきた。

ちなみにその実装ではラスタ画像をSVGのベクタ形式に変換しているが、SVGの<image>タグのxlink:href属性にPNG画像などをdata URI schemeを使って埋め込むとラスタ画像も利用できる。


最近はAdobeのソフトウェア(PhotoshopIndesignなど)がOpenType-SVGカラーフォントをサポートし始めたり、最新のWindows 10の描画エンジンでもサポートが始まり、Edgeなどでも表示できるようになっているらしく、今後が期待できる。


そういえば、OpenType-SVGではSMILによるアニメーションは問題なく突っ込めるという話があった*1

OpenType fonts with either TrueType or CFF outlines may also contain an optional 'SVG ' table, which allows some or all glyphs in the font to be defined with color, gradients, or animation.

https://www.microsoft.com/typography/otspec/svg.htm

せっかくなので試してみる。

SVGのアニメーションといえば前になんか作ってたなあと思ったので次のページで作成したSVGをフォントに突っ込んでみることにする。

手順

編集する下地のフォントとして、M+フォントのmplus-1p-medium.ttfからASCIIコード外のグリフをごっそり削除したものを利用した(編集にはFontforgeを利用した)。
これは次のリンクからダウンロードできる。

まず用意した下地のフォント(mplus-mod.ttf)をTTXでXML形式にダンプする。

ttx mplus-mod.ttf

するとmplus-mod.ttxが出来上がるので、このファイルをテキストエディタなどで開いて編集する。

今回はアルファベットの“W”の代わりにSVG画像が表示されるようにしてみる*2
まず、<GlyphOrder>タグで囲まれた要素を見て行って、WのglyphIDを調べる。今回は、次の記述から、58であることがわかった。

    <GlyphID id="58" name="W"/>


これをもとに、ルート要素である<ttFont>の子として次のように<SVG>タグを追加する。

  <SVG>
    <svgDoc endGlyphID="58" startGlyphID="58">
      <![CDATA[<svg xmlns="http://www.w3.org/2000/svg"
                    xmlns:xlink="http://www.w3.org/1999/xlink"
                    width="768" height="432" 
                    viewBox="0 600 764 432" id="glyph58">
        (SVGの描画される要素がここに入る)
      </svg>]]>
    </svgDoc>
  </SVG>

ここで、<svgDoc>タグにはstartGlyphIDおよびendGlyphID両属性に58(WのglyphID)を指定している。
また、<svg>タグはhttp://nixeneko.2-d.jp/hatenablog/20170330-svganim/animate.svgの中身を突っ込んだものであるが、viewBoxの2番目の値を600に変更し、さらにWのglyphIDの58に合わせてid="glyph58"の指定を追加している。<svg>タグの子孫要素は長いので記載を省略した。


最後に編集した.ttxファイルをTTXで.ttfフォントファイルに変換する。

ttx -o out.ttf mplus-base.ttx

完成したフォントは次のリンクからダウンロード可能:

サンプル

次のページで実際に試すことができる:


実際にFirefoxで見てみると次のようになった。
f:id:nixeneko:20171031204634g:plain
こいつ…動くぞ…!?


なお、Edgeで見てみたら次のような感じになり、アニメーションは動かなかった*3
f:id:nixeneko:20171031210837p:plain
ここで、SVG画像の表示される高さや大きさが、Firefoxの場合と異なっている。SVGファイルをそのまま突っ込んだだけで幅・高さの辻褄を合わせていないから実装依存になってしまっているのだと思う。

ちょっとした解説

OpenType-SVGでは複数のグリフに対して一つのSVG文書(画像)を指定することができる。

つまり、TTXの形式では、一つの<svgDoc>を複数のglyphIDに対応付けることができる。この対応付けはstartGlyphIDとendGlyphIDで指定し、指定されたstartGlyphID~endGlyphID間に含まれるglyphIDに対応するグリフがそのSVG文書に結び付けられる。

また、<svgDoc>内に埋め込まれるSVG文書には、id="glyph58"のように、idに“glyph<glyphID>”の形で(その<svgDoc>と結びつけられた)glyphIDに対応するid属性を指定した要素が含まれていないといけない。グリフが描画されるとき、そのglyphIDに対応するidを持つ要素が画面に表示されることになる。

詳しくは仕様書を参照: The SVG Glyph Outlines Table


あと、svgのviewBoxの2番目の要素を変化させると、SVGがフォントとして表示される際の位置を上下に動かすことができる。今回使ったSVG画像は最初viewBox="0 0 764 432"と指定されていたが、その状態では丁度ベースラインからぶら下がる位置に表示された。なので、もう少し上の位置に表示させるためにviewBox="0 600 764 432"を指定した。

今回はSVG画像の幅や高さは特に気にせず突っ込んだが(それでも動く…!)、高さはフォントのEMのユニット数、幅はグリフのadvanceWidthに合わせるといいのではないかという気がする。描画時にどのように描画サイズが計算されるのかはちゃんと確認した方がよさそう。

まとめ

  • SVG画像で表示したいグリフに対応するよう指定してSVG画像を突っ込めばOpenType-SVGカラーフォントは作成できる
  • FirefoxではSVGのアニメーションまで動く
  • EdgeではOpenType-SVGは表示できるがアニメーションは動かない
  • SVGの幅や高さの指定がフォントの高さやグリフの幅と合ってない場合、表示位置や大きさは実装依存っぽい

*1:セキュリティ上の理由から、Javascriptは動かない。

*2:なぜWかというと、Windowsのフォントビューアのサンプルテキストの最初に来る文字だからである。なお、Windowsのフォントビューア自体はSVGフォントに対応してないので普通にWが表示された。

*3:そもそもEdgeってSMILアニメーションに対応してなかった…。

ins/delタグのdatetimeで指定された追記/削除時間を表示する

HTML文書を書いているとき、<ins>や<del>などのタグで追記や削除を行う場合に、その追記や削除を行った時間を表示しておけたらいいと思うことがある。これらのタグにはdatetime属性で時間が指定できるので、そこで指定された日時に追記あるいは削除された、ということを自動で表示できるようにしたい。

要するに、例えば、

<ins class="test" datetime="2017-10-28T01:23:45+09:00">こんばんは。</ins>

と書かれた場合、

(2017年10月28日追記)こんばんは。

などと表示できたらうれしい。


ここで、タグの前に文字列を挿入するのはCSSの擬似要素を使えばできるのだが、固定テキストやタグに指定された属性の内容等を挿入することはできる一方、それらを組み合わせたり複雑な処理を行うことはCSSのみではできないようだ。


次掲のページによると、Javascriptで直接擬似要素をいじることはできないが、擬似要素に適当な属性を指定しておくとそれ経由でJavascriptで動的に表示を変更できるらしい。


というわけで、作ってみた。

実行例

おはようございます。こんばんは。今朝今晩もいい天気です。今日も頑張っていきもう寝ましょう。

datetimeに何も指定しない場合は特に何も挿入しないようにした。

ソース

<style type="text/css">
ins::before {
  content: attr(data-before);
}
ins{
  text-decoration-line: underline;
  text-decoration-style: dashed;
}
del::before {
  content: attr(data-before);
}
</style>

<script type="text/javascript">
//forEachに渡すdata-before要素を書き換える関数を返す関数。
//追記と削除で同形式だから統合した。
function getRewriteAttrFunc(inserttext){
  return function(elem){
    datestr = elem.getAttribute('datetime');
    if (datestr){ //datetime要素が空でない場合
      t = new Date(datestr); //Date型に変換
      writestr = "("+t.toLocaleDateString()+inserttext+") "; 
                                            //(2017/10/28に追記) とか
      elem.setAttribute('data-before', writestr);
    }
  }
}
//HTMLのロード完了時に実行
document.addEventListener("DOMContentLoaded", function(event) {
  Array.prototype.forEach.call(document.getElementsByTagName("ins"), 
                               getRewriteAttrFunc("追記"));
  Array.prototype.forEach.call(document.getElementsByTagName("del"), 
                               getRewriteAttrFunc("削除"));
});
</script>

<del datetime="2017-10-30T01:27:42+09:00">おはようございます。</del><ins 
datetime="2017-10-30T01:27:42+09:00">こんばんは。</ins><del>今朝</del><ins
>今晩</ins>もいい天気です。<del datetime="2017-10-30T01:27:42+09:00"
>今日も頑張っていき</del><ins datetime="2017-10-30T01:27:42+09:00">もう寝</ins
>ましょう。

日付を表す文字列を用意するのにtoLocaleDateStringを使ってるけど、要するにロケール異なるとまた違う出力になりそうなので、代わりにgetFullYear, getMonth, getDateあたりのメソッドから泥臭く作る方がrobustかも。

datetime属性の指定が壊れてる場合に“(Invalid Date追記)”などという表示になる。対応したほうが良いかもしれない。

あと、window.onload使うのも、他に使用しているJavascriptライブラリと競合してしまってよくない場合があるかもしれない。jQueryなどのライブラリを使ってる場合はそちらに投げてしまったほうがいい気がする。
コメントでご指摘いただいたように、window.onloadの代わりにdocument.addEventListener("DOMContentLoaded", function(event){ … });を使うように書き換えた。

家の壁に付いている電灯のスイッチを修理する


経緯

壁に付いているスイッチが壊れて、オフ状態で留まらなくて常にオン状態になってしまったので、これを常々直したいと思っていた。なお、直す前はガムテープで貼りつけて固定してなんとか凌いでいた。

必要な資格

さて、家の配線をいじることになるが、電気工事士法 第三条2によると

2 第一種電気工事士又は第二種電気工事士免状の交付を受けている者(以下「第二種電気工事士」という。)でなければ、一般用電気工作物に係る電気工事の作業(一般用電気工作物の保安上支障がないと認められる作業であつて、経済産業省令で定めるものを除く。以下同じ。)に従事してはならない。

http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=335AC0000000139&openerCode=1

とのことである。ここで、一般用電気工作物というのは、電気事業法で規定されているが、電力会社から低圧(600V以下)で受電する家庭や小規模な事業所などの配線や電気設備を指す*1
要するに、第二種(または第一種)電気工事士にならないと家の配線を弄ることはできない。

という訳で、工事の為に第二種電気工事士の免状の交付を受けることが必要になるが、そのためにはまず第二種電気工事士試験を受けて合格しないといけない。(第一種は条件がより厳しく、携わることのできる工事の種類が第二種のsupersetになっている。)

申し込み

第二種電気工事士試験は年2回行われていて、筆記試験と技能試験があり、その両方に合格した場合に免状の交付を受けることができる。
2017年の上期試験の申し込み期間は3月15日(水)~4月5日(水)であったのでその間にネットで申し込んだ。


筆記試験

2017年上期の筆記試験は6月4日(日)、技能試験は7月22日(土)あるいは7月23日(日)のどちらか。筆記試験から技能試験までは一ヶ月以上間が開くので、まずは筆記試験の対策をした。

筆記試験対策に使ったテキストは次。

2017年版 第二種電気工事士試験 完全攻略 筆記試験編

2017年版 第二種電気工事士試験 完全攻略 筆記試験編

一日3~4時間で1~2週間ほど勉強した気がする。要点をさらいながら一通り練習問題をこなしていけば、合格点の60点はとれるのではないか。
テキストを勉強しながら作ったノートが次。多分間違いがあるので参考にしてはいけない。


筆記試験は2時間と時間的に余裕があるので、そこまで急ぐ必要はない。退室可能時間になると結構な人が途中退室していく。合格率は6割程度らしい。

技能試験

7月初旬に筆記試験の合格通知が来た。それから技能試験まで2週間程度あった気がする。時間が確保できるのであれば技能試験対策は合格通知が来てからでも全然間に合う。

技能試験対策のテキストとして次を利用した。

2017年版 第二種電気工事士試験 完全攻略 技能試験編

2017年版 第二種電気工事士試験 完全攻略 技能試験編

他に、工具セット一回分の練習材料を購入した。いろいろな会社が出してるが買うのはどれでもいいと思う。ただ、工具のVVFケーブル用ワイヤストリッパーはなくても受験できるが、技能試験は時間的な余裕があまりないので、あった方がケーブルや電線の被覆を剥くのが手早くできて良い。

一週間ほど前から一日に候補問題を2~3問分、3~4時間程度練習した。13問ある候補問題を本番のつもりで一通り作れば力はつく気がする。最初は一問完成させるのに1時間近くかかったが、最後は試験時間の40分ぎりぎり~5分程度余裕を持たせて終わらせられるようになった。欠陥があると困るので、よくチェックし、欠陥となる基準を覚えておく。




当日は5~10分程度時間に余裕をもって完成させられれば安心な感じ。間違えると焦るが、5分あればリカバリは利く。退出時に眺めた限りだと完成できてない人もそれなりに居たみたいだった。合格率は7割程度らしい。

免状の申請

合格していれば9月上旬に合格通知が届く。


住んでいる都道府県の窓口に免状の交付を申請する。直接行くこともできるが郵送で申請することもできるので、住んでいる都道府県の窓口に確認する。
結局、郵送で申請した。3週間ほどで免状が届き、晴れて家の電気工事ができるようになった。

スイッチの修理

修理自体は単純なもので、ブレーカーを切って埋込連用スイッチを交換するだけであり、10分ほどあればできる。スイッチは技能試験の練習用部品として購入したものを流用した。

ここで、それまで設置されていたスイッチの工事が、電気工事士試験でやったらまず合格しないだろうなという施工でびっくりした。写真は撮ってないが、スイッチの差し込み穴に差し込まれていた電線の露出部がスイッチの外に数ミリ出てたわけで……。

スイッチ不調の原因

取り外したスイッチを分解してみたところ、オフの位置で留まらないのは中のバネが割れていたためのようだった。ちょっと力を加えたら完全に2つに分かれてしまった。
f:id:nixeneko:20171027173756p:plain
f:id:nixeneko:20171027173724p:plain
f:id:nixeneko:20171027173548p:plain
f:id:nixeneko:20171027173343p:plain
写真でみても割れているのがわかる。

まとめ

申し込みから工事までにかかった時間: 7か月弱

かかった金額:

第二種電気工事士試験 受験手数料 9,300円
2017年版 第二種電気工事士試験 完全攻略 筆記試験編 2,030円
2017年版 第二種電気工事士試験 完全攻略 技能試験編 2,030円
ホーザン(HOZAN) 電気工事士技能試験工具セット DK-18 9,363円
平成29年度 第二種電気工事士技能試験練習材料(1回練習分) 13,500円
免状の申請手数料 5,200円
合計 41,423円

ほかに、書留の送料、証明写真料金などもかかっている。


普通に電気店に工事依頼した方が安くて早いですね。

Raspberry Pi Zero Wのセットアップ(Raspbian Stretch Lite)をして超A&G+音声再生機にする

Raspberry Pi Zero Wを買ったが、ディスプレイ接続端子がMini HDMIということで接続ケーブルがなかった。
ディスプレイを繋がない状態(headless)でセットアップしようとしたが、上手くいかなかったのでMini HDMI-HDMI変換アダプタを買い、キーボードもUSB Micro-Bオス-Aメス変換アダプタを利用して接続して調べたところ、headlessセットアップのやり方がわかったのでメモ。

また、ついでに超A&G+(AGQR)音声再生機にしてしまう。


なお、セキュリティ関係の設定は省いているのでセキュリティ的には微妙なはずなので注意。

環境

  • 母艦: Windows 10 64-bit
  • Raspberry Pi Zero W
    • インストールするOS: Raspbian Stretch Lite (Version: September 2017)

手順

Micro SDへのイメージ書き込み

上のダウンロードページからRaspbian Stretch Liteのzipファイルをダウンロードしてくる。
解凍した中身の“2017-09-07-raspbian-stretch-lite.img”をWin32 Disk Imagerなどを利用してMicro SDカードに書き込む。

SSH有効化

sshを有効にするため、イメージを書き込んだSDカード(bootという名前になっている)を開いて、"ssh"という空ファイルを作成する。

Wifi接続設定

Wifiの設定を行う。

If a wpa_supplicant.conf file is placed into the /boot/ directory, this will be moved to the /etc/wpa_supplicant/ directory the next time the system is booted, overwriting the network settings; this allows a Wifi configuration to be preloaded onto a card from a Windows or other machine that can only see the boot partition.

https://www.raspberrypi.org/blog/another-update-raspbian/

とのことで、Windowsから開けるbootのパーティションに設定ファイルであるwpa_supplicant.confを突っ込んでおくと自動で適切な場所にコピーしてくれるらしい。

次のような内容でwpa_supplicant.confを作成しSDカードに突っ込む。一行目がないと接続されないので気を付ける。

ctrl_interface=/var/run/wpa_supplicant
network={
    ssid="xxxxxxxxxxxxxxxxxxxx"
    psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    key_mgmt=WPA-PSK
}

起動

USBで電源に接続すると起動する。USB端子は2つあるが、端の方にある方は電源供給専用らしい。
起動すると自動的にWifiに接続される。IPアドレスRaspberry Pi Zero Wにディスプレイを繋げていればそこに表示されるが、分からない場合はAdvanced IP Scannerなどを利用して調べる。

SSH接続

sshで接続する。
この環境ではCygwinにOpenSSHのsshクライアントをインストールしてあるので、Cygwin端末を開き、Raspberry Pi Zero WのIPアドレス(例では192.168.11.10)を指定して次のように実行する。(Cygwinを入れてない場合はTera Termなどを利用して接続する)

ssh pi@192.168.11.10

パスワードを求められるので、Raspbianの初期パスワードraspberryを入力するとログインできる。(ついでに、rootパスワードはadminであるらしい)

あとはCLIでやりたい放題。Debianなので楽。

ソフトウェアを最新版にしておく:

sudo apt update
sudo apt upgrade

ラジオにする

pHAT DACセットアップ

まず、Raspberry Pi Zero W側にピンヘッダ(別売り)を、pHAT DAC側にピンソケットをはんだ付けし、それらを接続する。
また、pHAT DACのミニジャックにスピーカーなどを接続しておく。ヘッドフォンを繋ぐ場合、音量が結構大きいので注意。音量コントロールのついているものを接続するのがよいと思う。

次にソフトウェアのインストールを行う。次のコマンドを実行:

curl https://get.pimoroni.com/phatdac | bash

その後、再起動する。

ストリーミング受信に必要なソフトウェアのインストール

sudo apt install rtmpdump ffmpeg

超A&G+ (AGQR)音声の再生


↑を参考に、次のコマンドを実行するとpHAT DACから音声が流れる。

rtmpdump -r rtmp://fms-base1.mitene.ad.jp/agqr/aandg22 --live -o - | ffmpeg -i - -vn -f s16le -ar 48k -ac 2 - | aplay -f dat

起動時に自動再生する様に設定

再生用シェルスクリプトの用意
nano playagqr.sh

playagqr.shを次の内容で作成:

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
rtmpdump -r rtmp://fms-base1.mitene.ad.jp/agqr/aandg22 --live -o - | ffmpeg -i - -vn -f s16le -ar 48k -ac 2 - | aplay -f dat

実行属性をつけて/opt/にコピー。

chmod +x playagqr.sh
sudo cp playagqr.sh /opt/
systemdを利用した自動起動

systemdを利用して起動時に自動実行されるようにする。

sudo nano /etc/systemd/system/playagqr.service

playagqr.serviceを次のような内容で作成する:

[Unit]
Description = Play AGQR radio

[Service]
ExecStart=/opt/playagqr.sh
Restart=always
Type=simple
User=pi
Group=audio

[Install]
WantedBy=multi-user.target

自動起動を設定する:

sudo systemctl enable playagqr

これで、電源を繋いでしばらくするとAGQRの音が再生されるようになる。