Apple シリコン(M1 Mac)でSQL ServerのDockerコンテナが動くようになった

Docker Desktopのアップデートがきたよ

今までM1 MacSQLServerのDockerコンテナを起動すると、

[+] Running 1/0
 ⠿ Container mssql-test  Created                                                                                                                                          0.0s
Attaching to mssql-test
mssql-test  | /opt/mssql/bin/permissions_check.sh: line 4: [: : integer expression expected
mssql-test  | /opt/mssql/bin/permissions_check.sh: line 59: [: : integer expression expected
mssql-test  | SQL Server 2022 will run as non-root by default.
mssql-test  | This container is running as user mssql.
mssql-test  | Your master database file is owned by mssql.
mssql-test  | To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216.
mssql-test  | /opt/mssql/bin/sqlservr: Invalid mapping of address 0x4003918000 in reserved address space below 0x400000000000. Possible causes:
mssql-test  | 1) the process (itself, or via a wrapper) starts-up its own running environment sets the stack size limit to unlimited via syscall setrlimit(2);
mssql-test  | 2) the process (itself, or via a wrapper) adjusts its own execution domain and flag the system its legacy personality via syscall personality(2);
mssql-test  | 3) sysadmin deliberately sets the system to run on legacy VA layout mode by adjusting a sysctl knob vm.legacy_va_layout.
mssql-test  | 
mssql-test exited with code 1

(Docker apple M1) Invalid mapping of address 0x40080f9000 in reserved address space below 0x400000000000 · Issue #668 · microsoft/mssql-docker · GitHub

こんな感じのエラーが出ていて、どうにもならないのでazure-sql-edgeを使ってしのいでいこうねという雰囲気だったんですが、
Docker Desktop 4.16でbetaとして追加されたUse Rosetta for x86/amd64 emulation on Apple Siliconでいきなり解決したので記念メモ。

Docker Desktop release notes | Docker Documentation

動かしてみる

前提

  • macOS 13以上
  • Docker Desktop 4.16以上

使用するイメージ

mcr.microsoft.com/mssql/server:2022-latest
https://hub.docker.com/_/microsoft-mssql-server

設定

Docker Desktopの Settings > Features in development > Beta features を開いて、Use Rosetta for x86/amd64 emulation on Apple Silicon にチェックをいれてApply & restart。 macOSのバージョンが12以下の場合はUse Rosetta ~ の項目が表示されなかった。

実行

動いた!

[+] Running 1/0
 ⠿ Container mssql-test                                                                                                                                 Recreated         0.1s
 ⠋ mssql The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested                   0.0s
