Introduce Terraform

最近転職活動を少しやっていまして,その中でお断りされる理由が以下の 2 つです. パブリッククラウドの経験 これはプライベートクラウドをばりばりやっている弊社ではどうしようもない. その代わり自社 DC 運用経験というのがあるわけですが,オンプレの「オ」の字も考えていない企業からしたらムダな経験ってワケですね. Terraform の経験 パブリッククラウドの IaC を Terraform でやるなんてもう当たり前です. 上述のとおりプライベートクラウドかつ自社向け PF が提供されているので,これまで利用する必要がありませんでした. 正直 Terraform というか構成管理については Python Fabric から始まり,Chef を利用しそこから Ansible に移行するまで実施していたので,やればできるだろぐらいに考えていました. とはいえ Terraform の実務経験がないことに渋られるのもなんかムカついてきたので,チーム内で Terraform を利用することにしました. 利用するだけだと職務経歴書に書いても響かないと思うので,Provider の作成も実施しました. 今回は Terraform Provider を自作して導入してみた,ということで記事を書かせていただきます.

Try nix

Photo by Aditya Vyas on Unsplash Nix に入門してみました. homebrew 代替となる home-manager や nix-darwin などがありますが,今回は開発環境整備で利用してみることにします. devcontainer 的な感じですね.

Installing k3s on rasberry pi 5

Photo by Jainath Ponnala on Unsplash Raspberry Pi Imager ssh とか昔は mkdir とかやった記憶なんですが,今は Imager の設定で ssh や鍵認証まで設定できるようになっていました. Static IP 現在は NetworkManager で設定するのがナウいようです. 初期は設定ファイルがないので名前を設定することでまずはファイルを生成します.

Try launchd on macOS

Photo by Joshua Hoehne on Unsplash macOS でのデーモン系の管理は launchd というものを利用するみたいですね. 早速 yaskkserv2 を launchd で管理してみました. 以下に記載の通りですが,ユーザ管理ものは ~/Library/LaunchAgents に配置するようなのでそこに置きます.

Arch Linux Install Battle

Photo by svklimkin on Unsplash grub から systemd-boot にしたいなぁと思っていて,どうせなら綺麗にするかということで Environment Surface Pro Type Cover Keyboard (US) インターネット接続 WiFi でやっていく ip link set wlan0 up wpa_supplicant -B -i wlan0 -c <(wpa_passphrase SSID password) dhcpcd パーティションの作成 gdisk と思ったら最近はワンライナーでいけるらしい

Get RedirectUri on PowerShell

Photo by Marc Rentschler on Unsplash PowerShell で curl -w “%{redirect_url}” 相当がしたくなったのでメモ. Param( [String]$Uri ) $request = Invoke-WebRequest -Method Head -Uri $Uri $redirectedUri = $request.BaseResponse.ResponseUri.AbsoluteUri echo $redirectedUri

Try flet

Photo by Andrew Neel on Unsplash 雑にいうと Python で Flutter web みたいなことができる. Build multi-platform apps in Python powered by Flutter とりあえずサンプルコードだけ載せておく. import flet from flet import IconButton, Page, Row, TextField, icons def main(page: Page): page.title = "Flet counter example" page.vertical_alignment = "center" txt_number = TextField(value="0", text_align="right", width=100) def minus_click(e): txt_number.value = int(txt_number.value) - 1 page.update() def plus_click(e): txt_number.value = int(txt_number.value) + 1 page.update() page.add( Row( [ IconButton(icons.REMOVE, on_click=minus_click), txt_number, IconButton(icons.ADD, on_click=plus_click), ], alignment="center", ) ) flet.app(target=main) Flutter の Widget 的なやつを Page class に add していくと良い感じに Frontend ができるという感じです. やはり Dart は採用しにくいというところもあると思うので,Python で雑というか簡単に Frontend ができるのは良いです.

Melbourne memo

