エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

中古のMacBook Air(2014)にUbuntuをインストールした

自宅に眠っていた中古MacBookをどうにか有効活用したい… そう思ってネットの海をさまよっているとUbuntuをぶち込むことができるようなので 実際にやってみたことを備忘録として残そうと思います。

使ったもの

  • ハードウェア: MacBook Air 13.3-inch Early 2014 MD760J/B Core_i5 1.4GHz 4GB SSD128GB
  • インストールするOS: Ubuntu 22.04 LTS(Ubuntu Desktop 日本語 Remix)
  • 適当なUSB(isoファイルを焼くので5GBくらいあると安心)
  • USBテザリング用Android端末 ※MacBookにUbuntuをインストールしてもWifiが有効化されなかった為必要でした

Macbookを初期化する

初期化方法はOSのバージョンにより異なってきますが、今回は↓の方法で実施できました。

www.e-tamaya.co.jp

isoファイルをDLする

Ubuntu Desktop 日本語 Remixのダウンロード | Ubuntu Japanese Team からDLしましょう。

isoファイルをUSBに焼く

焼くために「Universal-USB-Installer」を使います。

具体的な手順は rtc-fukushima.jp を参照。

MacBookにUbuntuをインストールする

以下の手順でインストールしていきます。

  • isoを焼いたUSBをMacBookに挿した状態で電源をONにし、option ボタンを押し続ける
  • EFI Boot を選択
  • 画面表示に従って初期設定を入力する
  • デスクトップ画面にインストール用のアイコンが配置されているので実行する
  • 画面表示に従って初期設定を入力するとインストールが始まる

AndroidのUSBテザリングでネットに一時接続し、Wifiを有効化する

今回の環境だと何故かUbuntuでWifiが有効化されておらず、設定することすらできませんでした。

その為、apt installでいくつかパッケージを入れる必要があるのですが、まずはネット接続が必要なのでUSBテザリングを使います。(有線接続が可能ならそれでもアリ)

ちょっと古い情報ですが大体やることは↓の通り。

bluearth.cocolog-nifty.com

AndroidをMacBookをUSB接続した状態で、AndroidのUSBテザリングをONにすれば自動的にネット接続が可能になるはず。

接続ができたら以下をターミナルから実行します。

sudo apt-get update
sudo apt-get purge bcmwl-kernel-source
sudo apt-get install broadcom-sta-source broadcom-sta-dkms broadcom-sta-common

qiita.com

その後、OSを再起動すればWifi設定が有効化されていると思います。

もし、ダメだったら以下を試すと良いかもしれない。

pslabo.hatenablog.com

英数・かなキーでIME有効/無効の切り替えができるようにする

日本語入力ができないと日本人としてはツラいと思うので、設定していきます。

↓で丁寧に説明されているので手順に沿ってやればOK。

www.maclab.tokyo

BunからFirestoreにDocumentを追加しようと思ったらうまく動かなかった

ちょっとハマってしまったのでメモがてらに書きます。。

やりたかったこと

以下のようなFirestoreのあるCollectionにDocumentを追加するような処理を書いてました。

import { cert, initializeApp } from "firebase-admin/app";
import { getFirestore } from "firebase-admin/firestore";
...

const firebaseInit = () => {
  const app = initializeApp({
    credential: cert(process.env.GOOGLE_APPLICATION_CREDENTIALS!),
    databaseURL: "https://*************.firebaseio.com",
  });

  return getFirestore(app);
};

