Serverless Framework 初めて触ってみた

Serverless Framework を利用するプロジェクトにアサインされました。

今まで全く触ったことがなかったのですが、いきなり「serverless.yaml 書いて」と言われたので急遽勉強するための環境を整えます。

インストール

www.serverless.com

node, npmバージョン確認

$ node -v
v18.12.1

$ npm -v
8.19.2

インストール

$ npm install -g serverless

serverless バージョン確認

$ serverless -v
Framework Core: 3.27.0
Plugin: 6.2.3
SDK: 4.3.2

プロジェクト作成

どうやら serverless でインタラクティブにプロジェクトが初期化できるようなのですが、選べるテンプレートが少なく、Lambda(Python) がなかったので、create コマンドで作成するようにします。

www.serverless.com

プロジェクト初期化

$ serverless create \
--template aws-python3 \ # 上記ページの "Available Templates" から選択
--path tutorial \ # コマンド実行ディレクトリに作成するプロジェクトディレクトリ名を指定
--name tutorial #  serverless.yml に記載されるプロジェクト名を指定

# GitHub等からテンプレートを持ってくる場合には `--template-url` を指定します。

AWS 権限設定

www.serverless.com

serverless でAWS APIを実行するための権限設定を行います。手順は以下の通り。

  1. IAMユーザ作成
  2. AdministratorAccessポリシーを付与・・・※補足1参照
  3. アクセスキーを作成

次に aws configure をします。serverless config credentials でラップされているようなのでこちらを使います。

$ serverless config credentials \
--provider aws \
--profile talkeyboid-serverless-user \
--key XXXXXXXXXXXXXX \
--secret XXXXXXXXXXXXXXXXXXX

プロファイル環境変数指定

$ export AWS_PROFILE=talkeyboid-serverless-user

補足1

※ドキュメントチュートリアルでは「AdministratorAccess を付与」と書いてありますが、怖すぎます。一応注意書きはある模様。

Note that the above steps grant Serverless Framework administrative access to your account. While this makes things simple when starting out, we recommend that you create and use more fine-grained permissions once you determine the scope of your serverless applications and move them into production.

権限を絞って与えるには以下が参考になりそうです。皆さん苦労されている様子。

blog.n-t.jp

qiita.com

ポリシージェネレータのリポジトリもありました。これですべてができるとは思いませんが、かなりの時短になりそうな予感。

github.com

github.com

補足2

以下のように serverless.yml を記載することで、--stage オプションに応じて、利用するプロファイルを変えることができるようです。便利。

service: new-service
provider:
  name: aws
  runtime: nodejs14.x
  profile: ${self:custom.profiles.${sls:stage}}
custom:
  profiles:
    dev: devProfile
    prod: prodProfile

また、定義した各リソースを CloudFormation 側でデプロイするときに利用するロール(サービスロール)を指定できるようでした。

provider:
  iam:
    deploymentRole: arn:aws:iam::123456789012:role/deploy-role

ここら辺は問題もある模様(カスタムリソースが勝手に作られそれにサービスロールが当たってしまう)。余裕があればここら辺もキャッチアップしたいですね。特に本番では気になる。

go-to-k.hatenablog.com

プロジェクト確認

ここで一度プロジェクトの内容を確認します。serverless create で作成したプロジェクトはこんな感じ。

$ tree
.
└── tutorial
    ├── handler.py
    └── serverless.yml

1 directory, 2 files

handler.py は Lambda デフォルトとほぼ同じコード、関数名が hello になってますが、yaml側でハンドラー定義もされてるんでしょうか。

handler.py
import json


