Y's note

「魔法少女まどか☆マギカ」の台詞をJavaScriptでMapReduceしてGoogle Chart APIでグラフ出力したよ!

[Hadoop] : 「魔法少女まどか☆マギカ」の台詞をJavaScriptでMapReduceしてGoogle Chart APIでグラフ出力したよ! Hadoop 第2版 作者: Tom White,玉川竜司,兼田聖士出版社/メーカー: オライリージャパン発売日: 2011/07/23メディア: 大型本購入: 9人 クリック: 182回この商品を含むブログ (24件) を見る 概要 「魔法少女まどか☆マギカ」の台詞をNLTK(Natural Language Toolkit)で解析する - Yuta.Kikuchiの日記 SpiderMonkeyでのコマンドラインJavascript - Yuta.Kikuchiの日記 CentOSでHadoopを使ってみる - Yuta.Kikuchiの日記 以前に「魔法少女まどか☆マギカ」の台詞をNLTK(Natural Language Toolkit)で解析することに挑戦しましたが、解析結果の集計グラフが奇麗に表示されませんでした。今回はそれを改善すべく手法を変えて挑戦します。グラフ化はNLTKではなくGoogle Chart APIを利用します。Google Chart Tools - Google Code またHadoopのMapReduceにJavaScriptを用い、Google Chart APIとのデータ連携をしやすいようにします。以下に大まかな処理の流れを記述します。 SpiderMonkeyをCentOSに設定 魔法少女まどか☆マギカの台詞をPythonでスクレイピング NLTKによる分かち書き JavaScriptによるMapReduce HadoopでMapReduce Google Chart APIでMapReduce結果をグラフ化 SpiderMonkeyをCentOSに設定 参考 HadoopのMapReduceをJavaScriptで行うためにCentOSにSpiderMonkeyを設定します。本家サイトのinstall手順を参考にしました。https://developer.mozilla.org/en/Building_only_SpiderMonkey ソースコード取得/解凍 $ wget http://ftp.

超絶簡単!JavaScriptの性質を10分で理解するための重要なポイントのまとめ

[javascript] : 超絶簡単!JavaScriptの性質を10分で理解するための重要なポイントのまとめ JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス 作者: Douglas Crockford,水野貴明出版社/メーカー: オライリージャパン発売日: 2008/12/22メディア: 大型本購入: 94人 クリック: 1,643回この商品を含むブログ (187件) を見る JavaScriptのニーズ NodeJSやTitaniumMobileの普及によりサーバサイド/スマフォアプリの作成をJavaScriptで書こうとする動きが盛んです。それだけ注目を集めているせいかブログの記事でもJavaScriptのネタを書くとはてぶ登録されやすい傾向が現れます。一応今までJavaScript系の記事をいくつか書いてきたのでリンクを紹介します。 Javascriptによる正規表現まとめ - Yuta.Kikuchiの日記 WebSocket対応状況のまとめ - Yuta.Kikuchiの日記 Node.jsでWebSocketを試してみる - Yuta.Kikuchiの日記 jQuery Proven Performance Tips And Tricks (翻訳) - Yuta.Kikuchiの日記 SpiderMonkeyでのコマンドラインJavascript - Yuta.Kikuchiの日記 jQueryの参考にすべきSiteのまとめ - Yuta.Kikuchiの日記 javascriptのクラスまとめ - Yuta.Kikuchiの日記 JavaScriptは記述の制限が緩い言語で記述者が自由に定義できてしまいます。自由度が高いという言葉は良いように聞こえますが、各人それぞれの志向に左右されることが多く、特に他人のコードを読む時に苦労します。今日はJavaScriptの性質を理解するためにdebugを仕込みながら勉強を進めたいと思います。 JavaScriptを理解する上で大切な事 個人的にJavaScriptの性質を理解する上で重要な事はObjectと関数を理解することだと認識しています。JavaScriptのほとんどのデータ定義がObjectで表現されます(関数、文字列、数値以外)。JavaScriptにはClassといった概念が無く、関数定義を他言語でのClassのConstructorのように扱い、Classメソッドのようなものをprototypeといった暗黙参照のObjectで定義します。左の言葉に少し違和感を感じられるかもしれません。後にコード例を示すのでそちらも参照してください。 配列/連想配列の定義 配列と連想配列は当然ながら別物です。配列はList型のデータに対して連想配列はKeyからValueを得るHashになります。JavaScriptの表記としても別々で扱いますが、両方ともObjectとしての性質を持ちます。 配列の定義 配列の宣言はArrayもしくは[]を利用します。私はArrayで宣言か添字で入れる書き方をします。newを使っても使わなくても同じということであれば使用しない事にしています。また添字を文字列で入れるまたhashで一度宣言という方法は使った事が無いです。

