Blog

Contents

Playwright を Lambdaで動かす

ちょっと苦労したのでポイントをまとめておく。

前提

  • TypeScriptでPlaywrightを動かすコードを書きたい
  • AWSが提供しているLambda用のAWSベースイメージはFedoraベース?(CentOSベース?)なのでPlaywrightの推奨ではない
    • 自分でコンテナイメージを作成する

準備

独自でコンテナイメージを作る

基本的に以下のサイトのコンテナの項を参考に作成しました。

簡単タコス(時間はかかる)を作ろう

タコス作りにはまっている

タコス - Wikipedia

タコス!日本だと店で食べるのが当たり前の料理!

しかし意外と簡単に作れてしかもうまい、ということを知ってしまった。特に小麦粉のトルティーヤ(タコスの皮ね)よりトウモロコシ粉を使ったトルティーヤの方が簡単でうまい!

Amplify UIでJWT Tokenを取得する

Tokenを取得する

以前のバージョンだと以下の方法で取得できていたが

import { useAuthenticator } from "@aws-amplify/ui-react";
const { user, signOut } = useAuthenticator((context) => [context.user]);
const token: string = user.getSignInUserSession()?.getAccessToken().getJwtToken() as string;

今(6.0.3)だと以下の方法で取得する必要があるっぽい?もっといい方法があるかもしれない。

import { fetchAuthSession } from "aws-amplify/auth";

async function currentSession() {
  try {
    const { accessToken, idToken } = (await fetchAuthSession()).tokens ?? {};
    console.log(accessToken);
    console.log(idToken);
  } catch (err) {
    console.log(err);
  }
}

Githubのプライベートリポジトリにパーソナルアクセストークンでアクセスできるようにする

環境作り直すたびに調べなおしていたのでここにまとめておく

トークンの作成

Github.comにログインし、Settings→Developer Settings→Personal access tokens→Fine-grained tokensに移動する。

左手デバイス XPPen ACK05をVSCodeと組み合わせて使う

XPPen ACK05買ったよ

resized-nNixyNfyGCVmPkIq.jpg

しばらく前から左手デバイスに興味があったが、Amazonに大量に並んでいる謎メーカーの小さなキーボードタイプのものはキー設定書き込みのためのソフトが謎のGoogle Driveからダウンロードする必要があるらしく、さすがに業務でも使おうと考えると無理があるなぁと思って尻込みしていた。あとBTで接続できるタイプも多いが謎メーカーのものは技適どうなんだと思ったり。

Goのバイナリが GLIBC not found で動かないとき

ローカルでビルドしたGoのモジュールをAWS Lambdaで動かしてみたところ、以下のようなエラーが発生して動かなかった。

/var/task/main: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by /var/task/main)

理由としてはビルドした環境のglibcと実行環境のglibcのバージョン違い(正確にはビルドした環境のほうが新しいglibcを使っている場合に発生する?)ようだ。

goのモジュールを一括アップデートする

go get -u all

プライベートリポジトリが含まれる場合は以下のように GOPRIVATE 環境変数を定義すれば良いらしい。

GOPRIVATE=github.com/example/hoge go get -u all

参考:

Goで開発途中のプライベートモジュールを参照する方法

VSCodeでビルドタスクを作る(ショートカットキーでビルドする)

tasks.jsonを書こう

トップ階層に .vscode/tasks.json を作り、そこにデフォルトのビルド動作を登録すると、ショートカットキー(Ctrl+Shift+B)でビルドコマンドをささっと実行できる(というか任意のコマンドは何でも登録できる)

2023-07-20コミュニケーションコストをAIに肩代わりさせたい

コミュニケーションコストをAIに肩代わりさせたい

所属している組織は、部署単位で数百人、関係部署や委託先入れると千人超えるような規模だったりする。

これだけ大きいので毎日色々なところで色々な会議が行われ、資料が作られ、しかもそこで決まったことが組織内の別のグループの予定に影響を及ぼす。

2023-07-19 ソフトスキルの可視化ができるか

ソフトスキルの可視化ができるか

※ただの日記なのでダラダラ書いて長いです。結論、今のところ自分が知る限りは可視化の方法はなさそう。

ここ数年、いわゆるソフトウェア開発のスキルではないスキル、いわゆるソフトスキルと呼ばれるものの重要性を感じている。

子供の夜泣きが始まった

子供の夜泣きが始まった

成長の証、ではあるもののなかなかきつい。大体夜中の1時から3時に1-2回は起きてわんわん泣く。妻は育休、自分はフルタイムで働いているので別部屋で寝ていて、妻が夜中の対応はしてくれるのだが、別部屋であっても子供の泣き声ってのは聞こえてしまうので目が覚める。

amplify init不要: Next.jsとAmplifyUIで既存のCognito使って認証だけしたい

やりたいこと

  • Cognitoのユーザプールは別で作成済みで、amplifyを使ってのリソース作成や管理は「しない」
  • Next.jsのアプリケーションは別で作成済み

という条件で、AmplifyUIのうち認証のとこだけ使いたい(要は Authenticator | Amplify UI for React だけ使う)ということです。

2023-07-11 プライムデーセールで買ったKindle本など

※リンクは全てAmazonアソシエイトリンクです

Kindle本

プライムデーに合わせて?Kindle本もセールをやっているのと、8冊購入で15%ポイント付与ということで調子乗って八冊買ってしまった。

赤ちゃん用品買ってよかったものリスト(生後7か月まで)

子育て実体験からおすすめ品の紹介

うちの子供は7カ月ちょっと。ここまで育つまでに「これは使ってよかった」と思えるものを紹介したい。あとこれ不要だった(かも)な、というものも合わせて紹介。

※父親目線です

2023-07-10 脱Googleを考えてみる

脱Googleを考えてみる

特にここ数年、Googleのサービス維持に希望を持つとまずそうなことが続いている。この前のドメイン管理サービス売却報道についてもそうだ。

