DDG - Develop a Digital Garden

develop a digital garden

DeepL API Freeを使った日本語ブログ記事タイトルをブログURLに変換するPythonスクリプト

Image from Gyazo

こんにちは、shootaceanです。

以前紹介したこちらの記事の、翻訳部分を「DeepL API Free」を利用して自動化したものになります。

英文をブログURLに適した形式に変換するPythonスクリプト shootacean.com

DeepL API Freeの準備

https://www.deepl.com/translator

DeepL APIにフリープランがありますので、そちらのプランでアカウントを作成します。

Image from Gyazo

アカウント作成後にAPIキーが発行されるので、そちらをメモっておきます。

Image from Gyazo

実行方法

下記のPythonコードを translate_blog_title.py として保存し、
DEEPL_AUTH_KEY = "key"
の部分を上記の手順で発行されたAPIキーで置き換えます。

後は $ python3 translate_blog_title.py "日本語ブログ記事タイトル" のように実行するだけです!

$ python3 translate_blog_title.py \
                    "DeepL API Freeを使った日本語ブログ記事タイトルをブログURLに変換するPythonスクリプト"
Python script to convert a Japanese blog post title into a blog URL using DeepL API Free
python-script-to-convert-a-japanese-blog-post-title-into-a-blog-url-using-deepl-api-free

Pythonコード

DeepL API Freeを使った日本語ブログ記事タイトルをブログURLに変換するPythonス…

【Obsidian+Alfred】1週間分のリンクを自動生成するスニペット

こんにちは、shootaceanです。

Obsidianでひとりスプリントを回すようにしていて、 スプリント用ノートに「各デイリーノートへのリンク」を書くようにしています。

その際に利用しているAlfredのスニペット1を紹介します。

なぜAlfredを使うのか?

Obsidianでは、現在日時はテンプレート機能で取得できるのですが、日付の計算が行えません。 なので、Alfredのスニペット機能[^1]を利用して運用しています。

Daily Notes and calculated Date - Help - Obsidian Forum

Alfredスニペット

こちらが実際のAlfredスニペットになります。

[[{datetime:yyyy-MM-dd_eeee}]]
[[{datetime +1D:yyyy-MM-dd_eeee}]]
[[{datetime +2D:yyyy-MM-dd_eeee}]]
[[{datetime +3D:yyyy-MM-dd_eeee}]]
[[{datetime +4D:yyyy-MM-dd_eeee}]]
[[{datetime +5D:yyyy-MM-dd_eeee}]]
[[{datetime +6D:yyyy-MM-dd_eeee}]]

Image from Gyazo

これを実際に貼り付けると、こんな感じに展開されます。

![[2021-06-07_月曜日]]
![[2021-06-08_火曜日]]
![[2021-06-09_水曜日]]
![[2021-06-10_木曜日]]
![[2021-06-11_金曜日]]
![[2021-06-12_土曜日]]
![[2021-06-13_日曜日]]

日付フォーマットと計算式の注意

[[{datetime:yyyy-MM-dd_eeee +1D}]]

Alfredスニペットの日付フォーマットと計算の指定方法ですが、 上記のようにフォーマットの後に計算式を書いてしまうと、「+1D」の部分が日付フォーマット指定として扱われてしまいます。

なので、以下のように先に計算式を書いてから日付フォーマットを指定するようにしてください。

[[{datetime +1D:yyyy-MM-dd_eeee}]]

曜日部分を英語にできないのか?

上記の展開例を見て思った方もいらっしゃると思うのですが、 [[2021-06-07_月曜日]]のように曜日が日本語になっています。

Obsidianのテンプレート機能での日付フォーマットは曜日が英語しか対応していません。 なので、Alfred側の曜日を日本語に対応できないか!?と調べてみました。

結論、私の環境ではできませんでした…

Alfredスニペットで展開される日付はMacのシステム設定を利用しているので、 Alredの設定ではなくMacの設定を変更しないといけないです。

こちらの参考記事2で紹介されているコマンドを叩くと、Mac側の設定は変更されるのですが、Alfredは変わらず日本語の曜日で展開されてしまいます。

$ defaults write -g AppleLocale en\_JP

どなたか方法を御存知の方いらっしゃれば教えてください!

参考


  1. スニペット機能はPower Packを購入しないと利用できないので、ご注意ください。

  2. 曜日や月を英語表記にするには? - Apple コミュニティ

Firebaseでコストが発生しているプロジェクトとサービスを確認する方法

  1. Firebaseのプロジェクトの設定メニューから請求ページを開いて、アカウントを表示をクリック

Image from Gyazo

  1. GCPの請求ページに行くのでサイドメニューから「価格表」を選択する
  2. プロジェクト毎に各サービスで発生しているコストを確認できる

Image from Gyazo

Elmで今年の残り時間を知れるサービスをつくりました

こんにちは、shootaceanです。