html5のcanvasを使ってブラウザ上でのお絵描きやニコニコ動画風テロップを実装する

[javascript] : html5のcanvasを使ってブラウザ上でのお絵描きやニコニコ動画風テロップを実装する 概要 html5のcanvasで遊んでみます。canvasの2dは学生の頃から使ってGoogleMap上にお絵描きできるシステムを作りました。またcanvasを巧く使えばニコニコ動画風のテロップも作れると思って今回実装してみました。次回は3dに挑戦したいです。 ブラウザ上でのお絵描き 仕組み 作り方は非常に簡単でhtmlにcanvasタグを埋め込み、それをJavascriptでdocument.getElementById( 'canvas' ).getContext( '2d' );とするだけでcanvasの2dオブジェクトが操作できます。mousedown,mousemove,mouseupのイベントを追加して、downしたら描画開始/moveしたら軌跡を残す/upしたら描画終了という処理の流れになります。当然の事ながらマウスのポイントを取得する必要がありevent.clientX/event.clientYで取得します。canvas上に軌跡を残すにはマウスポイントの一つ前の座標と新しい移動座標をからmoveTo、lineTo、strokeといったcanvasの2dオブジェクトが持っているメソッドを利用するだけです。jsも全部で50行ぐらいです。必要なことを箇条書きでも記します。 項目 簡易コード canvas2dの取得 document.getElementById( 'canvas' ).getContext( '2d' ); マウスイベント追加 addEventListener( 'mousedown', Canvas.mousedown, false); addEventListener( 'mousemove', Canvas.mousemove, false); addEventListener( 'mouseup' , Canvas.mouseup , false); マウスポイント取得 { x:e.clientX, y:e.clientY }; canvasに軌跡を書く var can = document.

JavaScript Ajax : XmlHttpRequestのLevel2でSameOriginPolicyを回避する

[javascript] : JavaScript Ajax : XmlHttpRequestのLevel2でSameOriginPolicyを回避する クロスドメイン制限の回避について 今まではXHR(XmlHttpRequest)の仕様によりJSを読み込んでいるHTMLファイルがあるサーバから異なるドメインサーバへのAjaxリクエストが制限されていました。Same Origin Policyと呼ばれているものです。Same Origin Policyの役割としては悪意のあるscriptが個人情報等を他のサイトに転送する事を防ぐためです。このセキリティ制限を回避するために多くの人が代表的なJSONP(JSON with Padding)を利用してサーバサイドでクライアントのコールバック関数をechoしてクライアント側で実行されることにより、クロスドメイン間のAjax通信をそれっぽく動くように対応していたと思います。 JSONPについては以前記事を書いたので宜しければ参照してください。20秒で理解するJSONP - Yuta.Kikuchiの日記 JSONPを利用するのは少し面倒でコールバック関数をリクエストされたサーバサイドから返却しないといけなく、またセキュリティ面でも不安で十分に気をつける必要があります。JSONP以外にもリバースProxyを用意する、Flashを経由するとクロスドメインリクエスト可能となりますがこの面倒な事に頭を悩ませるJavascripterも多かったと思うのですが、色々と調べてみるとXHRのLevel2の仕様によりJSONPを使わずとも異なるドメイン間でのAjaxリクエストが可能となりそうです。 制限を回避するために Access-Control-Allow-Origin HTTP access control - MDN にあるようにAccess-Control-Allow-OriginというHttpResponseHeaderを仕込むとクロスドメインを回避する事ができるようです。このHttpResponseHeaderをどこに仕込むのか?ということが疑問になりそうですが、Ajaxリクエスト先のAPIサーバに設置します。(リクエスト元に設定する方式だとXSRFなどが好き勝手出来てしまうのでそれは無いですね) Access-Control-Allow-Originにリクエストを受け付けるURLを指定、もしくは*(ワイルドカード)を指定すると全てのURLを受け付ける設定になります。 関連Header一覧 色々なブラウザ仕様があるのでAccess-Control-Allow-Originだけでなく、念のため以下のResponseHeaderも設定しておくと動作が確認できるようです。 Access-Control-Allow-Origin : 上で説明した通りでアクセス元のURLを指定します。*(ワイルドカード)指定可能です。 Access-Control-Allow-Methods : GET,POST,PUT,DELETE,OPTIONSなどの受け付けるRequestMethodを指定します。 Access-Control-Allow-Headers : RequestHeaderに仕込んである値を見て許可する内容を指定します。*(ワイルドカード)指定可能です。 Access-Control-Max-Age : 各種OptionHeaderの有効時間を設定します。 Demo 今回のAPI/ClientともにサンプルコードをGitHubに挙げました。https://github.com/yutakikuchi/JS/tree/master/crossdomain API Server アクセスするAPIサーバをGoogle App Engineに置きます。上で説明したHeaderを仕込み、とりえあずは簡単な文字列(CrossDoaminRequest)だけをprintします。 #!/usr/bin/env python # -*- coding: utf-8 -*- from google.

