気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

ECサイト セールス用語

セールス用語について、触れたものに関して記載していきます。

アップセル、クロスセル

  • アップセル:より高い商品を買ってもらう
  • クロスセル:追加商品、もしくはセット商品で買ってもらう

店舗やメーカーに対しての愛着や信頼度が高いユーザーに特に有効な施策

Mixed contentとは?

Mixed contentとは

httpsページ内にhttp(非暗号化通信)で読み込んでいるファイルが存在(混在)している状態を指します。

httpsページにhttpコンテンツが混ざることの問題点

  • httpコンテンツがブラウザから「安全でない」と一部読み込まれない現象が発生しうる
  • 結果的にサイトデザイン崩れ、ボタンが動作しないなどの機能的不具合がある状態になるかもしれない

問題事象の詳細

iframeやスクリプトファイル(CSSJavaScriptXMLなど)は読み込みがブロックされ、画像や動画ファイルはブロックされません。
Chromeではアドレスバーに「i」マークが表示され、クリックすると「このサイトへの接続は完全に保護されていません」というメッセージが表示される。

引用先URL

ChromeがMixed contentの段階的なブロック強化を開始!詳細や対応方法とは? | さくらのSSL

OracleとPostgresSQLのクエリの違い

1クエリにおいてOracleからPostgresSQLに変換した際の違いについて、メモしておきます。

Oracle

  • スキーマ名、テーブル名はダブルコーテーションで囲わなくてもよい
  • 組み込み関数
    • sysdate:SYSDATE
    • trunc:TRUNC(CURRENT_DATE, 'DD') 時間切り捨て
    • デフォルト値:nvl(AAA, '1')

PostgresSQL

  • スキーマ名、テーブル名はダブルコーテーションで囲う
  • 組み込み関数

Elastic Searchとは?

概要

  • 拡張性に優れた全文検索エンジン、複数DBの横断検索が可能、スキーマレスのNoSQL
  • 分析ツール:リアルタイムデータ分析、ログ解析などの分析ができる
  • 関連ツール:ログ集約のLogstashやfluentd、可視化ツールのkibanaと組み合わせて使うことが多い
  • REST APIJSONの送受信で操作する

Elastic Searchの構成要素