今年の残り時間を知れるサービスをつくりました。

https://year-progress.shootacean.com

実装はElmのみで行っています。
ソースコードGitHubにありますので、よかったら見てみてください!
https://github.com/shootacean/year-progress

Image from Gyazo

基礎からわかる Elm

基礎からわかる Elm

Amazon

指定したURLのHTTPステータスを一括でチェックするPythonスクリプト

Image from Gyazo

こんにちは。shootaceanです。

CSVファイルに定義したURIを元にGETリクエストを行い、レスポンスのHTTPステータスをチェックするPythonスクリプトです。

運営しているWEBサービスの検証をする際に利用しました。

pandasのインストール

$ pip3 install pandas

Pythonスクリプト

host, csvFilePath, csvColumnName という変数を変更すれば、ご自身の環境に合わせることができると思います。

import urllib.request
import pandas as pd


host = "https://shootacean.com"
csvFilePath = "urls.csv"
csvColumnName = "uri"


def checkUrl(url):
    """指定したURLにGETリクエストした際のHTTPステータスをチェックする"""
    try:
        # GETリクエストをしてレスポンスを受け取る
        with urllib.request.urlopen(url) as response:
            # HTTPステータスが正常だった場合
            return True, response.code, url
    except urllib.error.HTTPError  as e:
        return False, e.code, url
    except urllib.error.URLError as e:
        if hasattr(e, 'reason'):
            return False, e.reason, url
        elif hasattr(e, 'code'):
            return False, e.code, url


if __name__ == "__main__":
    # CSVファイルを読み込む
    csv = pd.read_csv(csvFilePath)
    # CSVのレコード数分、チェックを繰り返す
    for uri in csv[csvColumnName]:
        url = host + uri
        # チェックを行う
        ok, code, url = checkUrl(url)
        if ok:
            # チェックが成功した場合
            print(code, url)
        else:
            # チェックが失敗場合
            print(code, url)

CSVレイアウト例

使うのは1カラムだけなのでレイアウトは何でも大丈夫です。 1レコード目はヘッダーとして利用します。

uri
/
/contact
/privacy-policy

参考

英文をブログURLに適した形式に変換するPythonスクリプト

Image from Gyazo

こんにちは。shootaceanです。

ブログ記事を書いた後にはURLを決める必要がありますが、 その際に活用できるPythonスクリプトを紹介します。

Pythonを実行する環境さえあればコピペだけで真似できるので、ぜひ試してみてください。

以下のPythonコードを main.py というファイル名で保存します。

import sys

def convert(title: str) -> str:
    """英文を記事URLの形式に変換する"""

    newTitle = title.lower()
    newTitle = newTitle.replace("/", "-", -1)
    newTitle = newTitle.replace(" ", "-", -1)
    newTitle = newTitle.replace("'", "", -1)
    # 他に変換したい文字がある場合は、ここに追記していく
    # newTitle = newTitle.replace("変換前の文字", "変換後の文字", -1)

    return newTitle

if __name__ == "__main__":
    
    # コマンドライン引数を受け取る ( sys.argv[0]はプログラム名なので使用しない )
    if (len(sys.argv) == 2):
        # 引数が1つの場合は、そのまま使用する
        title = sys.argv[1]
    else:
        # 引数が2つ以上の場合は、文字列として連結する
        title = " ".join(sys.argv[1:])

    print(convert(title))

以下のコマンドで実行できます。 実行すると変換後の文字が表示されるので、それを記事URLとして使います。

$ python3 main.py "Your Blog's Title"
your-blogs-title

$ python3 main.py Your Blog\'s Title
your-blogs-title

以上これだけです。

ブログ記事のURLを決める

という作業は今後頻繁に行っていく作業なため、早い段階で自動化した方が時間の節約になります。

プログラムとしては単純なものなので、活用していただければ嬉しいです。

この記事で試してみた例

英文をブログURLに適した形式に変換するPythonスクリプト

というブログタイトルを翻訳ツールで翻訳すると、

Python script to convert English text to a format suitable for blog URLs

となりました。 その英文をPythonスクリプトで変換してみると

$ python3 blog_title.py Python script to convert English text to a format suitable for blog URLs
python-script-to-convert-english-text-to-a-format-suitable-for-blog-urls

という感じで変換され、

python-script-to-convert-english-text-to-a-format-suitable-for-blog-urls

という記事URLとして利用できる形式になります。

変換する文字を追加したい場合

上記のPythonコード内の

他に変換したい文字がある場合は、ここに追記していく

と記載されている行へ以下のように追記していきます。

# 他に変換したい文字がある場合は、ここに追記していく
# newTitle = newTitle.replace("変換前の文字", "変換後の文字", -1)
# ダブルクォートを削除する
newTitle = newTitle.replace("\"", "", -1)

参考

Elmで数値をフォーマットする方法

Image from Gyazo