Attaching to mssql-test
mssql-test  | /opt/mssql/bin/permissions_check.sh: line 4: [: : integer expression expected
mssql-test  | /opt/mssql/bin/permissions_check.sh: line 59: [: : integer expression expected
mssql-test  | SQL Server 2022 will run as non-root by default.
mssql-test  | This container is running as user mssql.
mssql-test  | To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216.
mssql-test  | 2023-01-15 09:14:28.95 Server      ライセンス PID は正常に処理されました。新しいエディションは [Express Edition] です。
2023-01-15 09:14:29.12 Server      The licensing PID was successfully processed. The new edition is [Express Edition].
2023-01-15 09:14:29.16 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\master.mdf' を '/var/opt/mssql/data/master.mdf' にコピーすることです。
2023-01-15 09:14:29.16 Server      Setup step is copying system data file 'C:\templatedata\master.mdf' to '/var/opt/mssql/data/master.mdf'.
2023-01-15 09:14:29.17 Server      既存のマスター データ ファイル /var/opt/mssql/data/master.mdf が見つかりませんでした。存在しない既定のマスター ファイルと他のシステム データベース ファイルをコピーしています。データベースの場所を移動したものの、データベース ファイルを移動していない場合、起動に失敗する可能性があります。修復するには: SQL Server をシャットダウンし、構成されている場所にマスター データベースを移動して、再起動します。
2023-01-15 09:14:29.17 Server      Did not find an existing master data file /var/opt/mssql/data/master.mdf, copying the missing default master and other system database files. If you have moved the database location, but not moved the database files, startup may fail. To repair: shutdown SQL Server, move the master database to configured location, and restart.
2023-01-15 09:14:29.18 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\mastlog.ldf' を '/var/opt/mssql/data/mastlog.ldf' にコピーすることです。
2023-01-15 09:14:29.18 Server      Setup step is copying system data file 'C:\templatedata\mastlog.ldf' to '/var/opt/mssql/data/mastlog.ldf'.
2023-01-15 09:14:29.18 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\model.mdf' を '/var/opt/mssql/data/model.mdf' にコピーすることです。
2023-01-15 09:14:29.18 Server      Setup step is copying system data file 'C:\templatedata\model.mdf' to '/var/opt/mssql/data/model.mdf'.
2023-01-15 09:14:29.19 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\modellog.ldf' を '/var/opt/mssql/data/modellog.ldf' にコピーすることです。
2023-01-15 09:14:29.19 Server      Setup step is copying system data file 'C:\templatedata\modellog.ldf' to '/var/opt/mssql/data/modellog.ldf'.
2023-01-15 09:14:29.20 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\msdbdata.mdf' を '/var/opt/mssql/data/msdbdata.mdf' にコピーすることです。
2023-01-15 09:14:29.20 Server      Setup step is copying system data file 'C:\templatedata\msdbdata.mdf' to '/var/opt/mssql/data/msdbdata.mdf'.
2023-01-15 09:14:29.21 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\msdblog.ldf' を '/var/opt/mssql/data/msdblog.ldf' にコピーすることです。
2023-01-15 09:14:29.21 Server      Setup step is copying system data file 'C:\templatedata\msdblog.ldf' to '/var/opt/mssql/data/msdblog.ldf'.
2023-01-15 09:14:29.21 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\model_replicatedmaster.mdf' を '/var/opt/mssql/data/model_replicatedmaster.mdf' にコピーすることです。
2023-01-15 09:14:29.21 Server      Setup step is copying system data file 'C:\templatedata\model_replicatedmaster.mdf' to '/var/opt/mssql/data/model_replicatedmaster.mdf'.
2023-01-15 09:14:29.22 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\model_replicatedmaster.ldf' を '/var/opt/mssql/data/model_replicatedmaster.ldf' にコピーすることです。
2023-01-15 09:14:29.22 Server      Setup step is copying system data file 'C:\templatedata\model_replicatedmaster.ldf' to '/var/opt/mssql/data/model_replicatedmaster.ldf'.
2023-01-15 09:14:29.22 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\model_msdbdata.mdf' を '/var/opt/mssql/data/model_msdbdata.mdf' にコピーすることです。
2023-01-15 09:14:29.22 Server      Setup step is copying system data file 'C:\templatedata\model_msdbdata.mdf' to '/var/opt/mssql/data/model_msdbdata.mdf'.
2023-01-15 09:14:29.23 Server      セットアップ手順は、システム データ ファイル 'C:\templatedata\model_msdblog.ldf' を '/var/opt/mssql/data/model_msdblog.ldf' にコピーすることです。
2023-01-15 09:14:29.23 Server      Setup step is copying system data file 'C:\templatedata\model_msdblog.ldf' to '/var/opt/mssql/data/model_msdblog.ldf'.
2023-01-15 09:14:29.28 Server      Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64) 
mssql-teOct  8 2022 05:58:25 
mssql-teCopyright (C) 2022 Microsoft Corporation
mssql-teExpress Edition (64-bit) on Linux (Ubuntu 20.04.5 LTS) <X64>
2023-01-15 09:14:29.28 Server      Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64) 
mssql-teOct  8 2022 05:58:25 
mssql-teCopyright (C) 2022 Microsoft Corporation
mssql-teExpress Edition (64-bit) on Linux (Ubuntu 20.04.5 LTS) <X64>
2023-01-15 09:14:29.28 Server      UTC の調整: 0:00
2023-01-15 09:14:29.28 Server      UTC adjustment: 0:00
2023-01-15 09:14:29.28 Server      (C) Microsoft Corporation.
2023-01-15 09:14:29.28 Server      (c) Microsoft Corporation.
2023-01-15 09:14:29.28 Server      All rights reserved.
2023-01-15 09:14:29.28 Server      All rights reserved.
2023-01-15 09:14:29.28 Server      サーバー プロセス ID は 436 です。
2023-01-15 09:14:29.28 Server      Server process ID is 436.
・・・

