「Webで使えるmrubyシステムプログラミング入門」にはmrubyだけでなくシステムプログラミングに必要なことがすべて書かれてるすごい本だった

概要

@udzuraさんが書かれた「Webで使えるmrubyシステムプログラミング入門」を読みました。各種書店ですでに販売されていますが、私はPDF版が購入できるManateeで購入しました。

読みはじめる前は「mod_mrubyの使い方を簡単に解説した本かな?」と思っていたのですが、読み進めていくと非常に内容が濃い一冊ということに気が付きました。

各章の詳細な感想

Chapter 2でmrubyのセットアップを解説した後は、Chapter 3でmrubyのビルドの全体像とbuild_config.rbの解説、サンプルmgemの作成まで一気に書かれています。いわゆる入門書であればここまでで1冊として成立しそうな内容ですが、本書は更にmrubyでできることを紹介してくれます。

Chapter 4ではpsコマンドの紹介や/procファイルシステムの紹介を丁寧に行った後にこれをmrubyで扱うためのツールを作っていきます。Chapter 5からはmrubyとC言語との連携方法について解説。数年前に私がmrubyで簡単なアプリを作ったときに四苦八苦しながら学んだ内容が凝縮されています。また、プログラムを書く上で欠かせないデバックの方法もツールの紹介とともに詳細に記されており、@udzuraさんのノウハウが惜しみなく丁寧に紹介されています。

Chapter 7からはmod_mrubyの紹介とそのサンプルの実装。1ページ1ページ濃密であることは変わりありませんが、さらにパフォーマンスの測定と分析のための方法論を丁寧に紹介されていて大変驚きました。なんて手厚い...。

Chapter 9では安全にプログラムを書く方法について。一般的な書籍では避けられがちな内容ですが、実例とともに紹介しています。システムプログラミングに必要な内容がかなり丁寧に書かれているすごい本だと感じました。

サポート

最近の技術書にはサポートページがついていて、サンプルソースなどを手元で確認できます。本書にもサポートページがあるので、自分で手で書いてみて詰まったときには参照してみるとよいかと思います。

github.com

iPhoneの機種変をするための準備

iPhone 12を買いました。まだ機種変作業は実施していないのですが、機種変に必要な作業を洗い出しておきます。2年前にも似たような記事も書きましたが、今回この記事も大いに役立ちました。

miyohide.hatenablog.com

環境

iPhoneが5G対応したということで、IIJ mioのSIMが使えるかどうかがちょっと不安でしたが、公式に検証結果が発表されていました。これで一安心です。

www.iijmio.jp

移行が必要なもの

多くのものはサービス提供会社が移行方法について記しています。それを参照しながら作業するだけです。

Suica

Suicaが使えないのは困るので、Suica関係については念入りに調べておきます。

SuicaApple Watchにうつしている場合は念の為iPhoneにうつしておきます。 appsuica.okbiz.okwave.jp

その後、iPhoneのWalletにあるSuicaを移す作業を実施。 appsuica.okbiz.okwave.jp

LINE

official-blog.line.me

Apple Watch

これもAppleのサイトに記されています。

support.apple.com

ペアリングを解除しておくと良さそうです。

iPhoneの移行

以上で準備が整ったので、iPhoneの移行を進めます。作業としては以下の通り。

support.apple.com

iOS APN構成プロファイルのインストール

この作業をしないとモバイル通信ができません。最近はあまりモバイル通信をしない人も多いので、なかなか気が付きにくいポイントかなと思います。

www.iijmio.jp

とりあえずこんなもので。

Azureの認定試験 AZ-104 Microsoft Azure Administratorに合格しました

下のブログで宣言したとおり、Azureの認定試験 AZ-104: Microsoft Azure Administratorを受験して合格しました。

miyohide.hatenablog.com

f:id:miyohide:20201012185306p:plain

試験勉強についてはMicrosoft Leanを使って勉強して、どうしても必要な場合は自分のサブスクリプションを使って動作を確認したりしていました。

こういう試験については昔から苦手で、だいたいお腹痛くなったりしています。今回も朝からお腹痛い><って泣きそうでしたが、最初の数問を解いて「なんとなく行けそう」と感じたら痛みはどこかに行ってました。無事、合格できてホッとしました。

