Smile Engineering Blog

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

Node.js のインストール

はじめに

node のバージョン管理に n を使っています。今までは n を npm で導入していて、そのためには先ず node/npm をシステムにインストールする必要があったのですが、これ無しに、直接 n をインストール方法を知ったので備忘のために記します。

直接インストールには n-install というサードパーティを使用します。

続きを読む

Audacityの「ノイズ除去」を検証してみる

Audacityでノイズ除去」では AudacityのNoise Reductionを紹介しましたが、はたしてどんなアルゴリズムなのでしょうか。気になったので少し検証してみます。

  • Audacityソースコード
  • 特定の周波数をノイズとして消してみる
    • 1kHzの正弦波を生成
    • 2kHzの正弦波を生成(トラックの追加)
    • 1kHzと2kHzの波形を合成
      • 周波数特性
    • 1kHzの正弦波でノイズプロファイルを取得
    • ノイズの除去:デフォルトパラメータ(ノイズ除去=12dB, 感度=6, 周波数平滑化=3)
      • 周波数特性を見る
    • ノイズの除去:パラメータを大きく(ノイズ除去=24dB, 感度=6, 周波数平滑化=3)
      • 周波数特性を見る
続きを読む

The Continuing Story of Error Correction Code 5

ハミング符号再訪

ハミング符号は誤り訂正の基礎

The Continuing Story of Error Correction Code 2 - Smile Engineering Blog で7ビットハミング符号を構成してみました。
このハミング符号はSECDED、CRC符号、BCH符号、リードソロモン符号などの基礎となっています。
ハミング符号に色々なアイデアを追加して更に強力な訂正符号が作り出されていったわけですね。
これらの符号を理解するためにハミング符号をもっと深堀してみましょう。 今回は訂正符号で頻繁に登場する排他論理和(XOR)について見ていきます。

排他論理和

入力をA、Bとしたときに出力Xが以下のようになる演算が排他論理和です。

 A  B  X
0 0 0
0 1 1
1 0 1
1 1 0

なんか、この出力の並びどこかで見たような・・・
The Continuing Story of Error Correction Code 2 - Smile Engineering Blog の「検査符号の計算方法」で登場したこの演算。


0+0=0 \\
0+1=1 \\
1+0=1 \\
1+1=0

これですね。
排他論理和は桁上がりを無視したビットの足し算になっています。
2を法とした演算ですね。


2 \equiv 0 (mod 2)

なので 1 + 1 = 0となります。

ちなみに引き算はどうなってるんよ

とりあえず普通に引き算をしてみましょう。


0-0=0 \\
0-1=-1 \\
1-0=1 \\
1-1=0

ここで 0 - 1 -1になってしまいますが、 0 1しかないはずなのに -1ってどうしたらいいんでしょう?
足し算を見てみると計算のルールとして 1 + 1 = 0と定義しているので


1 + 1 = 0 \\
1 =-1

より 0 - 1 = 1としてしまいます。
よって、引き算は以下のようになります。


0-0=0 \\
0-1=1 \\
1-0=1 \\
1-1=0

この演算、足し算と見比べてみると演算の記号が +から -に変わっただけで他は同じですね。
このビット単位の演算では足し算も引き算も結果は同じになります。
引き算も2を法とした演算と考えれば


1 \equiv -1 (mod 2)

となるので 0 - 1 = 1となります。

排他論理和の不思議な性質

The Continuing Story of Error Correction Code 2 - Smile Engineering Blogで作ったハミング符号 P_{3} P_{2} P_{1}


(P_{3},P_{2},P_{1})

と表すことにします。 P_{3}=1 P_{2}=0 P_{1}=1なら


(1,0,1)

となります。

この3ビットのパリティを加算します。加算は先ほど示したルールに従いビットごとに行います。
3ビットのパリティを3個適当に取り出して加算してみましょう。
とりあえず (1,0,1) (0,0,1) (0,1,1)の3個を選んでみました。


(1,0,1)+(0,0,1)+(1,1,0)=(0,1,0)

答えは (0,1,0)ですね。 ではこの (0,1,0)に再度 (1,0,1) (0,0,1) (0,1,1)を加算してみます。


(0,1,0)+(1,0,1)+(0,0,1)+(1,1,0)=(0,0,0)

