2021年12月1日水曜日

楽天ラッキーくじの当選を整理する。【2021年12月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年11月】
日付当選数当選サービス
12/11【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
12/21InfoseekNewsラッキーくじ
12/33Rakuten Link限定ラッキースロット 第2弾、楽天ブログ ラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
12/41楽天トラベル ラッキーくじ
12/52楽天Edy スマホ ラッキーくじ、楽天トラベル ラッキーくじ
12/63楽天リワード ラッキーくじ、楽天ブログ ラッキーくじ、【楽天レシピ】ラッキーくじ 
12/72InfoseekNewsラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
12/81マネ活ラッキーくじ
12/90
12/102【楽天カード】じゃんけん勝者限定くじ、【楽天ポイント活動部】ラッキーくじ(2021年11月~2月通常版)
12/112【楽天ポイント活動部】ラッキーくじ(2021年11月~2月通常版)、楽天トラベル ラッキーくじ
12/122マネ活ラッキーくじ、 楽天リワード ラッキーくじ
12/133【楽天ポイント活動部】ラッキーくじ(2021年11月~2月通常版)、楽天トラベル ラッキーくじ、【楽天ブックス】facebookラッキーくじ
12/141楽天リワード ラッキーくじ
12/151楽天トラベル ラッキーくじ
12/162【楽天ポイント活動部】ラッキーくじ(2021年11月~2月通常版)、楽天トラベル ラッキーくじ
12/172【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天トラベル ラッキーくじ
12/180
12/190
12/200
12/211楽天Edyラッキーくじ
12/221楽天トラベル ラッキーくじ
12/231【楽天くじ広場】ラッキーくじ
12/242【楽天レシピ】ラッキーくじ 、【楽天toto】楽天totoラッキーくじ
12/252楽天リワード ラッキーくじ、楽天トラベル ラッキーくじ
12/262楽天Edyラッキーくじ、マネ活ラッキーくじ
12/271楽天リワード ラッキーくじ
12/283Rakuten Link限定ラッキースロット 第3弾、【楽天ポイント活動部】ラッキーくじ(2021年11月~2月通常版)、楽天トラベル ラッキーくじ
12/291マネ活ラッキーくじ
12/300
12/310
合計:40、平均=1.3

2021年10月31日日曜日

楽天ラッキーくじの当選を整理する。【2021年11月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年10月】
日付当選数当選サービス
11/11楽天トラベル ラッキーくじ
11/21【楽天ブックス】facebookラッキーくじ
11/30
11/40
11/51楽天ラッキーくじ
11/60
11/74Rakuten Link限定ラッキースロット 第2弾、楽天リワード ラッキーくじ、楽天リワード ラッキーくじ、【楽天ブックス】facebookラッキーくじ
11/80
11/93マネ活ラッキーくじ、楽天ブックス・ラッキーくじ、楽天トラベル ラッキーくじ
11/101【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版
11/112マネ活ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
11/121楽天トラベル ラッキーくじ
11/132Rakuten TV ラッキーくじ、Rakuten Link限定ラッキースロット 第2弾
11/142【楽天toto】楽天totoラッキーくじ、リワード特集ページ ラッキーくじ
11/153楽天Edyラッキーくじ、マネ活ラッキーくじ、楽天トラベル ラッキーくじ
11/161マネ活ラッキーくじ
11/173楽天カードラッキーくじ、楽天リワード ラッキーくじ 、マネ活ラッキーくじ
11/181楽天ブログ ラッキーくじ 
11/1911LINE限定 毎日引けるくじ、楽天トラベル ラッキーくじ
11/201楽天トラベル ラッキーくじ
11/213【楽天カード】じゃんけん勝者限定くじ、【楽天ブックス】facebookラッキーくじ、Rakuten TV ラッキーくじ
11/223【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)、楽天トラベル ラッキーくじ、Rakuten TV ラッキーくじ
11/232【楽天カード】じゃんけん勝者限定くじ、楽天リワード ラッキーくじ
11/242楽天トラベル ラッキーくじ、楽天ブログ ラッキーくじ 
11/251【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
11/260
11/272楽天リワード ラッキーくじ、楽天トラベル ラッキーくじ
11/280
11/292マネ活ラッキーくじ、楽天トラベル ラッキーくじ
11/301楽天トラベル ラッキーくじ
合計:54、平均=1.8

2021年10月3日日曜日

【moto】motoでtransact_write_itemsをモックする。【Python】

motoでtransact_write_itemsをモックする。

moto と transact_write_items で検索すると、motoを拡張してモックする方法が上位に表示される。詳しく調べていないが、moto 2.2.4 では拡張せずともモックできるので、サンプルを提示したい。

この記事ではテストコードは一部だけ記載するので、完全なものは https://github.com/tomohikoseven/moto_transact_write_items を参照ください。

実装コード

実装したコードは、ClickCountというテーブルにItemをトランザクションで追加・更新(アトミックカウンタ)するものです。DynamoDBをご存知の方には、簡単なものかと思います。

簡単に説明すると、以下の実装コードはハッシュキー:month は文字列 YYYYMM を、レンジキー(ソートキー):date は文字列 YYYYMMDD を期待して、1トランザクションで2つのItemに対し、clickCountをカウントUPするものになります。

トランザクションの1つ目は日付の末尾が00となっており、月間のclickCountをカウントUPします。今回の記事では気にすることではないです。


(index.py)
import boto3


client = boto3.client('dynamodb',  region_name='ap-northeast-1')
def lambda_handler( month:str, date:str ):
  try:
    response = client.transact_write_items(
      TransactItems=[
        {
          'Update' : {
            'Key' : {
              'hKey': { 'S': month },
              'rKey': { 'S': month + '00' }
            },
            'TableName':'ClickCount',
            'UpdateExpression': 'ADD clickCount :increment',
            'ExpressionAttributeValues' : {
              ':increment': { 'N': '1' }
            }
          }
        },
        {
          'Update' : {
            'Key' : {
              'hKey': { 'S': month },
              'rKey': { 'S': date }
            },
            'TableName':'ClickCount',
            'UpdateExpression': 'ADD clickCount :increment',
            'ExpressionAttributeValues' : {
              ':increment': { 'N': '1' }
            }
          }
        }
      ]
    )
  except Exception as e :
    print("===")
    print(e)
    raise e

  return 200

テストコード

pytestでテストコードを実行します。

motoでモックするテストコードを記述したことがある方は難しいことはないです。mock_dynamodb2をimportして、アノテーション@mock_dynamodb2をテストケースに付けてやればよいです。


(test_index.py)

# 本当のテストは1ケースだけではないので、ここでは余分なライブラリがインポートされています。
from importlib import import_module
import boto3
from moto import mock_dynamodb2
from unittest import mock
from botocore.exceptions import ClientError
import pytest


@mock_dynamodb2
def test_success(set_dynamodb_Count):
  # mock dynamodb
  table = set_dynamodb_Count()

  month = '202101'
  date = '20210101'
  from src.index import lambda_handler
  res = lambda_handler( month, date )

  item = table.get_item(Key={'hKey':month, 'rKey': date})
  assert res == 200
  assert item['Item']['clickCount'] == 1

conftest.pyに set_dynamodb_Count を記載しています。テストにはこちらも必要になります。test_index.pyと同一フォルダに置いてください。


(conftest.py)
import pytest
import boto3

@pytest.fixture
def set_dynamodb_Count():
  def definition():
    dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1')
    dynamodb.create_table(
      TableName='ClickCount',
      KeySchema=[
          {
              'AttributeName': 'hKey',
              'KeyType': 'HASH'
          },
          {
              'AttributeName': 'rKey',
              'KeyType': 'RANGE'
          }
      ],
      AttributeDefinitions=[
          {
              'AttributeName': 'hKey',
              'AttributeType': 'S'
          },
          {
              'AttributeName': 'rKey',
              'AttributeType': 'S'
          }
      ],
    )

    return dynamodb.Table('ClickCount')
  return definition