有効期限が2年間なので、定期的に情報更新をしてより知識を深めたいと思います。また、AzureだけじゃなくAWSとかにもチャレンジしてみたいです。

第1回目のKaigi on Railsは初心者から上級者までが楽しめるカンファレンスだった

去る2020年10月3日(土)にKaigi on Railsというカンファレンスが開催されました。コロナ禍のため、オンライン開催。個人的にはオンライン開催はありがたい。

kaigionrails.org

るびまに載せたいので、みなさんブログ書いてください」と言った手前、自分も参加ブログを書きたいと思います。

拝見したセッションのメモ

レーニングとか家事とかをこなしていたらすっかり午後になってしまったので、午後から参加。自分が聞いた範囲の内容を記します。

継承とメタプログラミング満載なアプリケーションコードでもアクションとフィルタに悩まないためのGemを作った話

スライド資料はこちら

なるほど、辛いな...って状況からその解決方法が面白く、参加初っ端から興味深く聞けたセッション。コードの解説がどんどん進んでいって自分は追いつけなかったので、解説記事をるびまに書いてほしい...

Action Mailbox in Action

スライド資料はこちら

いやあ、メールを扱うって大変だなあ...といろいろと学べたセッション。ほんと気軽にメールサーバーを立てようとか思わないようにしよう。

育てるSinatra

Sinatraって1ファイルで収めなきゃいけないんでしょ?と思っていたのをサクッときれいに解決されていて、「なるほど、その手があったか」とfmfm頷きながら聞いていました。あまり大きくなりすぎてもなんですが、発表中にあった「20 Action」程度ならSinatraで作ってみるのもいいなと改めてSinatraを見直す機会となりました。

ミドルウェアActionDispatch::HostAuthorizationと学ぶDNSのしくみ