答えは (0,0,0)になります。 加算した結果に更に同じものを加算すると答えは0になるんですね。
なんか、不思議な感じがしますがこの演算は加算と減算は同じである、ということを思い出すと納得がいきます。


(1,0,1)+(0,0,1)+(1,1,0)=(0,1,0) \\
(0,1,0)-(1,0,1)-(0,0,1)-(1,1,0)=(0,0,0)

値を加算して、同じ値を減算すれば0になる、という当たり前の話です。
この当たり前が、ビット単位の演算でも成立しているよ、と。

では3個足して、その答えに2個だけ更に加算(減算)するとどうなるでしょうか?  (1,0,1)を加算(減算)しないと・・・


(1,0,1)+(0,0,1)+(1,1,0)=(0,1,0) \\
(0,1,0)+(0,0,1)+(1,1,0)=(1,0,1)

ちゃんと加算(減算)しなかった1個 (1,0,1)が残ってますね。 加算と減算の結果が同じということを除くと普通の加算、減算と同じように考えてもよさそうです。

排他論理和ハミング符号を考えてみる

The Continuing Story of Error Correction Code 2 - Smile Engineering Blogハミング符号は4ビットの送信語がありました。  D_{4} D_{3} D_{2} D_{1}の4ビットです。
この4ビットのうち1ビットだけが1の時の符号語を取り出してみます。

 D_{4}  D_{3}  D_{2}  P_{3}  D_{1}  P_{2}  P_{1}
0 0 0 0 1 1 1
0 0 1 1 0 0 1
0 1 0 1 0 1 0
1 0 0 1 0 1 1

 D_{1}だけが1のときのパリティ (0,1,1) D_{2}だけが1のときのパリティ (1,0,1) D_{3}だけが1のときのパリティ (1,1,0)、 そして D_{4}だけが1のときのパリティ (1,1,1)になっています。

では D_{1} D_{2}が1のときのパリティは?

 D_{4}  D_{3}  D_{2}  P_{3}  D_{1}  P_{2}  P_{1}
0 0 1 1 1 1 0

になっているから (1,1,0)!!
正解!!、なんですが実は D_{1}だけが1のときのパリティ D_{2}だけが1のときのパリティから計算できるのです。
計算方法は D_{1}だけが1のときのパリティ D_{2}だけが1のときのパリティを加算する、だけです。
やってみましょう。
 D_{1}だけが1のときのパリティ (0,1,1) D_{2}だけが1のときのパリティ (1,0,1)だから


(0,1,1)+(1,0,1)=(1,1,0)

もう一個ぐらいやってみましょうか。
送信語の全ビットが1の場合は D_{1}から D_{4}までそれぞれだけが1のときのパリティを加算します。


(0,1,1)+(1,0,1)+(1,1,0)+(1,1,1)=(1,1,1)

表をみると確かに (0,1,1)になっていますね。

 D_{4}  D_{3}  D_{2}  P_{3}  D_{1}  P_{2}  P_{1}
1 1 1 1 1 1 1

では、符号語に1ビットの誤りがあった場合を考えてみます。
送信語の全ビットが1を送信したら D_{3}が誤って0になったとします。
符号語は (1,1,1,1,1,1,1)ですが、受信語は (1,0,1,1,1,1,1)になりました。
受信語の D_{4} D_{2} D_{1}が1、パリティ (1,1,1)なので


(1,1,1)+(0,1,1)+(1,1,0)+(1,1,1)=(1,0,1)

で、答えは (1,0,1)、これは D_{3}だけが1のパリティに該当します。
ということで誤っているのは D_{3}のビットだとわかります。

なんか分かったような、分からんような・・・

延々と言葉で説明してきましたが、そろそろ数学的な表現を導入してハミング符号を表現できるようにしましょう。
まずは、あれですね。
みんな大好き「行列」。
え゛ーーー、って声が聞こえそうですが、慣れるとこのほうが楽ですよ。
いや、本当に。
ということで次回は行列の基礎。
ハミング符号を行列を使って表してみましょう!!

curl 備忘録

はじめに

近ごろは Postman を使うことが多くなりましたが、サーバからのリクエストなどではコマンドラインが必要です。検索キーワード上位ランクイン確実な curl コマンドのオプションについてまとめました。