2021年9月30日木曜日

楽天ラッキーくじの当選を整理する。【2021年10月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年9月】
日付当選数当選サービス
10/10
10/23楽天Edyラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、【楽天ブックス】facebookラッキーくじ
10/31毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる
10/40
10/50
10/61【楽天ブックス】facebookラッキーくじ
10/73楽天ラッキーくじ、楽天カレンダーラッキーくじ、【楽天カード】じゃんけん勝者限定くじ
10/81楽天トラベル ラッキーくじ
10/94楽天Edyラッキーくじ、スマートフォン限定 楽天ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)、楽天トラベル ラッキーくじ
10/100
10/112楽天Edyラッキーくじ、楽天トラベル ラッキーくじ
10/121楽天トラベル ラッキーくじ
10/131【楽天ブックス】facebookラッキーくじ
10/1413【楽天カード】じゃんけん勝者限定くじ、LINE限定 毎日引けるくじ、楽天トラベル ラッキーくじ、【楽天ブックス】facebookラッキーくじ
10/150
10/162楽天カードラッキーくじ、楽天トラベル ラッキーくじ
10/172InfoseekNewsラッキーくじ、楽天トラベル ラッキーくじ
10/181楽天トラベル ラッキーくじ
10/194Rakuten Link限定ラッキースロット 第2弾、楽天リワード ラッキーくじ、楽天トラベル ラッキーくじ、【楽天ブックス】facebookラッキーくじ
10/2011【楽天カード】じゃんけん勝者限定くじ、LINE限定 毎日引けるくじ
10/214毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる、【楽天カード】じゃんけん勝者限定くじ、【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)、【楽天ブックス】facebookラッキーくじ
10/220
10/231【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
10/241Rakuten Link限定ラッキースロット 第2弾
10/252楽天トラベル ラッキーくじ、【楽天くじ広場】ラッキーくじ
10/261【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
10/270
10/281【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
10/291楽天トラベル ラッキーくじ
10/301楽天×ぐるなび ラッキーくじ
10/312Rakuten Link限定ラッキースロット 第2弾、楽天トラベル ラッキーくじ
合計:64、平均=2.1

2021年8月31日火曜日

楽天ラッキーくじの当選を整理する。【2021年9月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年8月】
日付当選数当選サービス
9/10
9/21楽天Edy スマホ ラッキーくじ
9/33マネ活ラッキーくじ、楽天カードスマホじゃんけん勝者限定くじ、【楽天toto】楽天totoラッキーくじ
9/40
9/53【楽天カード】じゃんけん勝者限定くじ、リワード特集ページ ラッキーくじ、楽天Car車検 ラッキーくじ
9/64マネ活ラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天トラベル ラッキーくじ、【楽天くじ広場】ラッキーくじ
9/73楽天Edyラッキーくじ、楽天カードスマホラッキーくじ、楽天カードラッキーくじ
9/82Rakuten Link限定ラッキースロット 第1弾、楽天トラベル ラッキーくじ
9/94マネ活ラッキーくじ、楽天カードスマホラッキーくじ、【楽天カード】じゃんけん勝者限定くじ、楽天トラベル ラッキーくじ
9/101リワード特集ページ ラッキーくじ
9/112楽天トラベル ラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
9/122楽天ブログ ラッキーくじ、楽天カードスマホラッキーくじ
9/131マネ活ラッキーくじ
9/143マネ活ラッキーくじ、スマートフォン限定 楽天ラッキーくじ、楽天×ぐるなび ラッキーくじ
9/1514Rakuten Link限定ラッキースロット 第1弾、マネ活ラッキーくじ、楽天ブログ ラッキーくじ、LINE限定 毎日引けるくじ、【楽天ブックス】facebookラッキーくじ
9/161Rakuten Link限定ラッキースロット 第1弾
9/172【楽天ブックス】facebookラッキーくじ、スマートフォン限定 楽天ラッキーくじ
9/182楽天トラベル ラッキーくじ、【楽天くじ広場】ラッキーくじ
9/191楽天トラベル ラッキーくじ
9/200
9/211【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
9/220
9/232毎日ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
9/240
9/251【楽天ポイント活動部】ラッキーくじ(2021年9月~11月通常版)
9/261楽天ブックス・ラッキーくじ
9/270
9/282楽天トラベル ラッキーくじ、楽天ブログ ラッキーくじ
9/292Rakuten Link限定ラッキースロット 第1弾、楽天トラベル ラッキーくじ
9/301楽天トラベル ラッキーくじ
合計:53、平均=1.8

2021年8月11日水曜日

【HTML】過去入力したメールアドレスのサジェスト表示の方法

<input id="email" type="email" />

id="email" を付けないと、フィールドにフォーカスを当てたときにサジェスト表示されない。

passwordだと、パスワード保存設定(Chrome系のブラウザの設定)だったり、iCloudキーチェーンの有効化設定+パスワード自動入力設定を有効化しなければならないが、メールアドレスに関してはその必要がないみたい。


【正規表現】連続する同一文字を含む文字列かどうかを判断する。【JavaScript】


var continueChar = function( str ) {
  const regexp = /(.)\1{3,}/;   // 4つ連続で同一文字を含む
  return regexp.test( str );
};

exports.continueChar = continueChar;

2021年8月2日月曜日

楽天ラッキーくじの当選を整理する。【2021年8月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年7月】
日付当選数当選サービス
8/11楽天ブログ ラッキーくじ
8/213【楽天くじ広場】ラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天カードラッキーくじ、LINE限定 毎日引けるくじ
8/31楽天ブログ ラッキーくじ
8/41楽天カードスマホじゃんけん勝者限定くじ
8/50
8/620マラソンスロット PC&SP版
8/720マラソンスロット PC&SP版
8/81アプリ限定 楽天ラッキーくじ
8/930LINE限定 毎日引けるくじ、マラソンスロット PC&SP版
8/102【楽天レシピ】ラッキーくじ、【楽天レシピ】ラッキーくじ
8/110
8/122【楽天カード】じゃんけん勝者限定くじ、【楽天カード】じゃんけん勝者限定くじ
8/130
8/141Rakuten TV ラッキーくじ
8/151楽天トラベル ラッキーくじ
8/163【楽天カード】じゃんけん勝者限定くじ、楽天ブログ ラッキーくじ、【楽天toto】楽天totoラッキーくじ
8/172楽天カードスマホラッキーくじ、楽天トラベル ラッキーくじ
8/180
8/193【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天トラベル ラッキーくじ
8/204楽天カレンダーラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)、【楽天カード】じゃんけん勝者限定くじ、楽天トラベル ラッキーくじ
8/210
8/2212Rakuten Link限定ラッキースロット 第1弾、LINE限定 毎日引けるくじ、楽天トラベル ラッキーくじ
8/231楽天トラベル ラッキーくじ
8/241楽天トラベル ラッキーくじ
8/253楽天保険の総合窓口ラッキーくじ、楽天トラベル ラッキーくじ、楽天カードラッキーくじ
8/260
8/272楽天カーサービスアプリ ラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
8/280
8/292【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天Car車検 ラッキーくじ
8/302楽天トラベル ラッキーくじ、楽天ブログ ラッキーくじ
8/314Rakuten Link限定ラッキースロット 第1弾、楽天カードスマホラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)、楽天トラベル ラッキーくじ
合計:127、平均=4.09

2021年7月21日水曜日

【FIRE前】2021年7月の支出

夫婦2人+猫1匹の支出