def hello(event, context):
    body = {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "input": event
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    return response

    # Use this code if you don't use the http event with the LAMBDA-PROXY
    # integration
    """
    return {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "event": event
    }
    """

serverless.yml はこんな感じ。やたらと親切にコメントでいろいろと書いてくれています。必要なところだけコメント外して書き換えるだけでいろいろとできそうですね。

serverless.yml
# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
#    docs.serverless.com
#
# Happy Coding!

service: tutorial
# app and org for use with dashboard.serverless.com
#app: your-app-name
#org: your-org-name

# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
frameworkVersion: '3'

provider:
  name: aws
  runtime: python3.8

# you can overwrite defaults here
#  stage: dev
#  region: us-east-1

# you can add statements to the Lambda function's IAM Role here
#  iam:
#    role:
#      statements:
#        - Effect: "Allow"
#          Action:
#            - "s3:ListBucket"
#          Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ]  }
#        - Effect: "Allow"
#          Action:
#            - "s3:PutObject"
#          Resource:
#            Fn::Join:
#              - ""
#              - - "arn:aws:s3:::"
#                - "Ref" : "ServerlessDeploymentBucket"
#                - "/*"

# you can define service wide environment variables here
#  environment:
#    variable1: value1

# you can add packaging information here
#package:
#  patterns:
#    - '!exclude-me.py'
#    - '!exclude-me-dir/**'
#    - include-me.py
#    - include-me-dir/**

functions:
  hello:
    handler: handler.hello
#    The following are a few example events you can configure
#    NOTE: Please make sure to change your handler code to work with those events
#    Check the event documentation for details
#    events:
#      - httpApi:
#          path: /users/create
#          method: get
#      - websocket: $connect
#      - s3: ${env:BUCKET}
#      - schedule: rate(10 minutes)
#      - sns: greeter-topic
#      - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000
#      - alexaSkill: amzn1.ask.skill.xx-xx-xx-xx
#      - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx
#      - iot:
#          sql: "SELECT * FROM 'some_topic'"
#      - cloudwatchEvent:
#          event:
#            source:
#              - "aws.ec2"
#            detail-type:
#              - "EC2 Instance State-change Notification"
#            detail:
#              state:
#                - pending
#      - cloudwatchLog: '/aws/lambda/hello'
#      - cognitoUserPool:
#          pool: MyUserPool
#          trigger: PreSignUp
#      - alb:
#          listenerArn: arn:aws:elasticloadbalancing:us-east-1:XXXXXX:listener/app/my-load-balancer/50dc6c495c0c9188/
#          priority: 1
#          conditions:
#            host: example.com
#            path: /hello

#    Define function environment variables here
#    environment:
#      variable2: value2

# you can add CloudFormation resource templates here
#resources:
#  Resources:
#    NewResource:
#      Type: AWS::S3::Bucket
#      Properties:
#        BucketName: my-new-bucket
#  Outputs:
#     NewOutput:
#       Description: "Description for the output"
#       Value: "Some output value"

コメント外すとたったこれだけです。予想通りハンドラ定義ありましたね。ソースを変更するときはここを書き換えればよさそうです。

serverless.yml
service: tutorial
frameworkVersion: '3'

provider:
  name: aws
  runtime: python3.8

functions:
  hello:
    handler: handler.hello

デプロイ

デプロイ

$ serverless deploy

CloudFormationスタックが作成されたことを確認。どうやらデフォルトで dev がつくようですね。custom.profiles を指定すれば任意に設定できるのでしょうかね(知らんけど)。

Lambda, ロググループ, IAMロール, S3バケット が作成されているようです。serverless.yaml では Lambda しか定義していなかったですが良しなに作ってくれました。ただ、ここでリージョンが us-east-1 になっていることに気づきました。IAM権限設定の際に serverless config をしましたが、ここでおそらくリージョンを設定しないといけなかった気がします。もしくはテンプレート内にリージョン書けばできるかな?

とりあえず、各リソースを確認していきます。

Lambda

ソースが反映されていることがわかります。

設定はマネジメントコンソールで作成するときとかなり違いますね。デフォルトだとタイムアウトが長く、メモリも大きいです。

ロール

ポリシーは以下が当たってました。Lambdaの一番シンプルな組み込みロールと同じ感じですね。

tutorial-dev-us-east-1-lambdaRole

tutorial-dev-lambdaポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogStream",
                "logs:CreateLogGroup"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:XXXXXXXXXXXX:log-group:/aws/lambda/tutorial-dev*:*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:XXXXXXXXXXXX:log-group:/aws/lambda/tutorial-dev*:*:*"
            ],
            "Effect": "Allow"
        }
    ]
}

S3

バケットには以下のファイルが格納されていました。

