amazon-linux-extrasがNo module named amazon_linux_extrasとなって動作しない問題

問題

Amazon Linuxでいろんなパッケージを簡単にインストールしてくれるamazon-linux-extrasなんですが、pyenvがPython3になっていると上手く動作しない問題があるみたい。

amazon-linux-extras
/root/.pyenv/versions/3.9.12/bin/python: No module named amazon_linux_extras

その場合、Python3のsite-packagesにリンクを作ってあげれば良いという解決方法がみつかるけれど、Python3のバージョンが変わるたびに変更するのも面倒なので、別の解決方法を備忘録として残す。

解決方法

Python2で動かせば良いね

python2 -m amazon_linux_extras

※ 注意点
amazon_linux_extrasは本来shellで起動するようになっており、そこで環境変数やconfigファイルの読み込みが行われている。
一通り読んで、自分のやりたいことにこのshellが必要ないことがわかったのでこの対応を取ったが、shellでの設定が必要な環境の場合、期待した動作にならない可能性があるので注意すること。

所感

この機能をサポートしているなら、多少環境変えてもAmazon Linuxでちゃんと動作するように作って欲しいところではある。
2024年6月30日までサポートされるみたいだけど、その後はどうなのか疑問。
よくある質問 - Amazon Linux 2 | AWS

Python2の時代はとっくに終わってる中で、pyenvのバージョン変えただけで動かなくなるような初歩的な問題が改善されない点からみても、この機能自体を使っていくかは悩ましい。
今あるものを根本から変えるのは面倒くさかったけど、今後新しく何かを作るときにこの機能を使うかというと、避けたほうが良いかもしれない。

Guzzle利用時のwrong signature typeエラーの対応

問題

Guzzleを利用したアクセス時に、接続先のSSLバージョンが古めだったためエラーが発生した。

[previous exception] [object] (GuzzleHttp\\Exception\\ConnectException(code: 0): cURL error 35: error:1414D172:SSL routines:tls12_check_peer_sigalg:wrong signature type (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://stbfep.sps-system.com/api/xmlapi.do at /var/www/html/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:210)

解決方法

GuzzleのOptionで必要な暗号を設定する。

        $client = new Client([
            'base_uri' => 'https://example.com',
            'timeout' => 5.0,
            'curl' => [
                CURLOPT_SSL_CIPHER_LIST => 'SSLv3'
            ],
        ]);

Compose Multiplatformのそれっぽいドロップダウンの書き方

Desktopアプリ作成でドロップダウンメニューを作ろうとしたが、意外と実装するのに苦労した。
Boxを上手に使うと表示周りの表現を柔軟にできそう。

f:id:snicmakino:20220203033811p:plain
dropdown

import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.DropdownMenu
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp

@Composable
fun Dropdown() {
    val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
    val expanded = remember { mutableStateOf(false) }
    val selectedOptionText = remember { mutableStateOf(options[0]) }

    Box(
        contentAlignment = Alignment.CenterStart,
        modifier = Modifier
            .size(250.dp, 50.dp)
            .clip(RoundedCornerShape(4.dp))
            .border(BorderStroke(1.dp, Color.LightGray), RoundedCornerShape(4.dp))
            .clickable { expanded.value = !expanded.value },
    ) {
        Text(
            text = selectedOptionText.value,
            modifier = Modifier.padding(start = 10.dp)
        )
        Icon(
            Icons.Filled.ArrowDropDown, "contentDescription",
            Modifier.align(Alignment.CenterEnd)
        )
        DropdownMenu(
            expanded = expanded.value,
            onDismissRequest = { expanded.value = false }
        ) {
            options.forEach { selectionOption ->
                DropdownMenuItem(
                    onClick = {
                        selectedOptionText.value = selectionOption
                        expanded.value = false
                    }
                ) {
                    Text(text = selectionOption)
                }
            }
        }
    }
}

IntelliJ IDEAのコンソールの日本語が文字化けする問題

問題

IntelliJ IDEAで、gradle runを行った際のコンソールで、日本語が文字化けする

解決方法

vmoptionsファイルに以下を追加 -Dfile.encoding=UTF-8

vmoptionsファイルの場所

JetBrains ToolboxでIDEをインストールしている場合、以下から設定ファイルを開ける

f:id:snicmakino:20220131215926p:plain
toolbox
f:id:snicmakino:20220131220037p:plain
toolbox2

Windowsデスクトップアプリのデータディレクトリ

Windowsで動作するデスクトップアプリで、アプリで使うファイル(設定ファイル等)の配置場所について悩んだのでメモ

開発環境

FW:Compose Multiplatform, by JetBrains
言語:Kotlin

解決した方法

System.getenv("APPDATA")
// C:\Users\<user>\AppData\Roaming

System.getenv("LOCALAPPDATA")
// C:\Users\<user>\AppData\Local

個人で使うアプリケーションならどちらを使っても問題なさそう。 組織で利用するアプリケーションの場合、APPDATAの方は同じアカウントで共有される模様。

qmk_firmwareのcompileに失敗する

自作キーボードのキーマップ設定時にコンパイルエラーが発生したのでメモ

現象

以下のようなエラーが出てコンパイルに失敗する

$ qmk compile
Ψ Compiling keymap with make ergodash/rev1:snicmakino


QMK Firmware 0.8.22
WARNING: Some git submodules are out of date or modified.
 Please consider running make git-submodule.

Making ergodash/rev1 with keymap snicmakino

tmk_core/protocol/lufa.mk:14: lib/lufa/LUFA/makefile: そのようなファイルやディレクトリはありません
make[1]: *** ターゲット 'lib/lufa/LUFA/makefile' を make するルールがありません.  中止.
Make finished with errors
Makefile:560: recipe for target 'ergodash/rev1:snicmakino' failed
make: *** [ergodash/rev1:snicmakino] Error 1

lib配下のlufaの中身が無いよというエラー

解決策

git でサブモジュールがインストールできていなかったため、以下のコマンドでインストールする git submodule update --init --recursive

rustlingsはじめました

rustlingsとは

Rustの読み書きになれるための演習ができるツール。
https://github.com/rust-lang/rustlings

インストールをしたら、rustlings watchコマンドで頭から順番に演習することができる。
(個別の問題がやりたい場合等は別のコマンドを使う)

進捗

  • variables
  • if
  • quiz1
  • functios
  • primitive_types

所感

機能はシンプルでわかりやすいし、問題もテーマがはっきりしていて、コンパイルを通したり、assertを通したりするのがわかりやすくて良い。

やった範囲は十分知っている範囲だったけど、Rustの読み書きが久しぶりだったので、なんていうか丁度いい感じのエクササイズになった。 同じ用に昔勉強したけど忘れたわーって人には丁度いいレベルなのかもしれない。

進めていけば理解を放置していたライフタイム等もわかるようになると嬉しいので、年末のうちにやりきる。