DeepL API Freeを使った日本語ブログ記事タイトルをブログURLに変換するPythonスクリプト
こんにちは、shootaceanです。
以前紹介したこちらの記事の、翻訳部分を「DeepL API Free」を利用して自動化したものになります。
英文をブログURLに適した形式に変換するPythonスクリプト shootacean.com
DeepL API Freeの準備
https://www.deepl.com/translator
DeepL APIにフリープランがありますので、そちらのプランでアカウントを作成します。
アカウント作成後にAPIキーが発行されるので、そちらをメモっておきます。
実行方法
下記の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コード
【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}]]
これを実際に貼り付けると、こんな感じに展開されます。
![[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
どなたか方法を御存知の方いらっしゃれば教えてください!
参考
Firebaseでコストが発生しているプロジェクトとサービスを確認する方法
- Firebaseのプロジェクトの設定メニューから請求ページを開いて、アカウントを表示をクリック
- GCPの請求ページに行くのでサイドメニューから「価格表」を選択する
- プロジェクト毎に各サービスで発生しているコストを確認できる
Elmで今年の残り時間を知れるサービスをつくりました
こんにちは、shootaceanです。
今年の残り時間を知れるサービスをつくりました。
https://year-progress.shootacean.com
実装はElmのみで行っています。
ソースコードはGitHubにありますので、よかったら見てみてください!
https://github.com/shootacean/year-progress
指定したURLのHTTPステータスを一括でチェックするPythonスクリプト
こんにちは。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スクリプト
こんにちは。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で数値をフォーマットする方法
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
パッケージは、小数点以下の切り捨てなどをサポートしていないためフォーマット前に、
- Elmコアの
floor
関数 - myrho/elm-round の
floorNumCom
関数
あたりを使用する必要があります。
サンプルコードに実装例もあるので、ぜひ参考にしてください。
サンプルコード
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
の場合は、IMDSv1
とIMDSv2
の両方利用可能で、
required
の場合は、IMDSv2
のみが利用可能となります。
インスタンスメタデータサービスの設定 - Amazon Elastic Compute Cloud
IMDSv2 の使用を必須にするには
既存インスタンスに対して、インスタンスメタデータのリクエスト時に IMDSv2 の使用を必須にするようにオプトインできます。
modify-instance-metadata-options CLI コマンドを使って、http-tokens
パラメータをrequired
に設定できます。http-tokens
の値を指定するときに、http-endpoint
をenabled
に設定する必要もあります。