項目支出額備考
家賃7.5万円
食費4.8万円
電気・ガス・水道0.0万円給与日が早く、支払い前なので、0万円。
日用品0.3万円
0.4万円
整髪0.0万円
医療0.0万円
通信費0.7万円
お小遣い1.9万円夫婦二人分
寄付0.28万円子供食堂へ寄付。
生命保険料0.2万円
その他0.6万円書籍代とか。
合計16.68万円

下記書籍をベースとして、早期リタイアを目指しています。

2021年7月2日金曜日

【FIRE前】FIRE後の国民年金の支払いをどうするか。

 夫婦2人+猫1匹で生活をしています(FIRE前)。

FIREした後、支出の中でなかなかの割合を占めるものがあります。国民年金です。

一人あたり約1.6万円なので、夫婦であれば年間約38.4万円の支出です。

未来のための投資と考えれば、まあよいかなと思う反面、米国ETF買っていた方がよいのでは?とも思います。(最終的には米国インデックスETFの方がお金がよりもらえます。)

結論から言えば、国民年金は全納もしくは免除(全額、4分の3、半額、4分の1)で未納期間を作らないようにしたいです。

その訳は、障害年金をもらうための保険としてです。
ずっと健康ではなく、障害を負ってしまうかもしれないので、そのための対策です。
障害年金をもらうための納付要件は以下です。(引用元
  1. 保険料納付要件の原則は加入期間の3分の2以上納めていること。
  2. 1.を満たさない場合は、直近1年間に滞納期間がないこと。
例えば40歳でFIRE(完全リタイア)し、国民年金を納めない場合、50歳まではよいとして、それ以降に障害を負ってしまうと加入期間が3分の2未満となり、障害年金がもらえません。障害となってしまってしかもお金がもらえないとなると、二重の痛手です。

よって、FIRE前の現在の結論としては未納期間を作らないようにします。

下記書籍をベースとして、早期リタイアを目指しています。

2021年6月30日水曜日

楽天ラッキーくじの当選を整理する。【2021年7月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年6月】
日付当選数当選サービス
7/11楽天トラベル ラッキーくじ
7/21【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
7/32マネ活ラッキーくじ、リワード特集ページ ラッキーくじ
7/41【楽天ブックス】facebookラッキーくじ 
7/51【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)
7/61【楽天くじ広場】ラッキーくじ
7/71楽天トラベル ラッキーくじ
7/81【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)
7/915マネ活ラッキーくじ、スマートフォン限定 楽天ラッキーくじ、LINE限定 毎日引けるくじ、【楽天カード】じゃんけん勝者限定くじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天トラベル ラッキーくじ
7/104マネ活ラッキーくじ、楽天カードスマホじゃんけん勝者限定くじ、楽天カードスマホラッキーくじ、楽天カードラッキーくじ
7/112【楽天カード】じゃんけん勝者限定くじ、楽天トラベル ラッキーくじ
7/123【楽天くじ広場】ラッキーくじ、楽天×ぐるなび ラッキーくじ、【楽天カード】じゃんけん勝者限定くじ
7/131Rakuten TV ラッキーくじ
7/1410LINE限定 毎日引けるくじ
7/153楽天トラベル ラッキーくじ、楽天カードスマホラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
7/1613マネ活ラッキーくじ、楽天ブログ ラッキーくじ、LINE限定 毎日引けるくじ、楽天ブックス・ラッキーくじ
7/171【楽天くじ広場】ラッキーくじ 
7/183楽天ブログ ラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、Rakuten TV ラッキーくじ
7/193楽天カードスマホラッキーくじ、【楽天toto】楽天totoラッキーくじ、楽天トラベル ラッキーくじ
7/202【楽天レシピ】ラッキーくじ、楽天トラベル ラッキーくじ
7/212楽天Edyラッキーくじ、【楽天カード】じゃんけん勝者限定くじ
7/2213LINE限定 毎日引けるくじ、【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)、楽天トラベル ラッキーくじ、【楽天ブックス】facebookラッキーくじ
7/2311LINE限定 毎日引けるくじ、楽天トラベル ラッキーくじ
7/241楽天トラベル ラッキーくじ
7/2514LINE限定 毎日引けるくじ、【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)、楽天トラベル ラッキーくじ、楽天デリバリー ラッキーくじ、【楽天ブックス】facebookラッキーくじ
7/261楽天トラベル ラッキーくじ
7/271楽天トラベル ラッキーくじ
7/280
7/291楽天カレンダーラッキーくじ
7/302楽天Edyラッキーくじ、楽天カーサービスアプリ ラッキーくじ
7/313楽天Edy スマホ ラッキーくじ、楽天ブログ ラッキーくじ、楽天カードスマホラッキーくじ
合計:117、平均=3.8

2021年6月28日月曜日

【FIRE前】何をポイントにお金が貯まっていったのか。

長期的にFIREを目指していたわけではないのですが、7年くらい共働きで働くうちに、貯金が貯まっていきました。この期間は、夫婦2人の生活において以下の決まり事を守っていました。
  • 家は買わない。買うとしても老後に現金一括で購入。
  • 保険は最低限の保証のもののみ。一人1000円/月程度のもの。
  • 車は買わない。
  • 結婚式は挙げない。写真のみ。
  • 所得が低い方(私)を生活費とする。
  • 急な支出は生活費以外から。
結果的に、借金をしない・固定費を抑えるような生活になったのかもしれません。
ただ、
  • 新婚旅行はハワイへ
この一度だけは大きな出費をしました。

これからFIREをする上で、今より1万円くらい安い賃貸物件(月6万円ほど)に引っ越すつもりです。



下記書籍をベースとして、早期リタイアを目指しています。

2021年6月27日日曜日

【FIRE前】FIRE時の金融資産目標はどうするか。

 4%ルールの原論によれば、株式:75%、債券:25%の割合が成功確率が一番いいわけですが、株式:100%と現金(生活費2年分)でFIREしようとしてます。

別のサイトによると、4%ルールをより長期間に適用した結果は、株式100%の方が高確率で成功します。(以下の画像を参照。)

