YAPC::Japan::Online 2022 での発表資料です。 recheck: https://makenowjust-labs.github.io/recheck
![ReDoS 検出の最先端 recheck の紹介 / State of the Art of ReDoS Detection](https://cdn-ak-scissors.b.st-hatena.com/image/square/bb24e2b0fdf9c8099c17412d7a781f5ed1e27174/height=288;version=1;width=512/https%3A%2F%2Ffiles.speakerdeck.com%2Fpresentations%2F7e913e6530e3464686edc3f62668926a%2Fslide_0.jpg%3F20678895)
Python で正規表現を書いて分析や機械学習のモデル構築、予測に活用する際には、正規表現実行時のパフォーマンスが足かせとなる場合があります。 正規表現の処理に用いられる実行時間がどのくらいになるかはテキストデータの分量や機械学習モデルの精度検証の実行回数に応じて変わってきます。 一つのテキストデータに対する正規表現の実行時間を少なくすることで、タスクによっては全体として大幅な処理時間の短縮が見込まれます。そのことによって精度検証を素早く回したり、テキスト処理実行時の前処理の実行時間を削減する等の効果が得られます。精度検証の間の実行待ち時間やバッチ・キューによる予測時の時間が減り、最終的には精度向上の機会の向上やサービスのユーザ体験の向上に繋がるというわけです。 本記事では Python を用いた場合の正規表現のパフォーマンス改善候補についてリストアップし、具体的な対応方法について見ていき
お久しぶりです&あけましておめでとうございます。昨年はブログを書く時間をうまく作ることができず、あまり記事を書けませんでした。今年はできるだけ月に1回程度何か書いていきたいと思っています。今年もよろしくお願いします! さて、ブログを書かなかった間にXSSからSQLインジェクションへ興味が移った、なんてことはありませんでしたので、今日もいつも通り大好きなXSSの話をしたいと思います! 最近、正規表現にユーザ入力を使っていることに起因するDOM based XSSに連続して遭遇しました。あまり見慣れていない注意が必要な問題だと思うので、この記事では、見つけたもの2つがどのように生じたか、また、問題を起こさないためにどうすればよいかを紹介します。 そのうちの1つはLINEのBug Bounty Programを通じて報告した問題です。 賞金と、"LINE SECURITY BUG BOUNTY"
タイトル通りによく使う正規表現を毎回ググるのが効率悪いのでまとめてみました。各言語で正規表現のサンプルを書いてみました。 正規表現式 Emailアドレス ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ ドメイン名 ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$ インタネットURL ^(http|https)://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ユーザー名 (Twitter username) ^[a-zA-Z0-9_\-.]{3,15}$ 固定電話 ^0\d-\d{4}-\d{4}$ 携帯電話 ^(070|080|090)-\d{4}-\d{4}$ IP電話 ^050-\d{4}-\d{4}$ フリーダイヤル ^0120-\d{3}-\d{3}
Julia Advent Calendar 2017の5日目の記事です。今日は,去年の今頃開発を開始したAutoma.jlというパッケージを紹介しようと思います。ここでは,最新リリース版のAutoma.jl 0.4.0を元に記述しています。 Automa.jlとは Automa.jlは正規表現(regular expression)のドメイン特化言語(DSL: Domain Specific Language)からJuliaのコードを生成するパッケージです。正規表現はJuliaの標準ライブラリにもありますが,Automa.jlの最大の特徴は,正規表現を合成したりマッチングの途中でJuliaのコードを実行したりできる点にあります。これを使えば,正規言語であるファイルフォーマットのパースや,文脈自由文法などで書かれた言語のトークン化などができます。 実際のコードは以下のようになります。このコー
はじめに 実際の開発や作業で正規表現を使っていくのが覚えるにも学ぶにも一番とは思いますが、 面白そうなゲームやツールで電車の中でも正規表現が学べそうなものをいくつか見つけましたので メモ程度に紹介します。 手軽でシンプルながら奥深い正規表現のツールで ちょっと燃えるクイズゲームを楽しんでみませんか。 RegEx Generator:ツール スマホアプリです。 条件を選択・入力すると正規表現を作ってくれます。 チートシートもあります。 (画像はGooglePlayより) 正規表現勉強中の方にオススメ、こんなのもあるんだなーとなりますよ。 RegExp playground :ツール ブラウザのツールです。 作ってみた正規表現を試したい時に。 上に正規表現を入力すると、 下に入力された文字列で何がマッチするか可視化してくれる、 テストとしてもゲームとしても楽しいブラウザツールです。 何もマッチ
サイボウズ・ラボの光成です。3月30日に第6期サイボウズ・ラボユース成果発表会を開催したのでその報告をします。 サイボウズ・ラボユース サイボウズ・ラボユースとは日本の若手エンジニアを発掘し、育成する場として2011年に設立されました。 ラボユース生が作りたいものをサイボウズ・ラボの社員がメンターとしてサポートします。 開発物の著作権は開発者本人に帰属します。基本的にオープンソースとして公開するのが条件です。 去年からは最大1年の通年募集となっています。 今年は3月で修了される3人の方と、現在開発継続中の4人、ラボユースOBから一人の発表がありました。 修了生の発表 緑川志穂さん 緑川さんは楕円曲線計算ライブラリecpyのC++による高速化というテーマで発表しました。 メンターは私です。 去年の中間発表ではペアリング暗号ライブラリのPython実装を紹介しましたが、今年はC++で開発したラ
パート1:小さな部分文字列はでき”ない” 数週間前、Dart SDKに関して、 String.substring のパフォーマンスが非常に悪い というバグが報告されました。以下は、その問題と一緒に提出されたマイクロベンチマークの中心部分です。 // JavaScript version function test(s){ console.time("substring(js)"); while (s.length > 1) { s = s.substring(1); } console.timeEnd("substring(js)"); } // Dart version test(s) { final stopwatch = new Stopwatch()..start(); while (s.length > 1) { s = s.substring(1); } print("subs
Eureka EngineeringLearn about Eureka’s engineering efforts, product developments and more.
筆者がPHPをさわり始めたころ、「PerlのコレはPHPではどうやるんだろう?」と思うことが頻繁にありました。一部の疑問については解説を見つけたり自分でソースコードを読んだりして解決したものの、考えるのをやめてしまったものもあります。その一つが正規表現コンパイル結果の保存に関するもので、最近まで完全に忘れていました。 正規表現のコンパイルというのは与えられた正規表現を解釈して実行しやすいデータ構造に変換する作業のことを指します。具体的にはDFA(決定性有限オートマトン)を構成するか、正規表現エンジン内部で用いられるVM命令列に変換するかといった処理になります。これらは複雑な処理ですので、性能の観点で言えば同じ正規表現に対するコンパイル処理はできるだけ繰り返したくありません。 Perlの場合、/foobar/ のようなスタティックな正規表現のコンパイルは1回しか行われません。一方で、正規表現
ある正規表現に対して特定の文字列がマッチングしているのを確認してくれるサイトは山のようにあるんだけど、正規表現そのものがどんな文字列を期待しているのか分析・解読してくれるツールってあまりないのよね...(´・ω・`) 例えば ^(a-z|A-Z|0-9){4}$ こんな簡単なものだったらすぐに分かるけど これが複雑になってくると自分でも頭が???状態になってしまいます>< そこでこんなものを見つけました。 Regexper www.regexper.com 正規表現を入力してDisplayボタンを押すとその正規表現が示す内容を図で表示してくれます。 例えば誰かが書いたこんな正規表現で???になるときもあると思いますが メールアドレスをマッチングさせる正規表現ってのは分かるんだけど、この表記でどんな文字列を 期待しているのか分からない場合でもこのツールを通してみると 図の見方は左から線を辿っ
Ruby の正規表現だけで Brainfuck インタプリタを作ることができました。正規表現の実行は =~ だけなので、ループなども正規表現の内部で実行してます。 https://github.com/shinh/hack/blob/master/bf_rb_reg/bf.rb つまりどういうことができるかというと、 BF_REG という Regexp と BF_SUFFIX という文字列定数があって、 bf という文字列に格納された Brainfuck のコードを BF_REG =~ bf + BF_SUFFIX で実行することができます。出力は $~['o0'], $~['o1'], ... に入っているので、 output = '' 256.times do |i| o = $~["o#{i}"] break if !o output += o end 的なコードで取り出すことができ
Eureka EngineeringLearn about Eureka’s engineering efforts, product developments and more.
正規表現を書く際、どのようなパターンにマッチさせるか、どこをキャプチャするかという視点で記述することはあっても、パフォーマンスを考えて記述するというのはある程度知っている人でなければ忘れがちな視点です。 このエントリでは、バックトラックをメインに正規表現がパフォーマンスに及ぼす挙動について見ていきます。 対象の正規表現エンジン ここでは、従来型 NFA を対象としています。具体的には、PHP の preg_ 関数で利用している PCRE や mb_ereg 関数が利用している鬼車です。Perl や Ruby、Python、Java、.NET でも従来型 NFA を採用しているので、似た挙動となるでしょう。 「従来型 NFA」や「バックトラック」などの用語については、「詳説 正規表現 第3版」のものを用いています。 バックトラックによるマッチ探査 正規表現エンジンでは、指定された文字列が、パ
findと正規表現の問題点 -regexオプションが「パスを含むファイル名全体が正規表現にマッチするものを検索する。」とあるが、grepで使うような正規表現を書いても検索できない。 これは正規表現の種類がデフォルトでemacsになっているのが原因。 たとえばYYYY-MM-DDが含まれるファイル名を探したい。また反対にYYYY-MM-DDが含まれないファイル名を探したい。 解決方法その1 regextypeを設定する。 findのregextypeに指定できるのはemacs以外にposix-awk, posix-basic, posix-egrep, posix-extended。 grepと同じにするにはregextypeをposix-basicにすればよい。 ※解決方法その1の注意点としては、grepと同じ種類の正規表現を使うといっても、部分一致で検索してくれるgrepとは異なり、fi
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く