SlideShare a Scribd company logo
1 of 22
Download to read offline
UrlRewriteFilterに
手を入れてみた
福原和朗
2013-11-16

1
自己紹介
• 福原和朗
– @kazurof

• 客先常駐で開発やってます
• Webサービス
• Android, iPhone アプリ (Titanium Alloy)

• アクシオヘリックス(株)
– http://www.axiohelix.com/
• 開発案件あれば、ご連絡ください。
• エンジニア募集しています。
2
UrlRewriteFilter
• リクエストのURLを書き換えるライブラリ
– 外向きには綺麗なURLを提示し、内部ではフレー
ムワーク標準に合うURLが使えるようにする。
– http://tuckey.org/urlrewrite/
http://example.org/repo/data/123/なんとかかんとか

http://example.org/repo/data/get.do&id=123
3
事の発端
• 利用者から障害報告が来ました。
– バージョン3系から4系に上げた後。
利用者からのメール引用

以下をダウンロードしようとしたところ
ページにアクセスできません
とエラーとなりました。ご確認いただけますと幸いです。
http://example.org/download/data1234/link/datafile.xls

4
3系と4系の違い
• URL変換の指定と実際の動作を調べてみた。
実際に変換の指定をしているところ

<to>/file/download.action?workId=$1&amp;fileTyp
e=${escape:$2}&amp;fileName=${escape:$3}&amp
;originalUrl=%{request-url}</to>

• ${...} の部分の括弧対応がおかしい。
– それぞれ処理されるべきだが全体で一括で処理
されている。
5
${...} とは何か
• 関数
– ${<関数名>:<引数>:...} というような形
– escape , replaceなど色々
${upper:hello}

HELLO

${trim:

nantoka

nantoka }

http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#functions
6
関数が複数あるとき
• 関数の連続はNG
"a${upper:hoge} ${lower:fOObAR} b "
"aHOGER} ${LOWER:FOOBAR b"
この部分が無視される

• 関数の入れ子はOK
"a${trim:AbCd ${lower:fOObAR} 1234 } b "
"aAbCd foobar 1234 b“

7
既にissue listに上がってました
https://code.google.com/p/urlrewritefilter/issues/detail?id=120

関数が連続してるとNGだよ、と。
3.2.0では問題なかったと。

8
上がってはいますけど
• いつ解決されるかはわからない。
– なるべくなら最新版のものを早く使いたい。

• 必要な物は自分でつくるべき

直してみることにしました。
9
修正してみよう
• 現在の挙動を調べてみた
関数の開始と終了を正規表現で識別
"a${trim:AbCd ${lower:fOObAR} 1234 } b "
引数の部分を再帰的に処理
関数がないか識別
AbCd ${lower:fOObAR} 1234
10
やりたいこと
• 関数が続いていても入れ子でも動作すること
"a${upper:hoge} ${lower:fOObAR} b "
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

• 設定を木構造として解釈できればよい。
11
木構造として解釈
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

‘b ’

関数

‘a’

関数パラメータ

関数名 ‘trim’

‘AbCd ’

関数名 ‘lower’

関数

‘ 1234 ’

関数パラメータ
‘fOObAR’

12
Interpreterパターン
http://www.hyuki.com/dp/cat_Interpreter.html

13
新しいやり方の概略
• 変換先パターンをツリー構造へ解析
– 関数とか文字列そのものがノード
"a${trim:AbCd ${lower:fOObAR} 1234 } b "

• それぞれのノードから処理結果を取得する。

14
必要なもの
• 文法規則
– 拡張BNFの形式
– 解釈の仕様

• 入力を切り分けるクラス
– トークン化する

• それぞれのノードを表す
クラス。
– 処理結果取得メソッド付き
15
拡張BNF
<tovalue> :== <element> *
<element> :== <value> | <function>
<value> :== any string
<function> :== ${ <functionContent> }
<functionContent> :== <functionName> : <param>
<param> :== <element> * | <element> * : <param>
<functionName> :== replace | replaceAll | replaceFirst | escape | escapePath | lower |
upper | toLower | toUpper | trim | length

${ , } , : が、文法上意味を持つ。これ重要!!
16
トークン化クラス
• ${ } : を基準に文字列を切り分ける。
a${trim:AbCd ${lower:fOObAR} 1234 } b

a

