はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化

Lintaro Ina
Lintaro InaSoftware Engineer at Hatena
はてなブックマークにおけるアクセス制御
半環構造に基づくモデル化
伊奈 林太郎
id:tarao @oarat
2015-11-24
@ WebDB Forum 2015
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
◮ 国内最大のソーシャルブックマークサービス
◮ 国内最大のソーシャルブックマークサービス
◮ Scala でいちから作り直すプロジェクトが進行中
DISCLAIMER
◮ 内容は開発中のもの
◮ 実際のリリース時には変更の可能性あり
◮ 最終的にどうなったか公表するかどうか未定
話すこと
◮ B!のアクセス制御はかなり複雑
◮ さまざまな画面/設定
◮ AND/OR 条件
◮ 統一的なモデル化でバグの作り込みを避けたい
◮ モデルの数学的な正しさ
◮ コード上で一貫して扱うしくみ
◮ 効率化したい
◮ DB クエリ等で権限に応じたフィルタリング
アクセス制御のモデル化
単純なアクセス制御
◮ 非公開ユーザの設定
◮ ブックマークが他人からは見えなくなる
◮ 本人にはもちろん見える
単純なアクセス制御
◮ 非公開ユーザの設定
◮ ブックマークが他人からは見えなくなる
◮ 本人にはもちろん見える
コード
if (bookmark.owner == visitor)
Some(bookmark)
else None
少し複雑なアクセス制御
◮ 閲覧許可ユーザの設定
◮ 本人に加えて許可された人にも見える
少し複雑なアクセス制御
◮ 閲覧許可ユーザの設定
◮ 本人に加えて許可された人にも見える
愚直なコード
if (bookmark.owner == visitor ||
bookmark.owner.allowedUsers.contains(visitor))
Some(bookmark)
else None
少し複雑なアクセス制御
◮ 閲覧許可ユーザの設定
◮ 本人に加えて許可された人にも見える
愚直なコード
if (bookmark.owner == visitor ||
bookmark.owner.allowedUsers.contains(visitor))
Some(bookmark)
else None
◮ 少し複雑
◮ そのうちチェックしわすれが発生
少し複雑なアクセス制御
◮ 閲覧許可ユーザの設定
◮ 本人に加えて許可された人にも見える
愚直なコード
if (bookmark.owner == visitor ||
bookmark.owner.allowedUsers.contains(visitor))
Some(bookmark)
else None
◮ 少し複雑
◮ そのうちチェックしわすれが発生
なにか統一的に扱いたい
アクセス制御のモデル
属性 A の羃で表現
要求 r ∈ P(A) = requestOf(viewer)
許可 p ∈ P(A) = permissionOf(target)
確認 p allows r ⇔ p ∩ r = ∅
アクセス制御のモデル
属性 A の羃で表現
要求 r ∈ P(A) = requestOf(viewer)
許可 p ∈ P(A) = permissionOf(target)
確認 p allows r ⇔ p ∩ r = ∅
例
ユーザ 閲覧許可 要求 許可
u1 なし {u1} {u1}
u2 u1, u3 {u2} {u1, u2, u3}
u3 u2 {u3} {u2, u3}
permissionOf(u1) allows requestOf(u2) = false
permissionOf(u2) allows requestOf(u3) = true
permissionOf(u3) allows requestOf(u1) = false
アクセス制御のモデル
属性 A の羃で表現
要求 r ∈ P(A) = requestOf(viewer)
許可 p ∈ P(A) = permissionOf(target)
確認 p allows r ⇔ p ∩ r = ∅
コードによる表現
val r = requestOf(visitor)
val p = permissionOf(bookmark.owner)
if (p allows r) Some(bookmark)
else None
◮ オブジェクトから属性集合へのマッピング
(permissionOf, requestOf)
◮ オブジェクト型ごとの一貫したメンテが可能
アクセス制御のモデル
r {a, b, c}
r {a, b} {a, c} {b, c}
r {a} {b} {c}
p {a} {b} {c}
p {a, b} {a, c} {b, c}
p {a, b, c}
◮ Lattice-based access control (LBAC)
◮ 権限の強弱関係が束をなす
もっと複雑なアクセス制御
◮ 個別のブックマークを非公開にできる
◮ 閲覧許可ユーザにも見えない
もっと複雑なアクセス制御
◮ 個別のブックマークを非公開にできる
◮ 閲覧許可ユーザにも見えない
愚直なコード
if (bookmark.owner == visitor ||
(bookmark.owner.allowedUsers.contains(visitor) &&
bookmark.isPublic))
Some(bookmark)
else None
もっと複雑なアクセス制御
◮ 個別のブックマークを非公開にできる
◮ 閲覧許可ユーザにも見えない
愚直なコード
if (bookmark.owner == visitor ||
(bookmark.owner.allowedUsers.contains(visitor) &&
bookmark.isPublic))
Some(bookmark)
else None
◮ LBAC では表現不能
もっと複雑なアクセス制御
◮ 個別のブックマークを非公開にできる
◮ 閲覧許可ユーザにも見えない
愚直なコード
if (bookmark.owner == visitor ||
(bookmark.owner.allowedUsers.contains(visitor) &&
bookmark.isPublic))
Some(bookmark)
else None
◮ LBAC では表現不能
(※実際はあと 5 段階くらい複雑)
もっと複雑なアクセス制御
◮ 個別のブックマークを非公開にできる
◮ 閲覧許可ユーザにも見えない
愚直なコード
if (bookmark.owner == visitor ||
(bookmark.owner.allowedUsers.contains(visitor) &&
bookmark.isPublic))
Some(bookmark)
else None
◮ LBAC では表現不能
(※実際はあと 5 段階くらい複雑)
もっとよいモデル化が必要
アクセス制御のよいモデル
属性 A の半環で許可を表現
要求 r ∈ P(A) = requestOf(viewer)
許可 p ∈ P(P(A)) = permissionOf(target)
確認 p allows r ⇔ ∃q ∈ p. q ⊆ r
半環 P(P(A)), ⊕, ⊗, ∅, {∅}
◮ p1 ⊕ p2 = p1 ∪ p2
◮ p1 ⊗ p2 = p1 ⋒ p2 = {q1 ∪ q2 | q1 ∈ p1 ∧ q2 ∈ p2}
アクセス制御のよいモデル
属性 A の半環で許可を表現
要求 r ∈ P(A) = requestOf(viewer)
許可 p ∈ P(P(A)) = permissionOf(target)
確認 p allows r ⇔ ∃q ∈ p. q ⊆ r
半環 P(P(A)), ⊕, ⊗, ∅, {∅}
◮ p1 ⊕ p2 = p1 ∪ p2
◮ p1 ⊗ p2 = p1 ⋒ p2 = {q1 ∪ q2 | q1 ∈ p1 ∧ q2 ∈ p2}
直感
◮ p = {{a1, a2}, {a3}, {a4, a5}}
◮ (a1 かつ a2) または a3 または (a4 かつ a5) の属性
アクセス制御のよいモデル
属性 A の半環で許可を表現
要求 r ∈ P(A) = requestOf(viewer)
許可 p ∈ P(P(A)) = permissionOf(target)
確認 p allows r ⇔ ∃q ∈ p. q ⊆ r
半環 P(P(A)), ⊕, ⊗, ∅, {∅}
◮ p1 ⊕ p2 = p1 ∪ p2
◮ p1 ⊗ p2 = p1 ⋒ p2 = {q1 ∪ q2 | q1 ∈ p1 ∧ q2 ∈ p2}
コードによる表現
val r = requestOf(visitor)
val p1 = permissionOf(bookmark.owner)
val p2 = permissionOf(bookmark)
val p = p1 & p2 // p1 ⊗ p2
if (p allows r) Some(bookmark)
else None
半環構造の妥当性
もしこう書いてしまったら?
val r = requestOf(visitor)
val p1 = permissionOf(bookmark.owner)
val p2 = permissionOf(bookmark)
if (p1 allows r) {
if (p2 allows r) Some(bookmark)
else None
} else None
半環構造の妥当性
Theorem (ブール代数への準同型写像)
∀r. allows r : P(P(A)) → B は準同型写像
もしこう書いてしまったら? → OK!
val r = requestOf(visitor)
val p1 = permissionOf(bookmark.owner)
val p2 = permissionOf(bookmark)
if (p1 allows r) {
if (p2 allows r) Some(bookmark)
else None
} else None
半環構造の妥当性
Theorem (ブール代数への準同型写像)
∀r. allows r : P(P(A)) → B は準同型写像
注意
◮ B, ∨, ∧, ⊥, ⊤ : ブール代数
◮ p allows r : B
◮ allows : P(P(A)) → P(A) → B
◮ allows r : P(P(A)) → B (部分適用)
半環構造の妥当性
Theorem (ブール代数への準同型写像)
∀r. allows r : P(P(A)) → B は準同型写像
p1, p2 p1 ⊗ p2
p1 allows r,
p2 allows r
(p1 ⊗ p2) allows r
p1 allows r ∧ p2 allows r
⊗
allows r
allows r
∧
◮ 条件を分解してチェックしても OK
出典
G. Karvounarakis and T. J. Green.
Semiring-annotated data: Queries and
provenance?
SIGMOD Record, 41(3):5–14, 2012.
R. Thion, F. Lesueur, and M. Talbi.
Tuple-based access control: a provenance-based
information flow control for relational data.
In 30th ACM/SIGAPP SAC, 2015.
実装戦略
基本戦略
Controller Business Logic
Domain Logic
Infrastructure
HTTP
(Adapter)
Application
Service
CLI
(Adapter)
Domain
Model
Repository
Interface
Domain
Service
Database
External
Service
複数層に権限チェックを分離可能 (∵ 準同型定理)
◮ アプリ層 : 前提条件でフィルタ
◮ ドメイン層 : 完全な権限チェック
◮ インフラ層 : 効率化のためのフィルタ
各層でのチェック
アプリ層 : 前提条件でフィルタ
◮ (例) 非公開ユーザのページは他人に見せない
ドメイン層 : 完全な権限チェック
◮ ⊗ された完全な権限をチェック
◮ アクセス制御の完全性はこの層に集中させる
インフラ層 : 効率化のためのフィルタ
◮ 権限の要求を検索クエリに対応させる
◮ 各テーブルごとでよい
◮ 完全でなくてよい
整合性のための工夫
一貫性
◮ 属性へのマッピングは一箇所で定義
◮ 同じ型には同じ方法で要求/許可が決まる
def requestOf(user: User): Request = user.accountId match {
case AccountId.Guest => Request(Attribute.Public)
case _ => Request(
Attribute.Public,
Attribute.User(user.id)) }
def permissionOf(user: User): Permission = user.status match {
case User.Status.Private => Permission(
Attribute.User(user.id) +:
user.allowedUsers.map(u => Attribute.User(u.id)): _*)
case User.Status.Public => Permission(
Attribute.Public,
Attribute.User(user.id)) }
整合性のための工夫
完全性
◮ 許可の可否のための完全な情報を使用
◮ (例) ブックマークの閲覧にはユーザの閲覧許可も必要
// ユーザ閲覧可否なしにブックマーク閲覧可否だけ調べるのは禁止
private def permissionOf(bookmark: Bookmark): Permission = ...
// ブックマーク閲覧可否は以下の 2 つの合成
// - 持ち主のユーザ閲覧可否
// - ブックマークアイテムそのものの閲覧可否
def permissionOf(pair: (User, Bookmark)): Permission =
permissionOf(user = pair._1) & // ユーザ
permissionOf(bookmark = pair._2) // ブックマークそのもの
検索クエリとの対応
クエリとの対応
◮ インフラ層での MySQLや Elasticsearch のクエリ
◮ 許可されないレコードは除いて効率化
◮ 要求 → クエリ断片への変換を用意すればよい
val r = requestOf(visitor)
// => Request(Attribute.User(u))
val user: Option[User] = db.run { sql"""
SELECT * FROM user
LEFT JOIN allowing
ON user.id = allowing.user_id
WHERE user.status = 'public'
OR user.id = $u
OR allowing.allowed_user_id = $u
""".as[User] }.headOption
完全 vs. テーブルごと
permissionOf(user)& permissionOf(bookmark)
◮ JOIN が必要
◮ user テーブルと bookmarkテーブル
◮ 条件が複雑
◮ AND 条件と OR 条件
テーブルごとにチェック
◮ bookmarkテーブルの検索時は
permissionOf(bookmark)だけチェック
◮ permissionOf(user)は別の層でチェック
◮ 準同型定理が活かされる
その他の効率化
和積形
許可は和積形 p′
でも表せる
◮ user : 本人 ⊕ 閲覧許可ユーザ
◮ bookmark : 本人 (非公開の場合)
◮ 全体: (本人 ⊕ 閲覧許可ユーザ) ⊗ (本人)
和積形のままチェック
◮ p′
allows r ⇔ ∀q ∈ p′
. q ∩ r = ∅
◮ 積和形のチェックと同値
p′
allows r ⇔ p allows r
和積形
許可は和積形 p′
でも表せる
◮ user : 本人 ⊕ 閲覧許可ユーザ
◮ bookmark : 本人 (非公開の場合)
◮ 全体: (本人 ⊕ 閲覧許可ユーザ) ⊗ (本人)
和積形のままチェック
◮ p′
allows r ⇔ ∀q ∈ p′
. q ∩ r = ∅
◮ 積和形のチェックと同値
p′
allows r ⇔ p allows r
⊗時に⋒を計算する必要はない
まとめ
モデル化
◮ AND/OR 条件を属性の半環で表現
◮ チェック関数はブール代数への準同型写像
実装戦略
◮ 準同型定理を利用してチェック処理を分離
◮ 要求/許可は一元管理
◮ 完全性の担保はドメインロジックに集中
効率化
◮ 要求をテーブルへのクエリ条件にしてフィルタ
◮ 和積形の利用で無駄な計算をしないように
1 of 42