継続的インテグレーション(CI)ツールJenkinsを導入するためのまとめ

[Web] : 継続的インテグレーション(CI)ツールJenkinsを導入するためのまとめ 概要 誰もがSorceビルドや開発debugは面倒と思う作業。これらの作業を少しでも手間を掛からないようにするために継続的インテグレーションツールのjenkinsというものがあります。jenkinsはテストおよびビルドの自動化やバグの早期発見に使われます。主にJava開発者向けのツールのようですが、他言語でも利用が出来るようです。今回の記事では主に導入周りの情報を整理したいと思います。 導入のメリット @ITにJenkinsの特徴が書いてあります。「Hudson」改め「Jenkins」で始めるCI(継続的インテグレーション)入門 (1/4) - @IT ソースコードの自動ビルド バグの早期発見レポート ソースコード解析、統計 テストの自動化 様々なプラグインによる機能拡張 日本語版のJenkins wikiにも色々と書いてあります。Meet Jenkins - 日本語 - Jenkins Wiki 差分サポート 永続リンク RSS/Eメール/IM との連携 ビルド後のタグ JUnit/TestNGによるテスト結果のレポート 分散ビルド ファイル指紋 infoQのJenkins開発者のコラムに流行った理由が書いてありました。InfoQ: Jenkinsによる継続的インテグレーションのススメ(1) インストールや設定がWebUIから行える 拡張性の高いプラグイン 対応OS 本家サイトにもあるように各種OSに対応したパッケージがあるようです。Welcome to Jenkins CI! | Jenkins CI Windows Ubuntu/Debian Red Hat/Fedora/CentOS Mac OS X openSUSE FreeBSD OpenBSD Solaris/OpenIndiana Gentoo 導入 環境 私が設定する環境はMacOSX Version10.

PHPのHash/暗号化関数の使用方法まとめ

[PHP] : PHPのHash/暗号化関数の使用方法まとめ 概要 「そもそもHashと暗号化って何が違うの?」この記事はそういった疑問を持っている私自身がまとめた記事でとても初歩的な内容になります。記事の紹介の中ではPHPをメインに話を進めます。PHPのHash関数、暗号化関数の種類が豊富で中々覚えづらい内容が多いです。今回の記事ではPHPによるHash/暗号化関数の使用とJAVAとの共通鍵暗号方式を意識した内容になります。また以前共通鍵暗号のAESについての内容をまとめたのでそちらも参照してください。AES暗号のまとめ - Yuta.Kikuchiの日記 Hash、暗号化の違いについて 個人的な見識を書きますので間違っている可能性が高いです。 HashとはMD5やSHAなどのHashアルゴリズムに基づいて生成されるチェックサムです。特定の値に対してアルゴリズム(関数)をかけることによって1つの値を取得します。導き出されたHash値から元の値を出す事は難しいとされ、一般的には不可逆性を持つと言えます。Hashの目的としてはデータの送信、受け取り側の両方で共通のアルゴリズムでHashを確認するようなデータ改竄の防止などに利用されています。 暗号化とはデータの秘匿性を守るための方法です。公開鍵暗号/共通鍵暗号などの方式がありますが、平文というデータを第三者に知られないように鍵を用いて暗号文を作成することが目的です。Hashと大きく異なるのが暗号文から鍵を利用して平文を取り出せるので、可逆性であると言えます。 注意:Hashに対しても鍵を使用することがあります。たとえばSHA256のhmac方式等です。SHA256というアルゴリズムに対して鍵を指定してHashを作成します。 PHPでHash化 似たような関数が存在し分かりにくいので実際に使用した感じをまとめていきます。 登録されているHashアルゴリズム一覧 print_r(hash_algos()); Array ( [0] = md2 [1] = md4 [2] = md5 [3] = sha1 [4] = sha224 [5] = sha256 [6] = sha384 [7] = sha512 [8] = ripemd128 [9] = ripemd160 [10] = ripemd256 [11] = ripemd320 [12] = whirlpool [13] = tiger128,3 [14] = tiger160,3 [15] = tiger192,3 [16] = tiger128,4 [17] = tiger160,4 [18] = tiger192,4 [19] = snefru [20] = snefru256 [21] = gost [22] = adler32 [23] = crc32 [24] = crc32b [25] = salsa10 [26] = salsa20 [27] = haval128,3 [28] = haval160,3 [29] = haval192,3 [30] = haval224,3 [31] = haval256,3 [32] = haval128,4 [33] = haval160,4 [34] = haval192,4 [35] = haval224,4 [36] = haval256,4 [37] = haval128,5 [38] = haval160,5 [39] = haval192,5 [40] = haval224,5 [41] = haval256,5 ) 16ByteのMD5を得る方法 16進数表記であるため32文字でデータ量は16Byteになります。hash、hash_init/hash_update/hash_final、md5のどれでも同じ値を返します。