久しぶりのオフラインイベントと初めての合宿

11/26〜27にJava女子部とJJUGのオフラインイベントに行ってきたお日記。

javajo.doorkeeper.jp jjug.doorkeeper.jp

Java女子部勉強会

朝10時に新宿の会議室に集合して、2グループに分かれてデザパタ本を読んだりコードを書いてみたりパワポで発表したり。
われわれのチームはBridgeパターンについてお勉強しました。
読んでてもピンとこないから実際にコード書いてみよう、でモブプロのためにIntelliJのCode With Meを使ってみたりもしました。
ずっとアイコンあったのに全然目に入ってなかった。

合宿

大久保に移動して不思議な民泊(紆余曲折ありました)で合宿。人の家に来た感がすごい。
久々のドンキと初めての業務スーパーでお買い物しました。業務スーパー楽しいな!次は乾燥きくらげ(大袋)がほしい。

もりもり食べ飲み喋ったりBlack Fridayセールを見たり買ったり人生ゲームをしたり。4人中3人がフリーターで終わるなかなか厳しい社会でした。
1人だけ医者になったまーやさんが安定しすぎてつまらながっていたり、 結婚して子供が生まれたとたんにフリーターになったprprちゃんが絶望していたのがとても人生って感じでした。

JJUG CCC現地会場

翌朝はJJUG CCCのスタッフのため、朝9時に西新宿のオフライン会場へ。
準備はそんなにやることなかったので、48階の配信会場に遊びに行って富士山を眺めたりしました。
10時ちょっと前くらいからは受付や簡単な誘導などをしていました。

www.instagram.com

オフライン会場ではライブビューイングとアンカンファレンスがありました。
ライブビューイングは10〜20人、アンカンファレンスは5人前後くらいで、あとは受付まわりでわいわいしたり幹事や登壇者のみなさんは配信会場行ったりの感じでした。

おみやげももらったよ。

13:20くらいでスタッフを交代したので、しばらくライブビューイングを見てお先に帰りました。
2日間でめちゃくちゃ人と会って喋って大変楽しかったです。
しばらくは反動で家に篭りそうなので、充電して2023年もまたオフラインでわちゃわちゃしたいなと思いました。おしまい。

日記

最近の日記

はじめてのオーダーメイド枕(夫の)

この前夫の誕生日だったので、プレゼントにオーダーメイド枕を作りに行きました。

pillowstand.com

ピロースタンドの高さ調整永久無料のやつです。
大体1時間くらいで計測→素材選び→高さ調整→実際に作ってもらってチェックしてお持ち帰り、という感じでした。
まあまあいいお値段ですが、メンテナンスがいつまででもOKなのと、へたってきたらパーツごとに買い替えができるとのことで安心感があります。
お昼寝タイムにお借りして気に入ったので、そのうち自分の枕も作りに行きます。

 

はじめてのkintan

これまた夫の誕生日で恵比寿のkintanに行きました。

www.kintan.restaurant

ユッケ

f:id:neruko_ha_sodatsu:20220220224017j:plain

タン

f:id:neruko_ha_sodatsu:20220220224051j:plain

フォアグラバーガー

f:id:neruko_ha_sodatsu:20220220224059j:plain

とても美味しかったです。客層が若めなこともあってコースはかなりこってりこってりだったので、次行くことがあればアラカルトで頼みます。

 

お菓子作り始めました

実家を出てからあまりオーブン使ってなかったんですが、なにか普段と違うことがしたいと思ってお菓子を焼いてみたりしました。
もともと持ってたマフィン型と、パウンドケーキ型を買い足しました。材料もまだ残ってるので色々試してみようと思います。

f:id:neruko_ha_sodatsu:20220220225023j:plain

