投稿

技術者教育の視点で読む「大規模サービス技術入門」

[Web開発者のための]大規模サービス技術入門 ― データ構造、メモリ、OS、DB、サーバ/インフラ 2010/7/7日 伊藤直也,田中慎司 著 [Web開発者のための]大規模サービス技術入門 (Amazonで書籍情報を表示) この本の冒頭にある「本書について」には以下のように書かれています。 本書は、大規模サービスを開発・運用する技術者のための入門書です。 インフラレベルから(主に全文検索を例とした)アプリケーション開発まで、大規模サービスを構築するために必要な技術が俯瞰的に述べられています。 ところで「はてな」では毎年夏に学生向けの就職体験を目的としたインターンシップを実施しているとのことで、インターンシップ企画を通じて、「はてな」では大規模サービス技術の教育方法が体系化されたとのことです。 本書では、このインターンシップでの講義をベースにして、大規模サービス技術を解説することを試みています。 私はこの本が出版された当時に買って読みました。しかしその時は興味あるところだけつまみ食いしただけで正直言えば印象が薄かったのですが、最近読み返したところ「教育方法の体系化」という点で非常に興味を持ちました。 今となっては少し古めの本かもしれませんが、本書に書かれている具体的な技術以上にとても勉強になり、面白さを感じたため取り上げることにしました。 <本の内容> はてなインターンシップの講義ベースと書き下ろしで構成されており、授業を受けている感じで進みます。私の学生時代にはこのような機会は無かったのですが、このようなインターンシップを体験できる学生さんが羨ましい。。。 【目次】 第1回 大規模Webサービスの開発オリエンテーション―全体像を把握する Lesson 0 本書の源 ―本書で説明すること,しないこと Lesson 1 大規模なサービスと小規模なサービス Lesson 2 成長し続けるサービスと,大規模化の壁 Lesson 3 サービス開発の現場 第2回 大規模データ処理入門 ―メモリとディスク,Webアプリケーションと負荷 Lesson 4 はてなブックマークのデータ規模 ―データが大きいと処理に時間がかかる Lesson 5 大規模データ処理の難所 ―メモリとディスク Lesson 6 スケーリングの要所 Lesson

Distributed Systems / 分散システム ― 原理とパラダイム

Distributed Systems / 分散システム ― 原理とパラダイム 今や分散システムではないシステムというものは殆ど考えられなくなってきました。今回はその分散システムに関する有名な分厚い教科書を取り上げます。 教科書といっても、お堅い数学書のようなものではなく、分散処理に関する基礎技術を網羅し、かつ、私のような実務者にも理解できるような丁寧な解説書といった雰囲気の本です。 この本の初版のサブタイトルに「原理とパラダイム」とあるように、単なる理論書ではなく、その応用システムにも触れられているので実務者にも親しみやすいと思います。 分散処理技術は現代のシステム構築にはいわば必須の技術なので、実務者としても、その基礎的な原理は抑えておきたいところです。自分が今使っている技術が全体のどのあたりに位置するものかが分かります。 が、そんなにストイックに考えなくても、ざっと斜め読み流して世の中にはどのような分散処理技術があるのかという雑学的知識を得るとか、システム設計や構築におけるキモや選択肢を知るとか、何らかのアイディアを得るため、などのような読み方もできます。 ところで、初版は 2002年あたりですが、コンピューティング分野の進展はすさまじいので、改定が続けられています。 現在の最新版は、英語ですが第4版です。 Distributed Systems ペーパーバック – 2023/1/8 日本語版は初版と第2版までのようです。 分散システム 第二版  2009/1 分散システム―原理とパラダイム  2003/10 なお、英語版ですが、この本の第二版以降は、以下のサイトから無料でPDF版(personalized copy)を入手できます。 Distributed Systems 4th edition (2023) Distributed Systems 3rd edition (2017) Distributed Systems 2nd edition (2007) これらは著者の一人の Maarten van Steen 先生がホストしているようで、スライドやソースコード等の資料もダウンロードできます。 DISTRIBUTED-SYSTEMS.NET https://www.distributed-sys