(引用:Early Retirement Now

つまり、株式100%でFIREしようとしています

【FIRE時の目標資産】
項目目標額備考
VOO6000万円楽天証券では、手数料無料で購入可能。
現金600万円ほど株式市場が暴落した際に生活費を下ろす。2年分程度。

なぜ、VOOかというとバンガード社の人気米国株ETFの中で、インデックスで成績がよいものだったためです。2020/07現在、VOOの目標額の83%を達成しています。

VOO以外の株(個別株、米国ETF)を新型コロナによる株式市場暴落時に仕込んでいましたので、それらを売却してVOOに付け替えていきたいと思います。


下記書籍をベースとして、早期リタイアを目指しています。

2021年6月26日土曜日

【FIRE前】2021年6月の支出

夫婦2人+猫1匹の6月の支出

項目支出額備考
家賃7.5万円
食費4.7万円
電気・ガス・水道0.6万円水道代は含まず。
日用品0.65万円
0.4万円
整髪0.1万円
医療0.38万円歯医者代
通信費1.16万円契約事務手数料5000円含む。後で戻ってくる。
お小遣い1.5万円夫婦二人分
寄付0.28万円子供食堂へ寄付。
生命保険料0.2万円
交通費0.15万円
その他0.1万円書籍代とか。
合計17.72万円

下記書籍をベースとして、早期リタイアを目指しています。

【FIRE前】朝食、昼食、夕食は何を食べているか。

 FIRE前ですが、お弁当や総菜ではなく、自炊をするように心掛けています。


【朝食】フルグラ+コーンフレーク+オートミール(インスタント)+豆乳(低脂肪)。

【昼食】野菜+豚肉たっぷりの味噌汁のみ。

【夕食】野菜+豚肉たっぷりの炒め物。もしくは麺類(袋ラーメン、そうめんなど)。

だいたいこのようなもの。炒め物の場合、ご飯を付けたりもします。

食費はだいたい楽天Edyで払うのですが、マネーフォワードで見ると月4万円使っていました。おー、使っているな。

フルグラ

オートミール(インスタント)

2021年6月22日火曜日

【FIRE前】FIRE時の年間支出目標

 夫婦2人(子供なし、猫1匹)40代でのFIRE時の年間支出目標


項目目標額備考
家賃80万円月6万円、更新料、火災保険を含む
食費36万円月3万円
電気・ガス・水道14.4万円月1.2万円
日用品4.8万円月0.4万円
4.8万円月0.4万円
整髪2.4万円月0.2万円
医療4.8万円月0.2万円
通信費12万円携帯:0.5万円/二人、インターネット:0.5万円
交通費7万円主に帰省代
お小遣い24万円月1万円/一人
国民健康保険4万円減免7割適用を仮定。
所得税・住民税0万円
国民年金0~39.8万円約1.6万円/月/一人。余裕がないときは延納。
合計204~234万円

2021年5月31日月曜日

楽天ラッキーくじの当選を整理する。【2021年6月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年5月】
日付当選数当選サービス
6/10
6/23【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天カードスマホラッキーくじ、【楽天レシピ】ラッキーくじ
6/31【楽天くじ広場】ラッキーくじ
6/41【楽天toto】楽天totoラッキーくじ
6/51楽天トラベル ラッキーくじ
6/61【楽天toto】楽天totoラッキーくじ
6/723楽天Edyラッキーくじ、楽天スーパーSALE スロット<第2弾>PC&SP版、マネ活ラッキーくじ、楽天トラベル ラッキーくじ
6/80
6/920楽天スーパーSALE スロット<第2弾>PC&SP版
6/1011楽天カードスマホラッキーくじ、LINE限定 毎日引けるくじ
6/113Rakuten TV ラッキーくじ、【楽天ブックス】facebookラッキーくじ、楽天トラベル ラッキーくじ
6/123楽天トラベル ラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、【楽天カード】じゃんけん勝者限定くじ
6/131楽天リワード ラッキーくじ
6/142【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)、スマートフォン限定 楽天ラッキーくじ
6/151マネ活ラッキーくじ
6/162マネ活ラッキーくじ、【楽天カード】じゃんけん勝者限定くじ
6/174スマートフォン限定 楽天ラッキーくじ、InfoseekNewsラッキーくじ、楽天トラベル ラッキーくじ、【楽天ブックス】facebookラッキーくじ
6/181【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)
6/192楽天トラベル ラッキーくじ、楽天カードスマホじゃんけん勝者限定くじ
6/202楽天トラベル ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)
6/211【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
6/223楽天ブログ ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)、【楽天ポイント活動部】ラッキーくじ(2021年6月~8月通常版)
6/230
6/240
6/2512リワード特集ページ ラッキーくじ、LINE限定 毎日引けるくじ、楽天トラベル ラッキーくじ
6/262楽天トラベル ラッキーくじ、Rakuten TV ラッキーくじ
6/2710LINE限定 毎日引けるくじ
6/283 楽天Edyラッキーくじ、楽天カレンダーラッキーくじ、楽天トラベル ラッキーくじ
6/292【楽天カード】じゃんけん勝者限定くじ、【楽天カード】じゃんけん勝者限定くじ
6/3012LINE限定 毎日引けるくじ、楽天カードラッキーくじ、Rakuten TV ラッキーくじ
合計:127、平均=4.2

2021年5月30日日曜日

【JavaScript】Day.jsでの日付妥当性をisValid()で。

Day.jsで日付の妥当性は isValid() を使うとできます。しかし、検索をすると使えない(日付の検証には使えない。)と結果が出てきます。それは誤りで、plugin を利用すれば可能です。customParseFormat を追加しましょう。

ポイント

  • プラグイン customParseFormat を追加。
  • dayjs() の第3引数 strict に true を指定。
const dayjs = require('dayjs');

// プラグイン 追加
const customParseFormat = require('dayjs/plugin/customParseFormat');
dayjs.extend(customParseFormat);

console.log( dayjs( '20210102', 'YYYYMMDD' ).isValid() ); // => true
console.log( dayjs( '20210132', 'YYYYMMDD' ).isValid() ); // => true
console.log( dayjs( '20210102', 'YYYYMMDD', true ).isValid() ); // => true
console.log( dayjs( '20210132', 'YYYYMMDD', true ).isValid() ); // => false
console.log( dayjs( '2021013a', 'YYYYMMDD', true ).isValid() ); // => false

【JavaScript】Day.jsのAPIサンプル(Parse編)

 Day.jsの使い方を知るためにサンプルを作っています。

Parse

 日付や時刻を含む文字列や数値からオブジェクトを作成するものです。作成されたオブジェクトはUTC時間だったりするので、利用時は気を付けないと想定とずれた時間になります。

Parse

 テキストをオブジェクトに変換します。日本語の日付を使うなどする場合など、「Invalid Date」でエラーとなってしまうときは、CustomParseFormat プラグインを利用することも頭に入れておくとよいです。

const dayjs = require('dayjs');

// JST:2021-04-30 00:00:00
// UTC:2021-04-29 15:00:00 (日本との差は-9時間のため)
console.log( dayjs('2021-04-30', 'YYYY-MM-DD').toDate() );
// => 2021-04-29T15:00:00.000Z (UTC)
console.log( dayjs('2021年04月30日', 'YYYY年MM月DD日').toDate() );
// => Invalid Date (日本語があるとパースできない.)

// プラグインを追加 
const CustomParseFormat = require('dayjs/plugin/customParseFormat');
dayjs.extend(CustomParseFormat);

console.log( dayjs('2021年04月30日', 'YYYY年MM月DD日').toDate() );
// => 2021-04-29T15:00:00.000Z (日本語があってもパースできる.)
console.log( dayjs('2021年04月30日', 'YYYY年MM月DD日').locale('ja').format() );
// => 2021-04-30T00:00:00+09:00 (日本でロケールしてみただけ.)

Now

 現在時刻のオブジェクト取得します。日本時間にするには ロケール変換+format() します。

const dayjs = require('dayjs');

let now_utc = dayjs();
let now_jst = dayjs().locale('ja');
console.log( now_utc.toDate() );
// => 2021-04-30T00:09:31.085Z (こちらは0時)
console.log( now_jst.format() );
// => 2021-04-30T09:09:31+09:00 (こちらは9時. toDate() はUTCになってしまうので注意.)

String

 ISO 8601形式の文字列からオブジェクトを作成します。日付と時刻の間に"T"を付け、時刻の後ろに"Z"や"+0900"などを付与した文字列です。

const dayjs = require('dayjs');

let utc = dayjs('2021-04-15T15:00:00.000Z');
console.log( utc.toDate() );

let jst = dayjs('2021-04-15T15:00:00.000+0900');
console.log( jst.locale('ja').format() ); // toDate()はUTC時間で出力される

String + Format

 事前に日付のフォーマットわかっていれば、引数の日付の文字列からオブジェクトが作成できます。注意すべきは CustomParseFormat プラグインを使わなければいけないことです。補足ですが、dayjs()の第4引数に真偽を指定すると、結果が変わります。

const dayjs = require('dayjs');
// プラグイン
const customParseFormat = require('dayjs/plugin/customParseFormat');

dayjs.extend(customParseFormat); // プラグイン追加
let jst = dayjs('2021年10月18日', 'YYYY年MM月DD日', 'ja');
console.log(jst.locale('ja').format());