あと胡椒餅がめっちゃ食べたいのでそのうちドライイースト買ってきて作ります。

www.sbfoods.co.jp


最近読んだ本とか

現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法:書籍案内|技術評論社

ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本(成瀬 允宣)|翔泳社の本

最高のおうちオフィスではたらく ~快適なリモートワーク環境の作り方~ - mochikoAsTech - BOOTH

老後の資金がありません|文庫|中央公論新社

技術書展の通販をお願いしたらノベルティやチラシを入れてくださってて、オフラインイベント行きたい欲がぐわっときてしまった。

 

ゲーム

APEX新シーズンたのしい〜〜〜!!!クリプト強化嬉しくてクリプトばっかり使ってます。マッドマギー未使用です。
ランクとりあえずプラチナに上がったので、あとはちまちま遊ぼうかと思います。

f:id:neruko_ha_sodatsu:20220220230510j:plain

初めてのスーパーレジェンドシャードも手に入れてハッピーです。クリプトのスパレジェ実装まで大事に取っておきます。

 

おわり。

毎月やってる社内の勉強会の話

2021年7月から、社内勉強会で毎月何か喋るというのをやっています。

前提

  • 社内チーム(普段の業務でのチームとは別)で毎月1時間くらい勉強会+情報共有会をやってる
  • 8人チームでほとんどが新卒〜3年目くらいのジュニアエンジニア。サーバサイドエンジニア(Java)として働いてる or Javaに興味がある人を集めて編成されている
  • 勉強会のコンテンツは年度はじめ(5月〜6月)にメンバーみんなでやりたいことを考える

経緯

  • 勉強会のコンテンツとして、リーダブルコードの読書会をすることになる(章ごとに担当をあてて、毎月2〜3章ずつ読み進めていく形式)
  • どうせなら実際にコードを書いて動かしてみよう!みんな自分のPCにJavaの環境ありますか?(構築できますか?)
  • ざわつく(ざわざわ)
  • Javaってなんだっけ?のおさらいや、関連トピックについての話をするというていで、毎月10分〜15分好きなことを喋ることになる

今までやったこと

よかった

  • ネタを出さないといけないので、自分が話したいこと(好きなこと、興味のあること)を考える癖がついた
  • 締め切り駆動で勉強できるようになった
  • 積読がちょっと消化できた
  • 意外とメンバーからの評判が良かった

しんどい

  • ネタがなかなか思いつかなかったり、時間が足りなかったりで十分な準備ができないまま当日を迎えてしまうことがある
    →それはそれで喋る練習、失敗する練習にはなってる
  • メンバーが若手ばかりなのもあって、先生と生徒の関係が固定されてしまう
  • メンバーが、勉強会で聞いたことや、リーダブルコードに書いてあることが絶対だと思い込んでしまう
    →何が正解かは状況や時代によって変わるものだから、どれが絶対ということはないよ、というのを繰り返し伝えてみている
    (とはいえ、断言されないと不安になったり、これは正解ですか?と聞いてくるようになったり、なかなか難しい)

今後のこと

だんだんモノが溜まってきたので、そのうち読み物としての体裁を整えたり、参考文献(ぜひ読んでほしい本リスト)をまとめたりして、便利に使う方法を模索したい。

【読書メモ】コーディングを支える技術

gihyo.jp

いろいろ気付きがあったし、読み物としても面白かったです。

プログラミングを始めたばかりの頃は言語仕様が絶対だと思ってしまうけど、仕様は誰かが考えて決めたもの。なんでこうしたのか?を、色々な言語を比較しながら易しく教えてくれる本でした。

 

なぜ世界にはこんなにいろいろな種類の言語があるのでしょうか?それは、何を「楽」だと考えるかが人によって異なるからです。(p.13)

いろいろな設計の言語があるのは、人間にいろいろな目的があるからなのです。高速なコードを書くのが楽であるように設計されているC++と、コードを読むのが楽なように設計されているPythonを比較して、C++を読みにくいと言ったりPythonを遅いと言ったりしてもあまり有益な議論にはなりません。(p.14)