Recommended

ゲームエンジニアのためのデータベース設計 by
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計sairoutine
33.9K views32 slides
例外設計における大罪 by
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
68.6K views37 slides
Redisの特徴と活用方法について by
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
101.5K views65 slides
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
148.7K views45 slides
オブジェクト指向できていますか? by
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
237.5K views129 slides
テスト文字列に「うんこ」と入れるな by
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
178K views16 slides

More Related Content

What's hot

DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話 by
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
88.2K views89 slides
それはYAGNIか? それとも思考停止か? by
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
29.3K views41 slides
Pythonによる黒魔術入門 by
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
44.4K views35 slides
グラフデータベース入門 by
グラフデータベース入門グラフデータベース入門
グラフデータベース入門Masaya Dake
20.8K views49 slides
MySQL 5.7にやられないためにおぼえておいてほしいこと by
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことyoku0825
175.1K views173 slides
PlaySQLAlchemy: SQLAlchemy入門 by
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
21.4K views91 slides

What's hot(20)

DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話 by Koichiro Matsuoka
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka88.2K views
それはYAGNIか? それとも思考停止か? by Yoshitaka Kawashima
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima29.3K views
Pythonによる黒魔術入門 by 大樹 小倉
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉44.4K views
グラフデータベース入門 by Masaya Dake
グラフデータベース入門グラフデータベース入門
グラフデータベース入門
Masaya Dake20.8K views
MySQL 5.7にやられないためにおぼえておいてほしいこと by yoku0825
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825175.1K views
PlaySQLAlchemy: SQLAlchemy入門 by 泰 増田
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田21.4K views
やはりお前らのMVCは間違っている by Koichi Tanaka
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka145.7K views
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話) by Tokoroten Nakayama
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
Tokoroten Nakayama9.4K views
異次元のグラフデータベースNeo4j by 昌桓 李
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
昌桓 李13.1K views
オブジェクト指向エクササイズのススメ by Yoji Kanno
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno57.2K views
MongoDBが遅いときの切り分け方法 by Tetsutaro Watanabe
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe34.8K views
マルチテナント化で知っておきたいデータベースのこと by Amazon Web Services Japan
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Unified JVM Logging by Yuji Kubota
Unified JVM LoggingUnified JVM Logging
Unified JVM Logging
Yuji Kubota12.9K views
(2017.6.9) Neo4jの可視化ライブラリまとめ by Mitsutoshi Kiuchi
(2017.6.9) Neo4jの可視化ライブラリまとめ(2017.6.9) Neo4jの可視化ライブラリまとめ
(2017.6.9) Neo4jの可視化ライブラリまとめ
Mitsutoshi Kiuchi9.5K views
NuxtでAPIサーバー立ててみた by ssuserbf0fbd
NuxtでAPIサーバー立ててみたNuxtでAPIサーバー立ててみた
NuxtでAPIサーバー立ててみた
ssuserbf0fbd588 views
フロー効率性とリソース効率性について #xpjug by Itsuki Kuroda
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda106.2K views
雑なMySQLパフォーマンスチューニング by yoku0825
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
yoku082555K views
40歳過ぎてもエンジニアでいるためにやっていること by onozaty
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
onozaty32.3K views

