{%- liquid
assign rating_value = product.metafields.yotpo.reviews_average.value
assign rating_count = product.metafields.yotpo.reviews_count.value
-%}
{%- capture product_category -%}
{{- product.category.ancestors | join: ' > ' | append: ' > ' | append: product.category.name -}}
{%- endcapture -%}
{%- capture merchant_policy_json -%}
{
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
The Fruit That Fell from the Sky: Getting Hooked on Suika Game# You can now run tests that have a particular tag with --grep command line option.
npx playwright test --grep @fast
// https://playwright.dev/docs/test-annotations#tag-tests
// To tag a test, either provide an additional details object when declaring a test, or add @-token to the test title. Note that tags must start with @ symbol.
import { test, expect } from '@playwright/test';
test.describe('group', {
tag: '@report',
}, () => {
test('test report header', async ({ page }) => {
// ...
});
test('test full report', {
tag: ['@slow', '@vrt'],
}, async ({ page }) => {
// ...
});
});
export class ScrollDirectionObserver {
/**
* Lightweight scroll direction tracker using rAF throttling.
*
* @param {(direction: 'up' | 'down', scrollY: number) => void} callback
* @param {{ threshold?: number }} [options]
* threshold – minimum px scrolled before direction fires (defaults to 4)
*/
constructor(callback, options = {}) {
this._callback = callback;
this._threshold = options.threshold ?? 4;
this._lastScrollY = window.scrollY;
this._ticking = fal[id="appMenu-update-manual-notification"],[id="appMenu-update-available-notification"],.autocomplete-richlistitem[type="insecureWarning"],#private-browsing-indicator-with-label,#tabs-newtab-button,#new-tab-button,
.urlbarView-button,.tab-label-container,#urlbar:NOT(.SEARCHBUTTON)>#urlbar-input-container>#identity-box[pageproxystate="invalid"],.tabbrowser-tab .tab-close-button,.titlebar-buttonbox-container,#identity-icon-label,
.urlbarView-row[tip-type="intervention_update_web"],#context-sep-bidi#BROWSER{-MOZ-BOX-ORDINAL-GROUP:0!IMPORTANT;ORDER:0!IMPORTANT}#navigator-toolbox-background{-MOZ-BOX-ORDINAL-GROUP:1!IMPORTANT;ORDER:1!IMPORTANT}#titlebar{ORDER:2;-MOZ-APPEARANCE:NONE!IMPORTANT;--tabs-navbar-shadow-size:0;}
.titlebar-spacer[type="pre-tabs"],.titlebar-spacer[type="post-tabs"]{WIDTH:0!IMPORTANT}.titlebar-buttonbox toolbarbutton{MARGIN-TOP:-0.5PX!IMPORTANT;MARGIN-RIGHT:-0.5PX!IMPORTANT}
:ROOT :is(panel, menupopup) {--arrowpanel-header-back-icon-padding:0!IMPORTANT}menupopup>menuite⚪ᗩ⚪ИN⚪人⚪ᗱᗴ⚪ᴥ⚪◯⚪ᗱᗴ⚪ᗝ⚪◯⚪ᔓᔕ⚪ᗩ⚪ꖴ⚪ᴥ⚪ᗩ⚪◯⚪ИN⚪ᗩ⚪ᑎ⚪ᒍᒐ⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ᒍᒐ⚪ᑎ⚪ᗩ⚪ИN⚪◯⚪ᗩ⚪ᴥ⚪ꖴ⚪ᗩ⚪ᔓᔕ⚪◯⚪ᗝ⚪ᗱᗴ⚪◯⚪ᴥ⚪ᗱᗴ⚪人⚪ИN⚪ᗩ⚪[0]=1;
⚪ᗩ⚪ИN⚪人⚪ᗱᗴ⚪ᴥ⚪◯⚪ᗱᗴ⚪ᗝ⚪◯⚪ᔓᔕ⚪ᗩ⚪ꖴ⚪ᴥ⚪ᗩ⚪◯⚪ИN⚪ᗩ⚪ᑎ⚪ᒍᒐ⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ᒍᒐ⚪ᑎ⚪ᗩ⚪ИN⚪◯⚪ᗩ⚪ᴥ⚪ꖴ⚪ᗩ⚪ᔓᔕ⚪◯⚪ᗝ⚪ᗱᗴ⚪◯⚪ᴥ⚪ᗱᗴ⚪人⚪ИN⚪ᗩ⚪[⚪ИN⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ИN⚪_Integer?Positive]:=⚪ᗩ⚪ИN⚪人⚪ᗱᗴ⚪ᴥ⚪◯⚪ᗱᗴ⚪ᗝ⚪◯⚪ᔓᔕ⚪ᗩ⚪ꖴ⚪ᴥ⚪ᗩ⚪◯⚪ИN⚪ᗩ⚪ᑎ⚪ᒍᒐ⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ᒍᒐ⚪ᑎ⚪ᗩ⚪ИN⚪◯⚪ᗩ⚪ᴥ⚪ꖴ⚪ᗩ⚪ᔓᔕ⚪◯⚪ᗝ⚪ᗱᗴ⚪◯⚪ᴥ⚪ᗱᗴ⚪人⚪ИN⚪ᗩ⚪[⚪ИN⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ИN⚪]=Sum[2^((⚪✻⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪✻⚪ (⚪✻⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪✻⚪-1)-⚪ИN⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ИN⚪ (⚪ИN⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ИN⚪-1))/2) ⚪ᗩ⚪ИN⚪人⚪ᗱᗴ⚪ᴥ⚪◯⚪ᗱᗴ⚪ᗝ⚪◯⚪ᔓᔕ⚪ᗩ⚪ꖴ⚪ᴥ⚪ᗩ/**
* @param {string} s
* @param {number} minJump
* @param {number} maxJump
* @return {boolean}
*/
var canReach = function(s, minJump, maxJump) {
const n = s.length;
const reachable = new Array(n).fill(false);
reachable[0] = true;
// prefix[i] = number of reachable positions in [0..i]
const prefix = new Array(n).fill(0);
prefix[0] = 1;
for (let i = 1; i < n; i++) {
// Only check if s[i] == '0'
if (s[i] === '0') {
// We want to know i#BROWSER{-MOZ-BOX-ORDINAL-GROUP:0!IMPORTANT;ORDER:0!IMPORTANT}#navigator-toolbox-background{-MOZ-BOX-ORDINAL-GROUP:1!IMPORTANT;ORDER:1!IMPORTANT}#titlebar{ORDER:2;-MOZ-APPEARANCE:NONE!IMPORTANT;--tabs-navbar-shadow-size:0;}
.titlebar-spacer[type="pre-tabs"],.titlebar-spacer[type="post-tabs"]{WIDTH:0!IMPORTANT}.titlebar-buttonbox toolbarbutton{MARGIN-TOP:-0.5PX!IMPORTANT;MARGIN-RIGHT:-0.5PX!IMPORTANT}
:ROOT :is(panel, menupopup) {--arrowpanel-header-back-icon-padding:0!IMPORTANT}menupopup>menuite⚪ᗩ⚪ИN⚪人⚪ᗱᗴ⚪ᴥ⚪◯⚪ᗱᗴ⚪ᗝ⚪◯⚪ᔓᔕ⚪ᗩ⚪ꖴ⚪ᴥ⚪ᗩ⚪◯⚪ИN⚪ᗩ⚪ᑎ⚪ᒍᒐ⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ᒍᒐ⚪ᑎ⚪ᗩ⚪ИN⚪◯⚪ᗩ⚪ᴥ⚪ꖴ⚪ᗩ⚪ᔓᔕ⚪◯⚪ᗝ⚪ᗱᗴ⚪◯⚪ᴥ⚪ᗱᗴ⚪人⚪ИN⚪ᗩ⚪[0]=1;
⚪ᗩ⚪ИN⚪人⚪ᗱᗴ⚪ᴥ⚪◯⚪ᗱᗴ⚪ᗝ⚪◯⚪ᔓᔕ⚪ᗩ⚪ꖴ⚪ᴥ⚪ᗩ⚪◯⚪ИN⚪ᗩ⚪ᑎ⚪ᒍᒐ⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ᒍᒐ⚪ᑎ⚪ᗩ⚪ИN⚪◯⚪ᗩ⚪ᴥ⚪ꖴ⚪ᗩ⚪ᔓᔕ⚪◯⚪ᗝ⚪ᗱᗴ⚪◯⚪ᴥ⚪ᗱᗴ⚪人⚪ИN⚪ᗩ⚪[⚪ИN⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ИN⚪_Integer?Positive]:=⚪ᗩ⚪ИN⚪人⚪ᗱᗴ⚪ᴥ⚪◯⚪ᗱᗴ⚪ᗝ⚪◯⚪ᔓᔕ⚪ᗩ⚪ꖴ⚪ᴥ⚪ᗩ⚪◯⚪ИN⚪ᗩ⚪ᑎ⚪ᒍᒐ⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ᒍᒐ⚪ᑎ⚪ᗩ⚪ИN⚪◯⚪ᗩ⚪ᴥ⚪ꖴ⚪ᗩ⚪ᔓᔕ⚪◯⚪ᗝ⚪ᗱᗴ⚪◯⚪ᴥ⚪ᗱᗴ⚪人⚪ИN⚪ᗩ⚪[⚪ИN⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ИN⚪]=Sum[2^((⚪✻⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪✻⚪ (⚪✻⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪✻⚪-1)-⚪ИN⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ИN⚪ (⚪ИN⚪◌⚪◌⚪◌⚪◌⚪◌⚪◌⚪ИN⚪-1))/2) ⚪ᗩ⚪ИN⚪人⚪ᗱᗴ⚪ᴥ⚪◯⚪ᗱᗴ⚪ᗝ⚪◯⚪ᔓᔕ⚪ᗩ⚪ꖴ⚪ᴥ⚪ᗩCreate a `docker-compose.yml` file in an empty folder:
```yaml
version: '3.9'
services:
postgres:
image: postgres:16
container_name: postgresDB
restart: unless-stopped
environment:
POSTGRES_USER: raghu
POSTGRES_PASSWORD: password
POSTGRES_DB: postgresDB
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7
container_name: redisDB
restart: unless-stopped
ports:
- "6379:6379"
start:
.infrastructure-ffw/lando/init.sh
se il processo fallisce fare:
lando ssh
e
COMPOSER_MEMORY_LIMIT=-1 composer install --no-interaction -o
dopo:
mettere il db nella root progetto_country.sql
./scripts/lando-build.sh nutella us
<script>
jQuery(document).ready(function($) {
$("img").mouseenter(function() {
let $lwp_title = $(this).attr("title");
$(this).attr("lwp_title", $lwp_title);
$(this).attr("title", "");
}).mouseleave(function() {
let $lwp_title = $(this).attr("lwp_title");
$(this).attr("title", $lwp_title);
$(this).removeAttr("lwp_title");
});
});
</script>/**
* @param {number[]} arr
* @param {number} d
* @return {number}
*/
var maxJumps = function(arr, d) {
const n = arr.length;
const dp = Array(n).fill(1);
// Sort indices by height (ascending)
const order = [...Array(n).keys()].sort((a, b) => arr[a] - arr[b]);
for (const i of order) {
// Explore left
for (let x = 1; x <= d; x++) {
const j = i - x;
if (j < 0 || arr[j] >= arr[i]) break;
dp[i] = Math.max(dp[i], 1 + dp[j]# ログへの機密情報出力と対策(備忘録)
## 何をすると何が起きるか
- `console.log(req.body)` 等でリクエストボディ全体をログ出力すると、パスワードやトークンが平文でログに残る。
- ログ集約サービス(CloudWatch、Datadog、Splunk等)へ送られると、複数のエンジニアや外部SREベンダーが閲覧可能になる。
- 削除を忘れ、かつ保管期間が無期限だと、機密情報がログに永久保存される。CloudWatch Logsの保管期間はデフォルトで無期限。
- パスワードやクレジットカード番号がログに含まれると、PCI DSSやGDPR等のコンプライアンス違反に該当する。
- ログ基盤が侵害された場合、平文のため攻撃者は復号せずに情報を取得できる。
## ログに出力してはいけないデータ
- パスワード、パスワードリセットトークン
- セッションID、JWTトークン
- クレジットカード番号
- マイナンバー、住所、電話番号
- APIキー、シークレットキー
## 対策
1. リクエストボディ全体をログ出力しない。必要なフィールドのみ明示的に選択