コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

広告在庫の概念がわかりにくいのであっさり味にまとめる

仕入れてないのに在庫って何やねん。という流通視点で行くとだいぶ混乱するので整理

その前の大前提

Web広告においてはエンドユーザーに表示される数がすべての根底にあり、その表示される数のことをインプレッション(略称:imp)と呼ばれる。

Web広告における在庫とは

基本的にはこの広告の表示が成立がすると、その表示にたいしてお金がはいるのがWeb広告となる。

そのため、広告を表示するWebサイトとしては「広告を表示するとお金が入る」ということになり、言い換えると「広告の1インプレッションを売る」ということになる。その考え方の流れに準ずると「 広告1表示 というものを売る」という考えになるので、広告在庫 = インプレッション数となる。

一般概念の在庫と乖離する部分

在庫は確実に用意できない場合がある

広告在庫というのは「ある一定期間のimpの予想値」であるので、必ずしもそのPVがその期間に取れるとは限らない(『その期間にサーバートラブルを起こしてページが表示されない』などで予想とズレるなどはある)

そのため、在庫を作るためにリアルタイムで工夫する必要があったり、他のページから無理くり誘導させる必要などがある。

在庫が余る

当該枠に関して枠があるが、買い手がいないのでただただ表示してimpを得れるが、広告がない状況になる。このような場合のことを在庫が余るなどと表現される。商品在庫はあるのに買い手がついていないと考えるといいと思う。

参考リンク

広告費におけるネット、グロス、マージンとは

いつもわからなくなるので図で書き留めておく

用語

ネット(Net)

ベースとなる費用のこと。意味としては「網」の方ではなく「正味」を表す英単語から。

マージン(Margin)

上乗せする手数料費用などの費用のこと

グロス(Gross)

ネットとマージンを足した総合計の費用。

図で表した例

例えば

  • ベースの費用が80万
  • マージンとしての手数料が20万
  • 総合計の費用が100万

だとすると、各用語の意味は以下のようになる

f:id:shinkufencer:20200821235620p:plain
ネット、マージン、グロスのまとめ図

補足

ちなみにパッケージ商品にも「NET」の表記があったりするが、こちらも同様の意味。そちらに関しては下記サイトが写真付きで紹介しているのでそちらをご参照のこと。

kw-note.com

参考リンク

HTTPヘッダのX-Forwarded-Forとは何か、そしてForwaredとは何かをざっくりまとめる

そもそもXがつくヘッダはどんなものなのか

別の記事でざっくり書いたのでそちらを参照

shinkufencer.hateblo.jp

X-Forwarded-Forとは

クライアントからレスポンス戻る際にロードバランサーなどの仲介する某かを通る場合がある。そのような場合は純粋に送信元IPを基準に考えると、もともとのクライアントのIPがわからなくなってしまう。

そこでHTTPヘッダに元のクライアントIPの情報を乗せるときに使われるヘッダが X-Forwarded-For である。

使われ方

フォーマットと意義

クライアントのIPから始まり、あとはクライアント起点で経由したプロキシのIPをカンマ区切りで追記していく形式

X-Forwarded-For: クライアントのIP, プロキシのIPその1, プロキシのIPその2 ...

こう記述することで、クライアントのIPと経由したプロキシのIPが順番も含めてわかる。

X-Forwarded-Forに増えるタイミング

プロキシにあたるものを一つしか挟まない場合は、クライアントのIPのみしか記録されない。そのため クライアントIPが記載されるのはX-Forwarded-For と勘違いされがち。

X-Forwarded-Forの歴史

これはRFCで標準化された仕様ではなく、Squidのキャシング/プロキシサーバで使われ始めて、それがデファクトスタンダードになったものだとされている。(ここに関しては原初が何の仕様だったのかまではたどることができなかった)

X-Real-IPとの違い

似たような拡張仕様に X-Real-IP ヘッダが存在するが、仕様としてはあまり他での利用が見かけられないがOracleのドキュメントには以下のような記述がある。