好きだった部分。それぞれの言語の思想をもっと掘り下げて知りたいと思った!

 

たとえば作者本人が書いたドキュメントやソースが一番詳しいでしょう。しかし「難しい」「量が多い」「英語なので読めない」と口実を付けて、誰かの書いたやさしい解説を探したりしてしまいがちです。それは「オリジナルの肉は大きくて硬いから」といって、安全なのか痛んでいるのかもわからない、誰かの作ったひき肉を食べるのと同じです。(p.80)

コラムで「どう学べばいいのか?」のような話を扱っていて良かったので、周りの初学者にコラムだけでもさくっと読んでほしい。

 

クラスの概念が複雑だと感じますか?たしかにそのとおりです。それは、C++Javaのクラスがいくつもの役割を持っているからです。
①まとまったものを作る生成器
②どういう操作が可能かという仕様
③コードを再利用する単位
(p.210)

複数のクラスを継承を使って密に結合してしまうのではなく、委譲を使って組み合わせたほうがよいのではないでしょうか。その委譲の参照も、ソースにハードコードするのではなく、設定ファイルを使って実行時に注入するほうがよいのではないでしょうか。こういう発想で「依存性の注入」(Dependency Injection)が生まれました。(p.223)

クラスには2つの相反する役割があります。1つ目は「インスタンスを作るためのもの」という役割で、このためには「完結した、必要なものを全部持った、大きなクラス」である必要があります。2つ目は「再利用の単位」という役割で、このためには「機能ごとの、余計な物を持っていない、小さなクラス」である必要があります。(p.231)

クラスについての話がとても学びになった。「インスタンスを作るためのもの」と「再利用の単位」をごちゃまぜにしていたけど、それぞれの役割を分けて考えるとすっきりする。

 

f:id:neruko_ha_sodatsu:20220118234439j:plain

面白くてぺろっと読んでしまった。

2021年まとめ

エンジニア的な話とゲームの話と生活の話をまとめてしたくなってきたのでブログにしました。
2021年の色々振り返り。

 

# 生活

4月に入籍しました。とはいえ一緒に住んで4年くらいなので、あまり生活に変化はなかったです。
引き続きフル在宅勤務なのでろくに外出てません。ワクチン2回目接種が終わって、10月くらいからちょっと遠くまで買い物に出たり、たまに家族と会うようになったくらい。
Amazonとネットスーパーに頭が上がらない。食料の宅配はOisixとヨーカドーネットスーパーとたまにCookpad Martを気分で使ってます。
あとは断捨離に目覚めてお部屋を片付け始めたり、サブスクでお花を飾ったり、アロマをたいたりと、おうちをエンジョイしています。

 

# 健康

9月前半に1回目、9月末に2回目のワクチン接種しました。その後何週間かびっくりするくらい体調を崩してびっくりしました。
今までそんなに気圧の影響感じてこなかったんですが、最近めっちゃ体調に出るようになったので、クラシエの五苓散を常備するようになりました。
あとは、マッサージに月2くらいで通ってます。運動不足が腕と腰と足にきている。セルフケアグッズでは筋膜ローラーとマッサージボールが気に入って使ってます。

 

# エンジニア的なところ

本業は引き続きJavaでサーバサイドの開発をやっています。
あとは社内で毎月勉強会をやってみたり、Java女子部で勉強会やLTで喋らせてもらったり開発をしたりしています。
20代後半はとにかく焦っていたんですが、最近ちょっと気持ちが落ち着いてきたなあと思います。「なんもわからん(錯乱)」から「なんもわからん(なんもわからん)」になったくらい。

 

# 趣味

GWにシルバニアに目覚めて一瞬で沼に落ちました。最初はとにかく手当たり次第だったんですが、最近ちょっと整理して小さめの建物やお人形を集めて遊んだり、イベント行ったりしています。
あとは手芸に目覚めてミシンを買ったり、ジェルネイル用品を揃えたりしました。ちょこちょこ遊んでます。
在宅をいいことにめちゃくちゃゲームをしてます。いっぱいやってるのはAPEX、DQ10、ソシャゲだとウマ娘とか。ちょっと遊んだのはあつ森、オラ夏、フォトナ、dbd、b4b、リヴリーとか。あと年末にシノアリスを引退しました。
来年も色々遊びつつ、ちょっと運動ができればいいな、、、

 