ファイル 中身
compiled-cloudformation-template.json CloudFormationに変換したテンプレート
serverless-state.json serverless.ymlで定義していない値をデフォルト値で埋めたテンプレート
tutorial.zip デプロイ資材(ここでは handler.py

これらは serverless deploy 時にコンパイルされた .serverless ディレクトリ内のファイルと "ほぼ" 同じもののようです。

$ ls .serverless/
cloudformation-template-create-stack.json  serverless-state.json
cloudformation-template-update-stack.json  tutorial.zip

どのような対応か、わかりやすく説明してくださってるページがありました。

blog.giftee.dev

どうやらこんな感じの流れなようです。

  • serverless.yml を解析
  • 埋まっていない値をデフォルト値で補完し serverless-state.json を出力
  • 定義ファイルやソースを格納するS3バケットを作成するためのテンプレートを cloudformation-template-create-stack.json として出力
  • 実際に作成するテンプレートを cloudformation-template-update-stack.json として出力。これはS3バケット上の compiled-cloudformation-template.json と同じ。※同じものがアップロードされるという意味なのかは不明

お掃除

全削除。CloudFormationスタックが削除されます。

$ serverless remove

serverless 実行用に作成したアクセスキーを無効化しておきます。

感想

全くの0からなんとなくイメージはつかめました。

serverless.yml の書き方、IAM権限の絞り込み周りを勉強していきます。

0.6 ÷ 0.2 の意味がわかりますか?「子どもの算数、なんでそうなる?」を読みました。

ゆる言語学ラジオでちらっと紹介のあったこの本を読みました。

www.iwanami.co.jp

子供の算数における様々な間違いを挙げ「なぜそのような間違いが起きるのか」「子供はどのように数を捉えているか」の考察がされています。また、そのような誤りをした子どもとの向き合い方について筆者の思いが語られています。

特に興味深かったのは第7章「かけ算の順序・かけ算の種類」。

かけ算を8つのパターンに分類しています。(分類をここに書いてしまうのはよくないので知りたい人は本を買ってください。)

そして付録の章ではそれぞれのパターンについて「等分除・包含除」を切り口にもう少し詳細な分析をしています。

「等分除・包含除」については Wikipedia の「かけ算の順序問題」でも触れられています。乗法・除法において基本的な考え方なのでしょう。

ja.wikipedia.org

ある量が「基準となる量」の「幾つ分」に除されるかを考えるとき、「基準となる量」を求めるのが等分除、「幾つ分」になるかを求めるのが包含除である。 ※上記Wikipedia「等分除と包含除」の章より

具体例を出しましょう。6個入のピノを2人で3個ずつ分けることを想像してください。上記「基準となる量」「幾つ分」と「6個のピノ」の関係はこのようになります。

基準となる量 × 幾つ分 = 6個のピノ

そして、「6個のピノを2人に3つずつ分ける」ときの考え方は問題設定により2通りあります。

問題設定 考え方 分類
一人分はいくつでしょう 基準となる量(1人当たりのピノの個数) × 2人分 = 6個 等分除
何人分でしょう 3個 × 幾つ分(何人分) = 6個 包含除

もちろん、これは "何を基準にするか" によって交換可能な概念です。「基準となる量」を2人とし、「幾つ分」をピノの個数と解釈することも可能だからです。

大人からすれば簡単すぎて当たり前のことですが、これがしっかりと腹落ちできていないと、以下の問題における 0.6 ÷ 0.2 の意味することが理解できないと思います。

(a) 0.6L の水を 0.2L ずつコップに入れていく。何杯できるか。

(b) 0.6L の水が全体の 20% であるとき、全体は何Lか。

谷口, 子どもの算数、なんでそうなる?, p.140

自分の子どものころを思い出すと、確か分数や少数の割り算を学んだときに、"計算もできるし、意味も口では説明できる。でもなんかもやもやする" と思って手元のおはじきやブロックを使って何度も確認作業をし、それでもわからなくて泣いた記憶があります。

筆者は、"誤りは必ずしも悪いことではなく、深い理解に繋がり得るもの。本人の思考をよそに誤りを訂正するのでは子どもの学びを失ってしまう恐れがある" という主旨のことを結びで語っています。学びって大事(小並感)。

MQなんもわからん同好会会長に就任しました

ふとしたことから、知人からAMQPについて聞き、AMQPってなんぞや?と思ったのでちょこっと調べてみましたが、、、なんもわからん。。。

MQTTはさわったことあるけどほぼマネージドオンリーなので中身を気にすることもなく恥をさらして生きてきた代償です。

なんとなくわかりました(なんもわからん)。たぶんものすごくわかりやすく説明してくださってるんだと思います。すみません。

一対一の高信頼性が求められるメッセージには AMQPってコト?

ちなみに、MQについての超概要は以下ページのリンクPDFが超絶わかりやすいです。

www.janog.gr.jp

Kubernetes 資格試験本番では edit コマンドを使わない

前置き

そういえば今年度何も資格を取っていなかったので、去年取得した CKA に続き、CKAD を受験しようと思います。

Udemy のこの講座に久しぶりにログインしたものの、あんまり覚えてないので最初からやり直しです。

去年はこれを受講し、CKAに合格。 www.udemy.com

CKA合格後、ちょっとだけこの講座を受講したが飽きてやめた。 www.udemy.com

試験難易度的には CKA > CKAD と言われているので、ちょっと復習すればいけるやろ的な甘い考えです。

復習する中で試験本番Tipsを一つ思い出したのでメモします。

試験本番では edit 禁止

試験本番では Kubernetes 環境に対して管理者権限でコマンドをベシベシ叩きます。そのため環境を壊して試験が続行できなくなる可能性があります。

環境を壊しても自分で直すか再構築すればOKですが、時間にシビアな試験なので環境破壊=試験終了を意味します。

直接マニフェストを書き換える kubectl edit コマンドは非常に便利ですが、ミスすると取り返しがつかなくなることがあるので試験本番では edit 禁止と律するのがよさそうです。

超簡単な例を挙げると以下のようなケースです。

Q: レプリカセットのイメージが間違っていて DockerHub からイメージプルできない。動くように修正せよ。

edit の場合(本番ではやらないようにしたい)

このとき、一番速いのは以下です。※エイリアス k を設定している前提

k edit rs hoge-replicaset

Vimが開くので spec を修正し保存。既存のエラー Pod をすべて delete。

これだけでOKですが、万一修正内容が間違ったまま保存してしまった場合、元に戻すことはできません。※一見 --record オプションが使えそうかなと思いますが、これはコマンドが記録されるだけなので無理です。

もしかしたらシステム側を掘れば旧戻しや差分確認ができるかもしれませんが非常にハードだと思います。

patch の場合(打ち込むのに時間がかかる)

edit は怖いとなれば、patch でやるのが定石です。

kubectl patch rs hoge-replicaset -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-container","image":"nginx"}]}}}}'

しかし、打ち込むのに非常に時間がかかり、カッコの数とかクオーテーションの数とかミスったときにはさらに時間がとられます。

再作成の場合(一番早くて安全)

要件が許すのであれば手数は多いもののコマンドが簡単な再作成が一番速いです。

マニフェストをバックアップ。このとき、Tab 補完で間違えないようにプレフィックスとして bk. をつけておくとよい。

k get rs hoge-replicaset -o yaml > bk.hoge-replicaset.yaml

編集用マニフェストを作成。

cp bk.hoge-replicaset.yaml hoge-replicaset.yaml

マニフェスト編集。

vi hoge-replicaset.yaml

既存の ReplicaSets は試験側で用意したものであるため、受験者側はオリジナルのマニフェストファイルは持っていません。このまま apply しても反映されない可能性がある(少なくとも Warning は出る)ため、リソースを削除してから新しいマニフェストを apply します。

k delete rs hoge-replicaset
k apply -f hoge-replicaset.yaml

‘edit` は使わないように気を付けましょう。

Nuro光のONUに自前ルータを接続する

NURO光から配布された ONU が F660A なのですが、無線接続可能台数が10台までとなっています。

2.4GHz, 5GHzのSSIDをそれぞれ4つずつ設定可能ですが、10×8=80台 というわけではなく全体で10台です。

そのため、多くのネットワーク機器を無線接続するためには外付けのアクセスポイントが必要になります。

であればアクセスポイントを購入すればよいのですが、家庭用のものは大体ルータ機能もついており、同時接続台数を多くしようとするとルータ機能も充実してるモデルを購入することになります。

そこで問題になるのが二重ルータ問題です。

NURO光公式的には二重ルータはNG(してはいけない)となっています。

www.nuro.jp

また、やむなく二重ルータを設定する方法として以下が記載されています。

意図的に二重ルーターの状態をつくり出す際には、上記のトラブルを避けるために2台目のルーターの設定を変更しなければいけません。 具体的には、中継器として用意した自前ルーターの設定を変更することが大切です。

NURO 光からレンタルしているONUには中継器として利用するための設定がないため、1つの家庭で2つのルーターを使う場合には、必ず自前ルーターの設定を変える必要が出てくるのです。

その際には、2台のルーターをそれぞれ、以下の設定にします。

・NURO 光のONUはそのままの設定

・自前ルーターの設定を「ブリッジモード」に変更

自前ルータ側を「ブリッジモード」に設定するということは、自前ルータのルータ機能をOFFにし「アクセスポイント」として利用していることになります。

これではせっかく購入した高機能なルータ機能が利用できないということです。これを「二重ルータ」と言ってしまうのはミスリードな気が。。。

じゃあONU側でルータ機能をOFFにすればよいというわけではありません。NURO光で配布されるONUではルータOFFの機能がないためです。

ここまでの話をまとめると以下のようになります。

# 推奨/非推奨 ONU 自前
1 不可能 ルータOFF ルータ
2 NURO推奨 ルータ アクセスポイント
3 NURO非推奨 ルータ ルータ

No.1 の構成ができれば一番ハッピーなのですが、仕様上できないので No.3 の構成をしようと思います。あえて自前ルータ側にルータ機能を残したまま二重ルータの設定をするということです。

調べてみると非常に多くの方がこの構成を試みていて成功しているようなのでマネしてやってみます。

構成

最終的に以下の構成となりました。

ひかりTVチューナーも自前ルータ配下に置きたかったのですが、3時間ほど格闘しうまくいかず。

作業

ONU(F660A)側

無線LANをOFF

ネットワーク>無線LAN RF2.4G>基本設定 で無線LANをOFFにします。

同様に ネットワーク>無線LAN RF5G>基本設定 で無線LANをOFFにします。

自前ルータ固定アドレス設定

ネットワーク>LAN>DHCP固定アドレス割当 で自前ルータのMACアドレスを指定し、静的IPを割り当てます。

MACアドレスはルータの後ろのシールに書いてあります。

ONUのIPが 192.168.1.1 なので、192.168.1.2 にしました(特に理由はない)。これが自前ルータから見たときの WAN IP になります。

ONU側DHCP設定

ネットワーク>LAN>ダイナミックアドレス管理(IPv4) を以下のように設定します。

DHCPを有効にしますが、無線はOFFに設定しているため、ONU機器に有線接続するデバイスに対してのみ有効になります。無効にしてもよいですが、自前ルータ側でトラブルがあったときに、ONUの管理画面が見れなくなってしまうので一応有効にしておきます。WAN IPが 192.168.1.2 なので 192.168.1.3から割り当てるようにしています。レンジは適当です(そんなに多く繋げないと思うので一旦10まで)。

talkeyboidsrfc がONUに有線接続しているPCです。DHCPを無効にすると自前ルータ経由でしかアクセスできなくなるので注意してください。ちなみにDHCPを無効にしていてもテレビが映りました。「WAN接続ができなくなったときに管理画面が見えなくなってもよい(ONUを初期化する)」のであれば無効にしてもよいと思います。

ネットワーク>LAN>ダイナミックアドレス管理(IPv6) は以下のように設定します。DHCPは有効にしなくてもひかりTVが映っているので無効にしています。

ファイアウォール設定

セキュリティ>ファイアウォール を以下のように設定します。

DMZ設定

アプリケーション>DMZ を以下のように設定します。

自前ルータ(ASUS AX5400)側

自前ルータは以下を利用しました。

www.asus.com

接続後、適当に初期設定します(後に変更できます)。

ワイヤレス設定

スマートコネクトはOFFにしています。マルチバンドで問題ないよという人はONでもいいです。

LAN設定

デフォルトのままです。192.168.50.1/255.255.255.0 のLANを構築します。

WAN設定

WAN接続タイプは 静的IPアドレス とし、デフォルトゲートウェイはONUのアドレス、WAN IP は ONU側で設定した固定IPを指定します。

セキュリティ的に UPnP は 無効にします。

WAN アグリゲーション、 F660A は対応してるのかな?わからないので無効にしておきます。

IPv6設定

パススルーを設定。

ファイアウォール設定

ファイアウォールを有効にし、DoS保護を有効にします。WAN側の Ping には応答しません。

ファイアウォール規則はおそらくホワイトリストだと思われます。特に外部からのアクセスは今のところないので何も設定していません。

AiProtection設定

今回の内容とは関係ないですが、AiProtectionをONにし、セキュリティ評価の項目をすべてOKにしておきます。

ひかりTVを自前ルータにぶら下げたい

ここら辺を見ながらトライしてみたのですがうまくいかず・・・。ネットワークなんもわからんマンなので、ちゃんと勉強しないと。

www.asus.com

www.asus.com

余裕ができたら再挑戦したいです。

Windows11にWSL2をインストールしNode開発環境を作る

WSL入れて、VSCodeから繋げるようにして、Ubuntu内の開発環境を作る(とりあえず最低限)。

WSL2 手順

以下に従い作業する。

learn.microsoft.com

Ubuntu-20.04をインストール

コマンドプロンプトを管理者権限で実行する。

インストールバージョンを確認

>wsl -l -o
インストールできる有効なディストリビューションの一覧を次に示します。
既定の分布は ' * ' で表されます。
 'wsl --install -d <Distro>'を使用してインストールします。

  NAME            FRIENDLY NAME
* Ubuntu          Ubuntu
  Debian          Debian GNU/Linux
  kali-linux      Kali Linux Rolling
  openSUSE-42     openSUSE Leap 42
  SLES-12         SUSE Linux Enterprise Server v12
  Ubuntu-16.04    Ubuntu 16.04 LTS
  Ubuntu-18.04    Ubuntu 18.04 LTS
  Ubuntu-20.04    Ubuntu 20.04 LTS

インストール

>wsl --install -d Ubuntu-20.04
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
ダウンロード中: WSL カーネル
インストール中: WSL カーネル
WSL カーネル はインストールされました。
ダウンロード中: GUI アプリ サポート
インストール中: GUI アプリ サポート
GUI アプリ サポート はインストールされました。
ダウンロード中: Ubuntu 20.04 LTS
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。

Windowsを再起動する。

WSL初期設定

再起動後、Ubuntu 20.04 LTS ウィンドウが表示される。

参考) https://aka.ms/wslusers の日本語ドキュメントはこちら learn.microsoft.com

新規ユーザ名とパスワードを入力するとWSLプロンプトが表示される。

Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: talkeyboid
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Jan  1 14:21:07 JST 2023

  System load:  0.0                Processes:             8
  Usage of /:   0.4% of 250.98GB   Users logged in:       0
  Memory usage: 1%                 IPv4 address for eth0: 172.31.201.125
  Swap usage:   0%

0 updates can be installed immediately.
0 of these updates are security updates.


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once once a day. To disable it please create the
/home/talkeyboid/.hushlogin file.
talkeyboid@talkeyboidsrfc:~$

Windows から WSL ディレクトリを見る

適当にファイルを作成

~$ pwd
/home/talkeyboid
~$ echo fuga > hoge.txt

Windows側のエクスプローラーから接続し、hoge.txt があることを確認する。

パスは \\wsl.localhost\Ubuntu-20.04\home\<username>

WSL から Windows のフォルダを見る

/mnt/c にCドライブがマウントされている。

が基本的に WSL から Windows のファイルはいじるべきではないと思うので使うことはなさそう。読み取り権限だけつける必要が出てきたときにはそのとき調べることにする。

VSCode手順

以下に従って作業する。

learn.microsoft.com

インストール

以下から Windows 用の VSCode インストーラをダウンロード

code.visualstudio.com

インストーラに従いインストール

VSCode設定

Setting Sync を利用し、元PCから設定を移行する("共有"と言ったほうが正しいかも)。

zenn.dev

WSL2 拡張機能をインストール

Remote Development Extension を導入する。全部入りのバンドルっぽい。

この拡張機能パックには、リモート - SSH 拡張機能と Dev Containers 拡張機能に加えて、WSL 拡張機能が含まれており、コンテナー、リモート コンピューター、または WSL 内の任意のフォルダーを開くことができます。

WSLに接続

コマンドパレットから WSL: New WSL Window を選択するとWSLに接続した VSCode ウィンドウが表示される。

ターミナルを表示すると、Ubuntuに接続できていることがわかる。

Ubuntu

基本設定

以下を参考に Ubuntu を設定する。どのような設定をするかはお好みで。

zenn.dev

homebrew導入

以下を参考に導入する。

zenn.dev

導入後、バージョン確認

$ brew update
Already up-to-date.
$ brew --version
Homebrew 3.6.16
Homebrew/homebrew-core (git revision 939b942b128; last commit 2023-01-01)

nvm導入

以下を参考に導入する。

note.com

ただし、M1 Mac ではないのでパスを通す部分は ~/.profile に設定する。

~/.profile 末尾に以下を追記。

export NVM_DIR="$HOME/.nvm"
  [ -s "/home/linuxbrew/.linuxbrew/opt/nvm/nvm.sh" ] && \. "/home/linuxbrew/.linuxbrew/opt/nvm/nvm.sh"  # This loads nvm
  [ -s "/home/linuxbrew/.linuxbrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/home/linuxbrew/.linuxbrew/opt/nvm/etc/bash_completion.d/nvm"  # This loads nvm bash_completion

~/.profile 再読み込み

$ source ~/.profile

バージョン確認

$ nvm --version
0.39.3

インストール可能バージョンを確認

$ nvm ls-remote
~略~
v18.12.0   (LTS: Hydrogen)
v18.12.1   (Latest LTS: Hydrogen)
~略~

最新のLTSをインストール

$ nvm i v18.12.1

nodeバージョン確認

$ node -v
v18.12.1
$ nvm current
v18.12.1

Git バージョン確認

Ubuntu デフォルトの 2.25.1 でとりあえずOK。

$ git version
git version 2.25.1

Surface Laptop Studio を購入したので初期設定していく

早く Mac から Win に戻りたいと思いはじめて2年くらい経った。

やっと Windows 機を購入。Surface Laptop Studio の メモリ32GB, SSD 1TB のモデル。Surfaceのノートでは一番上のシリーズっぽい。

www.microsoft.com

さっそく設定していく。

全般設定

マウスとタッチパッドのカーソルスピードを最速に

azby.fmworld.net

変換無変換キーでIME ON/OFF

英語/日本語切り替えをMacデフォルト風にする。

pcmanabu.com

タスクバーを自動的に隠す

pc.watch.impress.co.jp

今まで仕事用ノート・私用デスクトップはWin10、私用ノートはMacを使っていたため、タスクバーを左下にすることには特にこだわりがない。

また、仕事の場合は複数のエクセルやブラウザウィンドウを立ち上げまくるのでタスクバーは必要だが、私用ではそんなに多くのアプリケーションを多重で立ち上げないのでタスクバーは消しておしゃれに使いたい。

ダークモード

中二病なのでダークモードにする。

imagingsolution.net

拡大/縮小 を125%にする

規定の150%では少し大きいので125%に調整。

chromeをデフォルトに

chromeをインストールし、アプリ>規定のアプリ>Microsoft Edgeから各拡張子・プロトコルをchromeに変更する。

プロファイルを全部インポート

用途別にたくさんGoogleアカウントを所有しているのですべてのアカウントをchromeのプロフィールに紐づける。

オフィス

Surface には MS Office がプリインストールされていたので、とりあえずExcelを開き個人用Office365(Microsoft365)アカウントでログインする。※WordとかPowerpointでもOK

アカウント>Office更新プログラム から最新プログラムに更新。

開発環境

こちらに書きました。

talkeyboid.com

音楽制作環境

また時間ができたときに。。。