dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

Typescript で sleep

2024-01-30 23:36:23 | Node.js
TypeScript で sleep する方法のメモ。
■プログラム
import { setTimeout } from 'timers/promises';

(async () => {
  console.log('before wait');
  await setTimeout(3000);
  console.log('after wait');
})();

■実行結果
before wait
after wait


jq コマンドで URL エンコード

2024-01-28 20:33:42 | linux
jq コマンドで文字列を URL エンコードする方法のメモ。

以下のように jq コマンドで文字列を URL エンコードすることができます。
$ ENC=`echo -n 'abc あいう def' | jq -Rr @uri`
$ echo ${ENC}
abc%20%E3%81%82%E3%81%84%E3%81%86%20def

echo の -n は文字列を改行しないで出力。
jq の -R は raw-input、-r は raw-output。

半角スペースは %20 にエンコードされています。

python で excel ファイルを生成

2024-01-25 00:18:35 | python
python で excel ファイルを作成する方法のメモ。
import xlsxwriter

class ExcelConverter:
    def __init__(self, fname):
        self.workbook = xlsxwriter.Workbook(fname)
        self.worksheet = self.workbook.add_worksheet()
	
        # 赤・ボールド
        self.strong = self.workbook.add_format({'color': 'red', 'bold': True})

        # 上・左詰め・折り返し
        self.cell_format = self.workbook.add_format()
        self.cell_format.set_text_wrap()
        self.cell_format.set_align('left')
        self.cell_format.set_align('top')

        self.data_idx = 0
        self.row = 0

    # ヘッダ行を出力する
    def output_header(self):
        self.row += 1

        cell = f'A{self.row}'
        self.worksheet.write(cell, '行番号')

        cell = f'B{self.row}'
        self.worksheet.write(cell, 'データ')

    # データを出力する
    def output_data(self, obj):
        self.data_idx += 1
        self.row += 1

        # 行番号
        cell = f'A{self.row}'
        self.worksheet.set_column(f'{cell}:{cell}', 7, self.cell_format)
        self.worksheet.write(cell, self.data_idx)

        # データ
        cell = f'B{self.row}'
        self.worksheet.set_column(f'{cell}:{cell}', 15, self.cell_format)
        self.worksheet.write(cell, obj['product-id'])

    def close(self):
        self.workbook.close()

def main():
    out_fname = sys.argv[1]

    conv = ExcelConverter(out_fname)
    conv.output_header()

    for line in sys.stdin:
        try:
            obj = json.loads(line)
            conv.output_data(obj)
        except Exception as e:
            try:
                sys.stderr.write(json.dumps(obj, ensure_ascii=False) + '\n')
                sys.stderr.write(e)
                sys.stderr.write('\n')
            except:
                pass

    conv.close()


TypeScript で WordPress に記事を登録・更新

2024-01-24 00:10:04 | Node.js
TypeScript で WordPress に記事を登録する方法のメモ。
Advanced Custom Fields(ACF)で作成したフィールドは fields でフィールドの値を指定します。

■登録
import WPAPI from 'wpapi';

async function create(article) {
  // オレオレ証明書を許可
  process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

  const wpapi = new WPAPI({
    endpoint: 'https://{ドメイン}/wordpress/wp-json',
    username: '{ユーザID}',
    password: 'uuuu vvvv wwww xxxx yyyy zzzz', // アプリケーションパスワード
  });

  const res = await wpapi.posts().create(article);
  return res;
}

(async () => {
  const article = {
    title: 'タイトル',
    fields: {
      main: '本文',
      ...
    },
  };
  const res = await create(article);
  console.log(res);
})();

レスポンス
{
  id: 1,
  ...
  status: '',
  type: 'post',
  ...
  title: {
    raw: 'タイトル',
    rendered: 'タイトル'
  },
  ...
  acf: {
    main: '本文',
    ...
  },
  ...
}

■更新
import WPAPI from 'wpapi';

async function update(id, article) {
  // オレオレ証明書を許可
  process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

  const wpapi = new WPAPI({
    endpoint: 'https://{ドメイン}/wordpress/wp-json',
    username: '{ユーザID}',
    password: 'uuuu vvvv wwww xxxx yyyy zzzz', // アプリケーションパスワード
  });

  const resCreate = await wpapi.posts().id(id).update(article);
  return resCreate;
}

(async () => {
  const article = {
    // status: draft / publish
    status: 'publish',
    title: '新タイトル',
    fields: {
      main_text: '新本文',
      ...
    },
  };
  const res = await update(1, article);
  console.log(res);
})();


TypeScript で WordPress API を使って記事データを取得

2024-01-17 23:24:05 | Node.js
TypeScript で WordPress API を使って記事データを取得する方法のメモ。