Cluster(クラスタ

  • 概要:1つ以上のノードの集合で、データ全体を包括する
  • 検索:インデックスおよびノードの横断的な検索機能を提供する。
  • 識別子:デフォルトではelasticsearch

Node(ノード)

  • 概要:クラスタを構成するサーバ
  • 識別子:デフォルトではノードの起動時に生成されるUUID
  • クラスタ接続:ノードは、クラス名指定でそのクラスタに接続可能。デフォルトはelasticsearchクラスタに接続

ノードの下にインデックスと呼ばれるRDBにおけるDBに値するものを保持する。
以下にRDBと比較しつつ、記載します。

RDBとの違い_概要

ElasticSearchは気軽にデータを保存、削除し、用途に応じたデータ保管形式で保存。
RDBは基本的にデータを永続保管。

  • RDB
    • データ保管:永続的に保管する
    • DB:基本削除しない
    • パフォーマンス:ElasticsearchやNoSQLDBを超えられない。結合処理などがあるため。
  • Elasticsearch
    • データ保管:永続保管ではない。DB(インデックス)を時間間隔やユーザーで区切ったりする、分析や検索用のデータを保管する
    • DB(インデックス):不要になったら捨てる
    • パフォーマンス:拡張性に優れており、パフォーマンスが出しやすい
RDB Elasticsearch
データベース インデックス
テーブル マッピングタイプ
カラム(列) フィールド
レコード(行) ドキュメント

テキスト処理

データ格納時

ElasticsearchではRDBと異なり、テキストデータに関して、挿入データがそのまま格納される訳ではない。
Analyzerという機能により、文字整形や文字分割が行われて格納されている。

  • テキストデータ:textタイプのフィールド ※V5より
  • Analyzer:Tokenizer、Token Filter、Character Filterという文字列分割や変換を行う機能
  • 元データ:stored field(store=trueなフィールド)、または _sourceという特殊フィールドに格納される
  • 特殊フィールド _source:全フィールド(ドキュメント)を保持。設定でデータ圧縮も可能、検索条件不使用フィールドはdisableでインデックスサイズを節約

データ格納例

例1 受信データ:AAA → Analyzer(変換) → aaa
例2 受信データ:「This is a pen」 → Analyzer(分割) ↓

this
is
a
pen

※空白区切り文字で分割、検索時不要文字のピリオドを除去。

データ参照時

検索条件文字列を用いて、検索する際もAnalyzerによって文字列変換や分割文字列の位置情報の利用などが行われます。

データ参照例

例1 クエリ:"term": {"field": "pen"} → 検索ヒット (フィールドには基本小文字で格納されている) 例2 クエリ:"term": {"field": "PEN"} → 検索ヒットせず (termクエリはAnalyzerを用いないため大文字指定ではヒットしない) 例3 クエリ:"match": {"field": "PEN a"} → 検索ヒットせず (matchクエリはAnalyzerを用いるため大文字指定でもヒット。penとaの両方を含む文書がヒット)

マッピングタイプ(テーブル)の特徴

  • マッピングタイプ単位で削除やカラム定義はできないので、RDBのテーブルと同じものと考えてはいけない
  • マッピングタイプ毎に別々のスキーマを保持可能
  • マッピングタイプ全体で、同名のフィールドは同一定義を保持する必要あり

マッピングタイプの定義

フィールド

  • 型:暗黙的に配列型、JSONオブジェクトもほぼそのまま入れられる
  • 値:同じ型の複数の値を保持可能、入力データをトークン毎に切り分けて格納するため、multi-valuedな挙動になっている
  • ソート:配列内の平均値、最大値、中央値といった値を指定してソート条件とする
{
  "f1" : { "p1": 1, "p2": "ABC" } 
}

↓ 変換して扱われる

{
  "f1.p1" : 1, 
  "f1.p2": "ABC" } 
}

フィールドにオブジェクト配列を入れることも可能。その場合は、「nested」というデータタイプを指定する。

データタイプ

Elasticsearch公式

  • 日時の型:DATE, TIME, TIMESTAMPなどはdateにまとまっている
  • 文字列長:CHARとVARCHARのような固定長・可変長の区別なし、最大長は通常指定しない

文字コードUnicodeのみ。異なる文字コードの場合、クライアント側での変更が必要

制約(Constraint)

  • 制約の機能なし。ユニークキーや主キーでレコード(ドキュメント)の一意性を強制はできない
  • ドキュメントの一意性:id、uidで一意性を担保
    • _id:マッピングタイプ内で一意な値。ドキュメントIDを保持するフィールド
    • uid:インデックス内で一意な値。マッピングタイプ名とidの値を区切り文字#で連結したもの

※ドキュメントID:indexAPIの場合はURLの一部、bulkAPIは_idフィールドを指定、未指定の場合は、適当な文字列が設定される

デフォルト値

  • null_valueオプション:nullを明示的に指定した場合のみ有効となり、デフォルト値に近いことができる
  • その他機能でのデフォルト値の機能
    • avg, sumなどの集合関数:metric aggregation
    • ソート: missingオプション

マッピングタイプ変更

  • 変更は基本できない。ALTER TABLE(テーブル変更のクエリ)の代替機能なし
  • 変更時は、インデックス(DB)の再作成、データ再投入が必要

マッピングタイプ削除

  • 削除できない
  • マッピングタイプ内のドキュメントすべて削除するということはできる
POST /index1/_delete_by_query // index名と削除クエリを指定
{
  "query": {
    "type": {
      "value": "type1"  // マッピングタイプを指定
    }
  }
}

elastic(ELK)

ELスタックと呼ばれるセットのサービス Elastic Searchの環境を立ち上げたときにサイドバーに表示されるメニューと使い方は以下

  • Dev tool コンソールでクエリ叩ける

  • Discover 登録データを見れる

参考になる記事

S2Daoのバッチ更新で手動作成SQLファイルを実行できるか調べてみた

