Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

Easy-RSA による公開鍵基盤(PKI)

はじめに

いわゆるオレオレ的な証明書の発行のためにプライベートな認証局(CA)を構築する、なんて経験は誰もがあるはず。自分も今までは CA スクリプトなど使いながらわりと苦労して構築してたんですが Easy-RSA なるシェルで簡単に構築できることが分かったので備忘録として残しておきます。

前提:

続きを読む

Fedora34でデフォルトIMEがAnthyになるですって!?? 〜OSSかな漢字変換再考〜

え、Anthy・・・!?!?

昨年末、LinuxディストリビューションFedora界隈でこんなディスカッションなるものがあったそうです。。。

fedoraproject.org

中身はタイトルのとおりなのですが、、、

Fedora次期バージョン(=Fedora34)からデフォルトIMEIBus-Anthyになる!!

とのこと。

趣味でかな漢字変換を自作している著者としては、「何事!?」と思われるお話だったのですが、よく考えると「あ〜なるほど」とある程度は納得のできるお話でした。(注:全てに納得したわけではありませんが

というわけで今回は、OSSかな漢字変換について振り返りをしてみようと思います。

本日、話題となるかな漢字変換はこちら。

それでは、行ってみます!

続きを読む

FIRフィルタのフレーム処理

信号処理ではそのアルゴリズムによってフレーム単位で処理している場合が多いです。 フーリエ変換を行う場合は、そのサイズ(点数)でフレーム化されたりします。 このようなケースを考えたとき、フィルタもそのフレームサイズに適した形が都合が良く、高速化(最適化)に関しても利点が多いです。

  • FIRのフレーム処理
    • サンプルコード 【C言語
  • 検証用のコード
    • サンプルコード 【C言語
続きを読む

思考のサルベージ(その13)

各工程で心がけたい思想を掘り起こしてみる

年末ですね。ということで開発の最後に片づける「ドキュメント整理」について考えてみます。

ドキュメント整理とは?

ドキュメント整理とは、要求仕様書とそれに対する上流工程から下流工程の設計書、試験仕様書など複数のドキュメントを紐づけて、一つの体系的なドキュメントとして完成させることですね。

どのように要求仕様、設計書を紐づけていくかはプロジェクト立ち上げの段階から規定されていることがほとんどなので、要求から設計書・試験仕様書作成し、ルールに従ってドキュメントを登録していけば、体系化させることにはそれほど手間はかからないはずです。

ルールでよくあるのは、各要求項目ごとにナンバリングして、その要求に対応するドキュメントやコードのコメントにもナンバーを記載していく、なんてのをよく聞きますね。設計仕様に記載される設計がどの要求に対応したもで、そのための試験がどの試験仕様書で表現されているか追跡できることが重要です。要求仕様、各設計書、試験仕様書が体系的に管理されていれば、機能漏れ、試験漏れを防ぐことができます。

設計変更

設計・コーディングが終わり、試験工程にはいると当然不具合が検出され、コード修正を繰り返し、製品の品質を上げていくことになります。大きな設計変更がなければドキュメント整理なんて楽なもんです。

ただ、途中で要求が追加されたり当初の機能設計ではもともとの要求にも対応できていない、なんてことも発生します。逐次設計書の修正・コード修正と段取りを踏めればよいのですが、大抵は設計追加・変更の簡単な資料を作っておいて、正式なドキュメントの修正は後回しになってしまいますね。

最新化

こうなると、ただのドキュメント整理に、設計仕様書・試験仕様書の最新化というひと手間が入ります。変更箇所が少なければそれほど辛くはないですが、不思議なもので変更が入る機能には山ほど変更がはいるんですよね。 ただし、ここでしっかりと最新化をしておけば設計資料は後継機開発の重要な財産となります。ここは覚悟を決めてしっかりと資料の最新化をしておきたいところです。

何か掘り起こせた?

  • 体系的にドキュメント整理されていれば、実装漏れ、試験漏れを防ぐことができる
  • 手間暇かけて最新化をしておけば、システムの財産となる。

逆に、ここができていないとせっかくの財産がいまいち役に立たないなんてことになります。流用元の設計書とコードを見比べたら、なんか違うことやってる、みたいなことも時々ありますね。

おしまい

他のメンバが後継機の初期検討に入っているのに自分だけまだドキュメント整理やってるなんてときは、なんとなくさみしくなります。

GPG キーのエクスポート/インポート

はじめに

過去の投稿「GitHub の Verified マーク」の中で GPG を使用しました。マシンの買い替えにあたり、手っ取り早く GPG キーを移行することにしたので備忘のためこの手順を残しておきます。

移行は、

  1. 古いマシンで GPG キー、GPG 署名キーのエクスポート
  2. 新しいマシンで GPG キー、GPG 署名キーのインポート
  3. 新しいマシンで GPG キーの所有者信頼を設定する

の手順で進めます。

続きを読む

Audacity『ノイズ除去』の周波数特性

Audacityのノイズ除去を検証してみる」では、AudacityのNoise Reductionが周波数を分析しているのならば、特定の周波数をノイズとした時、その周波数が消えるか?という観点で調べてみました。周波数特性についてもう少し検証してみます。

  • 周波数特性を調べる方法
    • ノイズプロファイルの周波数特性を調べる
      • 1kHzの正弦波をノイズプロファイル
      • ホワイトノイズをノイズ除去して周波数特性を調べる(Noise Reductionに入力して出力を調べる)
  • ホワイトノイズは消せるか?(分析しているのは周波数だけか?)
    • ノイズレベル大:約-40dB
      • ノイズ除去=12dB(感度=6, 周波数平滑化=3)
      • ノイズ除去=18dB(感度=6, 周波数平滑化=3)
    • ノイズレベル小:約-49dB
      • ノイズ除去=12dB(感度=6, 周波数平滑化=3)
      • ノイズ除去=18dB(感度=6, 周波数平滑化=3)
  • ノイズプロファイルでは何をしている?
続きを読む

The Continuing Story of Error Correction Code 6

行列

はじめに

ここまでの記事で4ビットの送信語、 D_{4} D_{3} D_{2} D_{1}から単一パリティ符号やハミング符号を生成する、ということを考えてきました。
今回からはこれらの符号生成などを行列を使って表現する、ということをやってみたいと思います。
ところで行列、やったことありますか?
昔は高校の数学(数C、だったかな・・・)でも行列を扱っていましたがゆとり教育のあたりから高校では扱わなくなっていたんですね。
これが最近、国の「AI戦略」とやらで高校数学に復活するという話も出ていますね。
そんなこんなで行列、基礎からやってみましょう。
ただし、必要なものを必要なときにやっていく、という方向にしておきます。
まずは送信語を符号語に変換する、という部分を行列で表現できるようになりましょう。

そうだ、焼き鳥屋に行こう

とりあえず、焼き鳥屋に行ってビール飲みながら焼き鳥でも食べましょう。
お品書きは・・・

品名 値段
生ビール 500円
日本酒(一合) 300円
ねぎま 80円
きも 100円
なんこつ 100円
はつ 90円
かわ 80円

とりあえず生ビールね、さて何食べようかしらん。 あぁ、これが伝票ね。

品名 値段 注文数 小計
生ビール 500円 1 500円
日本酒(一合) 300円 0 0円
ねぎま 80円 0 00円
きも 100円 0 0円
なんこつ 100円 0 0円
はつ 90円 0 0円
かわ 80円 0 0円
合計 500円

生ビール来たよ、じゃあやきとりの注文ね。
ねぎま、きも、それからかわを2本ずつ。

品名 値段 注文数 小計
生ビール 500円 1 500円
日本酒(一合) 300円 0 0円
ねぎま 80円 2 160円
きも 100円 2 200円
なんこつ 100円 0 0円
はつ 90円 0 0円
かわ 80円 2 160円
合計 520円

伝票が2枚ありますが、この計算を式で表すと


(500円×1+300円×0+80円×0+100円×0+100円×0+90円×0+80円×0)\\
+(500円×0+300円×0+80円×2+100円×2+100円×0+90円×0+80円×2)\\
=(500円+0円+0円+0円+0円+0円)+(0円+0円+160円+200円+0円+160円)\\
=500円+520円\\
=1020円

となります。
これを行列で表してみます。

お品書き行列

まずはお品書きを行列で表します。
[と]あるいは(と)の間に値段を並べていきます。
この記事では[と]を使用して書いていきます。
それぞれの値段の区切りにカンマなどは使わないでスペースで区切っていきます。 一番左の列が生ビール、2番目の列が日本酒、3番目の列がねぎま、とお品書きの順番に単価をならべていきます。


\begin{bmatrix}
生ビールの単価 & 日本酒(一合)の単価 & ねぎまの単価 & きもの単価 & なんこつの単価 & はつの単価 & かわの単価
\end{bmatrix}

 
メニューの種類は7種類なので1行7列の行列になります。
実際の単価を入れた行列は以下のようになります。


\begin{bmatrix}
500 & 300 & 80 & 100 & 100 & 90 & 80
\end{bmatrix}

とりあえず生ビール伝票行列

最初に注文した生ビールの伝票を行列にしてみます。 こちらは注文数を縦にならべていきます。
一番上の行が生ビール、2番目の行が日本酒、3番目の行がねぎま、とお品書き行列の列に並べた順番と同じにします。


\begin{bmatrix}
生ビールの注文数\\
日本酒(一合)の注文数\\
ねぎまの注文数\\
きもの注文数\\
なんこつの注文数\\
はつの注文数\\
かわの注文数
\end{bmatrix}

 
メニューの種類は7種類なので7行1列の行列になります。
とりあえず生ビールの行列は以下のようになります。


\begin{bmatrix}
1\\
0\\
0\\
0\\
0\\
0\\
0\\
\end{bmatrix}

最初の食べ物オーダー伝票行列

最初に頼んだ焼き鳥の伝票も行列にしておきましょう。
とりあえず生ビール伝票行列と同じように縦に注文数をならべていきます。


\begin{bmatrix}
0\\
0\\
2\\
2\\
0\\
0\\
2
\end{bmatrix}

伝票を1枚にする

今、とりあえず生ビールの伝票と最初の食べ物オーダー伝票の2枚の伝票がありますが、面倒なので1枚の伝票にまとめてしまいましょう。
行列の足し算を行います。


\begin{bmatrix}
1\\
0\\
0\\
0\\
0\\
0\\
0\\
\end{bmatrix}+
\begin{bmatrix}
0\\
0\\
2\\
2\\
0\\
0\\
2
\end{bmatrix}=?

 

行列の足し算をどうやってやれば良いのか説明していませんが、話の流れからして各メニューごとの注文数を足し算すればよさそうですね。


\begin{bmatrix}
1\\
0\\
0\\
0\\
0\\
0\\
0\\
\end{bmatrix}+
\begin{bmatrix}
0\\
0\\
2\\
2\\
0\\
0\\
2
\end{bmatrix}=
\begin{bmatrix}
1\\
0\\
2\\
2\\
0\\
0\\
2
\end{bmatrix}

行列の足し算は各行列の同じ位置の要素を足すだけです。
足し算をするためには足す行列と足される行列の行数、列数が一致している必要があります。
ここではどちらも7行1列の行列なので足し算を実行することができます。
さて、これで伝票を一枚にすることができました。
次は行列で合計金額を計算してみましょう。

合計金額を求める

合計金額を求めるになどうしたら良いでしょうか。
普通に計算するなら


合計金額 = 生ビールの単価 × 生ビールの注文数 + 日本酒(一合)の単価 × 日本酒(一合)の注文数 + ねぎまの単価 × ねぎまの注文数 
+ きもの単価× きもの注文数+ なんこつの単価 × なんこつの注文数 + はつの単価 × はつの注文数 +かわの単価 × かわの注文数

 
ですよね。 これを行列で表現します。
まず、お品書き行列をおき、お品書き行列に伝票行列をかけます。


\begin{bmatrix}
生ビールの単価 & 日本酒(一合)の単価 & ねぎまの単価 & きもの単価 & なんこつの単価 & はつの単価 & かわの単価
\end{bmatrix}×
\begin{bmatrix}
生ビールの注文数\\
日本酒(一合)の注文数\\
ねぎまの注文数\\
きもの注文数\\
なんこつの注文数\\
はつの注文数\\
かわの注文数
\end{bmatrix}\\
=\begin{bmatrix}
合計金額
\end{bmatrix}

 
行列で掛け算を行う場合も普通に計算する場合と計算方法は同じです。
実際の値を入れて計算してみましょう。


\begin{bmatrix}
500 & 300 & 80 & 100 & 100 & 90 & 80
\end{bmatrix}×
\begin{bmatrix}
1\\
0\\
2\\
2\\
0\\
0\\
2
\end{bmatrix}\\
=\begin{bmatrix}
(500 × 1) + (300 × 0 ) + (80 × 2) + (100 × 2) + (100 × 0) + (90 × 0) + (80 × 2)
\end{bmatrix}\\
=\begin{bmatrix}
+500 + 0 + 160 + 200 + 0 + 0 + 160
\end{bmatrix}\\
=\begin{bmatrix}
1020
\end{bmatrix}

それぞれの小計(単価×注文数)を計算して、小計をすべて合計する、それだけですね。
行列の掛け算では掛けられる行列(ここではお品書き行列)の列数(ここでは7列)と掛ける行列(ここでは伝票行列)の行数(ここでは7行)が一致している必要があります。
そりゃそうですよね、伝票の8行目に注文数2と書いてあってもお品書き行列には8列目はないのだから一体何を注文したのかわからないですもんね。


\begin{bmatrix}
500 & 300 & 80 & 100 & 100 & 90 & 80
\end{bmatrix}×
\begin{bmatrix}
1\\
0\\
2\\
2\\
0\\
0\\
2\\
2(何を2個注文したの・・・?)
\end{bmatrix}\\

 
これだけでは普通に計算しているのと変わらないので2枚の伝票から計算してみましょうか。

伝票2枚バージョン

先ほどは2枚の伝票行列を足して1枚の伝票で計算しましたが伝票行列を2枚に分けてから計算してみましょう。
2枚の伝票を行列で表す場合、2列に並べて一つの行列とします。
1列目がとりあえず生ビール伝票、2列目が最初の食べ物オーダー伝票です。


\begin{bmatrix}
1 & 0\\
0 & 0\\
0 & 2\\
0 & 2\\
0 & 0\\
0 & 0\\
0 & 2
\end{bmatrix}

 
お品書き行列に伝票行列2枚バージョンを掛けてみます。


\begin{bmatrix}
500 & 300 & 80 & 100 & 100 & 90 & 80
\end{bmatrix}×
\begin{bmatrix}
1 & 0\\
0 & 0\\
0 & 2\\
0 & 2\\
0 & 0\\
0 & 0\\
0 & 2
\end{bmatrix}\\
=\begin{bmatrix}
(500 × 1) + (300 × 0 ) + (80 × 0) + (100 × 0) + (100 × 0) + (90 × 0) + (80 × 0) & (500 × 0) + (300 × 0 ) + (80 × 2) + (100 × 2) + (100 × 0) + (90 × 0) + (80 × 2) 
\end{bmatrix}\\
=\begin{bmatrix}
+500 + 0 + 0 + 0 + 0 + 0 + 0 & 0 + 0 + 160 + 200 + 0 + 0 + 160
\end{bmatrix}\\
=\begin{bmatrix}
500 & 520
\end{bmatrix}

 
はい、こんな感じになります。
先ほどと異なり答えは1行2列の行列になってますね。
そして、答えの1列目はとりあえず生ビール伝票の合計金額、2列目は最初の食べ物オーダー伝票の合計金額です。
行列の掛け算では答えの行列は掛ける行列(ここでは伝票行列2枚バージョン)の列数(ここでは2列)となります。
このため、伝票1枚のときの答えの行列は1列になっているわけです。