サービスを作るときの各パラメータ

# 概要

サービスを作るときに、そのサービスの利用者が損益分岐点を超えるかはそのサービスの各パラメータが閾値を超えているかどうかで変わると考える。  
その時のパラメータをまとめる。  

# キャラ付けという考え

これらのパラメータの設定は、サービスのキャラクター付けを考えるのに似ている気がする。  
価格を安くして安くて簡単を目指すのか、価格を高くして高いけど質が高い・機能が多いを目指すのか。  
キャラ被りを無くすと差別化が図ったり、キャラ立ちを目指すことで目立ちやすくすることを目指すと考えると考えやすいかも。  

# パラメータ

## 周知率の高さ

そもそも十分に存在が知られていないとサービスの利用者は増えない。  
存在を知っている人の中でその何割かが利用者になると考える。  
存在を知ったうちの何割が利用者になるかはこの後のパラメータによって決定されると考える。  

## 価格の安さ

一定の価格を下回ると売れる場合がある。  

## 価格の高さ

逆に一定の価格を上回ると売れる場合がある。  
価格の高さが

利用ffmpeg对m3u8生成加密切片

> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [hlsbook.net](https://hlsbook.net/how-to-encrypt-hls-video-with-ffmpeg/)

> In this post, we’ll look at what encryption HLS supports and how to encrypt your videos with ffmpeg. ......

In this post, we’ll look at what encryption HLS supports and how to encrypt your videos with ffmpeg.

Encryption is the process of encoding information in such a way that only authorised parties can read it. The encryption process requires some kind of

随机生成一个AES密钥

AES密钥是一个长度为128位、192位或256位的二进制串。要随机生成一个AES密钥,可以使用随机数生成器来生成一个长度合适的随机二进制串。在 Python 中可以使用以下代码来生成一个随机的 AES 128 位密钥:

```py
import os
key = os.urandom(16)
print(key)
```

1671. Minimum Number of Removals to Make Mountain Array

You may recall that an array arr is a mountain array if and only if: arr.length >= 3 There exists some index i (0-indexed) with 0 < i < arr.length - 1 such that: arr[0] < arr[1] < ... < arr[i - 1] < arr[i] arr[i] > arr[i + 1] > ... > arr[arr.length - 1] Given an integer array nums​​​, return the minimum number of elements to remove to make nums​​​ a mountain array.
/**
 * @param {number[]} nums
 * @return {number}
 */
var minimumMountainRemovals = function(nums) {
    const n = nums.length;
    if (n < 3) return 0;

    // Arrays to store the length of the longest increasing subsequence (LIS) ending at each index
    const inc = new Array(n).fill(1);
    // Arrays to store the length of the longest decreasing subsequence (LDS) starting at each index
    const dec = new Array(n).fill(1);

    // Calculate the LIS ending at each index
    for (let i = 1; i <

preload webfonts

 <!-- Preload webfonts -->
    <link rel="preload" href="/templates/yootheme_custom/webfonts/Comfortaa-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
    <link rel="preload" href="/templates/yootheme_custom/webfonts/Comfortaa-Regular.woff" as="font" type="font/woff" crossorigin="anonymous">
    <link rel="preload" href="/templates/yootheme_custom/webfonts/AveriaSerifLibre-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">
    <link rel="preload" href="/template

Create New Playwright Server

1. clone git repo (how to add new ssh key?)
//2. install nodejs:
//sudo apt update
//sudo apt install nodejs
//3. Install npm
//sudo apt install npm
4. Update nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrc
optional -> list available versions:
nvm list-remote
5. Install node
nvm install v22.2.0
6. Configure config.json
7. npm install
8. npx playwright install
9. npx playwright install-deps

Installing Web Audio Analyzer/Gener

Useful routes on Linux

- [Official Guide](https://www.intel.com/content/www/us/en/develop/documentation/installation-guide-for-intel-oneapi-toolkits-linux/top/installation/install-using-package-managers/apt.html)
- [VMagnin's post](https://fortran-lang.discourse.group/t/intel-releases-oneapi-toolkit-free-fortran-2018/471/43)
- **NOTE**: Make sure to do `sudo apt update` after adding intel's repositories to apt.
- [VMagnin's post regarding sourcing `/opt/intel/oneapi/setvars.sh`](https://fortran-lang.discourse.group/t/

body class label (top left)

/** * Dit script voegt een detector toe aan de pagina die de huidige body class weergeeft. * De body class kan een van de volgende waarden zijn: 's', 'm', 'l', 'xl', 'xxl'. * De detector wordt linksboven op de pagina weergegeven en wordt bijgewerkt wanneer de body class verandert. * * Functionaliteiten: * 1. Verwijdert een bestaande detector als die er al is. * 2. Maakt een nieuwe detector en voegt deze toe aan de pagina. * 3. Detecteert de huidige body class en werkt de detector bij. * 4. Observeert wijzigingen aan de body class en werkt de detector bij wanneer de class verandert. */
/**
 * Dit script voegt een detector toe aan de pagina die de huidige body class weergeeft.
 * De body class kan een van de volgende waarden zijn: 's', 'm', 'l', 'xl', 'xxl'.
 * De detector wordt linksboven op de pagina weergegeven en wordt bijgewerkt wanneer de body class verandert.
 * 
 * Functionaliteiten:
 * 1. Verwijdert een bestaande detector als die er al is.
 * 2. Maakt een nieuwe detector en voegt deze toe aan de pagina.
 * 3. Detecteert de huidige body class en werkt de detecto

Slider

<?php if(function_exists('jssor_slider_shortcode')){
    if(is_home() || is_front_page() ){
        echo do_shortcode('[jssor-slider]');
    }
} ?>

Slim SEO hide meta boxes for certain post types

function plt_hide_slim_seo_metaboxes() {
	$screen = get_current_screen();
	if ( !$screen ) {
		return;
	}

	// Define the post types where you want to hide the Slim SEO meta box
	$allowed_post_types = ['player', 'club', 'court'];

	// Check if the current screen's post type is in the allowed list
	if (in_array($screen->post_type, $allowed_post_types)) {
		// Hide the "Search Engine Optimization" meta box for the specified post types
		remove_meta_box('slim-seo', $screen->id, 'normal');
	}
}
add_

2684. Maximum Number of Moves in a Grid

You are given a 0-indexed m x n matrix grid consisting of positive integers. You can start at any cell in the first column of the matrix, and traverse the grid in the following way: From a cell (row, col), you can move to any of the cells: (row - 1, col + 1), (row, col + 1) and (row + 1, col + 1) such that the value of the cell you move to, should be strictly bigger than the value of the current cell. Return the maximum number of moves that you can perform.
/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxMoves = function(grid) {
    const rows = grid.length;
    const cols = grid[0].length;
    
    // Create a memoization table to store the maximum moves from each cell.
    const memo = Array.from({ length: rows }, () => Array(cols).fill(-1));

    // Function to perform DFS with memoization.
    function dfs(row, col) {
        // If the value is already computed, return it.
        if (memo[row][col] !== -1) {
            return m

Estimator template for Regression

import numpy as np
from sklearn.base import BaseEstimator, RegressorMixin
from sklearn.utils.validation import check_X_y, check_array
from sklearn.model_selection import cross_val_score, ShuffleSplit
from sklearn.ensemble import RandomForestRegressor


class TemplateRegressor(RegressorMixin, BaseEstimator):
    """Regressor based on Random Forest Regressor"""

    """model parameters"""
    # model id
    model_version = '0.1.0'
    # model
    seed=42
    n_estimators = 100
    

vite


tailwind.config.js
postcss.config.js
vite.config.js


<head>
    @vite('resources/css/app.css')
</head>

JS - formatMoneyPrice Shopify

window.theme.formatMoney = function (cents, format) {
  if (typeof cents === 'string') {
    cents = cents.replace('.', '');
  }
  let value = '';
  const placeholderRegex = /\{\{\s*(\w+)\s*\}\}/;
  const formatString = format || window.theme.moneyFormat;

  switch (formatString.match(placeholderRegex)[1]) {
    case 'amount':
      value = formatWithDelimiters(cents, 2);
      break;
    case 'amount_no_decimals':
      value = formatWithDelimiters(cents, 0);
      break;
    cas

flexとcontentsでは入れ替えられない順番をgridで入れ替え、セルごとに固有の幅を指定する

<div class="container">
  <div class="box1">box1</div>
  <div class="box2">
    <div class="box2-1">box2</div>
    <div class="box2-2">box3</div>
  </div>
</div>