ノート

異常時にちゃんと止まるシェルスクリプト

自動化は大切ですが、自動化するときは異常時にちゃんと止まるようにしなければなりません。トヨタ自動車でいうところのニンベンのついた「自働化」である。なぜ自働化が必要かというと、エラー時に止まってくれない機械は稼働中に人が張り付いて見守ってい…

無向ネットワークのリンクの結合度

ネットワークサイエンスについて勉強している。 ノード間のリンクの結合の強さを表す尺度を思いついた。既に発見されているかもしれないが記録しておく。*1 仮説1: リンクに重みが予め付加されていない場合でも、ネットワークの構造からリンクの結合度を表…

クラスの依存関係グラフ 4

Java および Scala のクラスの依存関係のグラフについて調べている。 今回はクラスタリング係数を見てみる。 クラスタリング係数とは、あるノードにリンクしたノード群が互いにリンクしている割合を表します。C で表します。ノードごとに値を持ち [0, 1] の…

ブロックチェーンについての考察

タイトルが雑だが、最近ブロックチェーンについてぼんやり考えていて、その覚書。 元の bitcoin の Proof of Work (PoW) は以下の式を満たすブロックをブロックチェーンにつなげることができる。 hash(prev, tx, nonce) < 1 / difficulty * hash_max (eq.1) …

bitcoin と ビザンチン将軍問題

bitcoin はビザンチン将軍問題を解決したとしばしば言われます。これが厳密には誤りだそうです。私もそんなに詳しくないのだけれども、確かにそうかなと思います。 ビザンチン将軍問題というのは――離れた場所にいる複数の将軍間で作戦の合意をとりたい;ただ…

bitcoin: Proof of Work の肝

bitcoin の仕組みは「ようできてる」と感嘆します。ポイントはデータベースの更新を承認する「Proof of Work」(PoW) という仕組みです。 さて、bitcoin が PoW で上手く回っているのは、PoW の特徴によるものに思います。PoW がなかったどうなるのかというの…

Bash でスタックトレースを表示