日本語入力を支える技術

日本語入力を支える技術 ~変わり続けるコンピュータと言葉の世界 2012/2/8 徳永 拓之 (著) 日本語入力を支える技術 ~変わり続けるコンピュータと言葉の世界 (Amazonで書籍情報を表示) これまで本ブログで日本語の文字に関する本をいくつか取り上げましたが、今回は日本語入力に関する本を取り上げます。 普段殆ど意識することなく日本語入力していますが、考えてみると、なぜ現在のような入力方式が一般に広がったのか?とか、どのような原理でローマ字入力から漢字交じりの日本語に変換できるのか?など、様々な疑問が湧いてきます。 今回取り上げる本は、そのような疑問に答えてくれる本です。 この本は2012年出版なので少し古い感じもするかもしれません。実は私も新品を買ったのではなく、最近、Amazon の中古品で購入して読みました。 ちなみに、私は先端の日本語入力技術を理解しているわけではありませんので、最新の技術と比較して、この本がどうなのかはわかりません。 しかし、日本語入力技術の経緯や理論的な考え方を、数式とコードを織り交ぜて丁寧に解説してくれており、興味深く読むことができました。理論中心の教科書と違って、コード例を示してくれることで数式の意味も理解しやすいです。 この本に書かれていることは、日本語入力に限らず、一歩進んだ入力支援機能を考える際のヒントが詰まっていると思いましたので、今回取り上げることにしました。 <本の内容> 本書の構成は「はじめに」に以下のように書かれています。 『本書の前半は日本語入力システム全般の知識を解説し、後半ではかな漢字変換を中心に、そこで使われるアルゴリズムやデータ構造などを掘り下げます。かな漢字変換には、自然言語処理という研究分野で用いられる手法がそのまま使えます。逆に、本書を自然言語処理への入門として読むこともできるでしょう。』 【目次】 第1章 日本語と日本語入力システムの歩み 1.1 コンピュータで日本語を扱うということ 1.2 日本語を入力するということ 1.3 日本語入力とかな漢字変換 1.4 日本語入力のはじまり 1.5 かな漢字変換のはじまり 1.6 単文節変換から連文節変換へ 1.7 2強時代の到来~統計・機械学習ベースのアルゴリズムへ 1.8 Web検索各社のかな漢字変換エンジ

Firebase Web クライアントのイベントを処理する(RxFire, ReactFire)