ということで脱Googleを少し考えてみている。と言ってもスマホはスマホ誕生当初から生粋のAndroid勢なので、ここからiPhoneというのは中々厳しい…が仕方ないか。

ROG ALLY、良いとこ悪いとこ

ROG ALLY買ったよ

Amazon.co.jp: ASUS ゲーミングPC ROG Ally RC71L 7インチ Ryzen Z1 Extreme メモリ16GB SSD512GB リフレッシュレート120Hz Windows11 ポータブル 重量608g ホワイト RC71L-Z1E512 : パソコン・周辺機器

2023-07-07 Googleの印象が悪い

Googleの印象が悪い

サービスを簡単に廃止したり売ってしまう点がここ数年(もしかしたら10年)、あまりにも目立っている気がする。GAFAMと呼ばれるテックジャイアントの中でもひときわ目立つ。

2023-07-06 ユーチューバーになるなら

ユーチューバーになるなら

もし自分がユーチューバーになるなら何するかな~と妄想してみてる。

色々とガジェット揃えるのは好きだしガジェット系ユーチューバーはどうかな?と思ったけど、連日Amazonで使うかも分からないようなもの買って、レビューして動画撮るなんてやっぱ無理だなと思い直す。

2023-07-04 子供のハイハイが速くなった

子供のハイハイが速くなった

ほんの2週間ほど前にはその場で四つん這いになりながらクルクル回るだけだった子供が、ここ何日かで急激に成長してハイハイができるようになり、更にはハイハイの速度があがったので目が離せなくなっている。

2023-07-03 久しぶりの出社

久しぶりの出社

すこし体調を崩しており、2週間ほどずっと家にいた。まだ体調に不安な部分はあるけど、かと言ってずっと家にいるのも性分に合わないので今日は久しぶりに出社してみた。 結論、そこまで問題はなかったが単純に疲れた感じはする。出社はやはり週に2、3程度で十分と感じる。

2023-07-02 ドッキングステーション買った

DELL WD22TB4を買った

ROG ALLYを買ってウキウキしながら元々持っていたLenovoのTB3のUSBドッキングステーションを繋げたのだが、ドライバを入れても機能してくれなかった。古いドッキングステーションでファームウェアやドライバも更新が止まっているので、これを機に新しいドッキングステーションとしてDELL WD22TB4をDELLの公式サイトから購入した。

2023-07-01 子供の成長

子供の成長

昨年生まれた子供もそろそろハイハイができるようになってきた。嬉しい反面、自分で移動できるので色々なものを触って何でも口に入れようとするので目が離せない。 そろそろ家に柵が必要だなぁと思っている

2023-06-30 雑にブログを書く

雑にブログを書こう

もっと雑にブログを(本来の日記的な意味で)書いてもいいかなと思ったので、今日から書いていこう。

雑にブログを書くために

このブログはHugoを使って生成しており、Netlifyで自動的にビルドされるようになっている。ということでリポジトリにmdファイルだけコミットすれば自動的に更新してくれる。

30代男性、育休を取る (育休中・後編)

これは何か

育児・育児休職に関すこれから育休を取る人(主に男性)に向けた、自分の体験に基づいたメッセージです。聞こえますかウヴォーさん。

  • 30代男性
  • 非管理職
  • 伝統的日本企業(企業規模大きめ)勤務
  • 里帰り出産しない
  • 実家が遠方で頼れない

という条件です。

30代男性、育休を取る (育休前夜編)

これは何か

育児・育児休職に関すこれから育休を取る人(主に男性)に向けた、自分の体験に基づいたメッセージです。聞こえますかウヴォーさん。

  • 30代男性
  • 非管理職
  • 伝統的日本企業(企業規模大きめ)勤務
  • 里帰り出産しない
  • 実家が遠方で頼れない

という条件です。

ffmpegでTS-NA220WからRTSPでカメラ映像を取得する

TS-NA220Wという防犯カメラを使っているが…

TS-NA220W | ネットワークカメラ | IODATA アイ・オー・データ機器

本体の録画機能に不満な点(連続録画に失敗していつの間にか録画されていなくなったり)があり、嫌になったのでRTSPから直接動画を保存することにした。

pythonで数日前の日付を取得する

datetimeで簡単に前の日付を取得できる

日付の取得

import datetime

# daysで日付を指定する
date = datetime.datetime.now() - datetime.timedelta(days=3)

ディレクトリを消す

20211201
20211202
20211203
20211204

上記のような日付が名前となっているディレクトリがある場合でX日前のディレクトリを消すスクリプト

3台まで接続可能なiCleverマウスレビュー

3台まで接続可能なiCleverマウスレビュー

しばらく前にiCleverのマウスを買って使っていたので比較紹介。 もともと自宅では MX Anywhere 3を使っていて非常に気に入っていたのだが、職場にもう一台買うにはちょっと高いな~と思い、安い価格帯のマウスを調べていて良さそうな2台を購入したので比較紹介。 どちらも使いやすいのだが、結果としてはMD167を会社で利用することにした。

JavaScriptとReactのお勉強

参考にした本

初心者向けの本でお勉強。あと少しで終わりそう。

公式のReactチュートリアルもあるのだが、JavaScript自体の経験もないのでJavaScriptのお勉強も兼ねて買ってみた

ASUS detachable cm3 を買ったので感想など

ASUS detachable cm3

公式サイト

ASUS Chromebook Detachable CM3 CM3000 | Chromebook | ノートパソコン | ASUS日本

スペックは公式サイトに載ってるので感想だけ。

なお初のChromeBookなので、ChromeBookになれている人からすると当たり前なことも書いていると思われる。

電話番号が変わったときに連絡すべきところ

電話番号変更時に連絡すべきところ

変更前に手続き方法を調べておいたほうがいいもの

  • LINE
  • Googleアカウント
  • ネット決済系サービス(Paypalなど)

連絡優先度