飛行機 カンタス航空を利用しました. 行きは羽田 -> メルボルン,帰りはメルボルン -> シドニー -> 羽田という感じでした. 帰りメルボルン空港はカンタス航空専用ターミナルからの出発のため,PP で利用できるラウンジがなかったのが残念. シドニー国際線ターミナルは PP で利用できるラウンジがありますが追加料金が $20 必要なタイプ,そのほかには $36 分の配給が得られるレストランが利用できます. 今回はトランジットの時間が短く利用はできませんでした.

Prometheus time unittest

現在の unixtime を返してくれる time() を使ったときの Prometheus Unittest の書き方です. よくあるのは SSL 証明書が切れそうなときアラートを発破したいという時かと思います. このアラートのテストをしたいと思ったとき,time() をどう mock するかみたいなことを考えるかと思います.

California Disneyland Resort memo

カリフォルニア の Disneyland Resort に行ってきました.事前準備などのメモです. 飛行機 ZIPAIR を利用しました.LCC なので受託手荷物は追加料金が必要です. 今回は事前座席指定・機内食・受託手荷物のセットになっている Value パッケージを追加しました. 座席については充電用 USB ポート・タブレット用ホルダーがあったり,無料で WiFi が利用できるので不便はありませんでした. これで格安でいけるならありですね.

Microsoft Graph API Calendar

Photo by Eric Rothermel on Unsplash 最近歯医者に行きはじめました.そこで困るようになったのが予約です. 完全リモートワークなのでどの日時でも問題ないのですが,個人の予定表と仕事の予定表をどちらも確認しつつ決めないといけません. 個人予定表と仕事予定表を一括で見られるようにするために,Microsoft Graph API を利用してかんたんな同期をやってみます.

Unix domain socket on Dart

Photo by israel palacio on Unsplash Dart で Unix domain socket やっていきます. Support making HTTP requests through unix sockets 環境 2.17.0–94.0.dev 以上であれば動くはず. $ dart --version Dart SDK version: 2.17.6 (stable) (Tue Jul 12 12:54:37 2022 +0200) on "linux_x64" Get import 'dart:convert'; import 'dart:io';void main(List<String> arguments) async { HttpClient client = HttpClient() ..connectionFactory = (Uri uri, String? proxyHost, int? proxyPort) { assert(proxyHost == null); assert(proxyPort == null); var address = InternetAddress("/var/run/docker.sock", type: InternetAddressType.unix); return Socket.startConnect(address, 0); } ..findProxy = (Uri uri) => 'DIRECT';final response = await client.getUrl(Uri.parse('http://localhost/_ping')).then((request) { return request.close(); }); print(response.statusCode); final responseText = await response .transform(utf8.decoder) .fold('', (String x, String y) => x + y); print(responseText); client.close(); } 実行結果

Work Angular Dart as single binary

Photo by Caspar Camille Rubin on Unsplash テンプレートをさくっと作成. $ dart create -t server-shelf foo $ cd foo $ ngdart create web とりあえず shelf を動かしてみるとこんな感じ. $ dart bin/server.dart Server listening on port 8080 2022-03-27T09:27:03.905499 0:00:00.014259 GET [200] / 2022-03-27T09:27:09.375476 0:00:00.005037 GET [200] /echo/foo--- $ curl http://localhost:8080/ Hello, World! $ curl http://localhost:8080/echo/foo foo 次に Angular Dart の方を build して動かしてみます.

Release tabler for displaying ASCII table format in Dart

