計算機

クラスとは

classとはなんぞやと考えている。たどり着いたところまでまとめる。 クラスとは、同じ性質を持ったオブジェクトを分類 (classification) したものである。漢字で書くと類です。同じクラスに属しているオブジェクトは同じような性質を持っている。クラスは、…

リスコフの置換原則は呼び出し側にも責任が伴う

以前にオブジェクト指向になっているならば、あるクラスを継承したクラスは継承元のクラスと置き換えても動かなければならないという気付きについて書きました。名前がついていて、それはリスコフの置換原則と呼ばれるらしいです。 fj.hatenablog.jp このリ…

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…

ClassクラスのClassオブジェクト

具体についてのクラスはインスタンスと同じもの? - 超ウィザード級ハッカーのたのしみ クラスって何なのだろうと疑問に思い始めた。 さて、Javaにはjava.lang.Classクラスという変なクラスがある。Classクラスのオブジェクトはクラスそのものではないみたい…

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

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

オブジェクト間の関係

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

アーキテクチャは疎↔密を繰り返す

歴史は繰り返しでアナロジーがあるから面白い。ソフトウェアのアーキテクチャの流行りを調べてみると同じようなことを言葉を変えて繰り返している。切り口はいろいろあると思うが、今日はアーキテクチャという切り口から見てみる。 ソフトウェアのアーキテク…

Spockを試す

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

SQL on HadoopだったらDWHでよくね?

ちょっと前からモヤモヤしていたこと――HiveやPrestoのようなSQLでHadoop上のデータを集計できるというようなものを使うのだったら、昔からあるデータウェアハウス(DWH)でよくないか? データを扱うにはSQLが、なんやかんやで向いているということが再確認…

Bashでロックを取る方法

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

Bashの括弧

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

chrootでビルド環境の作成2

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

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

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

データにもOSI参照モデルがある

計算機の通信機能(プロトコル)には階層があって、OSI参照モデルだとかDARPAモデルだとかが知られている。有名なものものとして、物理層はイーサネット、ネットワーク・トランスポート層はTCP/IP、アプリケーション層にはHTTPが挙げられる。イーサネットの…

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は仕様を決定したら、先にテストを…

碁と統計

fj.hatenablog.jp ニューラルネットワークである局面を入力したら終局図が出力できるようなものを作れるはずだと考えていたが、よくよく考えると別にニューラルネットワークでなくてもよいかもしれない。 碁と統計が相性が良さそうだという事実はモンテカル…

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を使うこと。 復号化する際は…

継承はメソッドを使いまわすためにあるのでない

まだまだオブジェクト指向を極めたわけではないのですが、最近気になったこと。 オブジェクト指向の継承はメソッドを使いまわすためにあるのではないということです。 Fooというクラスがあって、BarというクラスがFooを継承(inherit)しているとする。つまり…

Jump Consistent Hash

jump consistent hashというアルゴリズムがなかなかすごいアイデアな気がする。記事を解読しているが、文章として読みづらい。文章だとか見栄えだとかを気にしたり引用で泊をつけるとかせずに雑い投稿ですごいことを書いているのは、中身だけ興味がある感じ…

chrootでビルド環境の作成

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

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

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

ブロックチェーンとクラウド事業

今更、bitcoinについて評価し始めました。bitcoinの価格がちょうど最高の頃に興味持っていたのですが、実益がないので放ったらかしになっていました。 しかし、bitcoin自体は忘れ去られつつありますが、ブロックチェーン技術について最近耳にするようになり…

組織のトップダウン・ボトムアップと動的計画法

組織あり方としてトップダウンというものとボトムアップというものがあります。全知全能の神がいるならトップダウンで上手くいくと思います。 しかし、下に降りてくると現実と合わないことが明らかになったり、降りてくる間に現実が変わっていたりします。こ…

Webブラウザの行の文字詰め

ちょっとCSSでの組版に凝っているのですが、Webブラウザの文字の配置がいけていないことが気になっています。 LaTeXだと、 というように表示される文章をWebブラウザに貼り付けると以下のようになります。 The Paxos algorithm for implementing a fault-tol…

HTMLでクールな履歴書

職務経歴書いわゆるresume・CVというものをHTMLでかっこ良く書けないかと頑張ってテンプレート的なものを作った。何の意味があるかは知らない――単に組版が好きなので手慰みでやっているだけです。 以下がWebブラウザからのサンプル: https://htmlpreview.gi…

Visual Studio Codeがオープンソース化

最近使っているテキストエディタVisual Studio Code (VSCode) がOSS化されまして、注目しています。 Linux is a cancer とかつては公言したMicrosoftが今やOSSを積極的に公開する時代です。 このように企業がOSSを公開するのがトレンドになっていますが、な…

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

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

ステップあたりのバグ数の確率分布