すぐに

  • 家族/親族
  • LINE(変更前に手続きを確認しておくべき)
  • Googleアカウント
  • 決済系(Paypalなど)
  • 会社
  • 銀行
  • 証券
  • クレカ

割と急ぎ

  • 賃貸の不動産会社
  • 保険
  • ネットプロバイダ
  • ガス
  • 水道
  • 電気

後からでも良さそう

上記を除く会員登録を伴うサイト

ストレージサービスの比較

主な機能比較

機能DropboxboxGoogleDriveOneDrive
有料プラン(最低限)/月\1200(2TB)\1200(100GB)\250(100GB)\224(100GB)
同期可能端末数(無料プラン)2不明不明(無し?)不明(無し?)
容量制限(無料プラン)2GB10GB15GB5GB
過去データの保持期間(無料プラン)30日日数不問の過去1バージョン日数不問のファイルごとの版管理日数不問のファイルごとの版管理

Dropbox

個人向けプランの料金を比較 - Dropbox

個人用に使えるメモサービス・アプリを比較した

個人向けメモサービス・アプリを比較した結果

結論から言うとJoplinが素晴らしかった。

経緯

インターネット上に公開しても問題ないような内容はこのブログにたまに書いているが、極個人的なメモを書いてまとめておくために何かいい方法は無いかなと調べたのでメモしておく。 今回はあくまでも個人向けを検討しているので、例えば会社のチームで使うことを主目的に置いているようなサービスは比較対象に入れていない(フリープランがあれば一応検討程度)。

プランターの大玉トマト収穫終了

トマトの収穫終了

初収穫後しばらくして梅雨に入り、どうやらトマト自体が何かの病気にかかってしまったようで葉が次々と枯れる自体に。

幸いいくつか玉ができている状態だったので、梅雨中は表面が乾いたら水やり抑えて順次収穫。

oauth2関連のメモ

oauth2のRFC

The OAuth 2.0 Authorization Framework rfc6749

日本語訳:The OAuth 2.0 Authorization Framework

The OAuth 2.0 Authorization Framework: Bearer Token Usage rfc6750

日本語訳:The OAuth 2.0 Authorization Framework: Bearer Token Usage(日本語)

アクセストークンレスポンスの例

  HTTP/1.1 200 OK
  Content-Type: application/json;charset=UTF-8
  Cache-Control: no-store
  Pragma: no-cache

  {
    "access_token":"mF_9.B5f-4.1JqM",
    "token_type":"Bearer",
    "expires_in":3600,
    "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"
  }

ライブラリ

Go

golang.org/x/oauth2

Python

oauthlib

Requests-OAuthlib

参考書籍

この本はとてもいい。読みやすくわかりやすい。

家庭菜園のメモ

肥料

肥料の種類

有機肥料

動植物や魚由来の原料で作られる、遅効性、緩効性の肥料。元肥として使われることが多い。悪臭や虫の発生の可能性があるが、オーガニック栽培をしたいなら優先的に利用を考えたい。牛糞、鶏糞、油かす、骨粉、草木灰など。

プランターの大玉トマト初収穫

トマトの初収穫

昨年からプランターで野菜を育てていて、去年は初心者ということもありバジルなどの葉物ばかりだったが、今年は実がなるものに挑戦したくなり、トマトの苗をゴールデンウィーク前の土日に植え付けたのだった。

ふるさと納税の返礼品でリッツパーティーした

鹿児島県伊佐市のふるさと納税

毎年のふるさと納税では主にお肉を選んでいたのだが昨年はチーズのセットをみかけたので試しに選んでみた。 結果としては金額(寄付額15000円)に対して満足度が高いセットが届いてとても良かった。

DIYのメモ

DIY(日曜大工)に関するメモ

材料

SPF材

ホームセンターでよく売っている柔らかく加工しやすい木材で、 SPFはSpruce(エゾマツ), Pine(マツ), Fir(モミ)の頭文字をとったもの。

2x4 など規定サイズで売っているので使いやすい。

How to use withings-go

withings-go

Go library zono-dev/withings-go is for Withings API.

Currently it support resource the below.

Getting started

1. Create your account and register your app

Before you can use withings-go, you need to create your Withings account and register your app; if you own a Withings product, you should already have a Withings account.

Access Register your app to register your app.

Callback URL must satisfy the following conditions described in Withings API FAQ.

pkg.go.devにパッケージを登録してgo docを表示する

pkg.go.devにパッケージを登録したい

About - go.dev

Adding a package に方法が書いてあった。

Adding a package Data for the site is downloaded from proxy.golang.org. We monitor the Go Module Index regularly for new packages to add to pkg.go.dev. If you dont see a package on pkg.go.dev, you can add it by doing one of the following:

Visiting that page on pkg.go.dev, and clicking the Request button. For example: https://pkg.go.dev/example.com/my/module

Making a request to proxy.golang.org for the module version, to any endpoint specified by the Module proxy protocol. For example: https://proxy.golang.org/example.com/my/module/@v/v1.0.0.info

go getしたモジュールを削除する

go clean

goコマンドのオプションとしてcleanというものがある。

go 1.15.6のヘルプは以下の通り。

$ go help clean
usage: go clean [clean flags] [build flags] [packages]

