はてなキーワード: expressionとは
へえ、「微妙な違い」という意味なんだとすっかり思い込んでた。
辞書にも「A subtle difference in or shade of meaning, expression, or sound」って載ってるし。
本当はどんな意味なの?
たぶん国内のまとめでは一番多く(また多機能)のソフトを紹介してるのでは?
Adobeの代替を探してる方や学生さんに参考にしていただければ幸いです。(あくまでも、趣味の範囲やお金のない学生向けです。可能ならAdobeでまとめたほうが情報も多いし、ソフト間の連携もシームレスになるのは言うまでもなく。)
有名だけどあまり優秀でないと思ったものは記載してないものがあります。(ex, Pixa、Sai、Paint.net、MMD等)
各カテゴリのとなりの()はAdobeではどのソフトかを表します。
Macを私は持ってますがあまり好きでないのと、ほかの方にあまりお勧めできない(主にスペック面で)ため載せてません。
今回はCADについてはまとめませんでした。
単純に私があまり知らないのと、様々な用途が多くて分類が面倒なので。
3DCGは絵を描けなくてもアニメーション動画を簡単に作れる点が嬉しいですよね。
有償であればいろいろなメーカーから良いもがたくさん出てます。(Light Works、Cinema 4d等)
あと学生であればAutodeskの高性能なものを無償で使えます。
以下その一覧
それぞれ梱包されてるのは違いますがAutoCAD、3ds Max、Maya、MotionBuilderなどプロ向けのが無償です。
マカーならKritaやAffinity PhotoやPixelmatorを組み合わせればアマチュアの方であればPSでなくてもいいのではと思えるほど。
CMYKでの編集可能なソフトはPhotoshopだけでないですよ。
KritaとCorelDraw、Affinity Photoは可能です。
Kritaは無料、Affinity Photoは安価ですし。
ただしAffinity Photoはペンタブの手ブレ補正はないです。(Kritaにはついてます。)
写真編集、特にRaw現像ならあまりPhotoshopに拘る必要は無いと思ってます。(富士フィルムのような特殊なメーカーを使用してない限り。)
レタッチは確かにPhotoshopは強力ですけど、Affinity Photoも十二分な機能はあります。
業務用でPhotoshopも使ってるという方以外は正直Affinityで問題ないと思います。(実際に私はそうです。)
有名であってもUIや使い勝手はAEに落ちるものがほとんどですし。
その点Blenderは多機能すぎますね。その分複雑だったりしますけど。
あとパワポやKeynoteを使えば安易なFXソフトになります。
意外なのはVFX(プロジェクションマッピング)ソフトでフリーのはほとんどないです。
Macの有料ソフトになりますがMadMapperとVDMX5の組み合わせは比較的分かりやすいです。
けどソフトが(内容を考えたら安いですが)この中では比較的高くなります。
あとかなりのマシンスペックが必要になるんでMacBookなら15インチモデルは欲しいですね。
DAWは比較的容易に開発できるせいかフリーのものや新規のものが多いです。
たくさんあるので紹介しきれないので、私が一番いいと思ってるFL Studioとかなり安価なReaperのみ紹介します。(←追記で他のも加えました)
FLはサポートを考えると非常に安いです。(最近、ちょっと雲行きが怪しいのでは?となってる状況です。Sonar見たくひどい状態ではないのですが、Golという中の人の移籍がどうとやら。)
ただEDMが得意で、生音源等は別途導入する必要がある場合があります。
他のDAWソフトはコスパだけなら中間グレードが一番コスパ良いと思います。(Cubase Artist、Studio One Artist等)
Mac向けのため上には記載してないですがLogicもかなり安いですよ。
ほかの用途ではお薦めはしてませんが、DAW用途でLogicの為だけにMacを購入するのはありだと思います。
Gravitは最近よくFireworksの代替えとしても挙げられてますね。
他にもいいのがあれば教えてください。
追記していきたいです。
以上参考になればうれしいです。
----------------------------------
http://b.hatena.ne.jp/entry/kenokabe-techwriting.blogspot.com/2015/04/blog-post_30.html
http://kenokabe-techwriting.blogspot.jp/2015/04/amazon102-93.html
この記事自体はどうでも良いのだけど、以前「クロージャ」という言葉の初期の使用例を探したことがあったのを思い出したので、参考までに。
Landin "A λ-Calculus Approach" (1966)
We represent the value of a λ-expression by a bundle of information called a "clusure", comprising the λ-expression and the environment relative towhich it was evaluated.
我々は、ラムダ式の値を「クロージャ」と呼ばれる情報の束で表す。「クロージャ」はラムダ式とそのラムダ式の評価に関する環境から成る。
Moses "The Function of FUNCTION in LISP,or Why the FUNARG Problem Should be Called the Environment Problem" (1970)
A useful metaphor for the difference between FUNCTION and QUOTE in LISP is to think of QUOTE as a porpous or an open covering of the function since free variables escape to the current environment. FUNCTION acts as a closed or nonporous covering(hence the term "closure" used by Landin).
LISPでのFUNCTIONとQUOTEの違いについては、次のように考えるのが有用な比喩になる。QUOTEは多孔的または開放的に関数をおおっていて、自由変数は現在の環境へと脱出できる。FUNCTIONは閉鎖的(closed)または非多孔的に関数をおおっている(このことからLandinはクロージャ(閉包)という用語を使っている)。
(訳はhttp://kreisel.fam.cx/webmaster/clog/img/www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/p/funarg/funarg.html から)
Sussman and Steele "SCHEME: An Interpreter for Extended Lambda Calculus" (1975)
In order to solve this problem we introduce the notion of a closure which is a data structure containing a lambda expression, and an environment to be used when that lambda expression is applied to arguments.
この問題を解決するためにクロージャという概念を導入する。クロージャはラムダ式とそのラムダ式が引数に適用されるときに使われる環境から成るデータ構造である。
Steele and Sussman "The Art of the Interpreter" (1978)
We say that the procedure is closed in the current environment, and the &PROCEDURE-object is therefore called a closure of the procedure, or a closed procedure.
この手続きは現在の環境に閉じられている(closed)と言い、それゆえ&PROCEDUREオブジェクトはその手続きの「クロージャ」あるいは「閉手続き」と呼ばれる。
IsNumeric Function (Visual Basic)
IsNumeric returns True if the data type of Expression is Boolean, Byte, Decimal, Double, Integer, Long, SByte, Short, Single, UInteger, ULong, or UShort, or an Object that contains one of those numeric types. It also returns True if Expression is a Char or String that can be successfully converted to a number.
ここは普通のことをいっている。 IsNumeric が True を返すのは以下のとき。
Indicates that no beginning value has been assigned to a Variant variable. An Empty variable is represented as 0 in a numeric context or a zero-length string ("") in a string context.
Empty は context にあわせて以下のように解釈される。
というわけで IsNumeric(Empty) は Empty が数値として解釈されて 0 になるので True を返す。
むかし社長が、小学生が習う筆算をドヤ顔で説明する、という馬鹿なことをやってたけど、
今日はてブで上がってきた記事。略称って色々あって知らないものまだあるかなーと思って覗いてみたら
http://wadap.hatenablog.com/entry/2014/01/13/133034
うん、今更ながらどこにでも見つかるような超初心者向け。今更まとめるにしては量が少なすぎ。
ま、それはいい。
だが、
Servces, Ownder, Eexpression, Intarfaceて。
前の三つはまあ、単なるタイポかもしれない。(Expressionは下に正しくあるし)
だけど、Intarfaceは恥ずかしい間違いかな。社員だったら見て見ぬふりしないといけないよね…
ちょっと気になってしまったのでいくつか「人気エントリー」を覗いてみたら香ばしい物しか無かった。
この人、「CTO」だよね?
自分の知ってる「CTO]って「最高技術責任者」なんだけど、違うものがあるのかな?
chief tera-warosu officerとかなんだろうか?
こんなブログ見たら社員のエンジニア、この人に着いていこう、なんて気直ぐに無くさないか?
おそらく社員は皆見てるんだろうけど、どういう気持なんだろう?
「Cならswitchテーブルを使った再帰関数で実現する必要がある」に対するレスなんだろうけど、飽くまでも「C以外の、継承とオーバーライドの機能がある言語では例題とほぼ同じ形で実装できるのに対してその機能がない言語では『関数内でswitchをして値ごとにdispatch、その後更に再帰』という原始的かつ全てのロジックを詰め込むせいでひとつの関数の行数が膨大になる問題を孕んでいる」という意味しか持たない。
確かにTopCoderで再帰を使ったら撃墜される可能性がある事には同意だけど、今回の例ではプロコンの外側での事であってスタックがオーバーフローしたなら例外をキャッチして後処理を行えば良い。
更に
バイナリツリーを自前で構築して式を表現する例題(expression tree)と、set and mapは用途が違う。
setとmapは本来、順序が定義できる要素をキーにしてそれそのものを保持するか、或いはそれに伴う値を結びつけて保持しておくもの。
例題のexpression treeの構造は「(必ずしもオペランドがふたつとは限らない)式の木を表現して、オーバーライドされたevalで式全体の評価を行う」もの。
は成り立たない主張であるし、
(C言語等のOOPが導入される前の言語で)綺麗に書く事ができないと問題を提供する側がそもそも「綺麗な解を前提とした問題」を出せない。
問題を他人に押し付けられる感じが嫌なんだよね。
まったりと、自分の好きな課題だけに取り組んでいきたい。そういう風にして生きている。
プログラミングも同じで、自分の作りたいものだけを作って生きている。
それともう一つ不満なのは(或いは『自分に合ってない』と表現した方が適切なのかも知れない)、洗練されたデータ構造や設計の必要性が問題中に殆ど出現しない所。
これは多くの言語に対して同じ問題を提供するには仕方のない事かも知れない。でも個人的にはそれが不自由で仕方がなかった。
例えばC++における純粋仮想関数(インターフェイス)と継承を使った下記の様な「木」を表現した構造、まず出てこないでしょ?C++ではなくCならswitchテーブルを使った再帰関数で実現する必要があるし、これが言語間で共通な問題を隔てる原因にもなっている。
struct interface_tree{ virtual double eval() const = 0; virtual std::size_t subtree_num() const = 0; virtual interface_tree *subtree(std::size_t) = 0; virtual ~interface_tree(){} }; // expression tree, add struct tree_add : public interface_tree{ tree_add(std::size_t n, interface_tree **t){ subtree_[0] = t[0], subtree[1] = t[1]; } virtual double eval(){ return subtree(0)->eval() + subtree(1)->eval(); } virtual std::size_t subtree_num() const{ return 2; } virtual interface_tree *subtree(std::size_t i){ return subtree_[i]; } virtual ~tree_add(){ delete subtree_[0]; delete subtree_[1]; } interface_tree *subtree_[2]; }; // expression tree, sub struct tree_sub : public interface_tree{ tree_add(std::size_t n, interface_tree **t){ subtree_[0] = t[0], subtree[1] = t[1]; } virtual double eval(){ return subtree(0)->eval() - subtree(1)->eval(); } virtual std::size_t subtree_num() const{ return 2; } virtual interface_tree *subtree(std::size_t i){ return subtree_[i]; } virtual ~tree_add(){ delete subtree_[0]; delete subtree_[1]; } interface_tree *subtree_[2]; }; // expression tree, value struct tree_val : public interface_tree{ tree_val(double n_) : n(n_){} virtual double eval(){ return n; } virtual std::size_t subtree_num() const{ return 0; } virtual interface_tree *subtree(std::size_t i){ assert(0); } virtual ~tree_add(){} double n; }; // ...
仕事切り上げて
How to Begin and End Email
Beginnings and endings are a challenge in most activities, but in email getting off to a good start and ending positively will strengthen the communication and increase understanding.
Start with a specific subject line.
Choose the better subject line in each pair below:
1. a. New Phones
b. New Phone Installation: Your Action Required
2. a. Update on Development of Sales Model
3. a. Summer newsletter
b. 10 Great Tips for Summer vacation
In number 1, the second choice conveys a sense of urgency and action, whereas the first choice falls flat. In 2, the longer title focuses the reader on which update the email is explaining. In 3, you don’t really have much choice. Who would take a?
Next comes the greeting.
Examples:
• Hi, Fred and Lauri.
• Hi, team.
• Greetings, everyone
• Good morning, Sayed. (If Sayed this message in the morning)
• Jian, we are looking forward to meeting you next week.
• To: Finance and Administration Team
• To all employees:
• David,
• Ruth, Mala and Felicia:
The last five examples must be on a separate line at the top of the message. All the others can be either a separate line or at the beginning of a paragraph.
Choose the greeting that matches your relationship with the reader(s) and the purpose of the message. “Hi” is friendly but too informal in certain situations—for example, in response to a request for a proposal. “Hello” is friendly and professional. “Hey”is too informal and slangy for most messages.
“To” followed by a pronoun like “all” or the name of a group sounds professional but does not convey warmth. Warmth is required in all messages, but please remember that you must always consider the position of the receiver.
Avoid gender-based greetings such as “Ladies.” Even if the group you are writing it is all women, some among them will object to this greeting.
Do not greet people whose name is included on the Cc line. Only greet people whose names are on the To line of the email.
The punctuation of greetings is a topic for discussion. All the punctuation used in the list above is correct. Some people use “Hi team” and “Hello Robin” without the comma, but traditional writers retain the comma. The reason is that these words are in “direct address.” When we directly address the reader, as in “Hi, team” (or in the example that begins with “Jian”) the name is separated from the other words by a comma.
“Dear Mr. Mathews” is followed by a colon in a business letter and in an email that replaces a business letter. However, it is also acceptable to use a comma after a
“Dear” greeting in a business email.
In a quick exchange of email with someone it is not necessary to continually greet your reader. Compare such an exchange with putting the person on hold on the telephone. When you return to the phone call, you say, “Thanks for holding. I have the information: rather than “Hi Laurie.”
The last sentence of an email is like the last words of a phone call. They may be a quick signoff or a courteous close, depending on the formality of the communication.
Examples:
• See you in Tokyo!
• Have a great trip!
• I will email you in August to schedule lunch.
• Please call me again with any questions
• Thanks again for all your help with the design.
• Thank you for your cooperation. We appreciate the opportunity to work with you.
Avoid continually using “Have a great day!” or similar expression as your closing sentence. It became meaningless with constant use and it is a bad fit with email that communicates a policy or serious announcement.
It is not wise to save a request for action or approval until the end of the message. Email readers do not read to the end of a message when they believe they have gotten the main point already.
A complimentary close—yes or no?
Business letters typicall end with phrases called “complimentary closes” such as “Sincerely yours,” “Best wishes,”and “Best regards.” A complimentary close is not required in email. However, business email often uses such a close to sound formal, look professional, or simply communicate courteously.
Examples:
• Sincerely,(the most formal of the list)
• Best regards, (professional)
• Warm regards, (professional and warm, as you would expect)
• Regards, (less friendly than the other 2 regards choices)
• With best wishes, (or) Best wishes, ( professional)
• With thanks, (professional and grateful)
• Ciao! (friendly and rather informal)
• Cheers, (friendly)
A word like “Greetings” does not belong in a close. It may be used in the last sentence, though, to greet others who might see the message:
• Please give our greetings to Dr. Carr
• Greetings to your colleagues in Systems Research
Although people frequently use “Thanks” as a close, it is not standard, and careful writers avoid it. Do not use “Thanks in advance” as a close, because many people find it presumptuous. Rather than “Thanks” or “Thanks in advance,” create a better sentence, such as “Thanks for considering my request.” Or use “With thanks” as a complimentary close followed by a comma.
Advice for those who receive less-than-perfect Email. You will sometimes receive email that is less than perfect, which means you might feel a bit offended by them. My advice to you on this is to get through them and leave them behind. Bring a bright smile to your face and a kind tone to your email reply. Forgive those whose writing was clumsy, abrupt, or annoying. They were merely experiencing moments of being human and imperfect.
http://anond.hatelabo.jp/20100620143255
主観的な意見だけど、TOEIC600-700位ってのは通じる英語の最低レベルだと思うのですよ。
意志決定レベルの人たちがそのレベルにすら到達していないという現状が存在していることを問題にすべきなんじゃないかなーと。
で、ここ数日来の、「日本人は英語ができるようにならんとグローバル化を生き残れない!」という論調はその当たりの事をついているんじゃないのかなー、と思うんです。
私の知人、とある国のプロジェクトに行っているんだけど、良く嘆いているのは、
「日本人の通訳がいないと何も出来ない奴らばっかり。それも所謂『偉い人』に。」
ということです。
何かをExpressionしたくても、
というプロセスを踏んでしまうので、
・人を余計に雇わなくちゃいけないので、全体的なコスト競争力の低下
に陥って、勝負にならない、とのこと。
本人→現地人通訳→相手
となって、随分スマートになるんだけど、こないだ日本に帰ってきたときも嘆いていました。
だから、元増田さんの、
しかし、英語の世界において、言葉を武器に戦うためには、「通じる英語」では全然足りないのである。その意味では、 TOEIC600と900の違いは誤差でしかない。結局勝負を分けるのは「どれだけ優秀なネイティブの参謀を捕まえられるか」なのだ。
というのは確かにそうだと思います。
でも、だからこそ、意志決定レベルの人には、最低限「通じる英語」ぐらいの能力は持っててもらわないと、なのだと思います。
「通じる英語」すら使えないのでは、優秀なネイティブの参謀を捕まえる事なんてとても出来ないのだと思うのですよ。
それが、楽天が「英語使えない役員は馘首する」という話につながっているんだと思うんです。
日本以外の外国って、何も英語がネイティブの所ばかりじゃないですよ?
これからのビジネスチャンスは、むしろ英語の国じゃないところにあるんじゃないでしょうか?
テレビやネットの情報を鵜呑みにして行っているだけで、本当の最前線を見ている訳じゃないですけど、楽天はインドネシアに行くようですし、ひととき前はアフリカの話が随分注目されていましたよね?
外国語をネイティブレベルに扱えるようになるのは、努力だけではない何かが必要なのはわかります。
それに、「通じる英語」レベルの日本人を参謀におくというのは、戦うのに無駄が多すぎます。
だからこそ、ネイティブの参謀が重要になってくるわけですよね?
その参謀を捕まえるにはどうしたらいいのでしょう?やっぱり「通じるレベルの英語」が必要なんじゃないでしょうか?
最も、アフリカなんかだと、現地人側にも「通じるレベルの英語」を出来る人が少なくて、違った苦労がおありだ、とも聞きました。
それにしたって、「通じるレベルの日本語」を話すネイティブよりも、「通じるレベルの英語」を話すネイティブを見つける方がよほど簡単です。
だから、グローバル化を生き残ろうとするのならば、どんな職域であれ、最低限「通じるレベルの英語」が必要なのではないのかな、と思うわけです。
学内Webメールシステムが、もろにCSRF&XSSのよわよわのシステムでした。NEC系のメーカーのASPだったようだけど。
WebメールにXSS&CSRFがあるというのは本当に最悪で、「開いただけでメールボックスやアドレス帳が全部どこかに送信されてしまう」ような攻撃メールが作れてしまうことを意味します。
で、担当部門がどこだかわからないのでメディアネットワークセンターというそれっぽい部署に教えてあげたんだけど、とにかく反応が遅い。対策の第一段階は即日システム停止することですよ、とまで書いてあげたのに。
2ヶ月たって何も修正がされないので、研究室内のゼミで発表してみました。情報系でも、知らない人はCSRFとか全然知らないからね、うちアルゴリズム系なのでみんな「Webってこんな攻撃ができるのか」って感心。教授はあわててどこかに電話。
そしたらすぐに、「どこがそんなにまずいのか」と相談の電話が折り返されてきて、(即時停止レベルだって教えたじゃん)と思いつつも、「このメールを開いた後、自分の送信箱を見てご覧なさい。見覚えのないメールが送信されていませんか?」と攻撃例を教えてあげました。寸止めかんちょー。
これで即時停止だろうと思ったら、結局それから4ヶ月間修正が入らないまま運営が継続、そして「これで直りましたよね」と連絡が来たのでテスト環境版を試してみると、この「修正版」は script タグを無効にするだけで onload とかまったく手を付けないザル修正でした。
それを指摘したらしぶしぶイベントトリガ系も消してくれたけど、CSSXSSとか不完全Shift-JIS文字とかexpressionとか知りもしないんだろうなー。セキュリティのこと知らないなら、HTMLメール扱う機能ごとばっさり削除が唯一の正解です。
本気でかんちょーしようと思えば簡単でした。自己増殖メールを誰かにぽんと送るだけでたぶん3日以内にメールシステムは麻痺して、実質停止に追い込めたはず。あ、それじゃかんちょーどころか直腸裂傷か。でも、それで全員のクオータがあふれてしまえば真に悪意のある攻撃メールを受信する余地なくなるし、セキュリティを保護できたことにならないかな。
で、本当にそれをしなかった理由はひとつだけ、攻撃テストメールを自分に送りまくっていたことがメールログに絶対残っているし、それで犯人とばれて退学とかいやだったから。うちの大学は中退じゃなきゃハクがつかないんです。
何いってるのやら
与えられた自由を探しもせず、頭の上から降ってくるもんだとおもってる奴は
結局何もできないって事さ
Visual Studio 2008
Visual Studio 2005
Windows Server 2008
SQL Server 2008 Developer Edition
Microsoft Robotics Developer Studio
http://www.microsoft.com/japan/academic/dreamspark/default.mspx
function returner() { return 100; } function profiler(aFunction) { var begin = new Date(); for (var i = 0; i < 500000; ++i) { aFunction(); } var end = new Date(); return end - begin; } function profileLambdaExpression() { // lamda expression print("lamda expression : " + profiler(function () returner()) ); // equal to above expression print("normal form : " + profiler(function () { return returner(); }) ); // not return the value print("return no value : " + profiler(function () { returner(); }) ); } profileLambdaExpression();
>> lamda expression : 1521
>> return no value : 1431
SpiderMonkey 1.8.0 pre
等位 Coordinating Conjunctions
相関 Correlative Conjunctions
お悔やみの言葉
会話一般
(語学学習サイト個人的リンクメモ / Lists of Language Learning Links)
One characteristic of the Japanese language is that it can express social identities by the mode of speech adopted: it can sound polite, aggressive, old, young, manly, girly, etc. just by changing how you call yourself. The content of the utterance itself does not have to change. Of course, this can be seen in many languages, even English. What is unique to Japanese, however, is that the degree of this embeddedness of the social identity in the utterance is very high. Many other language can express this through the body-language or non-verbal operation of the body. Japanese, on the other hand, make use of the verbal very strongly.
On the web, this may cause an interesting phenomena which cannot be observed in the English sphere: strong schismogenesis. Take the culture of 2ch, for example: language used there strongly differs from the 'normal' Japanese language, yet comprehensible. This creates a certain type of discourse that is differentiated from the 'real' world. Moreover, people may accuse each other for adopting a certain mode of talking.
Again, this is not to argue that other languages do not have this characteristic. In Britain, for example, the vocabulary used by the higher class and the lower class is very different. Youths may use a certain form of abbreviation (e.g. "r u ok?"). However the Japanese language can encompass something much more than that. It can express the class, gender, feelings, level of politeness, etc just by changing the verbal expression, which may result in debasement of the value of non-verbal expression.
「はじめての正規表現」がホッテントリ入りしていますが、
導入としては、何に使うのかがわかりやすくて良いのではないかと思います。
あれを見て、基本機能をまとめてみたくなったので、正規表現の基本的な機能について書いてみます。
(正規表現が初めてという人は「はじめての正規表現」を先に見たほうがいいと思います。)
例では「検索」か「置換」をするものとして話を進めていきます。
(「はじめての正規表現」が実例を中心にしたのに対して、こちらは機能を中心に書きます)
正規表現は、プログラミング言語やその他のツールなど、それぞれで微妙な違い(方言)があるので、その点には注意が必要です。
(表記法が違ったり、ここに紹介する機能がサポートされていなかったり、逆に紹介していない機能をサポートしていたりする場合があります)
メタ文字とは機能を持つ文字で、『.
』『*
』『*?
』といったものが当てはまります。
リテラル文字は「文字それ自体」と解釈される文字で、『
』『a
』『<
』といったものです。
「検索する文字列:『egg
』 置換する文字列:『chicken
』」
などとすれば、正規表現を使わない置換と同じ効果になります。
なお、検索して検索文字列が当てはまることを「マッチする」と言います。
メタ文字に使われている文字を検索したい場合は、直前に『\
』を置きます。(これを「エスケープ」と呼びます。)
『.*?^$()[]{}
』などがメタ文字です。
『$100
』を検索したければ、『\$100
』とすればいいということになります。
(『\
』は環境によって、半角の『¥』『\』のどちらかになります。)
言語、ツール、モードなどによっては『@/#
』もエスケープが必要です。
また、『\
』自体は常にエスケープが必要です。
メタ文字 | 意味 |
---|---|
? | 直前の文字を0回または1回繰り返す |
* | 直前の文字を0回以上繰り返す |
+ | 直前の文字を1回以上繰り返す |
{n} | 直前の文字をn回繰り返す |
{n,} | 直前の文字をn回以上繰り返す |
{n,m} | 直前の文字をn〜m回繰り返す |
これらのメタ文字は「量指定子」といって、直前の文字の繰り返しを意味します。
『*
』は「任意の文字を0回以上繰り返す」とありますが、
「0回以上繰り返す」とは、「全く何もなくてもいいし、いくらあってもいい」という意味です。
よって、『?
』は「あってもなくてもいい」、『+
』は「1つ以上あればいい」と解釈できます。
『colou?r
』は『u
』があってもなくてもいいので「colorかcolour」ということになります。
『{n}
』は、たとえば『-{15}
』なら、「ハイフン(-)が15個続くもの」となります。
『-{10,}
』なら「ハイフン(-)が少なくともは10個続くもの(多いのはいくらでも)」、
『-{10,15}
』なら「ハイフン(-)が10〜15個続くもの」となります。
また、複数の文字を繰り返したい場合は括弧で囲みます。
『(Gang){2}Dance
』は『GangGangDance
』と同じ意味になります。
メタ文字 | 意味 |
---|---|
? | 直前の文字を0回または1回繰り返す(欲張り) |
* | 直前の文字を0回以上繰り返す(欲張り) |
+ | 直前の文字を1回以上繰り返す(欲張り) |
?? | 直前の文字を0回または1回繰り返す(非欲張り) |
*? | 直前の文字を0回以上繰り返す(非欲張り) |
+? | 直前の文字を1回以上繰り返す(非欲張り) |
「欲張り」とは、「なるべく多くの文字に適用しようとする」、
「非欲張り」とは、「なるべく少ない文字に適用しようとする」という意味です。
すると、検索する文字列が『a+
』なら『aaa bbb ccc
』、
検索する文字列が『a+?
』なら『aaa bbb ccc
』が置換対象となります。
(「すべてを検索/置換」する場合は当てはまりません)
「『a
』を1回以上繰り返す」ということは、『a
』でも『aa
』でも『aaa
』でもマッチすることになりますが、
「欲張り」かそうでないかで実際のマッチは変わってくるわけです。
文字クラス | 意味 |
---|---|
[abc] | a、b、cのいずれか |
[a-z] | a〜zのいずれか |
[^a] | a以外の文字(改行文字を含めaを除いた全て) |
[^a-z] | a〜z以外の文字(改行文字を含めa〜zを除いた全て) |
文字クラスは『a
』や『<
』などの代わりに文字の種類を指定するものです。
a〜eのどれかの1文字という指定をしたい場合に『[abcde]
』や『[a-e]
』といった指定ができます。
また、文字クラス内の最初に『^
』をつけて『[^abc]
』などとすれば、
「a、b、c以外の何の文字でもいい」とすることができます。
間違いやすいのが「そこにaもbもcも存在しなければいい」という意味ではないということです。
文字クラスは「なんらかの1文字の身代わり」なので、それは何か1文字を表しています。
『-
』は範囲を表すのに使用します。そのため、『[;-%]
』で「; - %のどれか」を表現することはできません。
『-
』を含める場合は必ず最初に持ってきます。すると『[-;%]
』という風になります。
「; - %以外の文字」としたいならば『[^-;%]
』とします。
『[
』や『]
』、『\
』を文字クラスに含めたい場合は直前に『\
』を置いてエスケープします。
「『[
』または『]
』」であれば『[\[\]]
』となります。
『^
』やその他の記号は先頭に置かなければいいので、エスケープの必要はありません。
『.
』は「改行以外のすべての文字」を表しています。
改行は『\n
』で表されるため、『.
』は『[^\n]
』と等価です。
(ただし、正規表現のモードによっては「改行も含めすべての文字」を表す場合もあります)
文字クラス | 意味 | 同等の表記 |
---|---|---|
\w | 記号や空白ではない文字すべて | [a-zA-Z0-9_] |
\W | 記号や空白ではない文字以外 | [^a-zA-Z0-9_] |
\d | 数字 | [0-9] |
\D | 数字以外 | [^0-9] |
\s | タブや改行など、空白類とされる文字 | [ \t\n\r\f\v] |
\S | タブや改行など、空白類とされる文字以外 | [^ \t\n\r\f\v] |
(*間違って『\s
』の同等の表記にも『^
』がついていたのを修正しました)
(『\t
』はタブ、『\v
』は垂直タブ、『\r
』はキャリッジリターン(CR、改行の一種)、『\f
』は改ページ)
これらは『[a-fA-F\d]
』のようにすることで、文字クラスのブラケット(角括弧)内に含めることができます。
「同等の表記」と書きましたが、文字をユニコードして扱うツールの場合は、上記が同等の表記にはならず、
たとえば『\d
』であれば漢数字が含まれてしまったりするので注意が必要です。
『(A|B)
』は「AまたはB」という意味です。(これを「選択」と呼びます)
『(A|B|C)
』なら「A、B、Cのどれか」という意味になります。
『(gray|grey)
』は『gr[ae]y
』とほぼ等価となります。
『[ae]
』は「1文字のaまたはb」という意味になるので結果的に、ほぼ同じ効果が得られるわけです。
(ただし、これはgrayとgreyの違いが1文字だけだったためで、そうでない場合はこうはなりません)
気をつけなければならないのは、その順番です。
『(Java|JavaScript)
』で検索すると、対象文字列内に存在する『Java
』と『JavaScript
』すべてマッチするように思えますが、
『JavaScript
』は選択肢の前(左)のほうにある『Java
』が当てはまってしまうため、
『Script
』部分にはマッチせず、『JavaScript
』というマッチになってしまいます。
選択では左側が優先されるので、『(JavaScript|Java)
』とすることでこの問題は防げます。
(言語、ツールによっては、この問題が起こらない=順番関係なく長いほうを適用しようとするものもあります)
メタ文字 | 意味 |
---|---|
^ | 行頭 |
$ | 行末 |
\b | 単語境界 |
\B | 単語境界以外 |
リテラル文字や文字クラスが「文字自体」にマッチするのと違い、アンカーは「位置」にマッチします。
検索する文字列が『^
』、置換する文字列が『>
』なら、「行頭に『>
』を挿入する」という意味になります。
単語境界とは、「単語を構成する文字=『\w
』に相当する文字」と「単語を構成しない文字=『\W
』に相当する文字」の間の位置のことです。
『regular expression.
』なら『^regular^ ^expression^.
』の4ヶ所に当てはまります。
『\b.*?\b
』とすれば単語すべてにマッチさせることができます。
しかし、「単語構成文字」が基準なので、『JavaScript
』は1単語でも、『L?K?O
』は1単語とは見なされません。
アンカーは位置にマッチするので、文字クラス内に含めることはできません。
『^
』や『$
』を文字クラスに含めても、その文字自体という意味になります。
つまり、『[^$]
』なら「行頭または行末」ではなくて、「『$
』文字以外」ということになります。
また、『\b
』は文字クラス内のみ、バックスペース文字を表す場合が多いようです。
正規表現には、大抵「大文字と小文字を無視する」というオプションがあります。
これが入っていないと「『to:
』で検索しても『To:
』にマッチしない」といったことが起こります。
言語、ツールによっては、正規表現の一部にのみ大文字と小文字を無視する機能があるものもあります。
例えばRubyでは『(?i:foo)
』という形式を使用できます。
『(
?i:Ruby) Python
』という表現なら、『ruby Python
』や『RuBy Python』にはマッチしますが、
『RUBY PYTHON
』にはマッチしない、ということになります。
括弧内に入れた文字列は、ある場所に記憶されます。(「キャプチャ」と呼びます)
これは『\n
』という表記を使って呼び出すことができます。(nは数字)
同じ単語が2連続で出てくるもの(『merry merry
』みたいなもの)を探すという場合、
『\b(\w+)\b \1
』とすることができます。(ここで使った『\1
』を「後方参照」と呼びます)
こうすると、『\1
』の部分は、『(\w+)
』を使ってマッチしたものと同じものがあるものとして解釈されることになります。
括弧を何個も使う場合は、左の括弧から順に『\1
』、『\2
』、『\3
』となります。
また、後方参照は置換文字列にも使うことができます。
つまり置換文字列内に『\1
』と書けば1番目の括弧、
『\2
』と書けば2番目の括弧でキャプチャされたものがそこに入ることになります。
この場合、言語、ツールによっては『\n
』ではなく『$n
』を使う場合もあるようです。
括弧は『(foo|bar)
』という選択や、『(humbert){2}
』というグループ化など、キャプチャ以外にも使われます。
そのため、キャプチャに使われた数字をわかりやすくするために、キャプチャしない括弧もあります。
それには『(?:foo)
』という表記を使います。
前の例であれば『(?:foo|bar)
』と『(?:humbert){2}
』になります。
「その位置の続くものを確認する」というのが「先読み」です。
対象文字列を『JavaScript Java Applet』として考えてみましょう。
『Java(?=Script)
』は「『Script
』が後に続く『Java
』」にマッチします。
『(?=Script)
』の部分が、「『Script
』が後に続くかどうか」をチェックしているので、
後ろに『Script
』が続かない単なる『Java
』にはマッチしません。
『(?=Script)
』の部分は「後に『Script
』が続く位置」にマッチしていることになります。
この例のマッチは『JavaScript Java Applet』となります。
逆に、『Java(?!Script)
』とすれば、「『Script
』が後に続かないかどうか」をチェックするので、
後ろに『Script
』が続かない単なる『Java
』にマッチさせることができます。
こちらは「否定先読み」と呼びます。
この例のマッチは『JavaScript Java Applet』となります。
言語、ツールによっては、「その位置の前にあるものを確認する」という「戻り読み」「否定戻り読み」がサポートされているものもあります。
(これは『(?<=foo)
』『(?<!=bar)
』という形で使います)
先読みや否定先読み、戻り読みなどをまとめて「前後読み」と呼びますが、
前後読みは位置にマッチするため、戻り読みは先読みとは通常書くべき位置が逆になります。
『(?<Mozilla )Firefox
』とすれば、『Mozilla
』に続く『Firefox
』のみにマッチします。
メタ文字 | 意味 |
---|---|
?+ | 直前の文字を0回または1回繰り返す(強欲) |
*+ | 直前の文字を0回以上繰り返す(強欲) |
++ | 直前の文字を1回以上繰り返す(強欲) |
上のほうで?、*、+は「欲張り」だと書きましたが、「欲張り」な量指定子も“ゆずる”ことがあります。
対象文字列が『"something"
』だとして、検索文字列『".*"
』はこれにマッチします。
しかし、強欲な量指定子『*+
』に置き換えて『".*+"
』とするとマッチしません。
これはなぜかというと、「欲張り」な量指定子を使った『.*
』の部分は、
最後の『"
』がなければ『something"
』にマッチすることになりますが、
正規表現の最後に『"
』があるために、対象文字列の最後の『"
』をゆずっているのです。
『.*+
』の部分が『something"
』にマッチしてしまい、
強欲な量指定子をサポートしていない言語、ツールでも、「アトミックなグループ」というものが使える場合があります。
アトミックなグループでは『(?>foo)
』という表記を使います。
『\w?+
』なら『(?>w+)
』、『\w*+
』なら『(?>w*)
』、『\w++
』なら『(?>w+)
』で代替できます。
『*
』の「直前の文字の0回以上の繰り返し」はよく気をつけないと、間違ったものにまでマッチしてしまいます。
リテラル文字と文字クラスは「文字自体」にマッチすると書きましたが、
『-*
』というような表現は、『-
』や『--------
』だけでなく、
なぜそうなるかというと、「0回以上」ということは「なくてもいい」ということだからです。
空文字列へのマッチは、実質上「位置」へのマッチと似たようなものになります。
検索文字列を『-*
』として一括置換すると、
『-
』や『--------
』が置換されるだけでなく、
『-
』が存在しないすべての場所に置換文字列が挿入されてしまうことになります。
正しい正規表現を書くためには、「どう書けばマッチするか」だけでなく、
「どういう場合にマッチしなければいいか」についても考えてみる必要があります。
*
』≒正規表現の『.*
』とありますが、これは厳密には微妙に違います。
ファイルグロブでは《*
》は「任意の文字を1回以上繰り返す」
つまり、1文字以上あればなんでもいいということになります。
この意味だと、《*.*
》は "foo." や ".bar" は当てはまりません。
しかし、「0回以上」であればマッチすることになります。
正規表現では「1回以上繰り返す」は、《+
》なので、
「任意の文字を1回以上繰り返す」は『.+』となります。
よって、《*.*
》とほぼ等価な表現は『.+\..+
』となります。
これは私の勘違いでした。miauさんご指摘ありがとうございます。
「*.*」は foo. にマッチするはずだし、.bar にマッチしないのは、「*」がドットファイルにマッチしないっていう特殊ルールがあるから・・・ですよね?
ファイルグロブの《*
》は、「0回以上繰り返す(ただし例外として、一番最初のドットは表せない)」ということのようです。
《*.*
》とほぼ等価な表現は、正しくは『(?!\.).*\..*
』となります。
正規表現を使うにあたっては、検索対象がどのようなものか知っておくことが重要です。
『\d{4}[-/]\d{1,2}[-/]\d{1,2}
』で日付と思われる文字列を検索することができますが、
これは『00-0000-00-00
』というものにもマッチしてしまいます。(『00-0000-00-00
』)
しかしこれを厳密にしようと思えばかなり複雑な正規表現になってしまうので、
どの程度の厳密さが必要かを把握しておくことが肝要と言えるでしょう。
冒頭にも書きましたが、正規表現は、言語やツールによって微妙な違いがあるので、
その辺りについては各言語、ツールの説明を参照してください。
本格的に学びたい場合はオライリーの「詳説 正規表現」がおすすめです。
(ただ、この本はプログラミングのことを多少は知らないと難しいかもしれません)
また、PHP正規表現チェッカーですぐに試せるようです。
b:id:K-Onoさんの
について。
実ははてなダイアリーもある(d:id:sleepwlk)んですが、長いこと書いてなかったので、
匿名ダイアリーのほうが多くの人に見てもらえるのではないかと思ってこちらに書いてみました。
*2008-09-23 誤記の修正と、一部加筆しました。
*2008-09-24 ワイルドカードの記述を修正しました。
*2008-09-24 文字クラスの記述の間違いを修正しました。b:id:FunnyBunnyDizzyさんご指摘ありがとうございます。
こっちのほうが処理が軽くていいや
matching expression
(<font*>)$SET(0=)|
(<i[^m]++>)$SET(0=)|
(<strike*>)$SET(0=)
Replacement Text
諸君 私は脆弱性が好きだ
諸君 私は脆弱性が大好きだ
PHPが好きだ
XSSが好きだ
SQLインジェクションが好きだ
CSRFが好きだ
UTF-7が好きだ
expressionが好きだ
Webで
LiveHTTPで
Filemonで
Regmonで
OllyDbgで
Perlで
セキュリティに関して口うるさく言っているサイトの脆弱性をいとも簡単に見つけるのが好きだ
大企業のサイトがGoogleによって脆弱性を発見された時など心が踊る
Perlを馬鹿にしていた奴のアカウントを乗っ取った時など胸がすくような気持ちだった
粘り強い同業者がMS Officeのシリアル認証と格闘している様が好きだ
PHP覚えたての野郎共が続々と脆弱性を作り出していく様など感動すら覚える
気に入らない奴のPCにトロイの木馬を忍ばせ奴の個人情報がWinnyネットワークに流れてゆく様などはもうたまらない
精魂込めて更新していたであろうWikiを滅茶苦茶にするのが好きだ
必死に守るはずだった同業者が次々に逮捕されてゆく様はとてもとても悲しいものだ
FBIに追いまわされ泥棒の様に捕まる恐怖と戦うのは屈辱の極みだった
諸君 私は攻撃を地獄の様な攻撃を望んでいる
諸君 私に付き従うクラッカー諸君
君達は一体何を望んでいる?
更なる攻撃を望むか?
情け容赦のない糞の様な攻撃を望むか?
鉄風雷火の限りを尽くし三千世界の鴉を殺す嵐の様な政府との闘争を望むか?
『攻撃! 攻撃! 攻撃!』
よろしい ならば攻撃だ
我々は渾身の力をこめて今まさに振り降ろさんとする握り拳だ
だがこの暗い闇の底で半世紀もの間堪え続けてきた我々にただの攻撃ではもはや足りない!!
大攻撃を!!
一心不乱の大攻撃を!!
我々はわずかに小数
ならば我らは諸君と私で総兵力100万と1人の集団となる
我らを忘却の彼方へと追いやり、眠りこけている奴らを叩きのめそう
髪の毛をつかんで引きずり下ろし 我々の方が強いことを眼(まなこ)をあけて思い出させよう
連中に恐怖の味を思い出させてやる
連中に進入される恐怖に怯えながら眠る夜を過ごさせてやる
連中に我々の技術を思い知らせてやる
天と地のはざまには奴らの哲学では思いもよらない事があることを思い出させてやる
世界を恐怖に陥れてやる
Canvasはどこに行ったんだっけ
インスピレーションは便利だったのに…
Strataって一応未だあるんだよね
ベクター系ペイントツールのExpressionは最終的にMicrosoftが買ったけど、これもう原形留めてないよね?
ロータスとかジャストシステムユーザーは未だ使ってるのか?ノーツは?
クラリスワークス改めAppleWorksはどういう幕のひきかたしたんだろ
http://www.atmarkit.co.jp/news/200704/23/eweek.html
これを見て、へーと思ったので、何ができるんにゃろめとあれこれかんがえてみたりした。
<script type="text/javascript">alert('test')</script> <div onClick="alert('test')">test0</div> <A href="javascript:alert('test')">test1</A> <A href=vbScript:MsgBox("test")>test2</A> <A href="javas cript:alert('test')">test3</A> <A href="javas	cript:alert('test')">test4</A> <div style="font-size:!!expression(alert('test'));">test5 !!を外せば動くけど死ぬよ</div> <iframe src="test.html">test6</iframe>
LiveScript
JavaTeaScript
http://www.fureai.or.jp/~tato/JS/scripttg.htm
にゃ!?
こんなにいっぱいスクリプト言語あるの・・・?
たとえば www.hatema.jp とかとって、そこにログイン画面作ってフィッシングサイトを作る。
捨てアカとって、JavaScriptつかってリンクがそこへ飛ぶ様にしておくエントリを書く。
http://anond.hatelabo.jp/20061227145016
使いやすいからJsってだけで、悪意をもって振舞えば別にJavaScriptつかわないでも現状のもと実現できるよね。
まちちゃんの可愛いところはマグロの解体ショーを人前で実践してくれるところ。
切り身のトロがメバチマグロなのか黒マグロなのか気にせずにショーとして楽しめるところ。
そもそも今回はJsなんか使われてないよね?
クライアント側に何をするのかより、サーバー側になにをするのかだと思うんだ。
鍵をいくつもつけまくるのは確かに抑止力にはなる。だけど不便じゃない?
いろんなブログパーツがあるけどはてなでは自由に使えないじゃない?
<a href="javascript:alert('こんにちはこんにちは!');">マグロの解体ショー</a>
こんな簡単なスクリプトからcss/expression()まで弾くぐらいJsをガチガチにブロックしている理由はさすがに少し技術的な固執じゃないかなと思う。スタイルシートをタグに適用するのも禁止とか……。
そのわりに肝心なアカウント認証の部分が緩いからこういうことになるんじゃないかな。
ドアには普通の鍵でいいから金庫の鍵だけはもうすこししっかりしてねという所感。
特にブログなんて公開するためのものだから、お店のドアが鍵だらけっていうのもどうなのかな。
金庫室って書いた鍵の緩いニセのドアを設けてそこを開けたお客さんをマークしておくとかすればいいと思うんだ。
戯言。