InnoDBの設計とインデックスを意識したサロゲートキーと複合プライマリキーの比較

[Mysql] : InnoDBの設計とインデックスを意識したサロゲートキーと複合プライマリキーの比較 実践ハイパフォーマンスMySQL 第2版 作者: Baron Schwartz,Peter Zaitsev,Vadim Tkachenko,Jeremy D. Zawodny,Arjen Lentz,Derek J. Balling,伊藤直也(監訳),田中慎司(監訳),吉川英興(監訳),株式会社クイープ出版社/メーカー: オライリージャパン発売日: 2009/12/14メディア: 大型本購入: 17人 クリック: 373回この商品を含むブログ (46件) を見る 概要 この記事ではInnoDBを使用する上でのクラスタインデックスを意識したサロゲートキーと複合主キーの比較をパフォーマンスの観点から行います。サロゲートキーか複合キーのどちらを使うべきかは様々な議論がなされているようにケースバイケースといったところで自分は納得しています。ここでは自分の実現したいテーブル設計と利用目的を明確にしてそのケースに合うのはどちらかという検証をしたいと思います。ちなみに今までの業務ではサロゲートを使う事がほとんどでした。理由としては参加したPJのほとんどで元々のテーブルが全部サロゲートであること、また自分で設計する時も主キー管理に面倒なことを考えなくて済むからという理由でサロゲートを使用していました。(使用しているフレームワークの制限でサロゲートを使用しないといけないということはありませんでした。)今までパフォーマンスを求められる箇所のDB設計を担当しておらず勉強不足が否めないので、今回検証してみることにしました。間違い等あればどんどんご指摘ください。宜しくお願いいたします。以下初めにこの記事で利用するキーの名前の定義をしておきます。 キーの定義 名前 意味 ナチュラルキー(自然キー) システムの外部から入力される値に対するキー。 サロゲートキー(代替キー) 自動生成される連番キーで主にプライマリーに利用されるが、値としては意味を持たない。 プライマリキー(主キー) テーブル内の行を一意とするための識別子。 複合プライマリキー(複合主キー) 複数のナチュラルキーにて構成されるプライマリキー ユニークキー(一意キー) NULL以外をユニークとするキー。 複合ユニークキー 複数のカラムでユニークを意味するキー。 実現したい内容 商品販売を行う携帯サービスを展開する時に 「どのユーザ」が「どの商品」を「どの携帯電話」で利用しているかという状況の履歴を管理するテーブルを作成します。データとしてはユーザ、商品、携帯電話の値それぞれがデータの意味としては一意となりますが履歴のテーブルであるため3つ揃って一つのユニークな履歴となります。(3つの値を持つ同じ履歴レコードは他には存在しない状況)テーブルとして必要な情報を以下にまとめます。

PHPにおける時間表記のISO-8061、DATE_ATOM、DATE_RFC3309、DATE_W3Cの違いは何か