let jst_imp = dayjs('2021年10月32日', 'YYYY年MM月DD日', 'ja');
let jst_strict = dayjs('2021年10月32日', 'YYYY年MM月DD日', 'ja', true);

console.log(jst_imp.locale('ja').format());
// => 2021-11-01T00:00:00+09:00  第4引数がtrueでない場合、日付の繰り越しが起こる.
console.log(jst_strict.locale('ja').format());
// => Invalid Date 第4引数がtrueの場合、日付の厳密性がチェックされ、存在しない日付の場合、
エラー(Invalid Date)になる.

 日付のフォーマットが1つではなく複数指定される可能性がある場合でもオブジェクト作成できます。日付のフォーマットを配列で指定してあげます。

const dayjs = require('dayjs');
const customParseFormat = require('dayjs/plugin/customParseFormat');

dayjs.extend(customParseFormat);
let date  = dayjs("2001-12-25", ["YYYY", "YYYY-MM-DD"], 'ja', true);
let date2 = dayjs("2001", ["YYYY", "YYYY-MM-DD"], 'ja', true);
console.log(date.locale('ja').format());  // => 2001-12-25T00:00:00+09:00
console.log(date2.locale('ja').format()); // => 2001-01-01T00:00:00+09:00


let date3 = dayjs("2001-25-12", ["YYYY", "YYYY-MM-DD"], 'ja', true);
let date4 = dayjs("2001-25-12", ["YYYY", "YYYY-MM-DD"], 'ja');
console.log(date3.locale('ja').format());  // => Invalid Date
console.log(date4.locale('ja').format());  // => 2001-01-01T00:00:00+09:00

Unix Timestamp (milliseconds)

 ミリ秒を表す数値を指定することでオブジェクトを作成します。基準日は1970年1月1日午前0時です。引数に指定したミリ秒だけ加算された日時のオブジェクトが作成されます。

const dayjs = require('dayjs');

let date = dayjs(0);
console.log( date.toDate() );
// => 1970-01-01T00:00:00.000Z

let date1 = dayjs(1);
console.log( date1.toDate() );
// => 1970-01-01T00:00:00.001Z

Unix Timestamp (seconds)

 秒を表す数値を指定し、オブジェクトを作成します。基準日は1970年1月1日午前0時です。引数に指定した秒だけ加算された日時のオブジェクトが作成されます。

const dayjs = require('dayjs');

let date = dayjs.unix(0);
console.log( date.toDate() );
// => 1970-01-01T00:00:00.000Z

let date2 = dayjs.unix(1);
console.log( date2.toDate() );
// => 1970-01-01T00:00:01.000Z dayjs()をラップしている.

let date3 = dayjs( 1 * 1000 );
console.log( date3.toDate() );
// => 1970-01-01T00:00:01.000Z 

Date

 JavaScriptのDateオブジェクトからオブジェクトを作成します。Dateオブジェクトのクローンを返すため、元のDateオブジェクトを変更しても、Day.jsオブジェクトは変更されません。その逆も同様です。

const dayjs = require('dayjs');

var d = new Date(2019, 7, 18); // monthは0-11を指定し、1月-12月を扱う罠.
var day = dayjs(d);

console.log( d );  // => 2019-08-17T15:00:00.000Z
console.log( day.toDate() );  // => 2019-08-17T15:00:00.000

Object

 オブジェクトからDay.jsオブジェクトを作成します。ObjectSupport プラグインを追加して使用します。

const dayjs = require('dayjs');
const ObjectSupport = require('dayjs/plugin/objectSupport'); // プラグイン

// プラグイン追加.
dayjs.extend(ObjectSupport);

let now = dayjs();
let date = dayjs({ hour:15, minute:10 });
console.log( now.toDate() );
// => 2021-05-01T07:51:36.994Z
console.log( date.toDate() );
// => 2021-05-01T06:10:00.000Z
// 当日の日本時間15時10分を指す?。UTCにすると9時間前なので、6時10分となる。

now = dayjs();
let date2 = dayjs({});  // 空のオブジェクトは現在日時
console.log( now.toDate() );
// => 2021-05-01T07:54:59.148Z
console.log( date2.toDate() );
// => 2021-05-01T07:54:59.148Z

let date3 = dayjs({ year :2010, month :3, day :5, hour :15, minute :10, second :3, millisecond :123});
console.log( date3.toDate() );
// => 2010-04-05T06:10:03.123Z
// monthは0-11の整数で、1月-12月を表す.

Array

 配列からDay.jsオブジェクトを作成します。arraySupport プラグインを追加する必要があります。dayjs([]) は現在時刻です。

const dayjs = require('dayjs');
const ArraySupport = require('dayjs/plugin/arraySupport');

dayjs.extend(ArraySupport);

// [ 年、月、日、時、分、秒、ミリ秒 ]
let date = dayjs([2010, 1, 14, 15, 25, 50, 125]);
console.log( date.toDate() );
// => 2010-02-14T06:25:50.125Z
// month部分は0-11を指定することで、1月-12月を表します。
// ログ出力ではUTC時間になるため、時刻が9時間前となります。 

let date2 = dayjs([2010, 6]);     // July 1st
console.log( date2.toDate() );
// => 2010-06-30T15:00:00.000Z
// month:6 は7月のこと。7/1 00:00:00から-9時間となり、6/30 15:00:00となる。 
// UTC時間は面倒だ。

UTC

 UTC時間のDay.jsオブジェクトを作成します。

const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');

dayjs.extend(utc);

let date = dayjs();
console.log( date.format() );
// => 2021-05-02T09:10:25+09:00
// 日本で実行しているので、format()は日本時間が出力される。
let date_utc = dayjs().utc();
console.log( date_utc.format() );
// => 2021-05-02T00:10:25Z
// 日本で実行していても、format()はUTC時間で出力される。 

Dayjs Clone

 Day.jsオブジェクトを複製して、同じオブジェクトを作成します。2種類の方法があり、複製元からclone()を使うか、dayjs()の引数に複製元を渡すかです。

const dayjs = require('dayjs');

let a = dayjs();
let b = a.clone();

console.log( a.toDate() ); // => 2021-05-02T00:18:31.274Z
console.log( b.toDate() ); // => 2021-05-02T00:18:31.274Z

a = dayjs();
b = dayjs(a);

console.log( a.toDate() ); // => 2021-05-02T00:18:31.325Z
console.log( b.toDate() ); // => 2021-05-02T00:18:31.325Z

Validation

 日付が正しいかチェックします。customParseFormat プラグインを使用します。注意しなければならないのは、dayjs()の第3引数の真偽です。厳密に日付の正しさを求めるならば true を指定します。そうでない場合、日付が正しくない場合でも繰り上げなどの計算をしてくれます。

const dayjs = require('dayjs');
// プラグイン
const customParseFormat = require('dayjs/plugin/customParseFormat');

// プラグインを追加 
dayjs.extend(customParseFormat);

let date = dayjs('2021-03-19', 'YYYY-MM-DD', true);
console.log( date.isValid() ); // => true

let date2 = dayjs('2021-15-19', 'YYYY-MM-DD', true);
console.log( date2.isValid() ); // => false

// 日付の形式が合っていればOKのやりかた。
let date3 = dayjs('2021-13-19', 'YYYY-MM-DD');
console.log( date4.isValid() ); // => true. 日付の形式が合っていればOKとなる。
console.log( date3.toDate() );
// => 2022-01-18T15:00:00.000Z
// 日付を勝手に繰り上げする.

【JavaScript】MS932で文字を判断する。

JavaScriptを使って、MS932文字コードで文字を判断します。ライブラリは iconv-lite を利用。


const iconv = require('iconv-lite');

let buf = iconv.encode('亜', 'ms932' );
console.log( buf );  //=> <Buffer 88 9f>  [0x88, 0x9f]の意味。