Photo by Abel Y Costa on Unsplash go-lang の tablewriter 的な ASCII テーブルで表示するやつが欲しかったの作りました. tabler | Dart Package example のとおりですが,こんな感じで使えます. void main() { var t = Tabler(); t.add(['a', 'b', 'c']); t.add([1, 22, 333]); print(t); // +---+----+-----+ // | a | b | c | // | 1 | 22 | 333 | // +---+----+-----+ } Dart は dart2native あるし,null safety だし Flutter が無かったとしても結構好きなんですが,こんな基本的と言えるライブラリが無いとは. それだけ Flutter でしか使われてないんだろうなぁ.

I tried Dart frontend using shelf

backend はこちら. I tried Dart backend Flutter Web とか AngularDart などあるんですけどちょっと雑にやりたいという場合です. コードは下記の通り. const index = '''<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous"> <title>Hello, world!</title> </head> <body> <main role="role"> <div class="container"> <h1 class="mt-5">{{ title }}</h1> </div> </main> </body> </html>''';void main(List<String> args) async { var handler = const shelf.Pipeline() .addMiddleware(shelf.logRequests()) .addHandler(_echoRequest); var server = await io.serve(handler, _hostname, port); print('Serving at http://${server.address.host}:${server.port}'); }Future<shelf.Response> _echoRequest(shelf.Request request) async { var template = Template(index); var output = template.renderString({'title': 'hoge'}); var headers = {'content-type': 'text/html'} return shelf.Response.ok(output, headers: headers); } index.html を静的ファイルで用意するのが普通だと思うんですが,dart compile して動かしてみたかったので dart ファイルに収めました. go-bindata などのように executable に静的ファイルを include するような仕組みが Dart にもあるといいですね. 気が向いたら作りたい.

Migrating to null safety on Dart

Photo by Jamie Davies on Unsplash いよいよ Dart の null safety が stable となりました. これまで何回か紹介しているライブラリ ipaddr を null safety にしていく過程をメモしておきます. 参考までに pullrq は下記です.

I tried Dart backend

Photo by Goran Ivos on Unsplash Flutter には盛り上がりがみられる Dart でバックエンドもやってみました. この時気になるのがフレームワークどうするか問題ですね. メジャーどころは下記の 2 つです.

That’s how I create flutter launcher icon

Photo by TheRegisti on Unsplash ランチャーアイコンを作ってくれる flutter_launcher_icons はとても便利です. Android の Adaptive Icon を SVG でやりたい場合は不十分です(雑に見てみた感じ png しか指定できないようでした).

Flutter web oidc authentication

Photo by Kelly Sikkema on Unsplash Flutter web で OpenID Connect やってたメモ. 以下を参考にしました. openid_client | Dart Package まずは認証ページを出すところまで. Flutter web は SPA なので Client Secret は渡せるようになっていますが渡しません.

Flutter Android Release Build on GitHub Actions

Photo by Richy Great on Unsplash workflow.yml ほんと単純で keystore を用意して,いわゆる local.properties を作成して build しているだけですね. flavor も考えるとつらいですが自分のケースの場合は — dart-define=<foo=bar> で済むケースがほとんどです.

Encryption with private key in RSA using Dart

Photo by Debby Hudson on Unsplash どうしても RSA Private key を使用して署名をしなきゃいけない案件があったのでやりました. 使用したライブラリは下記です. 死ぬほど助かりました.

Flutter web docker on GitHub Container Registry

Photo by Victoire Joncheray on Unsplash GitHub Container Registry が GA したみたいなので使ってみます. ついでなので Flutter web で. 普通に docker push するのは普通過ぎるので actions でやります. サンプルレポジトリは下記です.

Build RPM Package of Python

Photo by Brandable Box on Unsplash Python パッケージの RPM 化といえば bdist_rpm がありますが,この場合依存パッケージも PRM 化する必要があります. ということで venv でいい感じにパッケージ化するときの spec ファイルの内容をメモ.

Making Flutter web apps responsive

Photo by Domenico Loia on Unsplash Flutter web でレスポンシブ対応したときのメモ. responsive_builder を使うとめっちゃ簡単. responsive_builder | Flutter Package 以下のようにデバイスに応じて Widget を返すようにするだけ.

Testing out sembast

Photo by fabio on Unsplash Flutter でモバイルだけでなくデスクトップや Web などマルチプラットフォームに対応している NoSQL データベースライブラリ sembast を使ってみたのでメモ.

I created a Dart library that simplifies working with IP addresses

Photo by Alexandru Acea on Unsplash Dart で ipaddress をいい感じにするライブラリを作りました. yuzumone/ipaddr ipaddr | Dart Package モチベーション 生活していると「あーこのアドレスがこのセグメント内かどうか調べたいわー」となることが多いと思います. これまでは Python でやることが多かったのですが,Dart でやりたい欲がふつふつと湧いてきました. 軽く見た感じ Python の ipaddress 相当のものがなさそうだったので作りました.

Revisiting Android Spinners

Photo by Emile Perron on Unsplash arrays.xml arrays は string-array で設定します. integer-array でやる場合は自分で spinner の xml を書かないといけなくなると思います. <resources> <string-array name="message_count"> <item>100</item> <item>200</item> <item>500</item> <item>1000</item> <item>2000</item> </string-array> </resources> 使う側 string-array でやれば android.R.layout.simple_spinner_item と android.R.layout.simple_spinner_dropdown_item が使えるので楽です. 逆に android~ を使わない場合は自分で ArrayAdapter を作成して Spinner#setAdapter() すれば良さそうです.

Using Firebase Cloud Messaging and Analytics without google-services.json

Photo by Daniel Sturgess on Unsplash イケてない GitHub に上げれないので CI/CD しようと思ったときめんどくさい apply plugin: ‘com.google.gms.google-services’ を app/build.gradle の 1 番下に書く必要がある FCM と com.google.gms.google-services の仲が悪い(らしい) ということで環境変数に APP_ID などを設定して FCM と Analytics を使う方法について書いていきます.

Getting values from other Views in Android Data Binding

Photo by Henri L. on Unsplash <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <data> <variable name="viewModel" type="example.MyViewModel"/> </data> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" > <android.support.design.widget.TextInputEditText android:id="@+id/edit_name" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <Button android:id="@+id/button_ok" android:layout_width="0dp" android:layout_height="wrap_content" android:onClick="@{(v) -> viewModel.action(editName.getText().toString())}" app:layout_constraintTop_toBottomOf="@+id/edit_name" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </android.support.constraint.ConstraintLayout> </layout> ポイント Java or Kotlin 側で使うように CamelCase で view の ID を書く

Using Kotlin's ReadWriteProperty for modern Android Preference handling

Photo by Louis Tsai on Unsplash Kotlin の ReadWriteProperty を使って Delegate して Preference をいい感じにするやつを使ってみました. ちなみに ReadWriteProperty は以下のように定義されています. interface ReadWriteProperty<in R, T> ReadWriteProperty - Kotlin Programming Language ReadWriteProperty 例えば int を Preference に入れる ReadWriteProperty

When told the APK can't be installed

Photo by Fahim Muntashir on Unsplash 最近 issue がとんできてて,そのときになんじゃこれ~と思ったのでメモ. きた issue は以下. Parsing error · Issue #9 · yuzumone/Recordachi 解決策 APK を作成する際,Signature Versions を V1 と V2 にチェックを入れる.

Created an Android library for multi-line ellipsizing

Photo by Volodymyr Dobrovolskyy on Unsplash Android の TextView で複数行 Ellipsize してタップすると全文表示するようなライブラリを作ってみました. yuzumone/ExpandableTextView 動作は下の感じです. 作った pic.twitter.com/IcyLLXjG9P — ゆずもね (@Yuzu_037) June 7, 2017 もともとすでに実装はしていて,今も Twltrus の Reply 送信画面では上の動作のような感じにはなっていました. Twltrus の実装では Fragment で boolean を持っていて TextView の ClickListener のところで Ellipsize する・しないを切り替えていました. CustomView にしたほうが TextView の状態を Activity や Fragment で気にしなくてよくなるよなというところです. あとは Android が正式に Kotlin をサポートということで Kotlin でライブラリを作ってみました.