[PHP] : PHPにおける時間表記のISO-8061、DATE_ATOM、DATE_RFC3309、DATE_W3Cの違いは何か ISO-8601時刻表記について ISO-8601はあまり使わない時刻を表記する形式ではあるがAtomフィードの時刻表記でその互換規格として利用されます。Atomについては最近記事を書いたのでそちらを参照してください。RSSより便利なAtomデータの詳細と利用方法について簡単にまとめてみた - Yuta.Kikuchiの日記 ISO-8601とは簡単に説明すると時刻の表記を以下のような形式で表現します。 年、月、日の関係はYYYY-MM-DDと表記する。(2012-01-24、20120124)。 年、年内の日番号はYYYY-DDDと表記する。(2012024) 2012年の24日目。 年、週、曜日をYYYY-Www-Dと表記する。(2012-W04-2) 2012年の4週目の火曜日。すなわち2012/01/24。 時刻の表記にはhh:mm:ssの形式が利用される。 10時30分20.5秒 ( 10:30:20,5 ) 10:30,5(1130,5)は10:30:30と同じ。 10.5は10:30と同じ。 timezone指定 UTCでは時刻の後ろにZを添える。2012-01-24T12:00Z UTC以外では時刻の後ろに+-hh:mm、+-hhmm、+-hhのいずれかを添える。2012-01-24T12:00+09:00(日本時間での2012/01/24の12時) 日付と時刻の間にはTを入れる。2012-01-24T12:00+09:00 期間を表記する場合は開始日時/終了日で表記する。2012-01-01T00:00+09:00/2012-01-24T12:00+09:00 (2012/01/01の0時〜2012/01/24の12時) 年/月/日の表記が省略表記等自由に表現できることや期間の表現が可能であるというメリットはありますが、定義が曖昧なのと人の目には分かりづらい表記のように思います。(timestampよりはましですが)。しかしほとんどのプログラミング言語、ミドルウェアはこの表記をサポートしているということで覚えた方が良いという事です。 AtomのDateコンストラクタ RFC 4287 The Atom Syndication Format 日本語訳 ここのDateコンストラクタ定義によるとRFC3339に準拠している必要があるようですが、この規格自体がISO-8601やW3C.NOTE-datetime-19980827、W3C.REC-xmlschema-2-20041028と互換性があります。以下はDateコンストラクタの簡単な例になります。 2012-01-24T00:00:00Z 2012-01-24T00:00:00.00Z 2012-01-24T00:00:00+09:00 2012-01-24T00:00:00.00+09:00 PHPでの各規格の表記の違い PHP: DateTime - Manual ここに載っているDateTime Manualの表記の違いについてコメントしますが、結論からするとISO8601だけ少し表記が違うぐらいの差でしかありません。なぜなら上のISO-8601の定義から同じ時刻を示すからです。規格自体が変わらないのだとすれば定数を増やすのは無意味と感じてしまいます。 定数 実データ DATE_ISO8601 2012-01-23T23:14:15+0900 DATE_RFC3339 2012-01-23T23:14:15+09:00 DATE_ATOM 2012-01-23T23:14:15+09:00 DATE_W3C 2012-01-23T23:14:15+09:00 PHP: date - Manual こちらのdate関数の説明も更に混乱を招きます。date関数の第一引数に'c'を指定するとISO8601形式と書いてありますが、実際には他の3パターンの時刻表記で表示されます。以下はPHPのサンプルコードとその実行結果です。どれも同じ値を示しますが混乱しないように注意しましょう。

実践 ハイパフォーマンスMySQL(第2版)を斜め読みして前半の重要なポイントだけをまとめてみた