Clean removes object files from package source directories.
The go command builds most objects in a temporary directory,
    so go clean is mainly concerned with object files left by other
    tools or by manual invocations of go build.

    If a package argument is given or the -i or -r flag is set,
    clean removes the following files from each of the
    source directories corresponding to the import paths:

    _obj/            old object directory, left from Makefiles
    _test/           old test directory, left from Makefiles
    _testmain.go     old gotest file, left from Makefiles
    test.out         old test log, left from Makefiles
    build.out        old test log, left from Makefiles
    *.[568ao]        object files, left from Makefiles

    DIR(.exe)        from go build
    DIR.test(.exe)   from go test -c
    MAINFILE(.exe)   from go build MAINFILE.go
    *.so             from SWIG

    In the list, DIR represents the final path element of the
    directory, and MAINFILE is the base name of any Go source
    file in the directory that is not included when building
    the package.

    The -i flag causes clean to remove the corresponding installed
    archive or binary (what 'go install' would create).

    The -n flag causes clean to print the remove commands it would execute,
    but not run them.

    The -r flag causes clean to be applied recursively to all the
    dependencies of the packages named by the import paths.

    The -x flag causes clean to print remove commands as it executes them.

    The -cache flag causes clean to remove the entire go build cache.

    The -testcache flag causes clean to expire all test results in the
    go build cache.

    The -modcache flag causes clean to remove the entire module
    download cache, including unpacked source code of versioned
    dependencies.

    For more about build flags, see 'go help build'.

    For more about specifying packages, see 'go help packages'.

iでgo install で作られたものを削除する。

http.Requestとhttp.Responseをダンプする

net/http/httputilを使えばいい

httputilの存在をしらず、最初は自分でRequest、Responseをダンプする関数を書いていたのだが こんなの無いわけない(少なくとも誰かがライブラリ作ってるはず。。。)と思い探したらそもそも公式で用意されていた。

WSL2のメモ

WSL2に関するメモ

以下も参考に。

WSL2(Ubuntu)

通常のUbuntuとの違い

WSL2のshutdown/reboot

WSL2側では対応できないので、Windows側で以下のコマンドを実行する。

Cheero Power Plus 5 を買った

モバイルバッテリーを久しぶりにアップグレード

2年ほど前?に買ったCheeroのPower Plus 3とPower Plus 3 miniを使っていたのだが、スマホを機種変しやっとtype-cの充電口になったのでモバイルバッテリーもtype-c充電可能なものに変更しようと思い Power Plus 5を購入した。

プロキシ設定が必要なネットワークでDocker buildのエラーが出る

WSL2+Docker Desktop for Windowsでdocker buildが通らない

会社にプロキシがある場合 docker build で以下のようなエラーがでる場合がある。

docker: Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host.

このエラーを解決するのにえらく時間がかかった。結論から言うとDocker Desktop側とWSL2側それぞれでプロキシの設定をしてあげる必要がある。

WSL2, Docker Desktop for Windows, VSCodeでの開発環境を整える

WSL2が使えるようになった

いつのまにかWindows 10 1909にもバックポートされていたので、プライベートのPCや会社のPCに

  • Windows 10 Home
  • WSL2
  • Docker Desktop for Windows
  • VSCode Remote Containers

の組み合わせで開発環境を構築してみた。

WSL 2 Support is coming to Windows 10 Versions 1903 and 1909 | Windows Command Line

Anker PowerExpand 7-in-1を買った

Anker PowerExpand+ 7-in-1を買った

Amazon.co.jp: Anker PowerExpand+ 7-in-1 USB-C PD メディア ハブ 85Wパススルー充電 Power Delivery USB-Cポート HDMI USB-Aポート : パソコン・周辺機器

Amazon PrimeDayセールで安くなっていたのと、1000円クーポンを事前にもらっていたこともありAnker PowerExpand+ 7-in-1 を購入した。

楽してスパイスカレー編

包丁まな板を使いたくない

以前のレシピだとトマト、玉ねぎを切らなくてはならないのでめんどくさい。

ということでまな板、包丁を使わないようにするため、冷凍玉ねぎみじん切りとカットトマト缶を使う。 ただしカットトマト缶を使うと酸味が強くなることには注意。

RaspberryPi4b CPU温度測定

RaspberryPi4bを買った

8GBモデルが出たのをこの前知った。64bitカーネルのRaspbianも今ベータ段階みたいなので、(大して値段も変わらないので)メモリが多いモデルを買った方が後々いいかな?と思い8GBモデルを購入した。

Goのsortパッケージでtime.Timeの要素を基にソートする

時間でソートしたい

小ネタ。

sort.Sliceでソート

Go1.8以降でならsort.Sliceを使ったシンプルな方法でソートできる。

Go 1.8 Release Notes - The Go Programming Language

Len,Swap,Lessを使う

Go1.8より前、もしくは独自のソートを行いたい場合はsort.Sortのinterfaceを満たすためにLen,Swap,Lessを用意する。

お金に関わるメモ

注:自分のために書いているページです

このページは自分の整理のために書いている内容なので、間違ってたり読みづらかったりする部分があると思います。(間違ってたら教えてほしいです)

今後も更新していきます。

GitHub Actionsを使ってみた感想

GitHub Actionsを使ってみた

きっかけ

stp というLambda、DynamoDB、S3を使って小規模なCDNを構成できるものを作っているのだが、それのヘルパーとして stph も用意している。 stphは単純にブログに画像を載せるときにMarkdownコードと画像を表示してくれたり画像の削除をしてくれるローカルで動作するサーバなので、バイナリ単体で動作するようになっている(設定ファイルは必要)

ASUSのプレゼントキャンペーンでノートPC ExpertBook B9が当たったのでレビュー

ExpertBook B9が届いた!

resized-YZOlwJRxBtishmJQ.jpg

Twitterでいろいろな企業がやっているリツイートして応募するタイプのプレゼント企画。個人的に好きなメーカーのASUSの企画で初めて当選! 現在のコロナの状況もありしばらく時間がかかったものの、先週末無事に当選品が届いた。

Goのnet/http互換WEBサーバやミドルウェアのメモ

WEBサーバやミドルウェア

とあるソースコードを見ていて知らないものがあるので、どういったものかメモしていく

go-chi/chi

go-chi/chi

webサーバでルーティング機能がある。デフォルトの net/http互換。

lightweight, idiomatic and composable router for building Go HTTP services

年収XXX万のリアルを教えようシリーズが流行って(?)いる

年収XXX万シリーズ

多すぎる

年収に関係なく共通して選ばれるユニクロすごいということは分かった(?)

雑感

年収1000万のリアルを教えよう

