ためすう

Rails5 で http ヘッダーリクエストのキーが変換される件

2019-05-25

やったこと

Rails で http ヘッダーリクエストについて調査をしていて、ハマった時の話しです。

http ヘッダーリクエストのキーが Rails 側で変更されていることにより、ハマりました。

キーがどのように変わっているかについて書きます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

任意のヘッダーを追加した時、Rails側でキーが変換されていることが分かりました。

app/controllers/tasks_controller.rb

class TasksController < ApplicationController
  def index
    @task = Task.new

    logger.debug(1234567)
    request.headers.sort.map { |k, v| logger.info "#{k}:#{v}" }
    logger.debug(request.headers['abc-def'])
    logger.debug(request.headers['HTTP_ABC_DEF'])
    logger.debug(request.headers['abc-xxx-yyy'])
    logger.debug(request.headers['HTTP_ABC_XXX_YYY'])
  end

リクエストを送る

$ curl -H 'abc-def:value' -H 'abc_xxx_yyy: value2' http://localhost:3000/

ログの出力結果

1234567
GATEWAY_INTERFACE:CGI/1.2
HTTP_ABC_DEF:value
HTTP_ABC_XXX_YYY:value2
...
value
value
value2
value2

http のリクエストヘッダーの key に HTTP_ が付与されました。また、- も _ に変更されています。

詳しい処理については、参考のリンクをご覧ください。

参考

Ruby のクラスインスタンス変数

2019-05-25

やったこと

Ruby でクラスインスタンス変数について調べます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

クラスインスタンス変数

クラスがClassクラスのオブジェクトであるとうことは、クラスオブジェクト自体にインスタンス変数を持たせることができます。

test.rb

class Sample2
  @class_instance_val = :class_instance_val

  def self.hogehoge
    @class_instance_val
  end
end

p Sample2.hogehoge

出力結果

$ ruby test.rb
:class_instance_val

参考

Ruby でインスタンス変数へのアクセスをラクにする

2019-05-25

やったこと

Ruby で インスタンス変数へのアクセスについて調べます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

アクセサを自動的に定義するには、attr_accessor を使います。

test.rb

class Sample
  attr_accessor :hogehoge
end

s = Sample.new
s.hogehoge = 'init'

p s.hogehoge

出力結果

$ ruby test.rb
"init"

ちなみに

  • 「参照するためのメソッド」だけを定義: attr_reader
  • 「代入するメソッド」だけを定義: attr_writer

を使います。

参考

  • パーフェクトRuby

Ruby でシングルトンを使ってみる

2019-05-25

やったこと

Ruby で singleton を使ってみます。

今回は用意されているライブラリを使います。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

test.rb

require 'singleton'

class SingletonSample
  include Singleton

  attr_accessor :count

  def initialize
    @count = 0
  end
end

p 'obj1'
obj1 = SingletonSample.instance
puts obj1.count
obj1.count += 1
puts obj1.count

p 'obj2'
obj2 = SingletonSample.instance
puts obj2.count
obj2.count += 1
puts obj2.count

p 'id'
p obj1.object_id
p obj2.object_id

出力結果

$ ruby test.rb
"obj1"
0
1
"obj2"
1
2
"id"
70354869597880
70354869597880

参考

アジャイルソフトウェア開発の奥義 第3章 プランニング

2019-05-25

「アジャイルソフトウェア開発の奥義」の読書メモです。

時々、個人の見解入りです。

この章は、XPの「計画ゲーム (planning game)」についてです。

流れ

  • ユーザーストーリを洗い出す
  • 相対的な見積もりをする
    • ある機能を1とした時、他の機能はどれくらいのボリュームとなるかを決める
  • 「速度」を掴むため、1 ~ 2つのストーリーを試作してみる
    • かかる時間が見積れる
  • イテレーションプランニング(たいていは2週間程度)
  • タスクプランニング
    • ストーリーをタスクレベルに分割する

チームの全員が、何を成し遂げるべきか、いつそれを成し遂げるべきかを把握している。

同意。チーム単位でこれを把握していれば、遅れているタスクがあっても手伝ったりできる。

「速度」について

見積もるために「速度」という概念が必要。