[Mysql] : 実践 ハイパフォーマンスMySQL(第2版)を斜め読みして前半の重要なポイントだけをまとめてみた 実践ハイパフォーマンスMySQL 第2版 作者: Baron Schwartz,Peter Zaitsev,Vadim Tkachenko,Jeremy D. Zawodny,Arjen Lentz,Derek J. Balling,伊藤直也(監訳),田中慎司(監訳),吉川英興(監訳),株式会社クイープ出版社/メーカー: オライリージャパン発売日: 2009/12/14メディア: 大型本購入: 17人 クリック: 373回この商品を含むブログ (46件) を見る 実践ハイパフォーマンスMySQLですがMySQL開発者にとっては誰もが目を通しておいた方が良いと推薦される本なので重要なポイントだけをまとめてみたいと思います。まだ前半しか読んでいませんがMySQLの細かいテクニックが載っていて感動です。全部で700ページ近くある本なので斜め読みをした結果を載せて行きます。内容としては実践的なものをカットし、理論的なものだけを抽出しています。今回の記事だけでなく複数回に分けて内容を紹介したいと思います。この記事とは関係なく過去にIndexについての記事を書いたのでそちらも参照してもらえればと思います。MYSQL INDEXのまとめ - Yuta.Kikuchiの日記 目次 1章 MySQLのアーキテクチャ MySQLの論理アーキテクチャ 平行性の制御 トランザクション マルチバージョンの平行性制御(MVCC) MySQLのストレージエンジン 2章 ボトルネックの検出:ベンチマークとプロファイリング ベンチマークを実行する理由 ベンチマーク戦略 ベンチマーク戦術 ベンチマークツール 3章 スキーマの最適化とインデックス 最適なデータ型の戦略 インデックスの基礎 高いパフォーマンスを実現するためのインデックス戦略 インデックスのケーススタディ インデックスとテーブルの管理 正規化と非正規化 ALTER TABLEの高速化 ストレージエンジンに関する注意点 MySQLのアーキテクチャ MySQLの論理アーキテクチャ MySQLの論理的なアーキテクチャは以下の3つのレイヤから構成される。 接続管理とセキュリティ 最適化と実行 ストレージエンジン 最適化と実行例レイヤがMySQLの中枢であり、Query解析、分析、最適化、キャッシュ、組み込み関数、ストアドプロシージャ、トリガ、ビューなどが含まれる。 ストレージエンジン間の違いを吸収するためサーバとエンジンはAPIを経由してデータのやり取りを行う。 クライアントから接続されるときは1つのスレッドを作成し、スレッドはコアやCPUと関連付けられる。スレッドは常にキャッシュされる。 接続はSSLでも可能である。 最適化のレイヤではQueryを解析して内部構造を作成し、Queryの書き換え、テーブルを読み取る順序、使用するインデックスの選択などが行われる。 オプティマイザが最適化を試みる。オプティマイザについては後で詳しく説明。 発行したQueryに対する結果がキャッシュされていれば(クエリキャッシュ)ばその結果を返すだけ。 平行性の制御 データベースの世界ではロック問題が絶え間なく発生する。ロックシステムの実装は大きく分けて次の2点 共有ロック(読み取りロック) 排他ロック(書き込みロック) ロックの粒度でロック対象のデータ容量を最小に抑える事が望ましい。 ロックのオーバヘッド(ロックの取得、チェック、解除)にリソースが取られパフォーマンスが低下する可能性がある。 テーブルロックは最もオーバヘッドが低い。テーブル全体をロックするから1クライアントが書き込み中は他のクライアントからの読み取りや書き込みは全て拒否される。 書き込みロックは読み取りロックよりも常に優先される。 行ロックは平行性が最も高いがオーバーヘッドも同様に高い。行ロックはストレージエンジンで実装されている。 トランザクション トランザクションとは1つの作業単位として不可分に扱われるSQLQueryの集まり。処理を一つにまとめて失敗した時は処理全体をロールバックする事を可能にする。 トランザクションはACID特性を持つ必要がある。Atomicity(不可分性)、Consistency(一貫性)、Isolaction(分離性)、Durability(永続性) トランザクジョンもパフォーマンスを下げるので、不必要であればトランザクションに対応しないストレージエンジンを選ぶ事によって改善できる可能性がある。 トランザクションは4つの分離レベルが定義されている。分離レベルが低いほど平行性が高くなる。READ UNCOMMITTED、READ COMMITTED、REPEEATABLE READ、SERIALIZABLE。 デッドロックとは複数のトランザクションが互いに拘束し合うこと。トランザクジョンが異なる順序でリソースをロックしようとした時に発生する。ロックの解放を永遠に待ち続けてしまう。 デッドロックを回避するために検知システムとタイムアウトを実装している。InnoDBなどは循環依存に気づいてすぐにエラーを返す。InnoDBのデッドロックへの対処法は排他ロック行がもっとも少ないトランザクションをロールバックすることである。 トランザクションログをはトランザクションの効率化に役立つ。ストレージエンジンは変更が発生する度にディスク上のデータを更新するのではなく、データのメモリ上のコピーを変更する。その後にトランザクションログに変更を記録する。 MySQLデフォルトではAUTOCOMMITモードで動作している。トランザクジョンを明示的に開始しない限り各Queryを別々のトランザクションで実行する。 InnoDBとMyISAMの併用をしたときに、トランザクションのロールバックが発生した場合は注意しないといけない。理由は非トランザクションテーブルへの変更を取り消す事ができないからデータの矛盾が発生してしまう可能性がある。 マルチバージョンの平行性制御(MVCC) トランザクションをサポートしているエンジンは行ロックとMVCCを組み合わせている。MVCCはバージョンを基にしたスナップショットを作成する仕組み。InnoDBのMVCCは各イベントが発生した時のバージョンを記録している。 MySQLのストレージエンジン 各MySQLストレージエンジンのまとめ ストレージエンジン MySQLバージョン トランザクション ロックの粒度 用途 使用すべきでない状況 MyISAM 全て 不可 同時挿入が可能なテーブル SELECT、INSERT、一括読み込み 読み取りと書き込みの混在 MyISAM Merge 全て 不可 同時挿入が可能なテーブル セグメント化されたアーカイブ、データウェアハウジング 多くのグローバルルックアップ Memory(ヒープ) 全て 不可 テーブル 中間計算、静的なルックアップデータ 大きなデータセット、永続ストレージ InnoDB 全て 可 MVCCを使用する行レベル トランザクション処理 無し Falcon 6.