// MS932の亜に対応した数値。8ビットシフトするのがポイント。
let enc = buf[0] << 8 + buf[1];  // 0x889f 
if ( enc === 0x889f ){
  console.log('亜だね。');
}

【JavaScript】Day.jsで年齢計算をする。

 基準日時点で生年月日から年齢はいくつかを計算します。


  let base = dayjs(baseDate, YYYYMMDD, true);  // 基準日
  let birth = dayjs(birthday, YYYYMMDD, true); // 生年月日 


  let ibase = Number( base.format(YYYYMMDD) );
  let ibirth = Number( birth.format(YYYYMMDD) );

  return Math.floor( (ibase - ibirth)/10000 );

【JavaScript】Day.jsで日付演算処理を行う。

 元となるソースはGitHub上にあります。

共通

 共通的に必要となる定義を示します。フォーマット変換するので、プラグインを入れるのがポイントです。


const dayjs = require("dayjs");
// プラグインの追加
dayjs.extend(require("dayjs/plugin/customParseFormat"));

// フォーマット
const YYYYMMDD = "YYYYMMDD";
const YYYYMMDD_HHmmss = "YYYYMMDD HHmmss";
const YYYYMMDD_HHmmss_SSS = "YYYYMMDD HHmmss.SSS";

エラー判定処理

 Day.jsの癖として、日付処理ができない場合は「Invalid Date」という文字列を返します(細かいことはわかりませんが。)。それを利用したエラー判定を行います。これは下で示していく自作APIが処理エラー時にnullを返したいために作られました。


function isValidDate(day) {
  if (typeof day === "string") {
    return day === "Invalid Date" ? null : day;
  }

  return day.isValid() ? day : null;
}

年齢計算

 diff()のポイントは、基準日に対し過去が正の値・未来が負の値となることです。つまり基準日.diff(過去日) > 0 で、基準日.diff(未来日) < 0 です。


/**
 * 年齢計算
 * @param {string} baseDate  年齢計算の基準日 YYYYMMDD
 * @param {string} birthday  生年月日 YYYYMMDD
 * @returns 満年齢 or null(計算不可).誕生日に年をとる.
 */
exports.calcAge = (baseDate, birthday) => {
  let base = dayjs(baseDate, YYYYMMDD, true);
  let birth = dayjs(birthday, YYYYMMDD, true);

  // 日付をパースできない.
  if (!isValidDate(base) || !isValidDate(birth)) {
    return null;
  }

  let ibase = Number( base.format(YYYYMMDD) );
  let ibirth = Number( birth.format(YYYYMMDD) );

  return Math.floor( (ibase - ibirth)/10000 );
};

日付計算(年)

 日付計算において、年・月・日の加減算はadd()の引数に"year"、"month"、"day"を指定することで計算を行う。

/**
 * 日付計算(年)
 * @param {string} baseDate 基準日 YYYYMMDD
 * @param {number} year 加減算する年
 * @returns {string|null} 加減算後の日付 YYYYMMDD
 */
exports.addYears = (baseDate, year) => {
  return isValidDate(
    dayjs(baseDate, YYYYMMDD, true).add(year, "year").format(YYYYMMDD)
  );
};

日付計算(月)

/**
 * 日付計算(月)
 * @param {string} baseDate 基準日 YYYYMMDD
 * @param {number} month 加減算する月
 * @returns {string|null} 加減算後の日付 YYYYMMDD
 */
exports.addMonths = (baseDate, month) => {
  return isValidDate(
    dayjs(baseDate, YYYYMMDD, true).add(month, "month").format(YYYYMMDD)
  );
};

日付計算(日)

/**
 * 日付計算(日)
 * @param {string} baseDate 基準日 YYYYMMDD
 * @param {number} day 加減算する日
 * @returns {string|null} 加減算後の日付 YYYYMMDD
 */
exports.addDays = (baseDate, day) => {
  return isValidDate(
    dayjs(baseDate, YYYYMMDD, true).add(day, "day").format(YYYYMMDD)
  );
};

日付フォーマッター

/**
 * 日付フォーマット
 * @param {string} baseDate 日付日時
 * @param {string} format フォーマット. フォーマット形式はDay.js参照.
 * @returns {string|null} フォーマット後日付
 */
exports.format = (baseDate, format) => {
  return isValidDate(dayjs(baseDate).format(format));
};

月末算出

 ライブラリが優秀なので、うるう年も対応しています。


/**
 * 月末の日付を返す.
 * @param {string} baseDate 日付 YYYYMMDD or YYYYMM
 * @returns {string|null} 月末日付 YYYYMMDD
 */
exports.endOfMonth = (baseDate) => {
  return isValidDate(
    dayjs(baseDate, [YYYYMMDD, "YYYYMM"], true).endOf("month").format(YYYYMMDD)
  );
};

日付比較

 isBefore()は基準日と比較して比較対象日付が未来ならばtrue、過去ならばfalseとなります。つまり、基準日.isBefore(過去日 "day") はtrue、基準日.isBefore(未来日, "day")はfalseです。

/**
 * 日付比較
 * @param {string} baseDate 基準日 YYYYMMDD
 * @param {string} compDate 対象日 YYYYMMDD
 * @returns {number|null} 比較結果. 基準日 < 対象日 は -1, 基準日 = 対象日 は 0, 基準日 > 対象日 は 1
 */
exports.compare = (baseDate, compDate) => {
  const base = dayjs(baseDate, YYYYMMDD, true);
  const comp = dayjs(compDate, YYYYMMDD, true);

  if (!isValidDate(base) || !isValidDate(comp)) {
    return null;
  }

  if (base.isSame(comp, "days")) {
    return 0;
  }

  return base.isBefore(comp, "days") ? -1 : 1;
};

日付差分日数

 やっていることは年齢計算と同じで、年を計算するか日数を計算するかの違いです。

/**
 * 差分日数
 * @param {string} fromDate 基準日 YYYYMMDD
 * @param {string} toDate 対象日 YYYYMMDD
 * @returns {number|null} 計算結果. 基準日 < 対象日は 正の値、基準日 > 対象日は 負の値.
 */
exports.diffDays = (fromDate, toDate) => {
  let from = dayjs(fromDate, YYYYMMDD, true);
  let to = dayjs(toDate, YYYYMMDD, true);

  if (!isValidDate(from) || !isValidDate(to)) {
    return null;
  }

  return to.diff(from, "day");
};

エポック <-> UTC時間変換

 UTC時間を使う場合、プラグインを追加します。またエポック時間には秒とミリ秒で使い方が違うので注意します。

エポック秒 to UTC時間

/**
 * エポック(秒) to UTC変換
 * @param {number} seconds Unixエポック
 * @returns {string|null} UTC時間 YYYYMMDD hhmmss
 */
exports.epocSecToUtc = (seconds) => {
  dayjs.extend(require("dayjs/plugin/utc"));  // 本来はファイルの先頭で宣言
  return isValidDate(dayjs.unix(seconds).utc().format(YYYYMMDD_HHmmss));
};

エポックミリ秒 to UTC変換

/**
 * エポック(ミリ秒) to UTC変換
 * @param {number} miliseconds
 * @returns {string|null} UTC時間 YYYYMMDD hhmmss.SSS
 */
exports.epocMilliSecToUtc = (miliseconds) => {
  dayjs.extend(require("dayjs/plugin/utc"));  // 本来はファイルの先頭で宣言
  return isValidDate(dayjs(miliseconds).utc().format(YYYYMMDD_HHmmss_SSS));
};

UTC to エポック秒

/**
 * UTC to エポック(秒)
 * @param {string} baseDate 日付
 * @returns {number|null} エポック(秒)
 */