■wpapi のインストール
npm install wpapi
npm install @type/wpapi

■プログラム
import WPAPI from 'wpapi';

async function getPost(id_num) {
  const wpapi = new WPAPI({
    endpoint: 'http://xxx.yyy.zzz/wordpress/wp-json',
    username: '{user}',
    password: '{password}',
  });

  // 指定ID
  const res = await wpapi.posts().id(100);
  return res;
}

(async () => {
  const res = await getPost(100);
  console.log(res);
})();

■実行
$ ts-node test_get_article1.ts
{
  id: 100,
  date: '2024-01-15T17:34:22',
  date_gmt: '2024-01-15T08:34:22',
  guid: { rendered: 'http://xxx.yyy.zzz/wordpress/?p=100' },
  modified: '2024-01-15T17:34:32',
  modified_gmt: '2024-01-15T08:34:32',
  slug: '...',
  status: '1',
  type: 'post',
  link: 'http://xxx.yyy.zzz/wordpress/archives/100',
  title: { rendered: 'タイトル タイトル タイトル' },
  ...
}



ts-node でエラーがでる場合の設定

2024-01-17 23:12:23 | Node.js
ts-node でエラーがでる場合の package.json、tsconfig.json の設定のメモ。
■package.json
{
  "type": "module",
  "dependencies": {
  },
  "devDependencies": {
  }
}

■tsconfig.json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "esModuleInterop": true
  },
  "ts-node": {
    "esm": true
  }
}


Elasticsearch で複数のフィールドでグループ化してカウント

2024-01-16 00:10:25 | elasticsearch
Elasticsearch で複数のフィールドでレコード数をカウントする方法のメモ。

■クエリ
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "count_name_value": {
      "multi_terms": {
        "terms": [{ "field": "name" }, { "field": "value" }],
        "size": 2
      }
    }
  },
  "_source": ["name", "value"],
  "size": 0
}

■実行結果
{
  "took" : 23,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "count_name_value" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 1,
      "buckets" : [
        {
          "key" : [
            "3",
            "3"
          ],
          "key_as_string" : "3|3",
          "doc_count" : 3
        },
        {
          "key" : [
            "2",
            "2"
          ],
          "key_as_string" : "2|2",
          "doc_count" : 2
        }
      ]
    }
  }
}

MySQL 8.0 でカタカナ・ひらがなを区別する COLLATE の設定

2024-01-03 13:23:30 | mysql
以前、MySQL 8.0 でカタカナ、ひらがなを区別して検索できるようにするために、以下のブログで varchar binary の検証を行いました。
mysql 8.0 でカタカナ、ひらがなを区別して検索する方法

今回は COLLATE で、ひらがな・カタカナを区別する方法の検証を行います。

COLLATE が utf8mb4_0900_ai_ci の場合、ひらがなとカタカナを区別しません。
mysql> select @@collation_database;
+----------------------+
| @@collation_database |
+----------------------+
| utf8mb4_0900_ai_ci   |
+----------------------+

mysql> select strcmp('あいう', 'アイウ');
+----------------------------------+
| strcmp('あいう', 'アイウ')       |
+----------------------------------+
|                                0 |
+----------------------------------+

COLLATE が utf8mb4_ja_0900_as_cs_ks の場合には、ひらがなとカタカナを区別することができます。
mysql> select strcmp('あいう' collate utf8mb4_ja_0900_as_cs_ks, 'アイウ' collate utf8mb4_ja_0900_as_cs_ks);
+----------------------------------------------------------------------------------------------------+
| strcmp('あいう' collate utf8mb4_ja_0900_as_cs_ks, 'アイウ' collate utf8mb4_ja_0900_as_cs_ks)       |
+----------------------------------------------------------------------------------------------------+
|                                                                                                 -1 |
+----------------------------------------------------------------------------------------------------+

alter database でデータベースの COLLATE を utf8mb4_ja_0900_as_cs_ks に変更します。
mysql> alter database collate 'utf8mb4_ja_0900_as_cs_ks';
Query OK, 1 row affected (0.01 sec)

mysql> select @@collation_database;
+--------------------------+
| @@collation_database     |
+--------------------------+
| utf8mb4_ja_0900_as_cs_ks |
+--------------------------+

テーブルを作成し、ひらがな・カタカナの文字列を登録します。
mysql> create table test1 ( str varchar(8) );
Query OK, 0 rows affected (0.04 sec)

mysql> insert into test1 values ('あいう'), ('アイウ');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

以下のように、ひらがなとカタカナを区別して検索することができます。
mysql> select * from test1 where str = 'あいう';
+-----------+
| str |
+-----------+
| あいう |
+-----------+

mysql> select * from test1 where str = 'アイウ';
+-----------+
| str |
+-----------+
| アイウ |
+-----------+