CODE COMPLETE 上を購入
2023年の目標で立てた目標のうち、「CODE COMPLETE 上を買う」をようやく達成することができた。
オブジェクト設計スタイルガイドを読んでたら、自分は本当に何もわかってないな、という気持ちになり少し焦りを感じた。少しでも良いコードがかけるように、少しずつスキルを磨いていこう。
2023年の目標で立てた目標のうち、「CODE COMPLETE 上を買う」をようやく達成することができた。
オブジェクト設計スタイルガイドを読んでたら、自分は本当に何もわかってないな、という気持ちになり少し焦りを感じた。少しでも良いコードがかけるように、少しずつスキルを磨いていこう。
プロジェクトのマネジメントをしていて、自分の想定通りにいかないことが多く冷静になれないことが多かった。自分が開発する側ならこんなことにはなってないのに、という内容が多くて自分の役割や立場を考えさせられるよいきっかけにもなった気がする。
私はシステム開発は割と好きだし、そのために勉強をすることだってある。でも、周りを見ていると好き好んで勉強する人は少ない。単純に熱量が違う気がいる。この差は大きい。だって、時間が経てば経つほど実力に差がついていくんだから。
だから、自分が思っている速度でメンバーが成長していないことにびっくりするし負の感情が出てくることがある。これじゃいつまでたってもいいシステムは作れないじゃん、って思うし、この会社への不満感にも繋がっている。転職すればいいんだけど、それも億劫な自分がいる。結局、自分がそういう場所を選んでるともいえるので、自業自得なところはあるんだよね。
そういう日々が続いていていると、私生活は家庭のことで精いっぱい。自分のことなんてなかなかできなかった。
それが一区切りつきそうで、気持ちが少し軽くなったので、こんなことを書いてみた。
個人的にブログを書くって心理的にハードルが高いと感じています。
でも、このツイートを見てもう少し楽に構えようという気になりました。
たぶん、zennとかqiitaのかの、個人の技術記事で重要なのは、とりあえずの言語化であって、まとめだとかはいらないのではと。
— はなだ☆のぶかず@動画編集始めました (@nobkz) June 7, 2024
別に個人運営なんだしまとまってなくても全然いいよね。そりゃそうだ。言語化することが大事だよ。
そう思うことにしました。
svg-inline-mkdocs-pluginプラグインを使うとインライン化できます。
PyMdown Extensionsのpymdownx.superfences
を公式ドキュメントの記載通りに設定してmermaidを書いたら、mkdocs serve
では正常に動作するものの、mkdocs build
では動作しませんでした。
そのときに解決した方法を記載します。
意外とMessaging APIについての情報が少ないので、メモとして残しておきます。
関数 URL
を設定して確認したサンプルコード書いていますが、そこではS3を使っています。必要に応じてその辺の設定もしてください。
そうすると、LineからWebhookへリクエストされます。
以下は、Lineからデータを取得してS3にアップロードするLambda + Pythonのサンプルコードです。
import json
import os
import urllib.request
import boto3
CHANNEL_ACCESS_TOKEN = "your token"
S3_BUCKET = "your bucket"
def lambda_handler(event, context):
print(json.dumps(event))
for message_event in json.loads(event["body"])["events"]:
message_type = message_event["message"]["type"]
# 画像・動画以外は受け付けない
if message_type not in ["image", "video"]:
continue
message_id = message_event["message"]["id"]
# 画像・動画ファイルを取得する
content = fetch_content(message_id=message_id)
# 画像・動画ファイルをS3にアップロード
original_filename = os.path.join("original", message_id)
upload_s3(bin=content, filename=original_filename)
# プレビュー画像を取得する
preview_content = fetch_preview_content(message_id=message_id)
# プレビュー画像をS3にアップロード
preview_filename = os.path.join("preview", message_id)
upload_s3(bin=preview_content, filename=preview_filename)
return {"statusCode": 200, "body": json.dumps("Hello from Lambda!")}
def fetch_content(message_id: str) -> bytes:
url = f"https://api-data.line.me/v2/bot/message/{message_id}/content"
return request_get(url=url)
def fetch_preview_content(message_id: str) -> bytes:
url = f"https://api-data.line.me/v2/bot/message/{message_id}/content/preview"
return request_get(url=url)
def request_get(url: str) -> bytes:
headers = {
"Content-Type": "application/json; charset=UTF-8",
"Authorization": f"Bearer {CHANNEL_ACCESS_TOKEN}",
}
req = urllib.request.Request(url, method="GET", headers=headers)
with urllib.request.urlopen(req) as res:
return res.read()
def upload_s3(bin: bytes, filename: str) -> str:
s3 = boto3.resource("s3")
bucket = s3.Bucket(S3_BUCKET)
bucket.put_object(Body=bin, Key=filename)
body
部分だけ参考として載せます。
{
"body": "{\"destination\":\"U668a9c2c0b1469cd8d5e984672961913\",\"events\":[{\"type\":\"message\",\"message\":{\"type\":\"image\",\"id\":\"463074078431562241\",\"contentProvider\":{\"type\":\"line\"}},\"webhookEventId\":\"01H4VG23S8TRNE9XJVEEE3HHFP\",\"deliveryContext\":{\"isRedelivery\":false},\"timestamp\":1688844963119,\"source\":{\"type\":\"user\",\"userId\":\"U0b465adc30fb8ac1fc6a414d06a0b1c7\"},\"replyToken\":\"fc66ac7d07bb408aa0f272cfb384d0f8\",\"mode\":\"active\"}]}"
}
{
"body": "{\"destination\":\"U668a9c2c0b1837cd1d5e984672961913\",\"events\":[{\"type\":\"message\",\"message\":{\"type\":\"video\",\"id\":\"463076447542233697\",\"duration\":34208,\"contentProvider\":{\"type\":\"line\"}},\"webhookEventId\":\"01H4VHD7F932NQFT58QE4FCB13\",\"deliveryContext\":{\"isRedelivery\":false},\"timestamp\":1688846375921,\"source\":{\"type\":\"user\",\"userId\":\"U0b465adc30fb8ac1fc6a414d06a0b1c7\"},\"replyToken\":\"e2b900a4dbef4f088a70d0097873dc60\",\"mode\":\"active\"}]}"
}
2023年6月某日に娘が産まれました。結婚してから約6年、2人にとっては念願の子供です。
長かった。私も妻も結婚したら何事もなく子供が産まれると思っていました。でも、うまくいかない時期が続きました。とくに妻は相当大変だったと思います。
など、いろいろ試行錯誤しました。
また、2022年には東京から岐阜に引っ越しました。周りに友だちがいない環境です。しかし、いい影響を与えたと2人とも感じています。
こんなことをしながら、ようやくの出産です。本当に良かった。
7、8月の2か月の間、育児休暇を取ります。良き父親になれるよう精進したいと思います。
このサイトのスタイルを確認したかったので、ChatGPTに確認用のテキストをMarkdownで生成してもらいました。
生成時に指示した内容はこれです。適当です。 「Markdown記法をふんだんに使った文章を作成してください。内容は問いません。」
自分で考えるのがめんどくさいときにGPTを利用するのは非常に楽でいいですね!
これは見出しの例です。Markdown では、#
の数で見出しのレベルを指定します。
以下はリストの例です。
番号付きリストの例もあります。
斜体 や 太字 のテキストを使用することもできます。
リンクのテキストを作成するには、角かっこ [ ]
と丸かっこ ( )
を使用します。
[リンクのテキスト](https://www.example.com)
画像を表示するには、次のように書きます。

引用を表すためには、行の先頭に >
を追加します。
引用の例です。引用文はこのように表示されます。
コードのブロックを表示するには、バッククォート `
を使用します。
表を作成するには、パイプ |
とハイフン -
を使用します。
| 名前 | 年齢 | | ---- | ---- | | 田中 | 25 | | 山田 | 30 | | 佐藤 | 28 |
名前 | 年齢 |
---|---|
田中 | 25 |
山田 | 30 |
佐藤 | 28 |
これらは Markdown 記法の一部の例です。Markdown を使用すると、テキストを簡単に整形して見やすくできます。
これは追加のパラグラフです。Markdown はテキストの書式設定や整形を行うための便利な方法です。シンプルで読みやすく、さまざまな要素を組み合わせることができます。見出しやリスト、強調、引用、コードブロック、表など、さまざまな要素を活用できます。また、リンクや画像の挿入も簡単に行うことができます。Markdown を使えば、文書を見やすく整理し、情報をわかりやすく伝えることができます。
さらにもう 1 つのパラグラフです。Markdown は多くのプラットフォームやツールで広くサポートされています。メモやドキュメント、ブログ記事、README ファイルなど、さまざまな場面で活用できます。記法も比較的シンプルで覚えやすく、初心者にも取り組みやすいです。Markdown を使って情報を整理し、魅力的な文章を作成しましょう。
Next.js で作成したアプリケーションに対して Cypress を使って E2E テスト実施時にカバレッジを測定するようにしました。
package.json
"dependencies": {
"next": "13.0.6",
"react": "18.2.0",
"react-dom": "18.2.0",
},
"devDependencies": {
+ "@cypress/code-coverage": "^3.10.7",
+ "babel-plugin-istanbul": "^6.1.1",
"cypress": "^12.5.1",
}
以下にファイルを作成してカバレッジを測定するための設定をします。
cypress/support/e2e.js
.babelrc
pages/api/__coverage.js
Server Side のコードカバレッジを取得するために、@cypress/code-coverage
プラグインはエンドポイントを必要とします。このエンドポイントは、Next.js の API 規約にしたがって pages/api/coverage.js ファイルに実装されています。このエンドポイントは、既存のグローバルカバレッジオブジェクトを返すか、NULL を返すだけです。
Cypress プラグインは、cypress.config.json ファイルから環境変数を使用して正しいエンドポイントを要求します。
cypress.config.js
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
require("@cypress/code-coverage/task")(on, config);
return {
...config,
};
},
baseUrl: "http://localhost:3000",
},
env: {
codeCoverage: {
url: "/api/__coverage__",
},
},
});