export const generateTokenAsync = async () => {
  const db = firebaseInit();

  ...

  await db.collection("hoge_fuga_collection").add(record);

このファイルをbun ****.tsで実行しようとすると以下のようなエラーが出てしまった。

$ bun ****.ts

29 | const CALL_INVOCATION_TRANSFORMER_SYMBOL = Symbol();
30 | function isFunction(arg) {
31 |     return typeof arg === 'function';
32 | }
33 | function getErrorStackString(error) {
34 |     return error.stack.split('\n').slice(1).join('\n');
                ^
TypeError: undefined is not an object (evaluating 'error.stack.split')
      at getErrorStackString (/mnt/d/*******/node_modules/@grpc/grpc-js/build/src/client.js:34:12)
      at onReceiveStatus (/mnt/d/*******/node_modules/@grpc/grpc-js/build/src/client.js:191:41)
      at onReceiveStatus (/mnt/d/*******/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:138)
      at onReceiveStatus (/mnt/d/*******/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:323:178)
      at /mnt/d/*******/node_modules/@grpc/grpc-js/build/src/resolving-call.js:94:75
      at processTicksAndRejections (:61:77)

動作環境

$ bun --version
1.0.15

package.json

  "dependencies": {
    "firebase-admin": "^11.11.1",
    ...
  }

Bun側の問題らしい

github.com

github.com

↑ら辺のIssueにそれらしい記載があり、Bun側で対応中みたい。 公式では"Bun aims for complete Node.js API compatibility."ということなので、対応に期待したいですね。

ポートフォリオサイトをNext.jsからReact.jsに置き換えました

最近ずっと放置していたポートフォリオサイトをアプデしました。

My Portfolio

元々はNext.jsで構成していたのですが、今回React.jsに置き換えをしました。

何で置き換えたの?

ビルド、デプロイはGitHub Actionsで実行されるようにしていたのですが、その際に使っていたserverless-next.jsが謎のエラーで動作しなくなった為です。

以前からNext.jsのバージョンを上げたりすることですぐエラーを吐く状況ではあり、かなり動作が不安定でした。 自前でNext.jsのデプロイ用の機構を用意するのも1つの手ですが、SSRの為の対応が面倒かつポートフォリオサイトのためにそこまで労力をかけたくなかった為、思い切ってReact.jsに置き換えることにしました。

システム構成

以前の構成

https://portfolio.ts-soda.net/images/configuration_portfolio.png

図では省略していますが、GitHub Actions経由でserverless-next.jsを使いS3バケットとLambdaにデプロイするようにしていました。

今の構成

React.jsに置き換えたことでSSRではなくSPAになった為、Lambdaを置く必要がなくなりシンプルになりました。

Spring(Java)で雑にOpenAI APIにニュースを要約させてみた

日頃技術系のニュースを追う際に、よく見るサイトの記事を俯瞰して見たいので毎日スクレイピングした記事をDBに格納して、自作アプリから見れるようにしています。

↓こんな感じ

https://birds-eye.ts-soda.net/news

特に大きな問題はなく運用できていたんですが、記事の内容をOpenAI APIで要約できれば時間がない時でもざっくりニュースを追えてより便利になりそうだったのでやってみました。

続きを読む

Spring FrameworkでRDBMSと通信する手段について調べた

以前Spring Frameworkについて調べていた時、RDBMSとの通信方法をまとめていたのですが記事として公開せず放置していたので公開しておきます。

続きを読む

MySQL(InnoDB)のTransaction Isolation Levelsについてまとめる

DBのロックについて考える際にTransaction Isolation Levelsを確認することはよくあると思いますが、バックエンドを触ってない期間が長くなると細かい部分を忘れてしまうのでまとめてみました。

続きを読む

Mockito+Springで単体テストを書く

業務ではバックエンドにSpringを使っているのですが、単体テストを書く場合のモックフレームワークとしてMockitoを使っています。

割合としてはE2Eテストの方が多く単体テストを書く機会が少ないのですが、今後は単体テストも割合を増やしていきましょうということで最近書くことが増えてきました。

というわけで今回はMockitoについて調べたことを残しておこうと思います。

続きを読む

GitHub ActionsからFirebase Hostingへデプロイするようにしてみた

プライベート用のReactアプリをたまに手直しすることがあるのですが、いい加減CI/CDでデプロイを楽できるようにしとかなきゃなぁと思い、先日GitHub Actions用の設定を追加しました。

続きを読む

VSCodeのターミナルをUbuntu on Windowsにしたらたまにディレクトリ名がおかしくなるぞ

プライベートの開発機はWindowsを使っているのでターミナルは基本的にGit Bashを使っていたのですが、最近Ubuntu on Windowsに変えてみました。

crontabは別途設定しないと動いてくれなかったりしますが、基本的にはWindowsの仮想環境でUbuntuが動くのでGit BashよりLinuxライクに使える部分が良いなと思ってます。

ただ、VSCodeのデフォルトターミナルに設定した際、妙な挙動をする時がありました。

続きを読む