Similar to はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化

RESTful APIとしてのRailsとクライアントとしてのJavaScript by
RESTful APIとしてのRailsとクライアントとしてのJavaScriptRESTful APIとしてのRailsとクライアントとしてのJavaScript
RESTful APIとしてのRailsとクライアントとしてのJavaScriptNaoto Koshikawa
2.3K views27 slides
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法 by
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法decode2016
510 views77 slides
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計 by
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計y_taka_23
4.6K views28 slides
PHP 2大 web フレームワークの徹底比較! by
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
13.4K views82 slides
20101018 JJUG CCC10 WindowsAzure by
20101018 JJUG CCC10 WindowsAzure20101018 JJUG CCC10 WindowsAzure
20101018 JJUG CCC10 WindowsAzureShinichiro Isago
620 views38 slides
Okinawa.rb 第2回勉強会 by
Okinawa.rb 第2回勉強会Okinawa.rb 第2回勉強会
Okinawa.rb 第2回勉強会Naoki Takaesu
1.8K views33 slides

Similar to はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化(20)

RESTful APIとしてのRailsとクライアントとしてのJavaScript by Naoto Koshikawa
RESTful APIとしてのRailsとクライアントとしてのJavaScriptRESTful APIとしてのRailsとクライアントとしてのJavaScript
RESTful APIとしてのRailsとクライアントとしてのJavaScript
Naoto Koshikawa2.3K views
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法 by decode2016
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
decode2016510 views
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計 by y_taka_23
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
y_taka_234.6K views
PHP 2大 web フレームワークの徹底比較! by Shohei Okada
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada13.4K views
Okinawa.rb 第2回勉強会 by Naoki Takaesu
Okinawa.rb 第2回勉強会Okinawa.rb 第2回勉強会
Okinawa.rb 第2回勉強会
Naoki Takaesu1.8K views
Ruby で扱う LDAP のススメ by Kazuaki Takase
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
Kazuaki Takase13.3K views
JavaScript Tips 2015(PDF 版) by taskie
JavaScript Tips 2015(PDF 版)JavaScript Tips 2015(PDF 版)
JavaScript Tips 2015(PDF 版)
taskie2.9K views
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall by 博文 斉藤
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
博文 斉藤702 views
Rails初心者レッスン lesson1 3rd edition by Goh Matsumoto
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
Goh Matsumoto1.3K views
DTraceによるMySQL解析ことはじめ by Mikiya Okuno
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
Mikiya Okuno3.9K views
GNU awk (gawk) を用いた Apache ログ解析方法 by 博文 斉藤
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤6.6K views
Haikara by jewel12
HaikaraHaikara
Haikara
jewel12694 views
RedmineとGitとスクラム by Takashi Okamoto
RedmineとGitとスクラムRedmineとGitとスクラム
RedmineとGitとスクラム
Takashi Okamoto15.7K views
エコなWebサーバー by emasaka
エコなWebサーバーエコなWebサーバー
エコなWebサーバー
emasaka691 views
第8回KPF発表資料 by cryks
第8回KPF発表資料第8回KPF発表資料
第8回KPF発表資料
cryks4.3K views
Chefを利用した運用省力化とDevOpsの取り組みについて by Yuuki Namikawa
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについて
Yuuki Namikawa7.3K views