exports.utcToEpocSec = (baseDate) => {
  dayjs.extend(require("dayjs/plugin/utc"));  // 本来はファイルの先頭で宣言
  let utc = dayjs.utc(baseDate);
  if (!isValidDate(utc)) {
    return null;
  }
  return utc.unix();
};

UTC to エポックミリ秒

/**
 * UTC to エポック(ミリ秒)
 * @param {string} baseDate YYYYMMDD HHmmss.SSS
 * @returns {number|null} エポック(ミリ秒)
 */
exports.utcToEpocMilliSec = (baseDate) => {
  dayjs.extend(require("dayjs/plugin/utc"));  // 本来はファイルの先頭で宣言
  let utc = dayjs.utc(baseDate);
  if (!isValidDate(utc)) {
    return null;
  }
  return utc.valueOf();
};

UTC <-> JST 変換

 Day.jsオブジェクトは実行環境のロケールに合わせてしまうので、クラウドのリージョンなどの環境では注意が必要ですが、今回は環境に依存しないように実装しています。

UTC to JST

/**
 * UTC to JST変換
 * @param {string} baseUtc UTC時間. YYYYMMDD HHmmss
 * @returns {string|null} 日本時間. YYYYMMDD HHmmss
 */
exports.utcToJst = (baseUtc) => {
  dayjs.extend(require("dayjs/plugin/timezone"));  // 本来はファイルの先頭で宣言
  dayjs.extend(require("dayjs/plugin/utc"));  // 本来はファイルの先頭で宣言
  dayjs.tz.setDefault("Asia/Tokyo");

  let utc = dayjs.utc(baseUtc, YYYYMMDD_HHmmss);
  if (!isValidDate(utc)) {
    return null;
  }

  return utc.tz().format(YYYYMMDD_HHmmss);
};

JST to UTC

/**
 * JST to UTC変換
 * @param {string} baseJst YYYYMMDD HHmmss
 * @returns {string|null} UTC. YYYYMMDD HHmmss
 */
exports.jstToUtc = (baseJst) => {
  dayjs.extend(require("dayjs/plugin/timezone"));  // 本来はファイルの先頭で宣言
  dayjs.extend(require("dayjs/plugin/utc"));  // 本来はファイルの先頭で宣言
  dayjs.tz.setDefault("Asia/Tokyo");
  let jst = dayjs(baseJst, YYYYMMDD_HHmmss, true);
  if (!isValidDate(jst)) {
    return null;
  }

  return jst.utc().format(YYYYMMDD_HHmmss);
};

2021年5月23日日曜日

楽天ラッキーくじの当選を整理する。【2021年5月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年4月】
日付当選数当選サービス
5/10
5/22楽天トラベル ラッキーくじ、【楽天toto】楽天totoラッキーくじ
5/35楽天PointClubアプリ ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)、楽天カレンダーラッキーくじ、InfoseekNewsラッキーくじ、リワード特集ページ ラッキーくじ
5/41楽天トラベル ラッキーくじ
5/54【楽天ブックス】facebookラッキーくじ、【楽天カード】じゃんけん勝者限定くじ、リワード特集ページ ラッキーくじ、アプリ限定 楽天ラッキーくじ
5/611LINE限定 毎日引けるくじ、リワード特集ページ ラッキーくじ
5/71楽天PointClubアプリ ラッキーくじ
5/80
5/913楽天トラベル ラッキーくじ、【楽天カード】じゃんけん勝者限定くじ、LINE限定 毎日引けるくじ、リワード特集ページ ラッキーくじ
5/101【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)
5/1123楽天Edy スマホ ラッキーくじ、マラソンスロット PC&SP版、リワード特集ページ ラッキーくじ、楽天PointClubアプリ ラッキーくじ
5/123楽天トラベル ラッキーくじ、【楽天レシピ】ラッキーくじ 、リワード特集ページ ラッキーくじ
5/131【楽天くじ広場】ラッキーくじ
5/1421マラソンスロット PC&SP版、楽天トラベル ラッキーくじ
5/151リワード特集ページ ラッキーくじ
5/160
5/173楽天ブログ ラッキーくじ、毎日ラッキーくじ 、楽天トラベル ラッキーくじ
5/180
5/191マネ活ラッキーくじ
5/200
5/210
5/222リワード特集ページ ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)
5/231楽天ブックス・ラッキーくじ
5/240
5/2510LINE限定 毎日引けるくじ
5/261【楽天くじ広場】ラッキーくじ
5/273楽天カードスマホじゃんけん勝者限定くじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天トラベル ラッキーくじ
5/282【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)、【楽天ブックス】facebookラッキーくじ
5/295リワード特集ページ ラッキーくじ、【楽天toto】楽天totoラッキーくじ、楽天トラベル ラッキーくじ、【楽天くじ広場】ラッキーくじ、Rakuten TV ラッキーくじ
5/300
5/312楽天カードラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
合計:117、平均=3.7

2021年4月1日木曜日

楽天ラッキーくじの当選を整理する。【2021年4月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年3月】
日付くじ数当選数当選サービス
4/15リワード特集ページ ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)、楽天カードラッキーくじ、楽天PointClubアプリ ラッキーくじ、楽天トラベル ラッキーくじ
4/22【楽天toto】楽天totoラッキーくじ、【楽天カード】じゃんけん勝者限定くじ
4/312リワード特集ページ ラッキーくじ、LINE限定 毎日引けるくじ、楽天カードスマホじゃんけん勝者限定くじ
4/41楽天トラベル ラッキーくじ
4/53リワード特集ページ ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)、楽天トラベル ラッキーくじ
4/62楽天×ぐるなび ラッキーくじ、楽天トラベル ラッキーくじ
4/71リワード特集ページ ラッキーくじ
4/82【楽天toto】楽天totoラッキーくじ、楽天PointClubアプリ ラッキーくじ
4/92楽天カードスマホラッキーくじ、楽天ブックス・ラッキーくじ
4/102楽天カードスマホラッキーくじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
4/1112リワード特集ページ ラッキーくじ、楽天カードスマホじゃんけん勝者限定くじ、LINE限定 毎日引けるくじ
4/121リワード特集ページ ラッキーくじ
4/131リワード特集ページ ラッキーくじ
4/141楽天ブログ ラッキーくじ
4/154【楽天レシピ】ラッキーくじ、【楽天レシピ】ラッキーくじ、楽天PointClubアプリ ラッキーくじ、楽天PointClubアプリ ラッキーくじ
4/164【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)、楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、楽天トラベル ラッキーくじ、Rakuten TV ラッキーくじ
4/171楽天PointClubアプリ ラッキーくじ
4/182楽天トラベル ラッキーくじ、リワード特集ページ ラッキーくじ
4/192楽天PointClubアプリ ラッキーくじ、【楽天ブックス】facebookラッキーくじ
4/201楽天PointClubアプリ ラッキーくじ
4/211リワード特集ページ ラッキーくじ
4/224楽天PointClubアプリ ラッキーくじ、楽天カードラッキーくじ、【楽天カード】じゃんけん勝者限定くじ、【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ
4/232【楽天×宝くじ】最大1000ポイントが当たる!楽天×宝くじラッキーくじ、リワード特集ページ ラッキーくじ
4/243Rakuten TV ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)、スマートフォン限定 楽天ラッキーくじ
4/252リワード特集ページ ラッキーくじ、楽天トラベル ラッキーくじ
4/261リワード特集ページ ラッキーくじ
4/272リワード特集ページ ラッキーくじ、楽天PointClubアプリ ラッキーくじ
4/283【楽天カード】じゃんけん勝者限定くじ、楽天カードスマホラッキーくじ、リワード特集ページ ラッキーくじ
4/292楽天トラベル ラッキーくじ、楽天PointClubアプリ ラッキーくじ
4/300
合計:81、平均=2.7