続きを読む

JupyterNotebook拡張機能「nbextensions」について

はじめに

Jupyter Notebookをより使い勝手をよくするjupyter_contrib_nbextensionsがあります。
Notebook上でいろいろな拡張機能が使えるようになるものですが使用してみて個人的に便利だったものについて紹介します。

続きを読む

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

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

前回は、開発メンバの「増員」をテーマとして、増員メンバを迎える立場で考えてみました。せっかくなので、増員メンバとして、新規にプロジェクト参入する立場についても考えてみます。

状況把握

  • プロジェクトへの新規参加。
  • プロジェクト内の他の担当機能からの移動。

前回も言いましたが、増員メンバとなるケースはこれくらいですかね。 後者は、まだいいですね。プロジェクト全体のスケジュール感や、共通機能については共有できているはずです。問題は、前者の場合ですね。ともかく、プロジェクトに参加したら、まず初めに状況を把握しましょう。

  • プロジェクト全体のリリーススケジュール
  • 担当モジュールの進捗状況。

この2つは確実にそして、真っ先に確認・把握しましょう。新規参入の場合、開発製品の学習、担当機能の学習期間は必須です。進捗もオンスケでスケジュールにも余裕がある状況と、遅延が発生して進捗が芳しくない状況とでは、学習期間も学習内容も、既存メンバの対応も全く異なったものになります。

積極性

学習期間の初めには、たいてい既存メンバからのレクチャがあります。前述した事と重なりますが、進捗状況、あるいは既存メンバのスキルによってはレクチャによる情報量も変わってきます。レクチャで得られる情報のみを「今、知っておくべき情報」と思わないでください。自分自身が知りたいこと、不明点等、聞きたいことがあれば積極的に質問しましょう。積極的な姿勢は、既存メンバが新規メンバを信頼できるか否かを判断する重要なポイントになります。

信頼関係

言葉は悪いですが、既存メンバは新規メンバをいきなり信頼したりしません。同様に新規メンバも既存メンバを機能担当の先輩として無条件に信頼しないほうが良いです。仕事の場じゃなくても初見の人にいきなり全幅の信頼を置いたりしないですよね。大切なことは学習期間を含めあらゆる工程は、信頼しあえる関係を構築していく為のプロセスであると意識することです。 積極的に発信された疑問や質問に、既存メンバがに真摯に対応してくれれば、既存メンバに信頼感を持てるでしょう。

何か掘り起こせた?

  • 積極的な姿勢が重要。
  • 信頼関係を構築することが大切

いきなりは無理でしょうが、既存メンバと同等のスキルを持つことを目標にしたいですね。決して「手足」で終わらないようにしましょう。

おしまい

それでも、既存メンバが信頼に値しない人たちだったどうすればいいんですかね。主担当の座を乗っ取っちゃうくらいの意気込みを持ちましょう。

Linux Mint 20 Ulyana 開発環境用初期設定

6月27日に「Linux Mint」の最新メジャーリリースとなるバージョン20(開発コード「Ulyana」)がリリースされました。
Linux Mint」はUbuntuベースのデスクトップ型Linuxディストリビューションのひとつです。
当記事では、64bitのWindows上にVMware Workstation Playerをインストールし、VMware上に「Linux Mint 20 Mate」を初期インストールした上、プログラム開発に適したLinux Mintの初期設定の例を紹介します。
VMware上に「Linux Mint 20 Mate」を初期インストールする手順は、こちらに掲載していますのでご覧ください。
Linux Mint」の仮想環境で当記事の設定が完了すると、開発環境のOSレベルでの基礎が完成します。
この仮想環境をマスターとし、各開発プロジェクトに応じたランタイムやIDEなどをインストールしていくことになります。

目次

  1. なぜ仮想環境(VMware)でプログラム開発環境を構築するのか
  2. OSの最新化
  3. ファイルエクスプローラーの一覧表示・隠しファイル表示をデフォルトに
  4. ドラッグ中にウィンドウ内を表示しない
  5. ホームディレクトリ配下のディレクトリ名を英字化
  6. FireFox起動時は空白ページを表示
  7. FireFox既定の検索エンジンをGoogleに変更
続きを読む