More from Lintaro Ina

Gradual Typing for Generics by
Gradual Typing for GenericsGradual Typing for Generics
Gradual Typing for GenericsLintaro Ina
3.4K views47 slides
Emacs上のターミナルを最強に by
Emacs上のターミナルを最強にEmacs上のターミナルを最強に
Emacs上のターミナルを最強にLintaro Ina
13.1K views37 slides
論理と計算のしくみ 5.3 型付きλ計算 (前半) by
論理と計算のしくみ 5.3 型付きλ計算 (前半)論理と計算のしくみ 5.3 型付きλ計算 (前半)
論理と計算のしくみ 5.3 型付きλ計算 (前半)Lintaro Ina
19.4K views60 slides
HTMLからの本文抽出 by
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出Lintaro Ina
9.6K views27 slides
はてなブックマーク in Scala by
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
68.8K views40 slides
『BrandSafe はてな』のアドベリフィケーションのしくみ by
『BrandSafe はてな』のアドベリフィケーションのしくみ 『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ Lintaro Ina
8.9K views38 slides

More from Lintaro Ina(7)

Gradual Typing for Generics by Lintaro Ina
Gradual Typing for GenericsGradual Typing for Generics
Gradual Typing for Generics
Lintaro Ina3.4K views
Emacs上のターミナルを最強に by Lintaro Ina
Emacs上のターミナルを最強にEmacs上のターミナルを最強に
Emacs上のターミナルを最強に
Lintaro Ina13.1K views
論理と計算のしくみ 5.3 型付きλ計算 (前半) by Lintaro Ina
論理と計算のしくみ 5.3 型付きλ計算 (前半)論理と計算のしくみ 5.3 型付きλ計算 (前半)
論理と計算のしくみ 5.3 型付きλ計算 (前半)
Lintaro Ina19.4K views
HTMLからの本文抽出 by Lintaro Ina
HTMLからの本文抽出HTMLからの本文抽出
HTMLからの本文抽出
Lintaro Ina9.6K views
はてなブックマーク in Scala by Lintaro Ina
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
Lintaro Ina68.8K views
『BrandSafe はてな』のアドベリフィケーションのしくみ by Lintaro Ina
『BrandSafe はてな』のアドベリフィケーションのしくみ 『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ
Lintaro Ina8.9K views
『BrandSafe はてな』のアドベリフィケーションのしくみ by Lintaro Ina
『BrandSafe はてな』のアドベリフィケーションのしくみ『BrandSafe はてな』のアドベリフィケーションのしくみ
『BrandSafe はてな』のアドベリフィケーションのしくみ
Lintaro Ina21K views

Recently uploaded

JJUG CCC.pptx by
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptxKanta Sasaki
6 views14 slides
Windows 11 information that can be used at the development site by
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development siteAtomu Hidaka
88 views41 slides
定例会スライド_キャチs 公開用.pdf by
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
121 views64 slides
SSH応用編_20231129.pdf by
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdficebreaker4
353 views13 slides
光コラボは契約してはいけない by
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
18 views17 slides

Recently uploaded(11)

Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka88 views
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4353 views
光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga18 views
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda376 views
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.71 views

はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化