一番はじめの記事はこれなんだけど、その後続々と同じような記事が続いていてちょっとおもしろかった。 それぞれの記事の内容が本当かどうかは定かじゃないけど。

IODATAのTS-NA220Wという防犯カメラを設置してみた

防犯カメラ TS-NA220Wを設置してみた

防犯のために、という理由もあるが一番の理由は単純に設置してみて映像を見てみたかったから。

TS-NA220Wのいいところ

  • 動作検知機能は割とまとも
  • 設定項目が豊富
  • ONVIF対応
  • Wi-Fi接続可能(有線LANもOK)
  • 視野角広め
  • IP65防水防塵
  • SMB, FTP経由でNAS、FTPサーバに保存可能
  • 画質が良い(1920x1080まで可能)
  • シンプルなデザイン
  • 実はAPIがある
  • 特別な設定なしにリモートからアクセス可能

いくつか詳しく書いていく。

aws cli でLightsailのポートを開け閉めする

LightsailもIP制限ができるようになっていた

Lightsailでいつのまにかアクセス元のIPアドレス制限ができるようになっていた。前々からfirewall機能はあったので自分でサーバ側で頑張って設定する必要はなかったのだが、IP制限まではできなかった。

GW中はスパイスからカレーを作ってばかりいた

なんで作ろうと思ったか

時間あるし前から作りたかった。

レシピ

元レシピはこれ。これをもとに自分にあうようちょっとカスタマイズしました。

我が家のインドカレー

これ書いてくれた人ありがとう。