Elmで数値をフォーマットする際は elm-format-number というパッケージが便利です。

$ elm install cuducos/elm-format-number

パッケージには、

  • usLocale ( 12,345.67 )
  • spanishLocale ( 12.345,67 )
  • frenchLocale ( 12 345,67 )

というフォーマットがあらかじめ用意されているので、適宜選択してください。
※基本的に usLocale になると思います

module Main exposing (main)

import FormatNumber exposing (format)
import FormatNumber.Locales exposing (usLocale)
import Html exposing (text)


main =
    text (format usLocale 12345.67)

フォーマットをカスタマイズする方法

基本的に usLocale を利用すれば問題ないのですが、

小数点以下を表示したくない

という場合には、フォーマットをカスタマイズする必要があります。

import FormatNumber exposing (format)
import FormatNumber.Locales exposing (Decimals(..), Locale, usLocale)

main =
        text ( format customeLocale 12345.67 ) -> 12345

-- Locale型を返す関数を定義する
customeLocale : Locale
customeLocale =
        -- usLocaleをひな形とし、小数点以下の桁数を0にする
        { usLocale| decimals = Exact 0 }

また、cuducos/elm-format-numberパッケージは、小数点以下の切り捨てなどをサポートしていないためフォーマット前に、

あたりを使用する必要があります。

サンプルコードに実装例もあるので、ぜひ参考にしてください。

サンプルコード

module NumberFormat exposing (main)

import FormatNumber exposing (format)
import FormatNumber.Locales exposing (Decimals(..), Locale, frenchLocale, spanishLocale, usLocale)
import Html exposing (Html, li, text, ul)
import Round


main : Html.Html msg
main =
    ul []
        [ li [] [ text ("us: " ++ format usLocale 12345.67) ]
        , li [] [ text ("spanish: " ++ format spanishLocale 12345.67) ]
        , li [] [ text ("french: " ++ format frenchLocale 12345.67) ]
        , li [] [ text ("custom: " ++ format integerLocale 12345.67) ]
        , li [] [ text ("custom floor: " ++ (format integerLocale <| toFloat <| floor 12345.67)) ]
        , li [] [ text ("custom floor float: " ++ (format floatLocale <| Round.floorNumCom 1 12345.67)) ]
        ]


integerLocale : Locale
integerLocale =
    { usLocale | decimals = Exact 0 }

floatLocale : Locale
floatLocale =
    { usLocale | decimals = Min 0 }

参考

AWSアカウント内の全EC2インスタンスの利用可能IMDSバージョンを確認するためのPythonスクリプト

こんにちは。shootaceanです。

AWSアカウント内に存在している全てのEC2インスタンス
利用可能インスタンスメタデータサービスバージョン ( IMDSv1 / IMDSv2 )
を確認する必要があったので、Pythonスクリプトを書いてみました。

コード

import boto3

profileName = "your-profile-name"

def getTargetInstances(ec2Session):
    """EC2インスタンス情報を取得する"""

    instances = ec2Session.describe_instances()
    targetInstances = []
    for r in instances['Reservations']:
        for i in r['Instances']:
            targetInstances.append({
                'App': getTagValueByName(i['Tags'], 'App'),
                'InstanceId': i["InstanceId"],
                'HttpTokens': i['MetadataOptions']['HttpTokens'],
            })
        
    return targetInstances

def getTagValueByName(tags: list, name: str) -> str:
    """AWSリソースのタグ配列から指定したタグ名の値を取得する"""

    for t in tags:
        if t['Key'] == name:
            return t['Value']
        
    return ""

if __name__ == "__main__":
    session = boto3.session.Session(profile_name=profileName)
    ec2 = session.client('ec2')
    targetInstances = getTargetInstances(ec2)
    for i in targetInstances:
        print("{}\t{}".format(i['InstanceId'], i['HttpTokens']))

IMDSの利用可能バージョン判断

boto3で取得できるEC2データ内のMetadataOptions.HttpTokensで判断できます。
optionalの場合は、IMDSv1IMDSv2の両方利用可能で、
requiredの場合は、IMDSv2のみが利用可能となります。

インスタンスメタデータサービスの設定 - Amazon Elastic Compute Cloud
IMDSv2 の使用を必須にするには
既存インスタンスに対して、インスタンスメタデータのリクエスト時に IMDSv2 の使用を必須にするようにオプトインできます。
modify-instance-metadata-options CLI コマンドを使って、http-tokens パラメータを required に設定できます。http-tokens の値を指定するときに、http-endpointenabled に設定する必要もあります。

参考

Appendix

MacにJupyter Labをインストールする

MacJupyter Labをインストールする手順です。
pip3を使ってインストールし、パスワード設定を行います。

MacにJupyter Labをインストールする

# Install
$ pip3 install jupyterlab

# Set password 
$ jupyter notebook password

# Run
$ jupyter lab

Jupyter Lab