クライアントのIPアドレスを指定します。 ロード・バランシング・サービスの場合、クライアントは最後のリモート・ピアです。 - HTTP "X-"ヘッダー

X-Real−IPは純粋にクライアントのIPのみを記載する目的のヘッダの様子。

置き換えとなるRFCの仕様 Fowarded

デファクトスタンダードだった仕様に対し、RFCで明確に定められた仕様が Forwarded

RFC 7239 - Forwarded HTTP Extension

X-Forwarded-For と同列で語られるデファクトスタンダード仕様である X-Forwarded-Host (クライアントのホスト名), X-Forwarded-Proto (クライアントが利用しているHTTPのプロトコル,http or https) も格納できるフォーマットとなっている。

ヘッダなので偽装もできる

X-Forwarded-ForもForwardedもどちらもヘッダに付与するものなので偽装は容易にできる。そのため、インターネットに接する面ではあまり効力を発揮しない。そのため現在では内部ネットワークでのリクエストのやりとり経路を確認するためのヘッダとして使う、というのが最近の使い方のスタンダードだと思われる。

参考リンク

今回調査をしようと思ったきっかけのツイート

RSpec3でbe_trueとbe_falseはなくなり、be_truthyとbe_falsey(be_falsy)になった

変化の経緯がなるほどなーと思ったのでまとめる。

出典

Notable Changes in RSpec 3

解説

RSpec3のリリースノートいわく

RSpec 2 had a pair of matchers (be_true and be_false) that mirror Ruby's conditional semantics: be_true would pass for any value besides nil or false, and be_false would pass for nil or false. In RSpec 3, we've renamed these to be_truthy and be_falsey (or be_falsy, if you prefer that spelling) to make their semantics more explicit and to reduce confusion with be true/be false (which read the same as be_true/be_false but only pass when given exact true/false values).

和訳すると

RSpec 2には、Rubyの条件付きセマンティクスを反映するマッチャーのペア(be_trueとbe_false)がありました。be_trueはnilまたはfalse以外の値を渡し、be_falseはnilまたはfalseを渡します。 RSpec 3では、これらの名前をbe_truthyとbe_falsey(またはそのスペルが望ましい場合はbe_falsy)に名前を変更して、セマンティクスをより明確にし、be true / be falseとの混同を減らします(be_true / be_falseと同じように読み取りますが、正確なtrue / false値が与えられたときに渡します)。

和訳だけだとわかりづらいかもしれませんが、意図を汲み取ると以下の通り

  • RSpec2までは be_true は 「nilかfalse以外の値のとき」 be_false は 「nilまたはfalseのとき」というマッチャになっていた。
  • 上記の場合、be trueという「trueと同一である」という名前に反してtrueと合致しないものも判定していた
  • そのためRSpec3では挙動に合わせてマッチャ名を変更し be_truthybe_falsey/be_falsy にリネームを行った

もし本来の意味のbe true、つまり「trueと同一である」というのを調べたい場合は be マッチャでtrueか同一か調べればいいということになる。

expect(check_value).to be(true)

なお be(true) ではなく be だけにすると be_truthy と同じ挙動になるので気をつけること

余談

PHPは両方あるので紛らわしい(参考:いつから俺は、be_truthy/be_falseyの仕様を勘違いしていたのだ - type holyshared = Engineer

参考リンク

RFCのMUST/MUST NOT/SHOULD/SHOULD NOT/ MAYに関しては個別に使い方を説明したRFCがある

トリビアの泉みたいな見出し

出典

RFC 2119 - Key words for use in RFCs to Indicate Requirement Levels

こちらはIPAの和訳がある

Key words for use in RFCs to Indicate Requirement Levels

どのようなRFCなのか

特定の大文字英単語(MUST / MUST NOT / SHOULD / SHOULD NOT / MAY ,など)が使われる場合はその言葉そのものに意味を持つというもの。

このルールが働くときにかならずある注記

この大文字英単語に意義をもたせる場合には下記の文章を載せろ、とRFC2119内にも記載があり、この文章の有無が効力を発揮するものかを判断する基準になる。

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT","SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119].

