この小さき世界
2018-03-19T00:31:47+09:00
ukulele_trip
仕事関係(ソフト開発)でのひとりごと (email: ukuleletrip at gmail.com)
Excite Blog
マイクロサービスアーキテクチャ
http://ukuleledev.exblog.jp/29660365/
2018-03-19T00:31:00+09:00
2018-03-19T00:31:47+09:00
2018-03-19T00:31:47+09:00
ukulele_trip
ソフト開発一般
「マイクロサービス」という言葉がキーワードになっているプロジェクトに関わってて、そもそも「マイクロサービス」が指すもの、そしてそのメリットやデメリットが共有されていないのではないか?と思ったのが本書を読んだ理由だった。
先に書いた通り、すでに古い内容も含まれているし、何より本書を読んだからといって世界共通のマイクロサービスという概念が何かがわかるわけではない(そもそもそんなものはないとも思うし)。
それでも改めて体系化された説明を読むことで、色々と理解が深まったところはあった。]]>
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
http://ukuleledev.exblog.jp/28117440/
2017-09-03T13:40:00+09:00
2017-09-03T13:40:49+09:00
2017-09-03T13:40:49+09:00
ukulele_trip
ソフト開発一般
Deep Learningの中身についてある程度の理解(あくまで外からツールを使う立場として、のレベル)が得られてよかった。
これまでも何度か関連する講演や読み物を読んだけど、どれもある一部を強調しすぎていたのだということがわかった。
]]>
Arduinoライブラリ開発
http://ukuleledev.exblog.jp/22592036/
2014-07-22T15:35:00+09:00
2014-07-22T21:19:21+09:00
2014-07-22T15:35:31+09:00
ukulele_trip
Arduino
よいArduinoスタイルのAPIを作るための情報であるAPI Style Guideも参照すること。(訳注:日本語訳はこちら)
まずシンプルなモールス信号のためのスケッチから始めよう。
int pin = 13;
void setup()
{
pinMode(pin, OUTPUT);
}
void loop()
{
dot(); dot(); dot();
dash(); dash(); dash();
dot(); dot(); dot();
delay(3000);
}
void dot()
{
digitalWrite(pin, HIGH);
delay(250);
digitalWrite(pin, LOW);
delay(250);
}
void dash()
{
digitalWrite(pin, HIGH);
delay(1000);
digitalWrite(pin, LOW);
delay(250);
}
[Get Code]
このスケッチを実行すると、pin13にSOS信号(救難信号)が出力される。
このスケッチにはライブラリ化するために変更する点がいくつかある。まず最初に、当然であるが、実際に点滅を行うdot()やdash()関数を準備する。次にこれらの関数がどのピンを使うのかを示す変数ledPinが必要となる。最後にそのピンを出力として初期化するpinMode()呼び出しを行う。
ではこのスケッチをライブラリにしてみよう!
ライブラリには最低限2つのファイルが必要である;ヘッダファイル(拡張子は.h)とソースファイル(拡張子は.cpp)である。ヘッダファイルはライブラリの定義をする:基本的には内部にあるものの列挙である。一方、ソースファイルには実際のコードが含まれる。このライブラリを"Morse"と名付けるので、ヘッダファイルはMorse.hとなる。実際にどのようなものか以下に示す。一見すると不自然に見えるかもしれないが、ソースファイルも見ればより理解できるだろう。ヘッダファイルのコアはライブラリに含まれる各関数が1行ずつ書かれ、それらは必要な変数とともにクラスに入れられる。
class Morse
{
public:
Morse(int pin);
void dot();
void dash();
private:
int _pin;
};
[Get Code]
クラスは1箇所にまとめる関数と変数の単純な集合である。これらの関数や変数はpublicに、つまりライブラリユーザからアクセスできるものにすることができるし、privateに、つまりクラス内部からしかアクセスできないものにすることもできる。各クラスはコンストラクタとなる特別な関数を持ち、それはクラスのインスタンスを生成するのに使われる。コンストラクタはクラスと同じ名前を持ち、戻り値を持たない。
ヘッダファイルには他にもいくつか必要なものがある。一つはArduino言語の標準型や定数にアクセスするための#include文である(これは通常のスケッチでは自動的に追加されるが、ライブラリでは追加されない)。以下のようになる(これは前述のClass定義の前に置かれる)。
#include "Arduino.h"
[Get Code]
最後に、ヘッダファイル全体を以下のような奇妙な構造で囲むのが一般的である:
#ifndef Morse_h
#define Morse_h
// the #include statment and code go here...
#endif
[Get Code]
これは基本的には、意図せずライブラリを2回includeしてしまうという問題を防ぐためのものである。
最後に、ライブラリの名前とともに、それが何をするものか、誰が開発したのか、日付やライセンスについての短い説明をコメントとして先頭に置くのが一般的である。
完成したヘッダファイルは以下のとおりである:
/*
Morse.h - Library for flashing Morse code.
Created by David A. Mellis, November 2, 2007.
Released into the public domain.
*/
#ifndef Morse_h
#define Morse_h
#include "Arduino.h"
class Morse
{
public:
Morse(int pin);
void dot();
void dash();
private:
int _pin;
};
#endif
[Get Code]
ではソースファイルのMorse.cppの各部をみていこう。
最初に何行かの#include文がある。これらはソースコードの以降の部分からArduinoの標準関数や本ライブラリのヘッダファイルにアクセスできるようにするものである:
#include "Arduino.h"
#include "Morse.h"
[Get Code]
次にコンストラクタが来る。繰り返しになるが、コンストラクタには本クラスのインスタンスを生成するときにすべきことを記述する。この例では、ユーザはどのピンを使いたいかを指定する。コンストラクタはそのピンを出力ピンとしてprivate変数に保存し、他の関数から使えるようにする:
Morse::Morse(int pin)
{
pinMode(pin, OUTPUT);
_pin = pin;
}
[Get Code]
このコードにはいくつかの奇妙なことがある。まず関数名の前にあるMorse::という部分。これはこの関数がMorseクラスに属していることを示している。このクラスの他の関数でも同様だとわかるだろう。次におかしいのはprivate変数である_pinについているアンダースコアである。この変数には実際には、ヘッダファイルでの定義と同じであれば好きな名前をつけてもよい。アンダースコアを名前の先頭につけるのはその変数がprivateであることを示すための一般的な慣習である。また関数の引数と区別するためのものでもある(この例におけるpinとの区別)。
続いてスケッチからライブラリに持ってくる実際のコードが来る(これが最後!)。関数名の前のMorse::やpinの代わりの_pin以外はほとんど同じに見える:
void Morse::dot()
{
digitalWrite(_pin, HIGH);
delay(250);
digitalWrite(_pin, LOW);
delay(250);
}
void Morse::dash()
{
digitalWrite(_pin, HIGH);
delay(1000);
digitalWrite(_pin, LOW);
delay(250);
}
[Get Code]
最後に、ソースファイルの先頭にコメントヘッダを加えるのがよいだろう。全体は以下のようになる:
/*
Morse.cpp - Library for flashing Morse code.
Created by David A. Mellis, November 2, 2007.
Released into the public domain.
*/
#include "Arduino.h"
#include "Morse.h"
Morse::Morse(int pin)
{
pinMode(pin, OUTPUT);
_pin = pin;
}
void Morse::dot()
{
digitalWrite(_pin, HIGH);
delay(250);
digitalWrite(_pin, LOW);
delay(250);
}
void Morse::dash()
{
digitalWrite(_pin, HIGH);
delay(1000);
digitalWrite(_pin, LOW);
delay(250);
}
[Get Code]
以上が必要なことすべてである(他にもやっておくとよいことがあるが、それについては後述する)。このライブラリをどうやって使うのかをみてみよう。
まず、スケッチブックディレクトリのlibrariesサブディレクトリ中にMorseディレクトリを作る。Morse.hとMorse.cppファイルをこのディレクトリにコピーまたは移動する。ここでArduino IDEを起動する。メニューの「スケッチ」→「ライブラリを使用」を開くと、その中にMorseが表示されているはずである。このライブラリは、それを使うスケッチとともにコンパイルされる。もしライブラリがビルドされないようであれば、ファイルが.cppや.hという拡張子になっているか確認する(例えば.pdeや.txtではないこと)。
それでは最初のSOSスケッチが新たに作ったライブラリを使うようにしてどのようになったかみてみよう:
#include <Morse.h>
Morse morse(13);
void setup()
{
}
void loop()
{
morse.dot(); morse.dot(); morse.dot();
morse.dash(); morse.dash(); morse.dash();
morse.dot(); morse.dot(); morse.dot();
delay(3000);
}
[Get Code]
最初のスケッチからいくつかの変更点がある(いくつかのコードをライブラリに移動したこと以外にも)。
まず、#include文をスケッチの先頭に追加した。これによってこのスケッチはMorseライブラリを使うことができ、これがArduinoボードに書き込むコードに含まれるようになる。したがってスケッチでライブラリを使う必要がなくなったら、コードサイズを減らすために#include文を削除すべきである。
次にmorseという名前のMorseクラスのインスタンスを生成している:
Morse morse(13);
[Get Code]
この行が実行されると(これはsetup()関数が呼ばれる前に起こる)、Morseクラスのコンストラクタが呼び出され、それにここで与えた引数が渡される(この例では13)。
(訳注:Arduino IDE 1.0.5 + MacOSXではこの宣言でmorseを使うとエラーとなった;その場合はMorse(13)をmorseに代入すればよい)
setup()関数は空になっていることに注意してほしい;これはpinMode()の呼び出しがライブラリ内で行われるようになったからである(インスタンスが生成される時に行われる)。
最後にdot()やdash()関数を呼び出すために、morse.というプレフィックス - 使いたいインスタンスの名前である - が必要となっている。Morseクラスの複数のインスタンスを持つことも可能であり、その場合それぞれのインスタンスはそれぞれのprivate変数の_pinに使用するピンを保存する。特定のインスタンスの関数を呼ぶことによって、関数呼び出しで使われるべきインスタンス変数を特定していることになるのだ。つまり、もし2つのインスタンスを持つとすると以下のようになる:
Morse morse(13);
Morse morse2(12);
[Get Code]
morse2.dot()を呼び出すと、内部の_pinは12になっている。
新バージョンのスケッチを試してみると、このライブラリ内の何もArduino IDEにカラーハイライトされないことに気づくだろう。残念ながら、Arduino IDEは自動的にライブラリ内で知恵技したものを認識することができないため(できればよいのだが)、IDEを補助してやる必要がある。そのために、keywords.txtというファイルをMorseディレクトリに作る。以下のようなものである:
Morse KEYWORD1
dash KEYWORD2
dot KEYWORD2
[Get Code]
各行はキーワードの名前を持ち、それにタブ(スペースではない)で区切ってキーワードの種類が続く。クラスはKEYWORD1にすべきでオレンジになる。関数はKEYWORD2で茶色になる。新しいキーワードを認識させるためにArduino IDEを再起動する必要がある。
また、ライブラリを使用するサンプルスケッチを提供するのもよいことである。これを行うには、examplesディレクトリをMorseディレクトリ中に作る。そして上記のスケッチを含むディレクトリ(SOSとする)をそこにコピーまたは移動する。(「スケッチ」→「スケッチのフォルダを表示」でこのスケッチの場所がわかる)その後、Arduino IDEを再起動すると(これが最後だと約束する)、ライブラリMorseの項目が「ファイル」→「スケッチの例」に表示される。ライブラリの使い方についてよりより説明を追加したいと思うかもしれない。
ライブラリのすべて(keywordsやexampleも含めて)を確認したいなら、ダウンロードできる:Morse.zip
今のところはこれがすべてである。しかしより進んだライブラリのチュートリアルを近々書くつもりである。それまでに問題や提案があれば、Software Development forumに投稿してほしい。
よいArduinoスタイルのAPIを作るための情報であるAPI Style Guideも参照すること。(訳注:日本語訳はこちら)
※本文書はオリジナルと同様、Creative Commons Attribution-ShareAlike 3.0 Licenseに従います。
]]>
Arduinoライブラリ開発スタイルガイド
http://ukuleledev.exblog.jp/22590632/
2014-07-22T11:32:00+09:00
2014-07-22T12:34:56+09:00
2014-07-22T11:32:42+09:00
ukulele_trip
Arduino
本家ページ上で"Writing a Library for Arduino"を見つけたので自分のために要約しようと思ったが、まず"Arduino Style Guide for Writing Libraries"を読むべしとあるので、先にこちらの翻訳から。
これはArduinoスタイルでAPIライブラリを作成するためのスタイルガイドである。ここに書かれているいくつかのことはプロフェッショナルなプログラミング実践とは相反している。多くの初心者がArduinoを簡単に始められるために、あえてそうしてある。これらの原則に留意してライブラリを作成してほしい。ArduinoライブラリをArduinoユーザにとってよりわかりやすいものにするための提案があれば、ディスカッションに加わって欲しい。まだArduinoライブラリは進行中のプロジェクトである。
エンドユーザにわかりやすく:聡明だがプログラミングの経験のない人がこのAPIを使うと想定する。APIが扱う概念について、わかりやすいメンタルモデル、用語や関数を考え出すこと。APIを、表面に出ていない拡張性にマッチさせる:詳細な実装は隠したいとしても、APIの拡張性について不正確なメンタルモデルを与えるべきでもない。例えばある設定に対していくつかの選択肢しかない場合に、int型の引数をとる関数を使うべきではない。それは好きな値を設定できると意味していることになる。ユーザが使いたいデータと機能に沿った公開関数セットを提供する:特定の電子モジュールを扱うコマンドセットが、通常に使用するにはあまりにも複雑で、高レベル関数などにまとめることができるということは非常にありがちである。一般のユーザが考えることについて考え、それに沿ってAPI関数セットを提供するよう心がけること。AdafruitのBMP085ライブラリはよい例である。readPressure()コマンドは最終結果の圧力を得るために必要なすべてのステップを行う。このライブラリは何度も実行される一連の関数を一つの高レベルコマンドにラップし、そのコマンドはユーザが得たい値をユーザが望むフォーマットで返す。このコマンドは低レベルI2Cコマンドだけでなく、中間レベルの温度や圧力の計算も抽象化している。その一方でこれらの中間レベルの関数も、それを望むユーザに対して提供している。省略しない日常語を使う: 関数名や変数名に説明不足な言葉を使わないこと。技術用語の代わりに日常語を使うこと。APIが扱う概念の、一般的で親しみのある見識に対応する言葉を選ぶこと。専門知識を前提としないこと。我々がpwm()ではなくanalogWrite()を使ったのはこの理由からである。略語は使ってもよい、ただし、それらが一般的に使われているか、何かの基本的な名前である場合に限ってである。例えば、"HTML"は比較的に一般的であるし、"SPI"はプロトコルの名前として有効である。("serial-peripheral interface"はおそらく長すぎる、“Wire”はおそらく間違いだった、このプロトコルについては通常"TWI"や"I2C"と呼ばれる)一般の人にとって異なる意味を持つ言葉を避ける:例えばプログラマにとってはerrorは何かが起こった通知であるが、一般の人にとっては悪いことになる。ある分野に特有の用語を使う必要がある場合には、「先に」一般の人に対する1〜2文の説明を書く:よりよい言葉を思いつくか、それができなければライブラリのドキュメントを作成する。ドキュメントとコメントを書く:サンプルやドキュメントを書く際には以下のスタイルガイドに従うこと http://arduino.cc/en/Reference/StyleGuide実績あるcoreライブラリやスタイルを使うこと:入力を読むにはread()を使い、出力するにはwrite()を使う。例:digitalRead(), analogWrite(), 他バイトストリームを扱う場合にはStream.hとPrint.hライブラリを使う。それらに適合しない場合でも、最低限モデルとしてこれらのAPIを使えないか検討すること。詳細は後述する。ネットワークアプリケーションについては、原則としてClientとServerライブラリを使う。ライブラリインスタンスを初期化するにはbegin()を、通常いくつかの設定とともに使い、終了するにはend()を使う。関数名にはキャメルケースを使い、アンダースコアは使わない:例えばanalog_readではなくanalogReadとする。またmy_new_functionではなくmyNewFunctionとする。これは可読性を重視してProcessing.orgから取り入れた。LONG_CONSTANT_NAMES_FULL_OF_CAPSのようなものは読みにくい:可能であればシンプルに、ただし説明不足にならないようにする。ブーリアン引数は避ける:代わりに2つの関数を、その引数による動作の違いを表す名前をつけて提供できないか検討する。ポインタの知識を前提としない:Cの初心者にとってポインタは最大の障壁であるし、&や*をみてもわけがわからないものである。したがってAPIにポインタを導入しなくてすむのなら、そうすべきである。一つの方法としては*ではなく配列で参照渡しをすることである。例えば
void printArray( char* array);
は次のようにできる。
void printArray(char[] array);
いくつかのライブラリではライブラリ側からconst charのようなポインタを渡すものがあるが、ユーザ側がポインタを渡すことは避けること。例えば、
foo.readAccel(&x, &y, &z);
よりは以下のようにすべきである。
xAxis = adxl.readX();
yAxis = adxl.readY();
zAxis = adxl.readZ();
シリアル通信を使う場合、Serialオブジェクトをハードコーディングするのではなく、ユーザがどんなStreamオブジェクトでも指定できるようにすること。これによってライブラリはMegaやDueのすべてのシリアルポートで使えるようになるし、SoftwareSerialのような別のインタフェースを扱うこともできる。ライブラリのコンストラクタかbegin()関数にStreamオブジェクトを渡すようにすればよい(ポインタではなく参照で)。それぞれの例としてFirmata 2.3やXBee 0.4を参照のこと。
バイトストリーム通信を行うライブラリを作成する場合にはArduinoのStreamクラスを継承すること。そうすればそのライブラリは、Streamオブジェクトを扱える他のすべてのライブラリから使うことができる。可能であれば入力バッファはread()がすぐにデータにアクセスできるようにし、続きのデータの到着を待たないようにする。可能であればwrite()メソッドはデータを送信バッファに保存するが、バッファに空きがない場合にはバッファが空くまで待たなければならない。待っている間にはyield()関数を呼ぶべきである。
Adafruitのライブラリにはいくつかの模範的なライブラリがある。デバイスの機能を非常にうまく高レベルの動作に再構成している。https://github.com/adafruit/Adafruit-BMP085-Library
https://github.com/adafruit/DHT-sensor-library
これはWire (I2) ライブラリをうまく抽象化している例である。
https://github.com/adafruit/RTClib Reference Home訂正や提案、ドキュメントの追加はフォーラムに投稿してほしい。
※本文書はオリジナルと同様、Creative Commons Attribution-ShareAlike 3.0 Licenseに従います。
]]>
R MacOSX おぼえがき
http://ukuleledev.exblog.jp/21840693/
2014-04-20T13:09:00+09:00
2014-04-20T13:09:21+09:00
2014-04-20T13:09:21+09:00
ukulele_trip
Mac OS X
ただ他の機械学習エンジンなどをいじった結果、やはり前段の解析にはRが一番汎用性があると思い、今度はちゃんとRの実習もやってみることにした。
以下、少しハマったのでメモ。
昨年7月以来だったので、Rもバージョンが2から3になってて、せっかくなので最新版にしようと思った。
もともとbrewでRをインストールしてたので、これでバージョンアップされてるだろうと思ってたが2のまま。
"brew upgrade"してもRはアップデートされなかった。
brewパッケージは2までしかないのかと思い、brewでRをアンインストールして、http://cran.r-project.org/bin/macosx/からpkgをダウンロードしてインストールした。
これをインストールするとRコマンドではなく、GUIもついたアプリがインストールされる。
ターミナルで使いたかったが、補完機能はターミナルで使うものよりよくできてるし、使っているうちに慣れるだろうと、さっそく必要なパッケージのインストールにかかったのだが…。
まずコンパイルのところでgfortran-4.8がない、とエラーになるものがいくつかあった。gfortranは前回Rを入れた時にやはりbrewでインストールしており、/usr/local/bin/gfortranはある。なのでとりあえずシンボリックリンクを作った。
gfortran-4.8の問題は解決されたが、今度はリンク時にライブラリパス(忘れた)がない、結果としてgfortranライブラリがないというエラーが出る。おそらくgfortranをbrewでインストールしたのと矛盾しているのだろう。
ここで古いバージョンでもやはりターミナルで使いたいし、このエラーを解決するのに労力を使いたくなかったので、再度brewでインストールすることにした。
ただ"brew install R"とやるとパッケージがない、と言われる…。ググると"brew tap homebrew/science"とtapを追加しておく必要があるとのこと。これで無事インストール完了で、しかもちゃんと最新版3.1.0になってた!
たぶんパッケージの構成か何かが変わっててバージョンアップもされなかったのだろう。
やっとスタートラインに立てた。
]]>
JavaScript DateオブジェクトとISO8601
http://ukuleledev.exblog.jp/21543270/
2014-03-11T09:41:00+09:00
2014-03-11T09:41:47+09:00
2014-03-11T09:41:47+09:00
ukulele_trip
Webアプリ
調べてみると、ここ にあるようにこれは実装依存とのことで、現状自分で年/月/日/時/分/秒を切り分けてやるのが唯一の確実な方法とのこと。
もう少し調べると、あちこちにちゃんと書いてあった…。
]]>
映画TV放送情報Web
http://ukuleledev.exblog.jp/21536216/
2014-03-09T23:55:00+09:00
2014-03-09T23:55:32+09:00
2014-03-09T23:55:32+09:00
ukulele_trip
Webアプリ
主にCS(NHK-BS含むが、WOWOWは未対応)の映画チャンネルで放送される映画に対して、レビューサイトのレートを含めてリスト表示できるもの。
http://ukllmovie.appspot.com/
いつも月はじめに各映画チャンネルの番組一覧をみては、そこからレビューサイトの点数を確認してはみたい映画を決めたりしてたので(もちろん点数に限らずみたいものは別だけど)、これを作ってからその作業がすごく楽になった。
]]>
AdMobアカウントからAdSense申請できない場合
http://ukuleledev.exblog.jp/21461173/
2014-02-22T11:57:00+09:00
2014-02-22T11:56:57+09:00
2014-02-22T11:56:57+09:00
ukulele_trip
Webアプリ
もともとiOSアプリにAdMobで広告をつけてたのだが、あるときにAdMobとAdSenseアカウントが統合された。
その時点でAdSenseアカウントは持っていなかったので自動的にAdMob/AdSenseアカウントを持っていることになったみたいなのだが、AdSenseの対象のURLなどが設定されていない状態。
あらためてAdSenseの申請をしようとすると、すでに有効だとエラーとなるが、URLを追加することもできない状態。
いろいろ探してようやく辿り着いたのがこのページ。ただページ内にあるリンクは404となるので、参照元のページから申請用ページに行く必要がある。
]]>
Raspberry PiとApple Keyboard
http://ukuleledev.exblog.jp/21359924/
2014-02-01T21:26:00+09:00
2014-02-01T21:28:09+09:00
2014-02-01T21:26:54+09:00
ukulele_trip
ガジェット
Raspberry Pi、新しいソフトが出てたので試す。
今回はRaspbianのrawイメージではなく、NOOBSの方でやってみた。NOOBSだとSDカードを初期化してzipファイルを展開するだけでよかった(rawイメージはddコマンドを使う)。
NOOBSだと最初のセットアップにディスプレイ、キーボード、マウスが必須となり、家にあるUSBキーボードがApple Keyboardしかない。ネットをみるとApple Keyboardは消費電流の問題で使えない、とあった。が、よくみると古い機種の場合で、最近のやつだといけるらしい。
やってみると、確かに普通に使えた。]]>
Webサービスのつくり方 ~「新しい」を生み出すための33のエッセイ
http://ukuleledev.exblog.jp/21357611/
2014-02-01T11:07:41+09:00
2014-02-01T11:08:14+09:00
2014-02-01T11:08:14+09:00
ukulele_trip
ソフト開発一般
内容は広く浅めだけど、コンパクトにまとまっていて読みやすかった。
ちょうど今仕事で、Webアプリのデモ(UI部分はjQueryで)作ったりしてたので、ついでに何か遊びで作ってみたくなった。
ただ、Perlは勘弁(笑)。
もちろん、昔はPerlで書いてたし、CPANとコミュニティが言語の柔軟性と親和性が高く、そこまで含めてのPerlだというのは本書を読んであらためて納得はするけど。]]>
金子勇「Winnyの技術」
http://ukuleledev.exblog.jp/20240944/
2013-08-20T21:53:03+09:00
2013-08-20T21:53:09+09:00
2013-08-20T21:53:09+09:00
ukulele_trip
ソフト開発一般
P2P、分散ネットワークといったところは今の仕事のコア技術であり、いろいろと苦労してきたところ。特にネットワークトラフィック・ノードの負荷軽減と、利便性向上のバランスをとりながら、アルゴリズムの改良やシミュレータによるパラメータ調整を重ねてきた過程は興味深く読めた。
やはり自律分散システムはおもしろい。仕事・趣味問わず、何か新しいものを作ってみたい気になった。
欲を言えば、想定部数が少ないからこの価格になるのは仕方ないにしても、他のP2Pシステムに関する詳細な解説も加えるなどしてもっとボリュームがあるとうれしかった。]]>
入門 機械学習
http://ukuleledev.exblog.jp/19970011/
2013-07-07T13:42:04+09:00
2013-07-07T13:42:21+09:00
2013-07-07T13:42:21+09:00
ukulele_trip
ソフト開発一般
これを起点に興味のある方向に手をのばしていく、というのが本書の正しい使い方だと思う。
僕自身としてはRはおもしろそうだけど、同じことがPythonでできるならそちらでやりたいし、何よりもう少し原理、つまり統計学の中身の方を読んでみたい。
読みかけのビジネス統計学の本を久しぶりに開かないと…。]]>
アジャイルサムライ−達人開発者への道−
http://ukuleledev.exblog.jp/19153530/
2013-04-04T23:03:29+09:00
2013-06-11T23:30:53+09:00
2013-04-04T23:03:04+09:00
ukulele_trip
ソフト開発一般
でも味のあるイラストやマスターとの対話など、独特の世界観とセンスは読んでいておもしろかった。
それにしてもソフトウエアプロジェクトの理想的な形としてここに書いてあることはわかるものの、これを導入・浸透させるのは簡単ではない。]]>
「リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック」
http://ukuleledev.exblog.jp/17889597/
2012-08-27T15:01:00+09:00
2013-06-11T23:30:53+09:00
2012-08-22T10:24:57+09:00
ukulele_trip
ソフト開発一般
ただ、Code Completeなどに比べるとかなり基本的な内容なので、ある程度以上の人が読む意味はあまりないと感じた。]]>
Jon Erickson 「HACKING: 美しき策謀」
http://ukuleledev.exblog.jp/17838765/
2012-08-06T20:27:00+09:00
2012-08-16T21:27:35+09:00
2012-08-06T20:27:36+09:00
ukulele_trip
ソフト開発一般
昔開発してた組込製品では今みたいにプログラムが全部フラッシュメモリに書かれるのではなく、マスクROMに書かれていた。これだと製品出荷後のバグのために多大な損害が出るので(基本、ROMを作りなおしてさらに貼り替える。バグ入のROMは廃棄する)、ある時からフラッシュメモリをROMと併用するようになった。
当時はフラッシュメモリは高価だったので容量は小さく、バグ修正するための保険のようなものだった。容量が増えるにしたがい、今度はソフト開発を日程ギリギリまで引っ張るために機能追加もフラッシュ側で行うことも多くなったが。
出荷時にはROM側のプログラムからフラッシュ側の空ルーチン(リターンするだけ)を呼び出すようにしておく。ROM出図後のバグ修正や機能追加の際にはフラッシュ側に、必要な処理を行いROM側プログラムの都合のよい場所に戻るようにするプログラムを作った。これをパッチと呼んでいたのだが、限られたフラッシュメモリ領域をいかにして節約するかということが腕のみせどころで楽しかった。実際パズルのようなパッチを作って腕自慢しあうこともよくあった。
0x300章以降ではこれを思い出させるような攻撃方法が紹介されていて、懐かしく、また読み応えがあった。さらにパッチをあてるべく作られたプログラムが対象ではないので、NOPスレッドによるアドレスに対するマージンを設けたり、セキュリティチェックにひっかからないようにコードを擬態したりと、読んでてニヤニヤしてしまうテクニックも紹介されている。
プログラム、特にCやアセンブラを扱っているエンジニアは絶対に楽しめるし、必読じゃないかと思う。]]>
https://www.excite.co.jp/
https://www.exblog.jp/
https://ssl2.excite.co.jp/