マーケ用語について、触れたものに関して記載していきます。
リテンション
お得意様で居続けてくれること(既存顧客維持)
リピートがつきやすい店舗を分析して、効果的な施策を出す
マーケ用語について、触れたものに関して記載していきます。
お得意様で居続けてくれること(既存顧客維持)
リピートがつきやすい店舗を分析して、効果的な施策を出す
セールス用語について、触れたものに関して記載していきます。
店舗やメーカーに対しての愛着や信頼度が高いユーザーに特に有効な施策
httpsページ内にhttp(非暗号化通信)で読み込んでいるファイルが存在(混在)している状態を指します。
iframeやスクリプトファイル(CSS・JavaScript・XMLなど)は読み込みがブロックされ、画像や動画ファイルはブロックされません。
Chromeではアドレスバーに「i」マークが表示され、クリックすると「このサイトへの接続は完全に保護されていません」というメッセージが表示される。
1クエリにおいてOracleからPostgresSQLに変換した際の違いについて、メモしておきます。
ノードの下にインデックスと呼ばれるRDBにおけるDBに値するものを保持する。
以下にRDBと比較しつつ、記載します。
ElasticSearchは気軽にデータを保存、削除し、用途に応じたデータ保管形式で保存。
RDBは基本的にデータを永続保管。
RDB | Elasticsearch |
---|---|
データベース | インデックス |
テーブル | マッピングタイプ |
カラム(列) | フィールド |
レコード(行) | ドキュメント |
ElasticsearchではRDBと異なり、テキストデータに関して、挿入データがそのまま格納される訳ではない。
Analyzerという機能により、文字整形や文字分割が行われて格納されている。
例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の両方を含む文書がヒット)
{ "f1" : { "p1": 1, "p2": "ABC" } } ↓ 変換して扱われる { "f1.p1" : 1, "f1.p2": "ABC" } }
フィールドにオブジェクト配列を入れることも可能。その場合は、「nested」というデータタイプを指定する。
※ 文字コード:Unicodeのみ。異なる文字コードの場合、クライアント側での変更が必要
※ドキュメントID:indexAPIの場合はURLの一部、bulkAPIは_idフィールドを指定、未指定の場合は、適当な文字列が設定される
POST /index1/_delete_by_query // index名と削除クエリを指定 { "query": { "type": { "value": "type1" // マッピングタイプを指定 } } }
ELスタックと呼ばれるセットのサービス Elastic Searchの環境を立ち上げたときにサイドバーに表示されるメニューと使い方は以下
Dev tool コンソールでクエリ叩ける
Discover 登録データを見れる
ループ内更新による性能劣化を改善するために、S2Daoのバッチ更新で IO回数を減らしたかったので調査しました。
今回は、手動作成SQLファイルの実行を前提としています。
そもそも、手動作成SQLファイルの実行では、バッチ更新できませんでした。。
いろいろ制約があり、S2Daoを使う限り、ループ内SQL実行は避けられないみたいです。
S2Dao_一括更新 http://s2dao.seasar.org/ja/s2dao.html#Batch
@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
以下の設定を元に考えてみます。
-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領域版|
物凄い大きなMapやListを保持する可能性が無い限りは同じ数値を指定するのが望ましい。
Xmxのサイズを大きい状態だと、FGC発生時に最大でXmxのサイズまで拡張されていく。
メモリの拡張確保分だけ、FGCの停止時間が長くなってしまうため、同じサイズにするのが良いとされている。
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