具体どのようなことを示すのか

大文字英単語が持つ意味合いに関して表にまとめる

表記英語 意味 同列表現
MUST その規定が当該仕様の絶対的な 要請事項であること REQUIRED,SHALL
MUST NOT その規定が当該仕様の絶対的な禁止事項であること SHALL NOT
SHOULD 特定の状況下では、特定の項目を無視する正当な理由が存在するかもしれませんが、 異なる選択をする前に、当該項目の示唆するところを十分に理解し、 慎重に重要性を判断しなければならない RECOMMENDED
SHOULD NOT 特定の動作が容認できる、ないし、非常に有用である、というような 特定の状況下では、正当な理由が存在するかもしれませんが、 このレベルの動作を実装する前に、当該項目の示唆するところを十分に理解し、慎重に重要性を判断しなければならない NOT RECOMENDED
MAY ある要素が、まさに選択的であることを意味します。特定の選択事項(オプション)を含まない実装は、おそらく機能的には劣る ことになるでしょうが、そのオプションを含む他の実装との相互運用に備えなければなりません。 同様に、特定のオプションを含む実装は、そのオプションを含まない実装 との相互運用に備えなければなりません。 OPTIONAL

文章内の記載例

例えば以下のような記述。下記の例の場合は MUST NOT

The user agent MUST NOT include more than one Origin header field in any HTTP request. (ユーザエージェントは、複数の Origin ヘッダーフィールドを、いかなる HTTP request 中にも含めてはならない) - The Web Origin Concept

RFC8174による追加

「小文字はどう捉えればいいのか」という曖昧な部分に関してRFC8174で「単語はすべて大文字である場合にのみ意味を持ち、そうではない場合は通常の英語の意味を持つ」というように追記が加わった。さらに説明用の一文が下記のように変化している。

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED","MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

参考リンク

HTTPヘッダのXから始まるものについての歴史と2020年現在での使い方をざっくりまとめる

もともとX-Forwarded-Forを調べていたが前段としてX-hogehoge(以下X接頭辞)についてまとめる。なお和訳はほとんど powered by Google翻訳

出典

このX接頭辞非推奨についてまとめられているRFC6648にそもそもX接頭辞はどう始まったかも含めてまとまっている。

RFC 6648 - Deprecating the "X-" Prefix and Similar Constructs in Application Protocols

X接頭辞のはじまり(RFC6648の付録Aより)

その記述によると最初はFTPのRFC691に記載されている以下の記述が始まり

I suggest that parameters be allowed to be more than one letter, and that an initial letter X be used for really local idiosyncracies (本当にローカル特異パラメータは、複数の文字にすることにし、最初の文字をXにすることをお勧めします) - RFC 691 - One more try on the FTP

またFTPではX接頭辞は使われ…

FTP allows "experimental" commands, whose names begin with "X". If these commands are subsequently adopted as standards, there may still be existing implementations using the "X" form.... ( FTPでは、名前が"X"で始まる"実験的"コマンドを使用できます。これらのコマンドがその後標準として採用される場合でも、"X"形式を使用した既存の実装がまだ存在する可能性があります。) - RFC 1123 - Requirements for Internet Hosts - Application and Support

その後、メールのヘッダにも使われるようになり、RFC1154にて以下の記述が登場する。

Keywords beginning with "X-" are permanently reserved to implementation-specific use. No standard registered encoding keyword will ever begin with "X-". ( "X-" で始まるキーワードは、実装固有の使用のために永久に予約されています。 " X-" で始まる標準の登録済みエンコーディングキーワードはありません。 )

このメールヘッダでの利用を倣ってほかのものでも踏襲されたとされている。(ただしこのあとメールヘッダでの利用は非推奨となる)

バックグラウンドの説明ではこのようにX接頭辞が使いたくなる場面として「標準化される可能性のあるような実験的なもの」や「決して標準化されないような拡張機能」があるとしている。

またこのX接頭辞使用するのは仕様を作る側の個別の選択であり、それをうまく取り込んでいるRFCもあると説明がされている。

X接頭辞の現況