[スライド資料はこちら](https://speakerdeck.com/yucao24hours/understanding-dns-with-actiondispatch-hostauthorization)。

イラストかわいい。そして分かりやすい。私もRails 6個人アプリを作ったときに「この設定がなんか知らないけれどもいる」という認識だったRails.application.config.hostsが、導入された背景から丁寧に説明されていました。

Rubyで書かれたソースコードを読む技術

スライド資料はこちら

今回のKaigi on Railsで幾度となく聞いた言葉として「ソースコードを読む」というのがあります。読み方やツールについて丁寧に説明された発表でした。個人的には、bundle install --path hogehogeはDeprecatedで今はbundle config set path hogehoge --localがいいということが新しい発見。

Ruby 3.0におけるドキュメンテーションと端末制御の未来

岩を登り、火をおこし、河を下り、浅草の道を歩くという発表内容よりも発表方法が斬新だったセッションでした。

ひみつきちを作りたい 〜「こどもれっどまいん」テーマ作りでの学び

スライド資料はこちら

Redmineをカスタマイズして「こどもれっどまいん」を作られたお話。My Redmineなら今すぐ使えるようです。

hosting.redmine.jp

フォントとか画面遷移とかちょっとしたイースター・エッグとか、飽きさせないカスタマイズが素敵でした。

快適なリモートワークを実現するために〜RailsでSSOを実現する3パターン

資料はこちら

GMOペパボさんの在宅勤務に関する取り組みはWEB+DB Press Vol 118にも詳しいのですが、また別のお話。発表中にあった「単なる二要素認証だけでは要件として不足している」という気付きから解決に向けての取り組みが勉強になりました。

TDD with git. Long live engineering.

スライド資料はこちら

発表タイトルや概要を拝見したときは「え?バージョン管理ツールとTDDのやり方って何か関係あるの?」と思っていたのですが、その疑問を「!」に変わったセッション。なるほど、「誰のためのコード?」を考えると得られたツールの自由度を最大限生かすための取り組みや活かし方を学べました。

Sidekiq to Kafka 〜ストリームベースのmicroservices〜

スライド資料はこちら

扱うデータ量がすごすぎて、「なるほど、そんな世界があるんだ...」とあっけにとられながら拝聴していました。

基調講演

松田さんの基調講演。松田さんが作られている多数のgemを紹介しつつ、コードリーディングや「自分が書いたコードが最高なので」という言葉の通りにどんどんコードを書いていくことを勧められていました。

github.com

「自分が書いたコードが最高なので」、かっこいいなあ。

After Party

いわゆるオンライン飲み会みたいなノリで開催されたAfter Party。いろんなお話が各所で行われ、それぞれ盛り上がっていました。個人的に聞いた話は、

まとめ

最近RailsRubyを触っていないので、話についていけるかな?と思っていましたが、コンセプト通り「初心者から上級者までが楽しめるカンファレンス」でした。この部分については、運営チームさんがかなり気を配って選考されたとお聞きしました。そのおかげで大変楽しめました。

まだ何も決まっていないようですが、来年もKaigi on Railsを開催予定とのこと。今から楽しみです。

AZ-104: Microsoft Azure Administratorを受けることになった

最近、クラウドの勉強をやっているのですが、なんらかの資格試験を取ったほうが見栄えが良いだろうという考えから「AZ-104: Microsoft Azure Administrator」という資格試験を受けることになりました。

まだ実際に受けていないので、試験の難易度とか全然わからないのですが勉強や試験の過程などをまとめておこうかと思います。

試験について

試験の情報は以下を参照。

docs.microsoft.com

試験範囲もすごく幅広く、試験勉強をしていても結構歯ごたえあります。

勉強

ひたすらMS Learnを使っています。

docs.microsoft.com

ここからAZ-104に関するものを全部受けるという感じで進めます。

また、「速習Azure Administrator」という本があるので軽く目を通しました。

https://tatsu-zine.com/books/azure-administrator

ただ、これだけで受かるとはあまり思えなかったので試験対策の資料を探すことにしました。

試験対策

なんとなくUdemyで検索して引っかかったもののうち、評価が高かったものを購入してやっています。

www.udemy.com

これをやってみると、全然分からない。5〜6割ぐらいの正答率なので、合格には程遠い感じ。ここで間違えた問題を中心に用語や機能の再確認をしています。

個人的メモ

とりあえずよく間違える点や覚えていなかったことをメモ代わりに。

サイト間接続の実装

  1. VNetとサブネットの作成
  2. ゲートウェイサブネットの作成
  3. VPN Gatewayの作成
  4. ローカルネットワークゲートウェイの作成
  5. VPNバイスの構成
  6. VPN接続作成

see. https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-site-to-site-resource-manager-portal

Azure Monitorにおける音声・SMS・メールの投稿制限

  • 音声・SMSは5分に1回
  • メールは1時間で100件未満

see. https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/alerts-rate-limiting

RPO/RTO

see. https://techtarget.itmedia.co.jp/tt/news/1901/15/news08.html

Azure組み込みロール

全部を覚えておく必要はないけれども、以下の違いは認識しておいたほうが良いかと。

  • コントリビューター
  • 所有者
  • Reader
  • User Access Administrator

docs.microsoft.com

Azure Cosmos DBをnode.jsから使ってみる

概要

最近Azureを触ることが多いのですが、そのたびに「Cosmos DB押し」をよく聞くのでちょっと触ってみることにしました。無償枠もあるようですので、気軽に試せます。

devblogs.microsoft.com

右も左も分からないので、まずは簡単なチュートリアルに沿って作業を進めます。下記のQiitaの記事を参考にしました。

qiita.com

その後は、作成したItemsコンテナに対してnode.jsアプリからアクセスしてみることにします。以下のドキュメントを参考にしました。

docs.microsoft.com

プロジェクト生成

任意の空ディレクトリにてyarn initを実行してプロジェクトを生成します。その後、yarn add @azure/cosmosを実行して必要なライブラリをインストールします。

設定ファイルの用意

config.jsというファイルを作成して接続先やデータベース名やコンテナ名を記述します。参考にしたドキュメントではプライマリーキーも記していましたが、それはあまり行儀が良くないので今回は環境変数で設定することにします。

const config = {
  endpoint: "エントリーポイント",
  databaseId: "ToDoList",
  containerId: "Items",
}

module.exports = config

環境変数の設定

config.jsにて設定しなかったプライマリーキーを環境変数COSMOSDB_KEYに設定するようにします。単純にLinux/macOSであれば、

export COSMOSDB_KEY=プライマリーキー

を実行するだけです。

プログラムの実装

Cosmos DBに対して参照・追加・更新・削除を行うプログラムapp.jsを実装します。こんな感じの実装となりました。

const CosmosClient = require("@azure/cosmos").CosmosClient
const config = require("./config")

const newItem = {
  id: "3",
  category: "fun",
  name: "Cosmos DB",
  description: "Complete Cosmos DB Node.js Quickstart ⚡",
  isComplete: false
}

async function main() {
  const { endpoint, databaseId, containerId } = config
  let key = null
  try {
    if (process.env.COSMOSDB_KEY) {
      key = process.env.COSMOSDB_KEY
    } else {
      throw new Error('環境変数COSMOSDB_KEYが設定されていません')
    }
  } catch (error) {
    console.log(error.message)
    return
  }

  const client = new CosmosClient({ endpoint, key })

  const database = client.database(databaseId)
  const container = database.container(containerId)

  // SELECTを発行してデータを表示する
  const { resources: items } = await container.items.query('SELECT * FROM c').fetchAll()
  items.forEach(item => {
    console.log(`${item.id} - ${item.description}`)
  })

  // 新しいアイテムを追加する
  const { resource: createdItem } = await container.items.create(newItem)
  console.log(`\r\nCreated new item: ${createdItem.id} - ${createdItem.description}\r\n`)

  // 追加したアイテムに対して更新処理を実施する
  const { id } = createdItem
  createdItem.isComplete = true
  const { resource: updatedItem } = await container.item(id).replace(createdItem)
  console.log(`Updated item: ${updatedItem.id} - ${updatedItem.description}`)
  console.log(`Updated isComplete to ${updatedItem.isComplete}\r\n`)

  // データ削除する
  const { resource: result } = await container.item(id).delete()
  console.log(`Deleted item with id: ${id}`)
}

main()

ポイントは以下のとおりです。

  • async/awaitの使用
  • SELECT文のFROMには何を指定してもいい。
    • サンプルにはcと指定してあり、???だったのですが、何を指定しても良いようです。

あまり分かっていないのでこれからの課題です。

プログラムの実行

最後に実行です。nodeコマンドで作成したapp.jsを実行させます。

$ node app.js
1 - id = 1
2 - This item is second.

Created new item: 3 - Complete Cosmos DB Node.js Quickstart ⚡

Updated item: 3 - Complete Cosmos DB Node.js Quickstart ⚡
Updated isComplete to true

Deleted item with id: 3

SQL API SDKについて

node.jsからアクセスする際のSDKについては以下を参照すれば良さそうです。

docs.microsoft.com

サンプルソース

github.com

Azure Database for PostgreSQLにてタイムゾーンを変える

今日も小ネタ。Azure Database for PostgreSQLについて。

以前、Azure Database for MySQLタイムゾーンを変える方法について記事を書きました。今回はPostgreSQL版です。

miyohide.hatenablog.com

前提

Azure Database for PostgreSQLは複数のPostgreSQLのバージョンを選択できます。

docs.microsoft.com

また、使用する段階でどんどんバージョンが変わります。今回使用したPostgreSQLのバージョンは11.6を使用しました。

デフォルトの動作

例えば次のようなテーブルを作成しておきます。

create table table1 (
    id serial primary key,
    description varchar(20) not null,
    ts timestamp not null
)

このテーブルのtsカラムに次のようなSQLでCURRENT_TIMESTAMPで値をinsertすると、デフォルトではUTCで日時がINSERTされます。

insert into table1  (description, ts) values ('before change', CURRENT_TIMESTAMP)

f:id:miyohide:20200816173245p:plain

この仕様は「困る。日本時間にしてくれ」という話を聞くので、この対処方法を。

サーバーパラメータの変更

MySQLのときと同じように、PostgreSQLもサーバーパラメータを変更できます。

docs.microsoft.com

日本時間に変更するには、timezoneパラメータをAsia/Tokyoに変更します。

f:id:miyohide:20200816173608p:plain

設定した値は保存後有効になります。変更後に次のSQL文を実行して、再度select文を発行します。

insert into table1  (description, ts) values ('after change', CURRENT_TIMESTAMP)

f:id:miyohide:20200816173827p:plain

MySQLとは異なり、変更前のデータが日本時間に変わるわけではなく変更後のデータのみが日本時間に変わってました。