本記事では Firebase Web クライアントの通知を処理しやすくなるかもしれない RxFire と ReactFile をみていきます。 【目次】 [1]はじめに [2]Firebase Web SDK をそのまま使う (1)Authentication 通知例 (2)Firestore 通知例 (3)Storage 通知例 [3]RxFire を利用する (1)RxJS と RxFire (2)RxFire のインストール (3)RxFire の利用例 [4]ReactFire を利用する (1)ReactFire (2)ReactFire のインストール (3)ReactFire の利用例 [1]はじめに 私が Firebase は面白いと感じることの一つに、様々な通知が得られることがあります。 例えば、Firebase Authentication であれば、ログイン、ログアウト状態の変化の通知を受け取ることができます。Firestore であれば、データベースの変更等の通知を受けることができます。 このような通知をうまく利用すれば、面白い動きをするアプリが作れそうな気になります。 一方で、アプリの規模が大きくなるにつれ、ユーザからのアクションとシステム等からの通知に対して一貫性を保って動作する設計や実装を行うことは難しいものです。 そこで本記事では手始めとして、Firebase Web クライアントの通知を処理しやすくなるかもしれない枠組みやライブラリを少しだけ見ておきます。 [2]Firebase Web SDK をそのまま使う Firebase クライアントライブラリから受けられる通知は沢山ありますが、ここではよくありそうな例を3つだけみておきます。 (1)Authentication 通知例 以下のようなコードで、ユーザのログイン状態(ログインした、ログアウトした)の変化の通知を受けることができます。 import { getAuth, onAuthStateChanged } from "firebase/auth"; const auth = getAuth(); const unsubscribe = onAuthStateChanged(auth, (user) =&g

JavaScriptで学ぶ関数型プログラミング

イメージ
JavaScriptで学ぶ関数型プログラミング Michael Fogus 著、和田 祐一郎 訳 2014年01月 JavaScriptで学ぶ関数型プログラミング (Amazonで書籍情報を表示) 最近のプログラム、特に UI 系のプログラムでは、map などを使ったコードを当たり前のように目にするようになりました。関数型プログラミングに由来するコードが増えてきたと思います。 関数型プログラミングの考え方は新しいものではありませんが、最近のプログラミング言語は、関数型プログラミングっぽいスタイルのコードが書けるように、これらの機能を標準レベルでサポートする傾向にあると思います。 そうなると、map や filter などを単なる便利な機能という使い方から少しレベルを上げて、関数型プログラミングとはどのようなものか?ということを知りたくなります。 とはいいつつも、実務で Haskell のような言語を使うわけではないので、実務に直接役立ちそうなレベルで関数型プログラミングのエッセンスを知りたい、というのも人情です。 そんな時にお勧めしたいのが今回取り上げる本「JavaScriptで学ぶ関数型プログラミング」です。 以下はこの本のスタンスと思われる記載(5.2)を抜粋したものです。 本書は関数型プログラミングの美徳を熱く説くものではありません。世の中には様々な関数型のテクニックが存在し、それぞれがソフトウェア開発における複雑性を飼いならすための手段となります。しかし同時に、個々の実装においては、よりよい方法があることに気づくこともあります。 普段からあなた自身の個人的な興味とニーズを深く追っておくことで、アプリケーションを構築する際にそのテクニックを使うことが適切であるかどうかを判断できるよう準備しておくことがプログラマーとして賢明であると言えます。 本書は関数型プログラミングの本ですが、同時に、何にもまして、問題とその解決方法を理解する力とそこで使える引き出しを持っているということが、その場その場でとるべき最善のソリューションにつながるものであると信じています。 とはいいつつ、オブジェクト指向スタイルと関数型スタイルの違いに触れながら、JavaScript を使って関数型プログラミングの美徳を熱く説いています(笑)。 初版が

Ubuntu 22.04 LTS 日本語デスクトップ環境のVagrant BOXを作る

イメージ
本記事は、Ubuntu 22.04 LTS のベースBOXから日本語デスクトップ環境のBOXを作成します。このBOXを利用すれば、デスクトップ環境の仮想マシンを素早く作ることができるようになり、さらに、開発ツールを追加したBOXを作成する際のベースBOXとしても利用できます。 【目次】 [1]はじめに [2]仮想マシンの定義 (1)プロジェクトディレクトリの作成 (2)Vagrantfileの作成 [3]仮想マシンの作成 [4]日本語環境の設定 (1)デスクトップへログインして状況確認 (2)言語サポート(日本語)の追加 (3)標準フォルダーの名前を設定 (4)入力ソース(日本語入力)の設定 (5)日付と時間の設定 (6)ソフトウェアの更新や Firefox 文字化け対応など [5]パッケージ化してBOX登録する (1)パッケージ化 (2)BOX登録 [6]BOXから新しい仮想マシンを作ってテストする (1)簡単な動作確認 (2)テスト用仮想マシンの削除 [7]BOX作成用の仮想マシンとプロジェクトディレクトリの削除 [1]はじめに 本ブログでは、Vagrant+VirtualBox+Ubuntu 上に日本語デスクトップ環境を構築する記事として、Ubuntu 18.04 LTS、Ubuntu 20.04 LTS 版を書きました。 Ubuntu 18.04 LTS 日本語デスクトップ環境のVagrant BOXを作る Ubuntu 20.04 LTS 日本語デスクトップ環境のVagrant BOXを作る 本記事はその Ubuntu 22.04 LTS 版です。 基礎的なベースBOXにデスクトップ関連のパッケージを追加する作業は、(特にダウンロードに)かなり時間がかかりますので、一度作ったデスクトップ環境をパッケージ化してBOX登録しておくと、そのBOXからデスクトップ環境の仮想マシンを素早く作ることができるようになります。さらに、このBOXに開発ツールを追加したBOXを作成する際のベースBOXとして利用することもできます。 本記事では、Ubuntu 22.04 LTSを対象として、Vagrant Cloudで提供されているベースBOXから日本語デスクトップ環境を仮想マシンに作りこみ、それをパッケージ化してBOX登録します。 具体的には以下

Oxigraph を利用して RDFLib の SPARQL クエリを高速化してみる

本記事は Python から RDFLib 経由で Oxigraph を利用する方法のメモです。 【目次】 [1]はじめに [2]Oxigraph、Pyoxigraph、Oxrdflib について [3]利用方法など (1)ライブラリのインストール (2)RDFLib から SPARQL を実行するコード例 [4]感想など [1]はじめに Python で RDF データを処理しようとするとき最初の選択肢は RDFLib だと思います。 rdflib https://rdflib.readthedocs.io/en/stable/# RDFLib はネットに沢山情報があるし、実績もあります。個人的には Google Colaboratory で手軽に使えることが気に入っています。 しかし、トリプル数が少なく、単純な SPARQL クエリを実行するだけなら気になりませんが、それなりに多いデータに対して複雑な SPARQL クエリを実行しようとすると、パフォーマンスが気になることが多いです。 このようなケースは、Apache Jena とか Fuseki を利用すれば素晴らしいパフォーマンスを発揮するので速度面は解決することができます。 Apache Jena https://jena.apache.org/ しかし、対話環境で利用したいとか、SPARQL クエリの実行結果を Pandas に挿入して云々のような、Python ならではの利点を生かそうとすると、環境構築やプラグラミング環境を含めて考えると、あまりお手軽とは言えません。(少なくとも Google Colaboratory 上でお手軽に使うという感覚ではありません。) そこで、Colaboratory 上で動作する Python のライブラリで、RDF ファイルを読み書きでき、 SPARQL クエリが高速に動作するライブラリは無いものかと探してみたところ、Oxigraph を見つけました。 ありがたいことに、Oxigraph は RDFLib のプラグインが提供されており、RDFLib を利用したコードを殆ど変更することなく、内部では OxiGraph を動作させることが可能です。(つまり、RDFLib の API で Oxigraph を使える。) そこで、本

Python で W3C PROV オントロジーを可視化する(Python PROV)

イメージ
本記事では Python の prov パッケージを利用して、PROV 情報を可視化する方法を見ていきます。 【目次】 [1]はじめに [2]Prov Python package の利用 (1)Prov Python package のインストール (2)PROV-N の概要 (3)Python で PROV 情報を作成する [3]可視化してみる (1)Graphviz、pydot のインストール (2)図(画像)をPNG ファイルとして出力する (3)属性の追加と日本語表示 [4]RDFファイルを読み込んで可視化する (1)PROV 情報を RDF ファイルとして保存する (2)RDFファイルから読み込んで可視化する [1]はじめに W3C PROV オントロジーを利用すると、物事の来歴情報を記述することができます。 PROV 仕様は来歴表現に関するデータモデルやシリアライズフォーマットが定義されていますので、機械可読な来歴情報を表現できます。 PROV-Overview An Overview of the PROV Family of Documents https://www.w3.org/TR/prov-overview/ ただし、一般に、形式的な表現のままでは人間が理解しやすいとは限りません。 これは PROV の仕様が複雑という意味ではなく、人間は、情報量が多くなると全体像を把握しづらくなるということかと思います。 これに対して PROV の表現を可視化(図示)するための推奨事項が公開されています。 PROV Graph Layout Conventions https://www.w3.org/2011/prov/wiki/Diagrams このような PROV 情報の可視化を行えば、全体像を把握しやすくなると思います。 前回の記事『 Git2PROV を例に W3C PROV オントロジー表現の基本を知る 』では、Git のコミット履歴に関する PROV 表現例を図を中心に概観しました。 簡単な来歴の図は手作業で書くこともできますが(前回の記事は手作業で書きました)、データが複雑になると手作業で書くのは無理です。 これは作図作業に時間がかかる、というだけでなく、誤りのもとになります。 そこで本記