出典のRFC6648によって、2012年6月からはX接頭辞は非推奨となっている。RFC6648では非推奨に関しての前置きで以下のように記述している。

In short, although in theory the "X-" convention was a good way to avoid collisions (and attendant interoperability problems) between standardized parameters and unstandardized parameters, in practice the benefits have been outweighed by the costs associated with the leakage of unstandardized parameters into the standards space. ( 要するに、理論的には"X-"規則は、標準化されたパラメータと標準化されていないパラメータの間の衝突(および付随する相互運用性の問題)を回避するための良い方法でしたが、実際には、標準化されていないパラメータが標準化されたパラメータへと変わってしまうコストがメリットを上回ってしまっています。 )

これは元となったメールヘッダなどがX接頭辞として始まったものが標準化されXを使用しないものとして動かされる事例があることを元に、置き換える際の様々なコストがかかることを懸念して、廃止にすべき…ということのようだった。

X接頭辞を使いたくなる場合どうするべきか

RFC6648には「新しいパラメータの作成者への推奨事項」という記載があり

  1. SHOULD assume that all parameters they create might become standardized, public, commonly deployed, or usable across multiple implementations.(それらが作成するすべてのパラメータが、標準化され、公開され、一般に展開され、または複数の実装にわたって使用可能になる可能性があると想定する必要があります。)
  2. SHOULD employ meaningful parameter names that they have reason to believe are currently unused.(現在未使用であると考える理由がある意味のあるパラメーター名を使用する必要があります。)
  3. SHOULD NOT prefix their parameter names with "X-" or similar constructs. (パラメータ名の前に「X-」または同様の構成体を付けないでください。) - RFC 6648 - Deprecating the "X-" Prefix and Similar Constructs in Application Protocols

というように、そのあと標準化される懸念をしながらX接頭辞に近しいものは使うな、というように念押しされている。

独自ヘッダの事例

思いをはせる、というようなガイドラインになっているが、具体的にはどうするといいのか、他社事例としてOpenStackの事例があった。

OPENSTACKではこのRFCを前提において以下のように OpenStack 接頭辞をつけることをしている。以下説明の抜粋です。

To do this, use “OpenStack” and the service name in the header. An example might be “OpenStack-Compute-FooBar”, which is unlikely to be standardized already or conflict with existing headers.(これを行うには、「OpenStack」とヘッダーのサービス名を使用します。たとえば、「OpenStack-Compute-FooBar」は、すでに標準化されているか、既存のヘッダーと競合する可能性が低いです。) - HTTP Header Guidelines — API Special Interest Group documentation

このように基本的にあるコンテキスト固有のものはこのようにそのコンテキストを象徴する文字列がいいのかもしれないです。

関連リンク

フラッグシップモデルという言葉をざっくりまとめる

ハイエンドモデルと何が違うんだっけ?ってなるので

語源

語源は海軍用語の旗艦(フラッグシップ)から

また、他の多くの海軍用語と同様、「旗艦」「フラグシップ」もほかの用途に転用されて、日常的な用語として使われる。この場合、集団やグループの最も重要な位置付けにあるものを指すが、この最も重要な位置付けとは、通常、ステータス性を持つものや戦略的に重要なものとしての位置づけである。 たとえば、会社の利益を支える主力製品、あるいは会社の技術の粋を尽くしてつくられた最高価格製品を「旗艦製品」「フラグシッププロダクト」と呼んだり、会社の中で最大の設備・規模を有する中核店舗、あるいは先駆的な試みをする位置付けの店舗を「旗艦店」「フラグシップストア」と呼んだりする。 - 旗艦 - Wikipedia

使われ方

重要なプロダクトの"モデル"であることは語源から汲み取れるが、実際に扱われる場合は2つのパターンがあるとされている。

  1. そのモデル(またはブランド)において最も機能が優れているモデル
  2. そのモデル(またはブランド)において最も重要な立ち位置のモデル

2の意味が本来のフラグシップだと思われるが、それが転じて最高機能を持つモデルという意味合いで使われることが増えた模様

参考リンク