これは、例えば1週間ごとにどれくらいこなしたかを実測値として取り、将来の計画も決めていく。

個人的に思うこと

プロジェクトを進める中で予期せぬことはよく発生すると思いますが、

主にその予期せぬことは下記2つの問題に分けられると考えています。

  • 技術的課題
  • 仕様的課題 (既存システムに組み込むという観点、法律の観点など)

最初のうちに気付ければ良いのですが、気付けなかった場合、計画立て直しになるので、

プロジェクト着手前には慎重に検討したいところです。

How to Win a Data Science Competition (Week2-1 part5)

2019-05-25

Exploratory Data Analysis

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Dataset cleaning and other things to check

  • データセットクリーニング

    • 一定の特徴
    • 重複している特徴
  • 他にチェックすること

    • 重複レコード
    • データセットがシャッフルされているかどうか

コンペの主催者はデータの一部を提供する(全部ではない)

traintest.nunique(axis=1) == 1
  • サンプリングが原因で、全てのデータ(訓練データ、テストデータ)で同じものを取ることがある

特徴の重複

traintest.T.drop_duplicates()

※ 関数はビデオに出てたものを写経しました。動作は確認していません。

参考

How to Win a Data Science Competition (Week2-1 part4)

2019-05-25

Exploratory Data Analysis

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Visualizations

  • 個別の特徴を探索する
    • ヒストグラム
    • プロット
    • 統計
  • 特徴の関連を探索する
    • 散布図
    • 相関プロット
    • プロット (インデックスと特徴の統計)

個別の特徴を探索する

ヒストグラム
plt.hist(x)
プロット
plt.plot(x, '.')
散布図
plt.scatter(range(len(x)), x, c=y)
統計値
df.describe()
x.mean()
x.var()
x.value_count()
x.isnull()

特徴の関連を探索する

単一の特徴で結論を出すのが難しいことが分かる

散布図
plt.scatter(x1, x2)
pd.scatter_matrix(df)
df.corr(), plt.matshow(...)
df.mean().plt(style='.')
df.mean().sort_values().plt(style='.')

※ 関数はビデオに出てたものを写経しました。動作は確認していません。

参考

How to Win a Data Science Competition (Week2-1 part3)

2019-05-25

Exploratory Data Analysis

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Exploring anonymized data

明らかにしたくない情報などを内容が分からないようにしていることがある。

データはデコード、匿名化解除することができる場合がある。

  • 個別の特徴を探索する

    • カラムの意味を推測する
    • カラムの種類を推測する
  • 特徴の関連を探索する

    • ペアの関連を見つける
    • 特徴のグループを見つける

役に立つ関数 (Pandas)

-- データの型を予測
df.dtypes

df.info()

-- 値ごとのカウント
x.value_counts()

-- nullかどうかをチェック
x.isnull()

参考

How to Win a Data Science Competition (Week2-1 part2)

2019-05-25

Exploratory Data Analysis

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Building intuition about the data

  • ドメイン知識の取得
    • 深く問題を理解するのに役立つ
  • データが直感的に分かるかどうか
    • データがドメイン知識と一致するかどうか
  • データがどのように作られたかを理解する
    • 適切なバリデーションを設定することは大切

何を予測するのか、持っているデータは何か、問題に対してどのようにアプローチするかを理解すること

データのカラムの意味を理解する

訓練データ、テストデータに偏りがあると、モデルの適切な評価ができないので注意する

参考

How to Win a Data Science Competition (Week2-1 part1)

2019-05-25

Exploratory Data Analysis

学習目標

  • Describe the major visualization tools
  • Generate hypotheses about data
  • Inspect the data and find golden features
  • Examine and analyze various plots and other data visualizations

Exploratory data analysis

EDA って何?

データを分析すること。

EDAで必要なこと

  • データをよく理解すること
  • データについての直感を構築する
  • 仮説を立てる
  • 洞察する

コンペで提供されるデータは、匿名化、暗号化、前処理、難読化されていることがある

リーク

コンペの主催者がデータ準備中の誤り。

まとめ

コンペを始めるときは、モデルを構築する前にEDAからやった方が良い。

参考