${

trim

:

AbCd

${

lower

:

fOObAR

}

1234

}

b

17
ノードを表すクラス
例:関数の中身を表現するBNFとそれを表すクラス
<functionContent> :== <functionName> : <param>

public class FunctionContentNode implements Node {
private FunctionNameNode funcNameNode;
private ParamNode paramNode;
public void parse(Context context) throws ParseException {
funcNameNode = new FunctionNameNode();
funcNameNode.parse(context);
context.skipToken(“:”);
paramNode = new ParamNode();
paramNode.parse(context);
}

18
Interpreterをやってみた印象
• それぞれの役割がはっきりしている
– トークナイザはただ区切って出すだけ。
– 各々のノードが各々の構文チェックのみを行う。
• 別の構文については何もしない。

19
(とりあえず)完成!
• 実サービスで現在稼働しています。
• パッチを本家に送ってみました。
– マージされれば御の字
https://code.google.com/p/urlrewritefilter/issues/detail?id=120#c4

• ビルド済みjarファイル公開しています。
http://www7b.biglobe.ne.jp/~archer/urlrewritefilter/issue120.html

20
まとめ
• 同じ問題に遭遇された方はどうぞ使ってみて
下さい。
– OSSのおかげで自己解決&他者へ貢献出来ました。

• Interpreterの練習が出来ました。
– 実業務ではやったことは無かった。
– プログラミングは実際に書いて動かすのが重要。

21
ご清聴ありがとうございました。

22

More Related Content

More from Kazuro Fukuhara

トーナメントは運か実力か
トーナメントは運か実力かトーナメントは運か実力か
トーナメントは運か実力かKazuro Fukuhara
 
nextProbablePrime() について
nextProbablePrime() についてnextProbablePrime() について
nextProbablePrime() についてKazuro Fukuhara
 
素数のハニカム螺旋
素数のハニカム螺旋素数のハニカム螺旋
素数のハニカム螺旋Kazuro Fukuhara
 
日本語によるJUnitの拡張について
日本語によるJUnitの拡張について日本語によるJUnitの拡張について
日本語によるJUnitの拡張についてKazuro Fukuhara
 
初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案Kazuro Fukuhara
 
Titanium初心者によるAlloy地雷原始末記
Titanium初心者によるAlloy地雷原始末記Titanium初心者によるAlloy地雷原始末記
Titanium初心者によるAlloy地雷原始末記Kazuro Fukuhara
 
OWLで何が言えるか
OWLで何が言えるかOWLで何が言えるか
OWLで何が言えるかKazuro Fukuhara
 
記述論理の解釈を見て思ったこと
記述論理の解釈を見て思ったこと記述論理の解釈を見て思ったこと
記述論理の解釈を見て思ったことKazuro Fukuhara
 
OWLで何が書けるか
OWLで何が書けるかOWLで何が書けるか
OWLで何が書けるかKazuro Fukuhara
 

More from Kazuro Fukuhara (10)

トーナメントは運か実力か
トーナメントは運か実力かトーナメントは運か実力か
トーナメントは運か実力か
 
nextProbablePrime() について
nextProbablePrime() についてnextProbablePrime() について
nextProbablePrime() について
 
素数のハニカム螺旋
素数のハニカム螺旋素数のハニカム螺旋
素数のハニカム螺旋
 
日本語によるJUnitの拡張について
日本語によるJUnitの拡張について日本語によるJUnitの拡張について
日本語によるJUnitの拡張について
 
初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案初心者でも楽しめる格闘ゲームへの提案
初心者でも楽しめる格闘ゲームへの提案
 
Titanium初心者によるAlloy地雷原始末記
Titanium初心者によるAlloy地雷原始末記Titanium初心者によるAlloy地雷原始末記
Titanium初心者によるAlloy地雷原始末記
 
OWLで何が言えるか
OWLで何が言えるかOWLで何が言えるか
OWLで何が言えるか
 
資格四方山話
資格四方山話資格四方山話
資格四方山話
 
記述論理の解釈を見て思ったこと
記述論理の解釈を見て思ったこと記述論理の解釈を見て思ったこと
記述論理の解釈を見て思ったこと
 
OWLで何が書けるか
OWLで何が書けるかOWLで何が書けるか
OWLで何が書けるか
 

Recently uploaded

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (14)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

UrlRewriteFilterに手を入れてみた