材料

  • 牛脂(あれば)2つ なければサラダ油かオリーブオイルを大さじ2くらい

    Hugo用にGo, Lambdaで画像を自動的にリサイズしてS3に保存するやつを作った

    とりあえずソースコード

    github.com/zono-dev/stp

    あと補助ツールも。

    github.com/zono-dev/stph

    なぜ作ったか

    Hugoで書いてるこのブログに画像を貼りたいことがたまにあるのだけれど、元となるmarkdownはgitで管理しているのでリポジトリに画像を入れたくないなぁと思ったことがきっかけ。あとは単純に自分の勉強を兼ねて作った。

    スピーカーを作ってみた

    スピーカー作ってみた

    在宅勤務期間が長くなってきて仕事をしながら音楽でも聞くかと思ったんだけどスピーカーが作業部屋になく、Amazonをさまよっているうちにふと思い出したのは随分前になんとなく買っておいたスピーカーのパーツ。

    英会話メモ

    在宅勤務や新型コロナ関連の話が多かった

    直近やったレッスンの最初の雑談では自宅で働いているか?とか新型コロナの対応とか、そういった話題が多かったかな。

    在宅勤務: work from home

    I believe working from home is quite useful to all employees to avoid the commuting problem such as the rush hour. 在宅勤務はラッシュアワーを回避する方法としてとても便利です。

    1ヶ月ずっと在宅勤務だったので知見をまとめる

    3月はずーっと在宅勤務でした

    感染症予防ということで2月の下旬に在宅勤務が決定し、当初3月中頃までの予定だったものが伸びて伸びて今は4月の半ばまでは在宅勤務が確定している状況。

    ということで3月はほぼ家に居たのだが、こんなに連続して在宅勤務をしたことがなかったので色々良い部分・辛い部分がわかってきた。 なお妻も在宅勤務なので、家族がいる場合を想像して読んでもらえると嬉しい。

    英会話メモ

    think outside the box!

    発想の転換をしてみよう,これまでとは全く違った観点で考えよう、といった意味の言葉。箱の外で考えよう、が直訳なのだがなぜ箱なんだろうか。

    英語メモ

    • solicit,勧誘する、懇願する、熱心に説く
    • address,(問題など)を扱う、に話しかける(固い表現)
    • warranty,保証、保証書
    • treat,扱う
    • concentrate,集中する
    • interactive,双方向性の
    • familiarity,【名】親しさ;精通
    • liaison,連絡係、連絡
    • ensure,確実にする、保証する
    • maintain,を維持する;と主張する
    • spontaneity,自発性
    • impromptu,即興の、準備なしの
    • admire,~に感心する
    • willingness,意欲、やる気

    Lenovo G580のCPU/メモリ交換とSSD化

    Lenovo G580のCPU/メモリ/HDDを交換してみた

    Lenovo G580というちょっと古いノートPCがあり、スペックがWindows10を使うには辛いものだった。

    • 購入:2013年?
    • CPU: Celeron 1000M(1.8GHz/2コア/2T)
    • メモリ: 4GB PC3-12800
    • HDD: 5400rpm, 500GB

    というか標準のWindows8.1でもきついのでは…と思うスペックで、標準で入っていると思しきソフトの効果も相まってかなり動作が重くなっていた。 少し調べてみるとこの機種はCPUが交換可能とのことで、チャレンジしてみることにした。 データは消えても問題ないということだったのでCPU交換だけでなく、HDDからSSDに、メモリは余っていたPC3のメモリを刺して増量する。

    S3バケットに対してバケットポリシーでIP制限をかける2020年02月時点版

    S3バケットに対してIP制限をかけたい

    調べたらすぐ出てくるのだが、結構古い内容も多くなかなか正解にたどり着けなかった。 S3はAWS re:Inventなどでちょこちょこ機能追加されてコンソールで設定できる内容が多くなっており、その影響を受けてバケットポリシーを追加するだけではIP制限をかけることができなくなっている。

    英会話メモ

    TOEIC 800点をやっと超えた

    TOEICの点数が高いからといって英語の能力が高いことには直結しないが、それでもある程度の目安にはなるので定期的に受験している。

    TOEIC用の勉強は数年前にやったくらいで、公式問題集も買ってはみたものの結局開いてすらおらず、やってきたことは単語の勉強をやったりやめたり、オンライン英会話が多いが、実践(仕事、プライベート)する機会が多くなったことが何よりモチベーションにつながっている気がする。

    Python boto3でCLB, ALB, NLBの情報を取り出す

    Python/boto3でLBの情報を取得する

    boto3でロードバランサの情報を取得を取得する。CLBとALB/NLBで利用するAPIが異なるので注意する。

    動作環境情報

    Ubuntu18.04 LTS
    Python 3.6.9
    boto3 (1.11.8)

    ソースコード

    import boto3
    from boto3.session import Session
    
    # セッションのセットアップ
    # aws cliの利用時に profileを設定していれば boto3が勝手に拾ってくれるようだ
    def setup():
        session = Session(
            profile_name = "profile_hoge"
        )
        return session
    
    # CLBの情報取得
    # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elb.html#ElasticLoadBalancing.Client.describe_load_balancers
    def get_clb_info(sess):
        elb = sess.client("elb")
        elb_info = elb.describe_load_balancers()
        for i in elb_info["LoadBalancers"]:
            lb_name = i["LoadBalancerName"]
            # ... その他色々情報が取れるが、LBによっては欠損している(辞書のKeyごと存在しない)情報もあるので
            # 辞書での情報取得時はKeyが事前にあるかどうかを確認した方がいい
    
    # NLB/ALBの情報取得
    # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/elbv2.html#ElasticLoadBalancingv2.Client.describe_load_balancers
    def get_elb_info(sess):
        elb = sess.client("elbv2")
        elb_info = elb.describe_load_balancers()
        
        for i in elb_info["LoadBalancers"]:
            lb_name = i["LoadBalancerName"]
            # ... その他色々情報が取れるが、LBによっては欠損している(辞書のKeyごと存在しない)情報もあるので
            # 辞書での情報取得時はKeyが事前にあるかどうかを確認した方がいい
    
    
    if __name__ == '__main__':
        sess = setup()
        get_clb_info(sess)
        get_elb_info(sess)

    ドキュメントではそのような記述が見当たらなかった気がするのだが、 “elb” で取得できるのはCLBの情報で、“elbv2” で取得できるのはNLBやALBの情報のようだ。

    英会話メモ My wife and me

    My wife and I/me は正しいが I and my wifeは間違い

    英会話中に指摘されて知ったのだが、英語には「三人称と ‘I’をandでつなぐといには必ず’I’があとに来る」というルールがあるらしい。 日本語ではどちらが先でも構わないが、英語の場合は他者の方を先に言う必要があるようだ(なぜだろう)

    英会話メモ

    オンライン英会話をまた始めた(半年ぶり4回目くらい)

    年の半分くらいオンライン英会話をやって半分くらいは休んでいたりするのだが、会社で契約してくれているオンライン英会話が他の安いオンライン英会話よりも良い感じだったので同じところでまた始めた。(前回は秋くらいで一旦終了した)

    re:Invent2019に行ってきた

    re:Invent 2019 に行ってきた

    2020/03/31追記:当初2ページで書くつもりだったのだが間が空いてしまったので1ページに画像を追加してお茶を濁すことにする

    だいぶ間が空いたが今更ながらメモがてら行ってきた話を書きたい。 来年も行きたいな。

    Google Cloud Vision APIでPDFにOCRをかけてみた

    給与明細にOCRをかけて自分の給与を記録したい

    会社から発行される給与明細はPDFファイル。しかもフォント埋め込みで埋め込まれてるフォントが有償?恐らく通常手に入らないRICOHのフォント。 データを抜き出せないかとGoogleDriveでPDFからGoogleDocumentsに変換してみたり、各種ツールでwordとかテキストに変換してみようとしたが一切うまくいかない。 そもそもコピペすらできない(コピペしようとしてもフォントが無いから?????になる)

    TypeScriptに入門したいのでJavaScriptに入門してみる(文と式)

    続: JavaScript入門

    教材は

    https://jsprimer.net/

    文と式

    JavaScriptは文と式で成り立つ。

    式は評価すると値を得ることができ、この値のことを評価値と呼ぶ。

    文は処理の一部として式を含むことがある。

    TypeScriptに入門したいのでJavaScriptに入門してみる(関数と宣言)

    続: JavaScript入門

    教材は

    https://jsprimer.net/

    関数と宣言

    関数は function キーワードを使う。

    function function_name(arg1, arg2) {
        // something to do...
        return return_value;
    }
    
    // 関数の呼び出し
    
    const result = function_name(arg1, arg2);

    関数名のルールは変数名のルールと同じ

    1. 半角のアルファベット、_ (アンダースコア)、$ (ダラー)、数字を組み合わせた名前にする
    2. 変数名は数字から開始できない
    3. 予約語と被る名前は利用できない
    • returnは必須ではない(値を返す必要がない関数はreturnを書く必要はない)
    • returnの返り値を省略している場合、もしくはreturn 文のそのものを省略した場合は未定義の値である undefined を返す。

    関数の引数

    定義した関数の仮引数よりも呼び出し時の引数が少ない場合、余った仮引数には undefined という値が代入される。(エラーにならないんですね…)

    TypeScriptに入門したいのでJavaScriptに入門してみる(暗黙的な型変換)

    続: JavaScript入門

    教材は

    https://jsprimer.net/

    暗黙的な型変換

    等価演算子などで暗黙的に型変換される例が載っているが、必要性は薄く基本的には === を使うようにすべき。

    暗黙的な変換は割とひどい仕様が載っている…

    TypeScriptに入門したいのでJavaScriptに入門してみる(演算子)

    続: JavaScript入門

    教材は

    https://jsprimer.net/

    演算子

    + での文字列結合

    const value = "hoge" + "moge";
    console.log(value); // -> hogemoge

    数値計算

    JavaScriptでは数値は内部的には IEEE 754方式の浮動小数点数として表現される。よって整数と浮動小数点数の加減乗除も + ,- , * , / , % で実行可能。

    TypeScriptに入門したいのでJavaScriptに入門してみる(nullリテラル~データ型とリテラルの最後まで)

    続: JavaScript入門

    [これ]({{ relref path=“2019-10-29-javascript-intro.md” }}) の続き。

    教材は

    https://jsprimer.net/

    nullリテラル

    null 値を返すリテラルで、「値がない」ことを表す。 nullを参照した場合コンソール上では null と表示されるだけである。

    DIYで家のネットワークをcat6aにした場合の費用はどのくらい必要か

    本ページには広告リンクが含まれます

    新築時にcat6aケーブルを敷設する

    持ち家のいいところの一つに、家の色々な部分を変更できるという点がある。 家を作るときに情報コンセント(モジュラージャック)を付けて、入居前に宅内LANを敷設してもらうことももちろん可能だ。 しかし家を建てるときに住宅メーカーにやってもらった場合、5箇所で10万~20万程度はかかってしまう。 更にcat6aなどは対応してくれない業者もあるので,それなら空配管だけ通しておいてもらって自分でやろう!と思った次第。

    TypeScriptに入門したいのでJavaScriptに入門してみる(変数~文字列リテラルまで)

    動機

    WebUIをある程度作れるようになりたい(個人の趣味レベルだけど)と大昔から思っていたものの、当時はJavaScriptのFWだったりJavaScriptのトランスパイラだったりが沢山出てきていたような印象があり、遠巻きにWebのUIを作るのは怖い!と思っていた。

    続:Terraformに入門してみた(Lambda)

    続: Terraform入門

    今回は terraformで lambdaを管理してみる。ただし terraform での Lambdaの管理は辛いというような意見が散見されるので、良い方法ではないと思われる。 まぁあくまでも入門ということで。

    Ubuntu18のaptでインストールしたpip3ではtargetオプションを使ってもExceptionが発生する(Ubuntu18.04)

    pip3でtargetオプションを使って特定ディレクトリにライブラリをインストールしたい

    $ pip3 -V
    pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

    このpip3はaptでインストールしたもので、バージョンが低くtargetオプションがそもそも存在しないようだ。

    $ pip3 install requests -t workspace/
    Collecting requests
      Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
    Collecting chardet<3.1.0,>=3.0.2 (from requests)
      Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
    Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests)
      Using cached https://files.pythonhosted.org/packages/81/b7/cef47224900ca67078ed6e2db51342796007433ad38329558f56a15255f5/urllib3-1.25.5-py2.py3-none-any.whl
    Collecting certifi>=2017.4.17 (from requests)
      Using cached https://files.pythonhosted.org/packages/18/b0/8146a4f8dd402f60744fa380bc73ca47303cccf8b9190fd16a827281eac2/certifi-2019.9.11-py2.py3-none-any.whl
    Collecting idna<2.9,>=2.5 (from requests)
      Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
    Installing collected packages: chardet, urllib3, certifi, idna, requests
    Exception:
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/pip/basecommand.py", line 215, in main
      status = self.run(options, args)
      File "/usr/lib/python3/dist-packages/pip/commands/install.py", line 360, in run
      prefix=options.prefix_path,
      File "/usr/lib/python3/dist-packages/pip/req/req_set.py", line 784, in install
      **kwargs
      File "/usr/lib/python3/dist-packages/pip/req/req_install.py", line 851, in install
      self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
      File "/usr/lib/python3/dist-packages/pip/req/req_install.py", line 1064, in move_wheel_files
      isolated=self.isolated,
      File "/usr/lib/python3/dist-packages/pip/wheel.py", line 247, in move_wheel_files
      prefix=prefix,
      File "/usr/lib/python3/dist-packages/pip/locations.py", line 153, in distutils_scheme
      i.finalize_options()
      File "/usr/lib/python3.6/distutils/command/install.py", line 274, in finalize_options
      raise DistutilsOptionError("can't combine user with prefix, "
    distutils.errors.DistutilsOptionError: can't combine user with prefix, exec_prefix/home, or install_(plat)base

    解決策

    根本的にはpython3の環境管理用の venv で、まるごとPythonの環境を取り替えてしまう方が良さそう。

    続:Terraformに入門してみた(VPC/サブネット/ピアリング等)

    続:Terraform入門

    今回はVPCを2つ作って、サブネット、ルートテーブル、ピアリングまで実施する。

    作るネットワーク

    • VPC1, VPC2の2つがある。
    • VPC1, VPC2ともに public用のサブネットを持つ。
    • またインターネットゲートウェイもそれぞれ持つ。
    • publicサブネット同士をルーティングする。
    • publicからインターネットゲートウェイを抜けて外にアクセスできるようにする。

    terraformのコード

    グローバルIPを使ってしまっているが、サンプルということで…

    Terraformに入門してみた

    Terraform使い始めた

    仕事でterraformを使い始めたのでメモしておく。 なお、AWSと一緒に使う場合を記載する。

    公式サイト

    https://www.terraform.io/

    対応してるIaaS等

    https://www.terraform.io/docs/providers/index.html

    意外とたくさん対応しているが、awsと組み合わせて使っている人が多いと思う。

    Gitコマンドのメモ

    gitに関するメモ

    gitの使い方などをメモしていく。随時更新。

    git logで変更されたファイルを確認する

    git log --name-only

    その他にも --stat, --numstat, --name-statusなどで確認できる。

    ブランチを作る

    git checkout 元にしたいブランチ名
    git branch -b 作成するブランチ名

    今いるbranchをベースに作られる。

    Hugoに関するメモ

    HugoやMarkdownの書き方などをメモしていく。随時更新。

    Gist用のshortcode

    Shortcodes | Hugo

    {{< gist zono-dev 377e5d76d335f73eb662ffc6dc02a09e >}}

    こんな感じでアカウント名とgistのIDを書けば良いらしい。

    HugoのTOC設定

    HugoのTOC設定はテンプレートで

    yum updateでurllib3のエラー

    Amazon Linux2のyum updateでurllib3のエラー

    Running transaction
      Updating   : python-urllib3-1.24.3-1.amzn2.0.1.noarch                                                                                                                         1/2 
    Error unpacking rpm package python-urllib3-1.24.3-1.amzn2.0.1.noarch
    error: unpacking of archive failed on file /usr/lib/python2.7/site-packages/urllib3/packages/ssl_match_hostname: cpio: rename
    python-urllib3-1.10.2-3.amzn2.0.1.noarch was supposed to be removed but is not!
      Verifying  : python-urllib3-1.10.2-3.amzn2.0.1.noarch                                                                                                                         1/2 
      Verifying  : python-urllib3-1.24.3-1.amzn2.0.1.noarch                                                                                                                         2/2 
    
    Failed:
      python-urllib3.noarch 0:1.10.2-3.amzn2.0.1                                               python-urllib3.noarch 0:1.24.3-1.amzn2.0.1                                              
    
    Complete!

    ここ

    によるとurllib3がrpmのものとpipでインストールしたものでコンフリクトして起こってるらしいので、

    AWSのgo用SDKでSQSに入ってくるメッセージを取得する

    目的

    インスタンスからgo用のAWS SDK でSQSに届くメッセージを取得したい。

    公式APIリファレンスの場所

    AWS SDK for Go API Reference

    インストール

    先にgo getしておきましょう。

    go get github.com/aws/aws-sdk-go/...

    使い方

    • 対象のSQSのキューのARNだけをリソースとして指定したPolicyを作り、ロールにアタッチする
    • EC2等にそのロールを付与する

    ソースコード

    package main
    
    import (
        "flag"
        "fmt"
        "log"
        "os"
        "time"
    
        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/aws/aws-sdk-go/service/sqs"
    )
    
    //
    // GetMessage will get messages in SQS queue.
    //
    func GetMessage() {
    
        params := &sqs.ReceiveMessageInput{
            QueueUrl: aws.String(queueUrl),
    
            // Number of messages are got in one time.
            MaxNumberOfMessages: aws.Int64(10),
    
            // If there are no messages, keeping connection in 20 sec.
            WaitTimeSeconds: aws.Int64(20),
        }
    
        // Get messages by using aws sdk
        resp, err := svc.ReceiveMessage(params)
    
        log.Printf("messages count: %d", len(resp.Messages))
    
        if len(resp.Messages) == 0 {
            fmt.Println("empty queue.")
        } else {
            // If message(s) are found, filtering them and delete them.
            for _, m := range resp.Messages {
    
                //
                // note:
                //     svc.ReceiveMessage will return many same messages( their number of defined by MaxNumberOfMessages),
                //     so deleting target all messages. ( I don't sure why ReceiveMessage do so... )
                //
                fmt.Printf("Found target message:\n%s\n", m.GoString())
                
                if err := DeleteMessage(m); err != nil {
                    fmt.Println(err)
                }
            }
        }
    
        return 
    
    }
    
    // DeleteMessage is deleting target message.
    func DeleteMessage(msg *sqs.Message) error {
        params := &sqs.DeleteMessageInput{
            QueueUrl:      aws.String(queueUrl),
            ReceiptHandle: aws.String(*msg.ReceiptHandle),
        }
        _, err := svc.DeleteMessage(params)
    
        if err != nil {
            fmt.Println(err)
            return err
        }
        return nil
    }
    
    func main() {
    
        targetRegion = "ap-northeast-1"
        queueUrl = "https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXXXXXXX/TestQue"
    
        sess, err := session.NewSession(&aws.Config{
            Region: aws.String(targetRegion)},
        )
        if err != nil {
            log.Println(err)
            panic(1)
        }
    
        // to create session
        svc = sqs.New(sess)
    
        // to get messages
        GetMessage()
    
    }

    ReciveMessageでなぜか同じメッセージが沢山入ってくる なんでだろう。ドキュメント読んでもそれらしきことは書いてないのだが、、、使い方間違ってるのかな。

    親の見守り方法を考える

    離れて住む老親の見守り方法を考える

    親が一人で暮らすようになり、遠隔地ということもあって見守り製品を検討している。 見守り製品で重要なのは、プライバシー侵害をせず、監視されている気持ちにさせない、ということだと思う。(自分が見守られる側だとすると、カメラなどで監視されるのは嫌なので。。。)

    AWSのgo用SDKでLambdaを呼び出す

    目的

    インスタンスからgo用のAWS SDK でLambdaを呼び出したい

    注意)Lambdaをgoで書きたいとか、Lambda to Lambdaをgoで書きたいとかではない(でもやってることはほぼ同じ)

    相続法の改正で助かる人も多そう

    相続法が改正された

    相続法の改正|凍結した口座から預金を引き出す法(仮払い制度)2019年度版

    司法書士事務所の公式ページなので、内容は信頼性が高そうだし、わかりやすくて助かった。

    法定相続分の3分の1、かつ150万円未満であれば想像できるらしい。相続人の戸籍謄本を準備するなど銀行によってそれぞれ条件があるようだが、相続の手続きが終わらないと引き出せないというのは残された人にとって困ることが多いため、今回の法改正は良いと思う。

    vim setpaste で不意なインデントを防ぐ

    setpaste で不意なインデントを防ぐ

    vimのautoindentやsmartindentが効いているときにMinttyなどを経由してコピペする時に自動的に改行されまくってうざいなぁと思っていながらも、手動または Ctr-v で範囲選択して = で直したりしていた。 しかし実は以下のオプションで一旦インデントを解除できるようだ。

    HugoとNetlifyでブログ開始

    ブログのビルドとホスティング

    以前 Sphinx を使ってブログを書いていたのだが、Sphinxはやはりドキュメンテーションツールであってブログ向きではないと思うことが多く、最近Goを触り始めたのもあり人気のあるHugoを利用することにした。

    First Commit

    Hello

    This is test page.

    Test code

    package main
    
    import "fmt"
    
    func main() {
        fmt.Printf("Hello World.\n")
    }