RSSより便利なAtomデータの詳細と利用方法について簡単にまとめてみた

[WebAPI] : RSSより便利なAtomデータの詳細と利用方法について簡単にまとめてみた 概要 Google Data APIがAtom形式のプロトコルを採用しているように、RSS/Atomというサイト情報を配信する仕組みからWebAPIでのリクエストやレスポンスにまでAtomが広く利用されつつあります。Atomって単純なXML文書の拡張でRSSとさほど変わりないと思っていたのですが、最近仕事でAtomに触れる機会が増えてきているので簡単にまとめた記事を書きます。 RSSとの違い Atomが生まれた経緯はRSSが古い仕様かつRSS1.0/2.0の仕様策定で色々と揉めていたときにAtomを作ろうという動きになったようです。RSSのバージョンごとに非互換性であったり、仕様が明確になっていなかった事が利用者からの不満が多くありました。今後のRSS仕様の策定は2.0から改変が加えられる様子は無いです。RSSの不満は仕様が曖昧な故に配信者に委ねられるという点です。例えばHTMLのマークアップがコンテンツに含めて良いのか?などの規定がありません。AtomはRSSでの反省を踏まえて、特定のベンダに依存しない、全ての人が自由に実装できる、誰でも自由に拡張可能である、明確にかつ詳細に定義する理念を掲げています。 Atomについて Atomには二つの仕様があります。一つ目はコンテンツ配信フィード用で「Atom配信フォーマット」(Atom Syndication Format)と呼ばれています。もう一つはコンテンツを編集するための「Atom出版プロトコル」(Atom Publishing Protocol)でAtomAPIやAtomPPと呼ばれる事もあるようです。Atom Syndication FormatはRFC4287で、Atom Publishing ProtocolはRFC5023で策定がされています。Atomのメリットをいくつか挙げるとすると独自の名前空間が使えるのでデータを自由にカスタマイズできる、配信内容がSummary(要約)とContent(内容)に明確に分離されているのでデータ構造が分かりやすい、contentフィールドにはテキストは勿論のことながらHTMLや画像/動画も含めて配信する事が可能になります。またIETFという機関が仕様を管理しているのでRSSのように配信者の意向に左右されることはありません。以下はAtomのサンプルです。 xml version="1.0"encoding="utf-8"? xmlns="http://www.w3.org/2005/Atom" type="text"dive into mark type="html" A <em>lot</em> of effort went into making this effortless 2005-07-31T12:29:29Z tag:example.org,2003:3 rel="alternate"type="text/html" hreflang="en"href="http://example.org/"/ rel="self"type="application/atom+xml" href="http://example.org/feed.atom"/ Copyright (c) 2003, Mark Pilgrim uri="http://www.example.com/"version="1.0" Example Toolkit Atom draft-07 snapshot rel="alternate"type="text/html" href="http://example.org/2005/04/02/atom"/ rel="enclosure"type="audio/mpeg"length="1337" href="http://example.org/audio/ph34r_my_podcast.mp3"/ tag:example.org,2003:3.2397 2005-07-31T12:29:29Z 2003-12-13T08:29:29-04:00 Mark Pilgrim http://example.