Raspberry Piの電源を入れるまで

PyLadies Japan Advent Calendar 2021 の21日目の記事です。

はじまりはじまり

突然お邪魔します。miiといいます。
普段はJava女子部でわいわい喋ったりお勉強したりしていて、仕事も主にJavaでサーバサイドの開発をしています。
Pythonは仕事でちょっと触ったことがある、くらいの初心者ですが、アドベントカレンダーにわくわくしたのでまぜてもらいました(わーい!)

なにをしようかな

PyLadiesでもJava女子部でも遊べるもの、ということで、Raspberry Pi(ラズパイ)のお話を書こうと思います。
とはいえ、ラズパイを使って特別おもしろいことはしておらず、たまに思い出して電源を入れて遊ぶくらいなので、とりあえず電源を入れます。

ラズパイの電源を入れるぞ!

まずはお買いもの

ラズパイの電源を入れるために、まずラズパイを買いに行きます。
(実際買いに行ったのは2〜3年くらい前のお話です)

行き先

ということで秋葉原に行って、秋月電子千石電商 で一通り揃えました。
サイトを見ると知らない物ばかり並んでてちょっとハードル高そうですが、実際の店舗は入り口が開けてて意外と入りやすかったです。

揃えたもの
  • 本体
  • ケース
  • microSDカード
  • 電源ケーブル
  • HDMIケーブル(家にあったやつ)
  • モニタ(家にあったやつ)
  • キーボード(家にあったやつ)
  • マウス(家にあったやつ)

今回用意したのがラズパイの中でもとっても小さいRaspberry Pi Zeroというタイプなので、追加で変換アダプタもご用意。

  • microUSB→USBの変換アダプタ
  • miniHDMI→HDMIの変換アダプタ

小さくない方のRaspberry Pi 3も持ってたんですが、弟が欲しがってたので実家に送ったら結局父の遊び道具になったようです。還暦から始めるPython

 

公式の赤白のケースがラズパイっぽくてとてもかわいい。シルバニアの赤ちゃん(ヤギ)と並べてもこんなに小さい。

f:id:neruko_ha_sodatsu:20211221204244j:plain

f:id:neruko_ha_sodatsu:20211221201206j:plain

Raspberry Pi Zero


インストール

手元に必要なもの(物理)が揃ったので、専用のツールを使ってmicroSDカードにRaspberry Pi用のOSを書き込んでいきます。

Raspberry Pi Imagerをダウンロード

公式サイトからRaspberry Pi Imagerをダウンロードします。

Raspberry Pi OS – Raspberry Pi

f:id:neruko_ha_sodatsu:20211221202442p:plain

公式サイト
Raspberry Pi Imagerを起動して書く!

PCにmicroSDをセットして、Raspberry Pi Imagerを起動して、インストールするOSを選んで、書く!

f:id:neruko_ha_sodatsu:20211221202311p:plain

f:id:neruko_ha_sodatsu:20211221202633p:plain

Raspberry Pi Imager

microSDにデータが入ってたら消してくれるみたい。

f:id:neruko_ha_sodatsu:20211221202958p:plain

実はImagerで事前にWifiとかの設定もできる。か、かしこい〜〜〜!

dev.classmethod.jp

f:id:neruko_ha_sodatsu:20211221203250p:plain

あとは電源を入れるだけ!

microSDにOSの書き込みができたら、ラズパイ本体にmicroSDをえいやっと差し込んで、本体をケースにセットして、
モニタとキーボードとマウスを繋いで、最後に電源ケーブルを挿せばなんと!電源が入ります!

f:id:neruko_ha_sodatsu:20211221204037j:plain

>ポート足りてなくない?

まとめ

ラズパイ、5000〜10000円くらいでとりあえず必要なものは揃うので、買って眺めたり、ちょっとつついてみたりしたらたのしいと思います。