2021年3月5日金曜日

Ubuntu Server 20.04 on RPi4 の初期インストール後のwifiネットワーク設定

目的

ラズパイ4にUbuntu Server 20.04をインストールしたが、wifiのセットアップで時間がかかったので、忘備録として記事を書く。
(Ubuntu Server 20.10でも同じ手順でwifiセットアップができました。)

参考


実際のオペレーション

$ sudo cp -p /etc/netplan/50-cloud-init.yaml /etc/netplan/99_config.yaml
$ sudo vi /etc/netplan/99_config.yaml
ファイルの修正内容は以下。wifis以下を追加した。固定IPアドレスの指定なので、そこは自身の環境に合わせる必要がある。
また、コロン(:)の直後に半角スペースがないことで、エラーになることがあるので注意。
network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    version: 2
    wifis:
        wlan0:
            access-points:
                "アクセスポイント名":
                    password: "パスワード"
            dhcp4: false
            addresses: [192.168.0.118/24]
            gateway4: 192.168.0.1
            nameservers:
                    addresses: [192.168.0.1,8.8.8.8,8.8.4.4]
$ sudo netplan apply
$ ping www.google.co.jp # 接続を試す。

2021年3月1日月曜日

楽天ラッキーくじの当選を整理する。【2021年3月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年2月】
日付くじ数当選数当選サービス
3/11リワード特集ページ ラッキーくじ
3/21リワード特集ページ ラッキーくじ
3/31【楽天くじ広場】ラッキーくじ
3/42【楽天ブックス】facebookラッキーくじ、リワード特集ページ ラッキーくじ
3/53楽天PointClubアプリ ラッキーくじ、楽天カレンダーラッキーくじ、リワード特集ページ ラッキーくじ
3/62リワード特集ページ ラッキーくじ、楽天トラベル ラッキーくじ
3/73リワード特集ページ ラッキーくじ、楽天PointClubアプリ ラッキーくじ、楽天トラベル ラッキーくじ
3/84リワード特集ページ ラッキーくじ、毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる、【楽天toto】楽天totoラッキーくじ 、楽天トラベル ラッキーくじ
3/93リワード特集ページ ラッキーくじ、毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる、【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)
3/1014リワード特集ページ ラッキーくじ、【楽天レシピ】ラッキーくじ、LINE限定 毎日引けるくじ、【楽天くじ広場】ラッキーくじ、楽天トラベル ラッキーくじ
3/114リワード特集ページ ラッキーくじ、楽天リワード ラッキーくじ、毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる、楽天PointClubアプリ ラッキーくじ
3/122楽天×ぐるなび ラッキーくじ、【楽天ブックス】facebookラッキーくじ
3/132リワード特集ページ ラッキーくじ、楽天×ぐるなび ラッキーくじ
3/144リワード特集ページ ラッキーくじ、楽天トラベル ラッキーくじ、【楽天くじ広場】ラッキーくじ、Rakuten TV ラッキーくじ
3/152リワード特集ページ ラッキーくじ、楽天PointClubアプリ ラッキーくじ
3/162楽天ブログ ラッキーくじ、楽天トラベル ラッキーくじ
3/172楽天PointClubアプリ ラッキーくじ、楽天カレンダーラッキーくじ
3/183リワード特集ページ ラッキーくじ、楽天トラベル ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)
3/190
3/2013リワード特集ページ ラッキーくじ、LINE限定 毎日引けるくじ、【楽天ポイント活動部】ラッキーくじ(2021年3月~5月通常版)、【楽天カード】じゃんけん勝者限定くじ
3/211楽天トラベル ラッキーくじ
3/222楽天ブログ ラッキーくじ、楽天トラベル ラッキーくじ
3/2323マラソンスロット PC&SP版、楽天カードラッキーくじ、楽天PointClubアプリ ラッキーくじ、楽天トラベル ラッキーくじ
3/242リワード特集ページ ラッキーくじ、【楽天toto】楽天totoラッキーくじ
3/2510LINE限定 毎日引けるくじ
3/262楽天PointClubアプリ ラッキーくじ、【楽天くじ広場】ラッキーくじ
3/271【楽天くじ広場】ラッキーくじ
3/280
3/293リワード特集ページ ラッキーくじ、楽天PointClubアプリ ラッキーくじ、楽天トラベル ラッキーくじ
3/303リワード特集ページ ラッキーくじ、楽天カレンダーラッキーくじ、【楽天ブックス】facebookラッキーくじ
3/312【楽天くじ広場】ラッキーくじ、楽天トラベル ラッキーくじ
合計:117、平均=3.8

2021年2月1日月曜日

楽天ラッキーくじの当選を整理する。【2021年2月】

前月の結果 → 楽天ラッキーくじの当選を整理する。【2021年1月】
日付くじ数当選数当選サービス
2/12【楽天ポイント活動部】ラッキーくじ(2021年1月通常版)、楽天トラベル ラッキーくじ
2/21リワード特集ページ ラッキーくじ
2/30
2/43楽天ブログ ラッキーくじ、楽天トラベル ラッキーくじ、InfoseekNewsラッキーくじ(SP)
2/51【楽天ブックス】facebookラッキーくじ
2/60
2/71楽天デリバリー ラッキーくじ
2/82楽天トラベル ラッキーくじ、楽天PointClubアプリ ラッキーくじ
2/92リワード特集ページ ラッキーくじ、楽天トラベル ラッキーくじ
2/102楽天PointClubアプリ ラッキーくじ、楽天PointClubアプリ ラッキーくじ
2/112【楽天くじ広場】ラッキーくじ、リワード特集ページ ラッキーくじ
2/122楽天トラベル ラッキーくじ、楽天PointClubアプリ ラッキーくじ
2/133楽天Edy スマホ ラッキーくじ、リワード特集ページ ラッキーくじ、楽天トラベル ラッキーくじ
2/141【楽天くじ広場】ラッキーくじ
2/151楽天リワード ラッキーくじ
2/162楽天PointClubアプリ ラッキーくじ、楽天トラベル ラッキーくじ
2/1712ポイント獲得実績のお知らせメール購読者限定ラッキーくじ(2021/2/16~2/18)、リワード特集ページ ラッキーくじ、楽天ラッキーくじ
2/183楽天ブログ ラッキーくじ、【楽天ポイント活動部】ラッキーくじ(2021年2月通常版)、【楽天くじ広場】ラッキーくじ
2/196毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる、【楽天くじ広場】ラッキーくじ、楽天PointClubアプリ ラッキーくじ、【楽天toto】毎日最大1000ポイントが当たる!楽天totoラッキーくじ、楽天トラベル ラッキーくじ、【楽天くじ広場】ラッキーくじ
2/201楽天PointClubアプリ ラッキーくじ
2/211毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる
2/224リワード特集ページ ラッキーくじ、毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる、【楽天ポイント活動部】ラッキーくじ(2021年2月通常版)、楽天トラベル ラッキーくじ
2/231リワード特集ページ ラッキーくじ
2/244リワード特集ページ ラッキーくじ、毎日チャンス マネ活ラッキーくじ!楽天ポイントが当たる、楽天ブックス・ラッキーくじ、楽天トラベル ラッキーくじ
2/252楽天PointClubアプリ ラッキーくじ、【楽天×宝くじ】毎日最大1000ポイントが当たる!楽天×宝くじラッキーくじ
2/263リワード特集ページ ラッキーくじ、楽天トラベル ラッキーくじ
2/2714リワード特集ページ ラッキーくじ、LINE限定 毎日引けるくじ、【楽天ポイント活動部】ラッキーくじ(2021年2月通常版)、楽天PointClubアプリ ラッキーくじ、【楽天カード】じゃんけん勝者限定くじ
2/280
合計:76、平均=2.7