Bash でスタックトレースを表示する方法。 caller という組み込みコマンドで関数の呼び出し元の位置がさかのぼって取れます。これを使って以下のようなスタックトレースを表示する関数が作れます。 function print_stacktrace() { index=1 while frame=($(ca…

CAP定理について

CAP定理という分散ストレージシステムの設計において非常に重要な定理がある。まだ、以下の元の論文を読んでいないので、正確な理解かどうかは保証できないが、理解している範囲で考えることを記す。 https://www.comp.nus.edu.sg/~gilbert/pubs/BrewersConj…

コード型ログ(5) Bashで自分のディレクトリを知る

シェルスクリプトで自分のディレクトリを知りたいことがあります。 . ./functions.sh 例えば、上のように他のシェルスクリプトを読み込みたいときに相対パスを使うのはよくないときがあります。なぜならば、./の場所はシェルスクリプトを実行するカレントデ…

テスト駆動開発で品質が上がる証拠

テスト駆動開発(TDD)で品質が上がる証拠を得た。 Realizing quality improvement through test driven development: result and experiences of four industrial teams*1 性質が異なる4つの製品の開発プロジェクトで TDD を行って、TDD でない類似の開発プ…

リコメンデーションのための相関係数2

ユーザーに対して類似のアイテムを推薦するアルゴリズムのアプローチには、 ユーザーの相関をとるアプローチ、 アイテムの相関をとるアプローチ がある。今回は2のアイテムの相関をとるアプローチについて。 item A item B item C item D user 1 2 0 2 1 us…

リコメンデーションのための相関係数1

ユーザーに対して類似のアイテムを推薦すること、いわゆるリコメンデーションを機械にさせるのが、浸透している。リコメンデーションのアルゴリズムというのは興味深い。 item A item B item C item D user 1 2 0 2 1 user 2 3 0 1 3 user 3 2 1 3 1 user 4 …

コード型ログ(4) Initialization-on-demand Holder

前回: コード型ログ(3) privateなメソッドのテスト - 超ウィザード級ハッカーのたのしみ 必要なときにインスタンスを作ったら、メモリ効率がよくないかと思って変なことをしてしまう悪い例。 class BadSingleton1 { private static BadSingleton1 instance;…

コード型ログ(3) privateなメソッドのテスト

前回: コード型ログ(2) staticな変数の排他にはsynchronized(*.class) { } を使う - 超ウィザード級ハッカーのたのしみ privateなメソッドは、ユニットテストがしにくい。 対処法は2つで、 テストしないか、 Reflectionで頑張るか、 スコープをpackage pri…

コード型ログ(2) staticな変数の排他にはsynchronized(*.class) { } を使う

他の人が書いていたら読めるけれども、知らなきゃ書けない定型文をあつめたコード型ログを作っている。今回は2回目。 前回: コード型ログ(1) スレッドを止めるにはinterruptを使う - 超ウィザード級ハッカーのたのしみ いい設計とは言えないかもしれないが…

コード型ログ(1) スレッドを止めるにはinterruptを使う

他の人が書いていたら読めるけれども、知らなければ書けない定型的なソースコードの型を集めているので気が向いたら書いていく。ダジャレが好きなので、コード型ログと呼ぶ。今回は1回目。 無限ループを持つスレッドはinterrupt()で止められるようにする。 …

可読性に関するソフトウェアメトリクスを考えた

新しいソフトウェアメトリクスを思いつきました。 ソフトウェアメトリクスとは、ソフトウェアの特性を推定するための定量値のことです。バグの数とかレビューの時間とか開発の過程で得られる値もありますし、テストの数だとかカバレージといったテストを評価…

クラスの凝集度を示すメトリクス:LCOM*

ソフトウェアメトリクスについて調査中です。今日はLCOM*について。 LCOM*とはLack of Cohision in Methods(メソッドの凝集度の欠陥)を示しており、以下の式で定義されます。 1 a ――――― Σ μ( Aj ) - m a j LCOM* = ――――――――――――――――――――――――― 1 - m ここで…

Martinのオブジェクト指向設計メトリクス

コードの品質のスカウターをどうにか作れないかと考えていて、ソフトウェアメトリクスについて調べている。 古い記事ですが、読んだのでメモ書きする。 Robert Martin, OO Design Quality Metrics. An Analysis of Dependencies https://linux.ime.usp.br/~j…

BashでStrategyパターン

デザインパターンはオブジェクト指向言語だけのものではない。シェルスクリプトにもデザインパターンの概念は適用可能です。 Strategyパターンとは、アルゴリズムを動的に付け替えることができるデザインパターンです。 この概念は決してオブジェクト指向だ…

単体テストの数とコードの行数の関係

興味深い記事を見つけた。 Cyclomatic Complexity and Lines of Code: Empirical Evidence of a Stable Linear Relationship http://dx.doi.org/10.4236/jsea.2009.23020 コードの行数(LOC)と循環的複雑度には強い相関があるとのことだ。 循環的複雑度とは、…

ubuntuでブートプロセスを表示

OSの起動プロセスは皮が被せられているけれども、できるだけ裸の方が何がどうなっているのか意識できて良いだろうと思ったので、ブートプロセスを表示するようにする。一方で、ノイズでもあるけれども。 /etc/default/grubを編集して、 GRUB_CMDLINE_LINUX_D…

具体についてのクラスはインスタンスと同じもの?

特定の具体を示しているクラスがあったとして、それはインスタンスと同じものと言えるのか? ぼんやりとした疑問で答えはまだ出ていない。 例えば、DogクラスとPetDogクラスがあったとする。PetDogクラスは、Dogクラスを継承していて、Dogクラスの中でも人に…

オブジェクト間の関係

UMLについて調べています。思考の整理ツールとしての表記法(diagramming)には興味があります。 UMLは書きにくいし、曖昧さも強いし、目的が良くわからない絵が多いので、あまり好きにはなれないです。規格としては不完全なように思うので、独自に改変した…

Spockを試す

JavaでBehavior Driven Developmentをするためのフレームワーク、つまり、機械に読める仕様書を書くためのフレームワークの1つであるSpockをeclipse上で試す。ついでにGradleも試す。 github.com Eclipseの設定 SpockはGroovyを使うので、EclipseでGroovyを…

Bashでロックを取る方法

前回に続いてBashネタで、Bashで排他ロックを取る方法について。 並行プログラミングをしようとするならば、排他は必要となる。シェルスクリプトでも並行性について考慮しなければならない場面があるが、アトミックにロックを取る手段はシェルスクリプトだけ…

Bashの括弧

最近Bashで凝ったものを作ろうとして、Bashについて結構しらべた。ネット上の情報は散らばっていたので、不完全ながら仕入れたネタをまとめようかと思う。特にカッコについて。 Bashのカッコには以下の種類がある。 { } ${ } ( ) $( ) <( ) >( ) (( )) $(( )…

chrootでビルド環境の作成2

以前chrootでクリーンなビルド環境を作る方法というのを書いたが、もっと簡単な方法を見つけたのでメモしておく。yumでrootディレクトリの位置を指定すれば良いのだ。 chrootでビルド環境の作成 - 超ウィザード級ハッカーのたのしみ 欲しいRHELかCentOSのイ…

ユニットテストの綺麗な書き方

テストばっかり書いている。テストコードなんかの綺麗さを追求しても仕方ないかなと思っていたのだけれど、適当に書いていると重複が多くて大変で、シンプルに楽に書くコツみたいなのを掴んできたのでメモしておく。JUnitを対象にする。 テストクラスの単位 …

PICTを試す

ちょっと古いツールではあるが、PICTというMicrosoft製のテスト項目作成ツールを見つけたので使ってみた。All Pair法という2つのパラメータの値の組みわせを網羅するようなテストを生成する。 github.com Linux環境でビルドするにはclang++とlibc++-devが必…

Test Driven DeveopmentとDesign By ContactとAll Pair Testing

Test Driven Deveopment (TDD) とDesign By Contact (DbC)とAll Pair Testingを組みわせたら最強の開発プロセスを実現するテスティングフレームワークが作れるのではないかと思った。だらだらとまとまりなく書きます。 TDDは仕様を決定したら、先にテストを…

Batsというテストツールが便利だった

Batsというテストツールをしばしば見るので、使ってみたら便利だった。 github.com シェルのコマンドのテストに使います。テストコードは、ほとんどBashのDSLで書かれます。テストケースは以下のように書きます。 @test "echo hello" { out=$(echo hello) [ …

Btrfsを試す

次のLinux用ファイルシステムのBtrfsを使ってみた。(今更?) インストール Ubuntu14.04では # apt-get install btrfs-tools # btrfs version Btrfs v3.12 でコマンド類がインストールされます。 フォーマット /dev/sdb1をBtrfsでフォーマットします。 # mk…

opensslコマンドでファイルを暗号化

file.datを暗号化してfile.dat.encryptedを出力する。鍵は./passwordとする。 $ openssl aes-256-cbc -e -in file.dat -out file.dat.encrypted -pass file:./password 脆弱性があるのでaes-256-ecbは使ってはダメ。aes-256-cbcを使うこと。 復号化する際は…

chrootでビルド環境の作成

chrootで綺麗なビルド環境を作る方法。ビルド程度ならLXCを使う必要もない。 RHELを意図していますが、用意できないのでCent OSでやる。 Cent OS 7の環境を作ります。 インストールするときにCDのどこからrootfsを持ってくるのかよくわからなかったのでLiveO…

ブロックチェーンについてのメモ書き

ブロックチェーン技術についてのまとまりのないメモ書き: 中央で管理されたデータベースでなしに、P2Pのネットワークの上にトランザクションを発行できるのが画期的。 ネットワーク上に存在するのはコミットログだけ。 トランザクションは10分毎にブロック…

Jupyterはデータとか数式いじる人には最強のツールかもしれない

「Jupyter」という主にPythonのためのWebベースのシェルに感動した。 インストールと起動 Ubuntu14.04なら、 $ sudo apt-get install build-essential python3-dev $ sudo pip3 install jupyter でインストールできるはずです。 $ jupyter notebook と打つと…

CephのStraw2について

Cephについて調べております。 CRUSHの中のstraw bucketというアルゴリズムに驚嘆したのですが、改良の余地がありそうだと思えたので、もっといい方法はないかと考えてしました。しかし、Cephの作者はおそろしく頭がよく、私の発想の2段階先に行っていました…

Ceph, 特にCRUSHアルゴリズムについて

Cephに興味が出たので調べていまして、そのメモ代わりに…… どのサーバーが何のデータを持っているのか覚えておかなければならない問題 分散ストレージシステムで面倒な課題にデータの位置の管理があります。あるファイルがあったとして、そのデータを読みた…

HTMLにTeX数式を書く。

MathJaxというライブラリを使えば簡単にできます。 <head> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [['$$','$$'], ['\\[','\\]']], processEscapes: true } }); </script> </head>

開発ステップ数を測る

開発ステップ数を測るなんて無意味なことだと思うけど、そういうことこそ効率化! C, C++, Javaの場合について。 以下のシェルスクリプトを実行すれば修正の実効ステップ数が出るはず。 before=$1 # path to source file before modified after=$2 # The pat…

FANNのテスト

PyBrainはあまり速くないので,名前からして速そうなFANN(Fast Artificial Neural Network Library)を試してみる. インストール方法のメモ Fast Artificial Neural Network Library (FANN) 環境はUbuntu 14.04 apt-getでも取れるがバージョンが2.1.0なので…

PyBrainのテスト 2

PyBrainでbuildNetwork関数を使わずにネットワークをつくる方法. バイアスパラメータを入れるには,BiasUnitを作って各レイヤーにつなげる必要がある. 例によってXORを学習させる. from pybrain.datasets import SupervisedDataSet from pybrain.supervis…

PyBrainのテスト

ちょっとニューラルネットワークで試したいことがあるので,最初の段階として,PyBrainを用いてニューラルネットワークというものを使用してみる. 階層型ニューラルネットワークの例題としてXOR演算を学習させる. 以下,コード from pybrain.datasets impo…

LinuxでのプロキシとDNSの設定

社内ネットワークとか,いわゆるイントラネットの中にあるLinuxマシンからインターネットに接続する場合,プロキシサーバを経由することが多い.また,社内用のDNSサーバが設けられていることもある.Linux(特にRedHat, CentOS, Fedora)でのDNSとプロキシ…