ループ内更新による性能劣化を改善するために、S2Daoのバッチ更新で IO回数を減らしたかったので調査しました。

今回は、手動作成SQLファイルの実行を前提としています。

S2Daoのバッチ更新が使える条件

そもそも、手動作成SQLファイルの実行では、バッチ更新できませんでした。。

いろいろ制約があり、S2Daoを使う限り、ループ内SQL実行は避けられないみたいです。

参考

S2Dao_一括更新 http://s2dao.seasar.org/ja/s2dao.html#Batch

Domaなら、S2Daoで出来なかったことができる

@BatchUpdate の exclude 要素に指定されたプロパティを更新対象外が可能。 https://doma.readthedocs.io/en/2.11.0/query/batch-update/#sql

@BatchUpdateのsqlFileにtrueを設定することで、任意のSQLファイルにマッピングできます http://doma.seasar.org/reference/query/batch_update.html

Javaメモリ設定方法と、確認用コマンド

メモリ設定方法

以下の設定を元に考えてみます。

-XX:MaxMetaspaceSize=128m -Xms256m -Xmx256m -Xss1m -XX:NewSize=100m -XX:MaxNewSize=100m

|オプション|説明|設定値目安| |:-|:-|:-|

|MetaSpace|libの読み込み、JSPコンパイル結果つむ|64~256程度| |Xms|ヒープ領域の最小サイズ(初期サイズ)|XmsとXmxは同じ数値を指定| |Xmx|ヒープ領域の最大サイズ|XmsとXmxは同じ数値を指定| |Xss|Java APIで生成するスレッドのスタックサイズ| |NewSize|ヒープ領域内のNew領域のサイズ指定。XmsのNew領域版| |MaxNewSize|ヒープ領域内のNew領域のサイズ指定。XmxのNew領域版|

Xms Xmx

物凄い大きなMapやListを保持する可能性が無い限りは同じ数値を指定するのが望ましい。

Xmxのサイズを大きい状態だと、FGC発生時に最大でXmxのサイズまで拡張されていく。
メモリの拡張確保分だけ、FGCの停止時間が長くなってしまうため、同じサイズにするのが良いとされている。

Old領域

New領域に指定されなかった残りのヒープ領域はOld領域に割かれます。(Xms - NewSize = Old領域)
New領域は最初にインスタンスが格納される領域で、一杯になるとYGCとかマイナーGCなどのGCが走る。
何回かのYGCを生き残ったインスタンスがOldに移動される。

NewとOldは1:2が基本で、Oldが大きい方が安全です。ほぼOld領域に行かないと分かっている場合は、
1:1運用がFGCが発生し難いので効率がよい。

メモリ設定等を確認するうえで良く使うコマンド

JVMのオプションをjps -vで確認し、
jstat で1秒毎のメモリ状況確認する。

jps -v

[user@hostname bin]$ jps -v
11111 Jps -Dapplication.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.35.amzn1.x86_64 -Xms8m
22222 Bootstrap -Dfile.encoding=UTF-8 -XX:MaxMetaspaceSize=64m -Xms80m -Xmx80m -Xss1m -XX:NewSize=40m -XX:MaxNewSize=40m -XX:SurvivorRatio=12 -XX:TargetSurvivorRatio=95 -XX:MaxMetaspaceSize=32m -Dfile.encoding=UTF-8

jps -vはその環境で動作しているJVMの一覧(オプション付き)とプロセスIDを表示可能。
tomcatが動作しているのかの確認にも使用可能。

jstat -gcutil -h{ヘッダ間隔] [プロセスID] [実行間隔]
jstat -gccapacity  [プロセスID] [実行間隔]

[user@hostname bin]$ jstat -gcutil -h20 23436 1000
 S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 0.00  16.46   8.74  45.33  97.03  93.16    865    2.958     1    0.036    2.994
 0.00  16.46  11.03  45.33  97.03  93.16    865    2.958     1    0.036    2.994
 0.00  16.46  12.72  45.33  97.03  93.16    865    2.958     1    0.036    2.994