1Kステップあたりx個のバグが検出されるべきという基準があって、それを元に品質管理をするという手法があります。これ自体は古いやり方だなとは思いますが、否定することもできません。 多分何かを仮定して品質というのを見積もろうとしているのでしょうが…

ステップ数を測るツール

コードの行数を測るツールはいろいろあるが、diffで見ることが前提で数えるツールでいいのを知らなかったので手慰みに作った。 GitHub - fjkz/tloc: A trivial code line counter for diff. こんな感じでファイルごとに行数を出してくれる。 $ git diff | ./…

単純バグなんて解決済みの問題だ

前回言及したような if (value = expected) と間違って書いてしまう類のバグがある。設計ミスとか勘違いとか調査不足とかでなくて、単純に書き間違えたことによるバグである。こういうのを単純バグと呼ぶならば、単純バグなんてもう世の中では解決済みの問題…

期待値は左か右か

つまらない論争なんですが、値を比較をするするときに期待値を演算子の左と右のどちらに置くべきなのでしょう。つまり、 if (value == expected) と書くべきか、 if (expected == value) と書くべきかという問題です。 私は前者にすべきと考えています。 も…

開発プロジェクト統合環境が必要

散々ぼやいているが、ITこそITで効率化するべきだと思っていて、現在その道具が揃いつつある:GitHub、JIRA、Jenkins、Maven、XUnit、Chef、etc。先進的な組織はこういうのをどんどん取り込んでいって、気持よく働ける環境を作り出している。 しかしながら、…

なぜRedHatだけ成功しているのか?

以前、サポートはOSSを商売にするには一般的な方法だと書きました。 オープンソースの弱点(4)サポート - 超ウィザード級ハッカーのたのしみ しかし、OSSのサポートをするというビジネスモデルで大成功している企業はRedHatぐらいではないでしょうか。RedH…

COBOLは悪くない

COBOL排除の動きが進んでいるそうで…… itpro.nikkeibp.co.jp 私はCOBOL触ったことないですし、COBOLerの実態もよく知らないし、そもそもSEではないので、以降完全に推測で書きます。 私は別にCOBOL言語自体は悪くないと思っている。確かに古いので、新しい言…

プログラミング言語の選択

プログラミング言語の選択は、ソフトウェアの価値を決定する大きな要素の一つだと思っている。言語はソフトウェアが依存する規格の中で最も大きい物だからだ。規格の重要性については、 OSSとは標準規格である(1)――ソフトウェア規格の奪い合い - 超ウィザ…

AWS Lambda

クラウドのデファクトスタンダードAWSに「Lambda」というサービスが出ています。これはすごいです。何がすごいのかというと、Lambdaは計算機の抽象化の新しい形態と思われるからだ。 Lambdaは何をしてくれるのかというと、データが投げられるイベントを検知…

補足)プログラミングの低レベルと高レベル

何気なく書いた記事に思いの他ブックマークがついて驚いた。誰しも同じようなことを考えているらしい。 fj.hatenablog.jp 後から読み返すと補足が要りそうな箇所があったので補足する。 1. Cプログラマに恨みはない 私は別にCプログラマにネチネチといじめら…

開発プロセスの目指すべきところ

プロジェクト・マネジャーをしているわけでもないのに、開発プロセスについて誰よりも考えていると思います。残念ながら私の考えを試してみて実証する機会がないので、私の考えが正しいかは分かりません。しかし、実績ができたら開発プロセスの指南だけで十…

プログラミングの低レベルと高レベル

プログラミングにはレベルの低い・高いがある。ここでいうレベルとはCPUとかストレージデバイスといった生のハードウェアに近いかという意味である。レベルが低いほど生のハードウェアを意識しなければならない。カーネルは低レベルなソフトウェアの代表であ…

非常に単純なPaxos実装

Paxosという分散システムでconsensusを取得するアルゴリズムがある。複数台のマシンから構成されるシステムで、単一のproposalが共有されることを保証するものである。ネットワークが不安定だったりシステムを構成するマシンが落ちたりするので、複数台のマ…

巨大なtry-catchが許せない

他の人が書いたコードに関しては誰しも許せないと思うようなことがあるだろう。私が最もイライラするのは巨大なtry-catch構文である。 try { foo(); bar(); ... ... spam(); egg(); } catch (Throwable t) { LOG.warn("error message", t) } というようなも…

オープンソースの弱点(4)サポート

OSSが弱そうなところについて書いています。 日本語 GUI 運用 サポート のうち今回はサポートについて。 サポート OSSで商売をするとしたら最も一般的な方法はサポートだ。*1したがって、弱そうなところというのはウソです。サポートを考えると安価であると…

オープンソースの弱点(3)運用

OSSが弱そうなところについて書いています。 日本語 GUI 運用 サポート のうち今回は運用について。 運用 運用はオープンソースに関わらずソフトウェアにとっての鬼門だ。開発するのと運用するのとの間には大きな断絶がある。左から右に流れるウォーターフォ…