最近耳にするWebAssemblyとは?

1年以上前ですが、このブログでプログラミング言語のトレンド調査を行いました。

その中でも上位に来ていたものに

「Assembly Language」

がありました。

ブログを上げた際にはアセンブラの一種かと思い、特に調べることもなかったのですが、最近、よく耳にするワードがあります。

「WebAssembly」

さらにはその中で「Rust」がいいよ、という内容が目に止まりました。

ただ「Rsut」は「Rsut」だよね?「Web」と書かれているということはブラウザで動作するということか?

いろいろ気になったので調べてみました。

WebAssembly (WASM)とは?

WebAssembly (Wasm)は、ウェブブラウザで実行される低レベルのバイナリフォーマットで、主に高性能なウェブアプリケーションの開発に利用されます。JavaScriptとは異なり、WebAssemblyはバイナリ形式であるため、ブラウザが解釈しやすく、実行速度が速いのが大きな特徴です。

https://qrz.co.jp/blog/webassembly_function/

弊社でもJavaScriptのフレームワークはいくつか導入しています。

  • React
  • Angular
  • Vue.JS

などを使ってサービスの提供を行っています。

確かにネックとなるのはそれほど実行速度は早くない、というところでした。

それがWebAssemblyでは解消されるということになります。

WebAssemblyの特徴

上記で実行速度を上げましたが、その他の特徴も調べてみました。

JavaScriptを超える高速処理

これは先ほども述べましたが、バイナリ形式であるためが大きいものと想像されます。

従来はJavaScriptによって記述されていた部分をWebAssemblyに置き換えることで、処理速度が改善されます。実測値の報告データによると約3倍の処理速度が期待できるそうです

3倍の違いというのはかなり大きいです。高速な処理が要求されるであろうゲームや、多くのデータを利用するシミュレーションやAIなどに有効になってきそうです。

多くのブラウザで対応済み

メジャーブラウザは多くで対応済みです。なので動作に心配ないのも安心です。

  • Chrome
  • Edge
  • Firefox
  • Safari
  • Opera

最新の対応状況はこちらで確認できます。

https://caniuse.com/wasm

移植性・言語選択肢の多さ

「Rust」が使える?という今回の疑問の回答がこちらになります。

低レベルのバイナリフォーマットは標準化されており、多くの言語が対応しています。

  • Java
  • PHP
  • C# .NET
  • C++
  • Ruby
  • C
  • Swift
  • R
  • Go
  • Rust

「Rust」もありますね。

バイナリフォーマットさえ出力できるものであれば、言語は問わないということですね。

WebAssemblyでは

多くの言語が使える=既存のソースコードの流用ができる、ということにもなります。

「Rust」には「Yew」というフレームワークもありました。

また最近はWebAssemblyに特化した「Oynx」といった言語も登場しています。

どの言語が利用されているのか?

Scott Logic社が、WebAssemblyの利用状況などに関する調査報告を毎年行っており、直近の「The State of WebAssembly 2023」を見てみます。

記事のグラフを抜粋しました。Rustが一番利用されています。さらに3年連続で一番利用されていることが分かります。40%以上と高い利用率ですので、よく話題になっているのかもしれません。

もう一つ、気になるグラフがありました。

WebAssemblyは実は利用用途はWebだけではないんです。

サーバレス、コンテナ、プラグイン開発と多岐に渡ります。

上記ではWebAssembly (Wasm)は、ブラウザで実行と書きましたが、正確には仮想マシン用バイナリ命令フォーマットの仕様になります。

そのフォーマットがWasm ランタイムと呼ばれるスタックベースの仮想マシンによって実行されることになるため、特定のプラットフォームに依存しないことになります。
また、Wasm は OS、 CPU アーキテクチャに依存していません
OS (Windows、Mac、Linux) や CPU アーキテクチャ (x86-64、ARM) が異なる環境でも動作します。
Wasm ランタイムが OS や CPU アーキテクチャの差異を吸収しているため Wasm アプリケーションでは意識する必要がありません。

これによってWebだけではなく、いろいろなところで活用できるというわけです。

最近良く聞く、と言いましたが、実はAWSのLambdaでWebAssemblyが利用できる、というのを見たのが最初の知ったきっかけになります。

サーバサイド向けとしてSpinというフレームワークも存在しているようです。

WebAssemblyでできないこと

良いことずくめなWebAssemblyですが、できないこともあります。

システムのルート権限でアクセスできない

OS やデバイス自体にシステムのルート権限でアクセスできません。したがって、USB や Bluetooth、画面などに直接アクセスすることは不可能です。

DOM操作が行えない

WebAssemblyはブラウザがHTMLを解析する際に生成するデータ構造であるDOM(Document Object Modelの略)の操作もできません。

WebAssemblyの設計仕様はHTMLの要素を操作するものではありません。DOMの操作にはJavaScriptを使う必要があります。

そうなんです、WebAssemblyはブラウザ上では単独では利用できないのです。

ですがJavaScriptを使えば良いだけですので、そんなにネガティブに考える必要はなさそうです。

WebAssemblyを使ってみたい

調べれば調べるほど、いろいろな可能性を秘めたWebAssembly。

しかし最近の動向でもWeb以外での利用も増えてきているとはいえ、メインはWeb利用です。

多言語対応、プラットフォーム非依存、高速性など多くの特徴を持っており、ぜひ取り入れてみたいと思わせる魅力があります。

新しいサービス開発となったら、Yewあたりで、いやまずはLambdaで使ってみたいですね。

ビジネス実務法務検定2級~受験チャレンジ~

昨年の11月にビジネス実務法務検定(以下:ビジ法)の2級にチャレンジしました。
今回は、ビジ法受験に向けて行った勉強法を紹介していきたいと思います。

ビジネス実務法務検定とは

ビジネスの場で必要な法律の基礎知識を習得することのできる資格です。

3級では主に民法についての知識が問われますが、
2級では民法に加えて、商法・会社法についての知識も必要になります。

試験期間は1年に2回あり、秋に受験しました。
今年の申込み期間や試験期間についてはこちらのページで案内されています

▼受験案内・お申込み - 東京商工会議所
https://kentei.tokyo-cci.or.jp/houmu/exam-info/#content01

受験のきっかけ

会社の推奨資格としてビジ法の3級を紹介されたので、
最初は軽い気持ちで3級にチャレンジしてみました。

3級は夏に受験しましたが、あと少しのところで不合格という結果になり、
自分でもびっくりするほど悔しい気持ちになりました。
あと少しだったのであれば、次は2級を受験して必ず合格しよう、と強く思ったことがきっかけです。

筆者のスペック

本記事のレベル感の参考として、筆者のスペックを記載します。

  • テキストをじっくり読んで勉強することが苦手
  • 学生時代の1番の苦手科目は社会科
  • 法律に関して勉強するのは(ほぼ)初めて

一度は3級にチャレンジしているので、2級の勉強をした時点では(ほぼ)初めてという感じです!

問題の出題形式と受験方法

試験時間は2時間で、正しい選択肢を選んで回答していく内容となっております。
100点満点とし、70点以上をもって合格とします。

受験方法は自宅で受験するIBT方式と、各地の会場で受験するCBT方式があります。
私はIBTの方が受験費が安いことと、自宅での受験なのでギリギリまで勉強できるという理由でIBT受験にしました。
IBT受験は受験者が用意したパソコンの内蔵カメラやスマートフォンを使用して、
部屋の様子やパソコンの周りなどを試験管に確認していただいたり、画面共有をしながら受験したりと、
自宅からの受験とはいえ厳重に管理された状態で受験します。

また、パソコンの周りは紙などは置けないため、紙でメモはできません。
問題画面のメモ欄にパソコンでメモをしながら問題を解いていきました。

実際の学習方法

ビジ法は選択肢から回答する試験内容となっておりますが、
その選択肢が多いため、選択肢がなくても答えがわかるぐらいに理解していないと、
合格は難しいです。

受験する人のレベルによっては、公式の問題集のみでも十分だと思いますが、

  • ほぼ初学者
  • 理解する前に回答を覚えてしまう恐れがあった
  • 予備知識が全くないため解説を理解することができない
  • 難しい文章を読み進めるだけだと集中力が持たず、頭に入らない

という理由から、複数の教材を用意して学習を進めました。

試験までの大まかな勉強の流れは下記の図の通りです。

メインはスタディングの動画の視聴をして進めていき、
理解が追い付かない部分はYouTubeの「動画で民法がわかーる。」というチャンネルから
関連動画を探して視聴をしました。


上記のYouTubeチャンネルは民法だけではなく、
商法や会社法も難しい言葉はあまり使わず親しみやすい例も交えて解説しているので非常に助けられました。あとアザラシがかわいいです。
また、スタディングでは1セクションごとに問題集を用意しているので、
1セクション視聴をするたびに問題集で復習をしました。

動画視聴やアプリの問題集は手軽に学習ができるので、
移動中や入浴中や料理をしているときなど、隙あらば勉強するようにしました。
ひと通りの講座を受講し、問題文が理解できるようになってから
公式問題集の練習問題に着手しました。

公式問題集もひと通り練習問題を解き、不正解だった問題はふせんを貼って、
ふせんが貼られている問題を中心に繰り返し確認しました。
本番を想定してメモはとらず、選択肢を見なくても答えが浮かぶように、
公式テキストの内容も確認しながら総仕上げをしました。

使用した教材は下記の通りです。

【動画教材】
▼ビジネス実務法務検定試験® 2級合格コース[2024年試験対応]
https://studying.jp/bijihou/itempage/course2-2024.html
※アプリの問題集も上記サービスのものを利用しました

▼動画で民法がわかーる。【行政書士試験対策】
https://www.youtube.com/@azarasi
※一部動画はメンバーシップに入会する必要があります

【書籍】
▼ビジネス実務法務検定試験Ⓡ2級公式テキスト〈2024年度版〉
https://amzn.asia/d/8rd4Ojz

▼ビジネス実務法務検定試験Ⓡ2級公式問題集〈2024年度版〉
https://amzn.asia/d/gObTDws

試験結果

合格です!!v(>▽<)v♪

試験を振り返って

実は最初の方はテキストのみで勉強を進めており、
理解ができずなかなか学習を進めることができなかったので、本腰を入れての勉強期間1カ月半ほどでした。
また、会社法や商法など普段は触れる機会のないジャンルの勉強でしたので、
初めて聞く単語も多く、同じ動画を何回も観たりして、理解するのに時間がかかりました…。

そのため、試験前の勉強時間に模擬問題に着手することができず、
本番では時間切れにならないか冷や冷やしながら受験することになりました。

問題集を解く際は選択肢を見ないようにしていたことは非常に効果的でした。

まとめ

無事、合格ができ、3級に落ちてしまったときの悔しさを晴らせて本当によかったです。

仕事のあとの長時間の勉強はけっこう大変でしたので、
次回のビジ法受験を考えている方は今からでも少しずつ、余裕を持って勉強に着手した方がいいと思います!(どんな試験にも言えることですが)

1級はかなりの難関のようなのでビジ法チャレンジはこれにて終了にしますが、
今後、別の試験にもチャレンジしていきたいと思います!

メールアドレスの正規表現

こんにちは、窪田です。

正規表現でメールアドレスをチェックしたいという状況は、エンジニアとして働いている以上、頻繁に起きるのではないでしょうか。

今回はメールアドレスの形式に当てはまる正規表現について解説したいと思います。


正規表現とは

正規表現とは、「文字列を一つの形式で表現するための方法」です。

正規表現を使用することで、いくつかの文字列を一つの文字列で表すことができます。

例えば、メールアドレスはそれぞれが異なる文字列ですが、メールアドレスの形式は決まっているので正規表現を使用することで、文字列がメールアドレスであるか、そうでないかを判断できます。


メールアドレスの正規表現

^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$

これがメールアドレスの形式に当てはまる正規表現です。

この正規表現について、少し解説してみます。


正規表現の解説

メールアドレスは@以前のローカル部分@以降のドメイン部分に分けられるので、正規表現も同じようにローカル部分とドメイン部分に分けてみます。

ローカル部分

^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@

ドメイン部分

([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$


ローカル部分の正規表現の解説

^

文字列の先頭を意味します。


[a-zA-Z0-9_\-]+

英数字、アンダーバー(_)、ハイフン(-)のうち、1回以上繰り返されることを意味します。

ピリオド(.)はメールアドレスの先頭に設定できないため、ピリオドは含めません。

メールアドレスに使用できる記号を増やした場合は、[]の中に追記してください。

この際、ハイフン(-)のように正規表現で特殊な意味を持つ記号は「\記号」としてエスケープする必要があります。


(\.[a-zA-Z0-9_\-]+)*

これは、ピリオド(.)と、英数字、アンダーバー(_)、ハイフン(-)のうち1回以上繰り返されるグループが、0回以上繰り返されることを意味します。

ピリオドは連続して使用することができず、ローカル部分の末尾にも使用できないため、このような複雑な正規表現になっています。

この正規表現により、a.@~やa..@~のようなメールアドレスは認めず、a@~やa.b@~を許可しています。

^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@でチェックした場合

a.@~やa..@~のようなメールアドレスは形式が正しくない判定になっている。


^[a-zA-Z0-9_\-]+([a-zA-Z0-9_\-\.]+)*@でチェックした場合

a.@~やa..@~のようなメールアドレスも形式が正しい判定になってしまう。


@

これは@が1つ一致するという意味です。


ドメイン部分の正規表現の解説

([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]\.)+

英数字と、英数字、ハイフン(-)のうち0回以上繰り返しと、英数字と、ピリオド(.)のグループが、1回以上繰り返されることを意味します。

ハイフンはラベル(ドメインの.で区切られた文字列)の先頭と末尾には使用できないため、このような正規表現になっています。


[a-zA-Z]{2,}

英字が2回以上繰り返されることを意味します。


$

文字列の末尾を意味します。


まとめ

今回はメールアドレスの正規表現について解説してみました。

正規表現を日本語で説明するのは非常に難しかったので、記事を読んでくださった方に理解していただけたか不安ですが、何かの参考になっていれば幸いです。

正規表現でメールアドレスの形式をチェックする際には、今回紹介した正規表現を使ってみてください。

Cloud FunctionsでAPIを作る!

あなたが今日も積み上げる理由になりたい。岡村です。

今回は以下2つを紹介できればと思います。

経緯

前回、水族館を作った話をさせていただきました。
水族館の機能の一部として、Discordからメッセージを取得する処理が必要でした。

これまで通りGoogle Apps Scriptで全て実装できればよかったのですが、
Google Apps ScriptからではDiscordのAPIへのアクセスが
遮断されてしまうという壁に当たり、数日寝込みました。(エラーの詳細)

思いついた対策としては、DiscordのAPIにリクエストするAPIを作成すること。(まぎらわしい)
Google CloudのCloud Functionsで実装しました。

Cloud Functionsではサーバーレス環境でお手軽にコードをデプロイし、実行することができます。Cloud Functionsがリクエストを中継してくれることで無事、
遮断されずにメッセージを取得することができました。

前置きはここまで。それでは実際にやってみましょう!

この解説でやってみること

チャンネル内には以下のようなメッセージがあるという前提です。
「テストテストテスト」以降のメッセージを取得してみます。

Cloud Functionsの設定

関数作成

「ファンクションを作成」をクリックします。

関数の構成を設定

「関数名」はお好みで。

例として今回はDiscordのメッセージを取得したいので「getDiscordMessages」。
HTTPリクエストをトリガーに関数を実行したいので「トリガーのタイプ」は「HTTPS」を選択。
「認証」は「未認証の呼び出しを許可」を選択。

コーディング

以下にソースコードを置いたのでコピペしてみてください。

内容としましては、
ポストされた情報を元に、メッセージ最大取得件数である100件を上限に
Discordへメッセージ取得をリクエストしています。
レスポンスはそのままクライアントへ返しています。

index.js

const fetch = require('node-fetch');
const functions = require('@google-cloud/functions-framework');

const END_POINT_GET_CHANNEL_MESSAGES = 'https://discord.com/api/channels/';

/**
 * discordAPIにアクセスできないGASの代わりにdiscordからデータを取得します。
 * 
 * 取得できた場合は、jsonオブジェクトを返します。ステータスは200です。
 * 既に最新メッセージを取得しており、取得するデータがなかった場合は、空のjsonオブジェクトを返します。ステータスは300です。
 * エラーが発生した場合は、空のjsonオブジェクトを返します。ステータスは400です。
 *
 * @param {Object} request クライアントからのリクエストに関する機能を提供するオブジェクト。
 * @param {Object} response クラアントへのレスポンスに関する機能を提供する提供するオブジェクト。
 */
functions.http('getDiscordMessages', async (request, response) => {

  let returnJson = new Object();

  try {

    const channelId = request.body['channelId'];
    const lastMessageId = request.body['lastMessageId'];
    const botToken = request.body['botToken'];

    const urlGetChannelMessages = END_POINT_GET_CHANNEL_MESSAGES + channelId + '/messages?after=' + lastMessageId + '&limit=100';

    const headers = {
      "User-Agent": "DiscordBot " + (urlGetChannelMessages, 10),
      "Authorization": "Bot " + botToken
    }

    const options = { 
      "method": "GET",
      "headers": headers
    }

    let responseFromDiscord = new Object(); 

    try {
      responseFromDiscord = await fetch(urlGetChannelMessages, options); 
      returnJson = await responseFromDiscord.json();
      response.status(200);

    } catch(error) {
      throw new Error('discordへのリクエスト中にエラーが発生しました。');
    }

  } catch(error) {
      console.error('エラーが発生しました。error:');
      console.error(error.stack);
      response.status(400);
  }

  response.send(returnJson);
  return;
});

package.json

{
  "dependencies": {
    "@google-cloud/functions-framework": "^3.1.3", 
    "node-fetch": "^2.6.0"
  }
}

デプロイ

「デプロイ」をクリックし、完了まで待機します。
これでCloud Functions側の準備は完了です。

DiscordのBot作成

アプリケーション作成

「New Application」をクリックします。
アプリケーション名はお好みで。

レスポンスにメッセージ内容を含ませる設定

「Bot」タブをクリックします。
「MESSAGE CONTENT INTENT」をオンにします。
これを忘れるとレスポンスに含まれるメッセージが全て空になるので注意です。

Botにメッセージ読み取りを許可するためのURL作成

「SCOPES」は「bot」にチェックを入れます。
「BOT PERMISSIONS」は「Read Messages/View Channels」「Read Message History」に
チェックを入れます。

Botにメッセージ読み取りを許可する

「GENERATED URL」に生成されたURLにアクセスし、
メッセージを取得したいDiscordのサーバーを選択します。

「認証」をクリックします。
これによりBotがチャンネル内のメッセージを読み取る権限を得るので、準備は完了です。

動作確認

Thunder Clientを利用しCloud Functionsに作成した関数にリクエストしてみます。

Enter Url」にはCloud Functionsに作成した関数の詳細画面の
URL」に記載されているURLを入力します。

channelId」にはメッセージ取得したいDiscordチャンネルのIDを入力します。

lastMessageId」にはメッセージ取得範囲の開始位置としたいメッセージの
1つ前にあるメッセージのIDを入力します。

botToken」にはDiscord上に作成したBotのトークンを入力します。
Botタブの中で「Reset Token」をクリックすることで表示されます。
1度しか表示されないため、忘れてしまった場合はリセットが必要です。

「Send」をクリックするとレスポンスが返ります。
「content」にメッセージが入っていますね。

あとがき

いかがでしたでしょうか。

取得できましたら、あとはレスポンスをお好きなように扱っていただければ!

岡村の場合は、友達が毎日【今日の積み上げ】を送ってくるので、それを数えるなどしております。
スプレッドシートに最終取得メッセージを記録し、
新着メッセージのみを取得しに行くようなイメージです。

前回からおなじみとなってきた積み上げDiscordですが、
そろそろ発足してから9ヵ月くらいになるようです。
今日の積み上げポイント略して「きょうつみポイント」は
メンバー合計が350kpを超えました。

毎日の小さな努力も可視化されて積み重なれば、山のようですね。

山。山と聞いて思い出すのは、ヤマノススメ3期12話を見ながら泣いた日のこと。

また何か作ったら共有します!

「健康経営優良法人2024(中小規模法人部門)」に認定されました

グリニッジ株式会社は2023年より、経済産業省の「健康経営優良法人(中小規模法人部門)」に認定されています。
そして今年度も健康経営の取り組みが認められ、無事に認定となりました。

健康経営とは

経済産業省では、健康経営に係る各種顕彰制度として、平成26年度から「健康経営銘柄」の選定を行っており、平成28年度には「健康経営優良法人認定制度」を創設しています。

健康経営優良法人認定制度とは

健康経営優良法人認定制度とは、地域の健康課題に即した取り組みや日本健康会議が進める健康増進の取り組みをもとに、特に優良な健康経営を実践している大企業や中小企業等の法人を顕彰する制度です。

健康経営に取り組む優良な法人を「見える化」することで、従業員や求職者、関係企業や金融機関などから「従業員の健康管理を経営的な視点で考え、戦略的に取り組んでいる法人」として社会的に評価を受けることができる環境を整備することを目標としています。

本制度では、大規模の企業等を対象とした「大規模法人部門」と、中小規模の企業等を対象とした「中小規模法人部門」の2つの部門により、それぞれ「健康経営優良法人」を認定しています。
この2つの部門のうち、グリニッジ株式会社は「中小規模法人部門」での認定となります。

グリニッジでの取り組み

グリニッジ株式会社での取り組みをご紹介いたします。

  • 健康診断受診率100%
    年に1回、全社員に対して健康診断を実施しています。
  • ストレスチェックの実施
    年に1回、自身のセフルケアに役立てるためにストレスチェックを実施しています。
    また、社内と社外にメンタルヘルス相談窓口を設置し、高ストレス者には医師による面談を案内しています。
  • ラジオ体操の導入
    社員の健康促進のため、朝礼でラジオ体操を実施しています。
  • 有給休暇の消化と残業時間の管理
  • 生活習慣改善のための情報提供
    毎月、関東ITソフトウェア健康保険組合より配信される健康に関するコラムを全社員に周知しています。

引き続き、職場の健康づくりに取り組んでまいります。

改めてreCAPTCHAについて調べてみた

メールフォームを作成する機会があり、スパム対策にreCAPTCHAが効果的だということで、
導入しましたが、詳しいことはあまり理解せず導入しました。

そこで、改めてreCAPTCHAとは、どのようなのもなのか詳しく調べてみました。

reCAPTCHAとは?

reCAPTCHAとは、botによるウェブサイトへのスパム攻撃を防ぐためのGoogleが無料で提供しているサービスです。

お問い合わせなどのフォームの送信画面やログイン画面で、
「私はロボットではありません」というチェックボックスを見かけたことがあるのではないでしょうか。

これは、reCAPTCHAの機能の一部です。

reCAPTCHAの種類と違い

reCAPTCHAの種類

reCAPTCHAは、以下の種類があります。

  • reCAPTCHA v1(2018年3月にサービス終了のため、利用不可)
  • reCAPTCHA v2
  • reCAPTCHA v3

reCAPTCHA v2の特徴

「私はロボットではありません」というチェックボックスへのチェックが要求されます。

そして、チェックした後、2パターンの挙動があります。

1つ目は、そのまま人間であると判断され、フォーム送信などが行えるパターン。
2つ目は、人間として認識されず、再度人間であるかの確認のため、下記のような画像認証が行われるパターン。

reCAPTCHA v3の特徴

reCAPTCHA v2のようなチェックボックスや画像による診断がなく、ユーザーの操作が一切不要です。
botと人間のウェブサイトでの行動パターンを機械的に学習し、自動でbotか人間かを判断します。

そのため、利用者が多いほど判断の精度が高くなっていきます。

reCAPTCHA v2の導入メリット・デメリット

メリット

「チェックボックスへのチェック」や「画像認証」による高い安全性です。
ユーザーにアクションを行ってもらうことにより、高い精度でbotか人間かを判定できます。

デメリット

「チェックボックスへのチェック」や「画像認証」によりユーザビリティーの低下です。
認証作業の煩わしさや問題の分かりづらさから認証失敗が多発し、サイトを離脱されてしまうことがあります。

reCAPTCHA v3の導入メリット・デメリット

メリット

v2のような「チェックボックスへのチェック」や「画像認証」がないので、ユーザビリティーが損なわれないので、サイトの離脱が少ない。

デメリット

reCAPTCHA v3の誤判定により、人間の排除され、botが通ってしまう可能性があります。

まとめ

私の経験上、v3の誤判定は、あまりない印象です。
そのため、v2とv3のどちらを導入したらいいか悩んだときは、基本的にv3の導入で大丈夫だと思います。

しかし、WordPressなどプラグインを使用して導入する場合、
v3では相性が悪い場合があり、誤判定されることがあるようなので、その時はv2の導入を考えた方が良いかもしれません。

reCAPTCHAの効果も大きいので、積極的に導入を考えてみてはいかかでしょうか?

サウナで始めるストレスゼロ生活

みなさま、はじめまして!グリニッジ内で自称1番のサウナ好きメンズの小坂と申します。
(週1回行く程度ですが笑)

健康維持やストレス解消のため、1人でも多くの働く方にサウナへ通っていただきたいと思い、
このテーマを書くことに決めました。

今回ご紹介する内容をご覧いただければ、

  • サウナに行ったことあるけど、ととのうがよくわからなかった。
  • 水風呂が苦手!!
  • デスクワーク続きで体が凝っている。
  • 寒暖差の影響で体調を崩しやすい。
  • ここ数ヶ月運動不足が続いている。

といった方もサウナに行きたくなること間違いなしですので、ぜひ最後まで読んでいただければ幸いです。

サウナの「ととのう」とは?

知人や友人にサウナの話をすると、「ととのう」がわからないという声をよく耳にします。
私自身もやんわりとしか理解していないので、これを機に少し調べてみました!

「ととのう」の語源とその意味

いろんな記事を調べていると、どうやら日本人プロサウナーから「ととのう」という言葉が生まれたらしいです。サウナ自体はフィンランドから持ち込んだ文化になりますが、「ととのう」という言葉が日本発の言葉として広まっているのは、なんだか嬉しいですね。

また、実際に「ととのう」という言葉が何を意味しているかというと、1種のトランス状態のことを指していることがわかりました。

また、以下サイトでも述べられておりますが、脳内麻薬がでてリラックスしている状態に近いですね。

サウナと水風呂の温冷刺激によって脳内で分泌されるのが、「β-エンドルフィン」「オキシトシン」「セロトニン」の3つの物質。「β-エンドルフィン」は、モルヒネと同じような作用をする物質で、鎮痛効果や気分の高揚・幸福感が得られる“脳内麻薬”です。「オキシトシン」はストレス緩和、「セロトニン」はうつ症状の改善・精神安定の効果があるそうです。

https://dododododo.jp/328/

サウナの効果と人気な理由

私を含め、多くのビジネスマンに愛されるサウナですが、リラックスできること以外にどういった効果が得られるのか、その人気な理由をまとめてみました。

  • 汗をたくさんかくことによる、デトックス効果快眠効果
  • 脳内麻薬の分泌による、うつ症状の改善精神安定
  • 血行も良くなるので、肩こりや足のむくみ改善

他にもあると思いますが、ざっくり3点ほど挙げさせていただきました。

特にサウナ後は頭がスッキリするとも言われており、PCなどのデスクワーク以外にもスマホなど電気機器が普及したことによる脳疲労の解消にも作用します。
そのため、最近だとビジネスマンをターゲットに、サウナ後の休憩室にワークスペースも用意している、サウナ施設が増えてきております。(サウナ室でミーティングする企業もいるだとか)

特に女性についてはサウナに入ることで、デスクワークでありがちな、肩こりや足のむくみもとれるので、岩盤浴だけでなくサウナも体験してほしいですね!!

ただ、サウナの入りすぎなどは逆に体調が悪くなってしまうので、このあと安全にサウナを楽しみ、「ととのう」方法をお伝えしたいと思います!

「ととのう」ために必要なこと

ここでお伝えするのは、私が普段サウナに入る際のスタイルですので、自己流がある方はご自身のお好みのスタイルで、サウナを楽しんでいただければと思います!

といっても私自身、サウナに入るために特別な何かを行っているわけではなく、

  1. サウナに入る
  2. 十分な汗をかく(1set 6~10min)
  3. 水風呂にはいる(30s~1min)
  4. 外気または室内気でゆっくり休む
  5. 適度に繰り返す(2~3set)

と、たったのこれだけです。

1つ1つのステップにこだわりがあるかというとそんなことはなく、ただ汗をかいて、水風呂に入り、ゆっくり休むことです。

もちろんサウナ前に軽く水分補給したり、水風呂も肩まで浸かるなど、要所にポイントありますが、ご自身の体調に併せて入っていただくことが1番です。
特に水風呂が苦手な方は、シャワーでもいいと思います!自身で温度調整できますし、大切なのは熱くなった体をしっかり冷やすことと、汗を流すことです!!

サウナおすすめアイテム

続いて、みなさんが快適にサウナをより楽しんでいただくためのおすすめアイテムをご紹介いたします!

サウナハット

サウナハットを被ることで、頭部が高温になりのぼせることを防いだり、髪や頭髪のダメージを予防する効果もあります。女性には特におすすめです!私も普段サウナに行くときは忘れず持っていきます。

サウナマット

サウナ室前に常備している場所も多いですが、他人の汗や衛生面を気にされる方はご自身のマットを持参することをおすすめいたします。

スマートウォッチ

サウナ室によっては時計が見えづらかったりするので、正確に入室時間を計測したい方におすすめ。時間がわかることで、のぼせる前に退出もできます。実際に都内のサウナでも付けている方を見かけることが多くなりました。

関東圏在住におすすめのサウナスポット3選

アイテムの次は本命のおすすめサウナスポットをご紹介いたします!
ご家族でも行きやすいところをご紹介しますので、休日などにぜひ利用いただけると嬉しいです!

おふろの王様 大井町店

有名なスーパー銭湯と思いますが、通常のサウナ室内が、6段の収容人数は約20名、室内温度は90度になります。テレビもついているので、退屈することなく汗をかける設計となっております。

水風呂も15度で設定されているので、入りやすい温度設定となっております。水風呂が苦手な方はこれくらいの温度から慣らすと良いかもしれません!

さらに漢方塩蒸風呂(塩サウナ)もついているので、2種類のサウナ楽しめる施設となっておりますので、ぜひご家族・ご友人といっていただきたいスポットです。(塩サウナはお肌ツルツルになります)

住所〒140-0014 東京都品川区大井1-50-5(阪急大井町ガーデン内)
アクセスJR京浜東北線「大井町」駅 徒歩3分
東急大井町線・東京臨海高速鉄道りんかい線「大井町」駅 徒歩2分
営業時間年中無休※設備点検等のため休業又は営業時間変更をする場合があります。
9:30~翌朝8:30(最終受付7:30)
※1:00~6:30までは入館できません。
※2:00~6:30までは清掃の為入浴できません。
料金【平日】
大人(中学生以上) 1,500円
小学生以下 870円
【土・日祝日】
大人(中学生以上) 1,950円
小学生以下 870円
https://www.ousama2603.com/shop/ooimachi/

スパジアムジャポン

関東最大級とも言われる温泉施設で、サウナだけでなく、約3万冊のコミック・雑誌が自由に読める岩盤浴エリアもおすすめです。一日ゆったり過ごしたい方、サウナがはじめてといった方、子供連れのご家族にピッタリの場所となっております。
(あくまでもゴールはサウナですが、この施設にくると半日は漫画を一気読みしてます笑)

フードコートもステーキ&ハンバーグ、ラーメン、エスニック、肉丼などラインナップも非常に充実しており、温泉施設界のワンダーランドと言っても過言でありません。

住所〒203-0001 東京都東久留米市上の原2丁目7−7
アクセス※無料シャトルバスあり
・西武新宿線「田無」駅、
・西武池袋線「東久留米」駅
・東武東上線「志木」駅
・東武東上線「朝霞台」・JR武蔵野線「北朝霞」駅
の4箇所

《車の場合》 
関越自動車道所沢ICより約20分(無料駐車場400台)
営業時間年中無休 ※施設メンテナンスのために休館となる場合は、館内やHPにて告知あり。
月~木曜日 9:00~1:00(最終受付 0:20)
金曜・祝前日 9:00~2:00(最終受付 1:20)
土曜日 8:00~2:00(最終受付 1:20)
日曜・祝日 8:00~1:00(最終受付 0:20)
料金【平日】
大人(中学生以上) 850円
【土・日祝日】
大人(中学生以上) 950円

※小学生以下は全日 350円
https://www.spajapo.com/info/

サウナ東京

最後にご紹介するのは、全国12,000施設以上のサウナ施設からサウナシュラン2023 第2位にも選ばれた赤坂にある「サウナ東京」です!

この施設の特徴は、5種類のサウナと、温度の違う3種の水風呂です。サウナも水風呂も自身に合わせて調整できるところが、サウナ初心者の方へのおすすめポイントです。

その他にも、1時間に1回のペースでアウフグースといって、スタッフの方がサウナ室で熱風をあおいでくれるのですが、これがサウナファンにたまりません!
普段ならじわじわ汗をかくわけですが、アウフグースにより、室温・体感温度が上がることで、一気に汗をかき、さらなる「ととのい」に誘われるのです...。

お値段は都内価格とやや高めの設定ですが、かなりハイクオリティのサウナ施設ですので、ぜひ1度は行ってみていただきたいです。

住所〒107-0052 東京都港区赤坂3−13−4
アクセス赤坂駅 1番出口 徒歩1分
赤坂見附駅 徒歩5分
溜池山王駅 徒歩7分
営業時間年中無休
平日 11:00~翌9:00(22時間営業)
土日祝 9:30~翌9:00(23時間30分営業)
料金【時間制】
1時間 1,600円
3時間 2,700円
6時間 3,900円
※土日祝日料金※
1時間 1,800円
3時間 3,000円
6時間 4,200円
https://sauna-tokyo.jp/access

まとめ

おすすめスポット含め、サウナが人気な理由やサウナの効果について、ご紹介させていただきましたが、サウナに行きたくなりましたでしょうか?

正直、息抜きするのにサウナである必要はないですが、こういった時代だからこそ、体調管理など心身の健康は自分でケアしていかないといけません。

その方法の1つとしてサウナを選んでいただけたら嬉しいです。

愛宕神社に行って出世する

最近の趣味は神社巡りです。
特に近場の神社巡りが楽しいです。
神社巡りの醍醐味は、神社の歴史自体の面白さと、神社の周りでも楽しめることが多いことです。

今回は会社がある新橋からも近いお勧めの神社、愛宕神社を紹介します。

出世階段(男坂)

この神社すごいです。これまでみたこともない階段が存在します。
神社に上るメインの階段、出世階段(男坂)と言われています。
登りは結構きついです、そして結構怖いです。
ちょっと離れたところにエレベーターがあるので不安な方は迷わずそちらを選びましょう
男坂の右手には多少緩やかな女坂が設けられていますが、今は工事中で利用できませんでした。
名前的に今の時代問題ありそうですが、好きなだけ好きな方で上り下りしてもらえば問題ありません。

写真だとなかなか伝わりませんが、ほんとにびっくりするような角度です。
しっかり登れば出世間違いなしです!

江戸城無血開城会談の地

この神社は明治維新好きは必ず訪れていただきたいのですが、
西郷隆盛勝海舟が会談した場所、江戸城無血開城会談の地なのです。

今回とらのもん方面の裏側から愛宕神社に階段を利用せず入ったため、男坂から一度降りてから再度登りました。
ほんとに怖いくらいの急な階段です、これほど急な階段の神社には出会ったことがありません。これだけで行く価値ありです。
ただ本当に危険と隣り合わせなので晴れた日にしっかり手すりを持って登ることをお勧めします。

甘味処

神社に行った時の楽しみの一つですが、残念ながら近辺に甘味処は見当たりませんでした。
帰宅の足で、とらのもんヒルズでお茶とかいいかもしれません。

NHK放送博物館

この神社に来た際に是ぜひ立ち寄っていただきたいのが、NHK放送博物館
神社のすぐ隣にあります。
左手にはエレベーター通路も見えます。


神社巡りにきたら実はメインがこちらになったということもあり得ます。というかそうなりました。
なんと入場料無料

おなじみのキャラクターがお出迎え

朝ドラ好き、大河好きはもちろんですが、NHKのテレビを子供のころに見たことがあれば嵌ること間違いありません。NHK人形劇やみんなのうたの歴史も振り返っていろいろ楽しめます。

1Fから4Fまで各階にいろいろなエリアがあるのですが、今回4F特設会場では正直不動産の展示を行っていました。
ドラマ正直不動産、かなり好きなのでテンションがあがります。
テレビの中で山Pが着てたスーツが普通のスーツ過ぎてびっくり、芸能人が着るだけで普通の服も良く見えるのか、月下さんこんな地味な服装だったのね、材質もいたって普通でリクルートスーツかこれはくらいの勢い。


他には4Fのアーカイブ室では抜粋ですが昔の放送もいろいろ見ることができます。欠かさず見ていた懐かしの中学生日記も抜粋ですが少しありました。でももっとたくさんアーカイブに乗っけて欲しい。

全てがエモーショナルな空間でした。

自然が人間に与える影響

グリニッジに入社して4カ月がたち
仕事もだいぶ慣れました。
入社後の約1ヵ月間は、研修などもあり
毎日出勤をしていましたが
現在は週4~5日、リモートワークになりました。

リモートワークに加えて、まだ気温が低く
家から出る機会が減ってしまったことから
外出のきっかけになればいいなと思い、この本を読みました!

どういった状況で幸福感や創造性が上がるのか
科学的データや筆者の体験談などが記載されています。

なんとなく自然のある場所に行くと
リフレッシュした気持ちになるのは実感がありましたが
ストレスを受けた時に分泌の増える
コルチゾール(別名:ストレスホルモン)への影響の他
自然免疫を高めるのに重要な
NK(ナチュラル・キラー)細胞等に効果があるそうです。

いろいろな実験データが紹介されていましたが
取り入れ易く印象に残った事例を紹介します。

・森の中を15分ゆっくり歩く
 コルチゾール値、交感神経、血圧、心拍数が減少。
 
・自然の風景のスライドを10分みる
 アルファ派が高まる。

・3日間2~4時間ほど森の中をハイキング
 NK細胞40%増大。

・部屋を睡眠時ヒノキの香りにする
 NK細胞20%増大。

・ラベンダーやローズマリーの香りを嗅ぐ
 コルチゾール値が減少。

データで出ると、なんとなくから確信に変わり
ヒノキのエッセンシャルオイルを試したくなりました。
手軽に取り入れられるは、いいですね!

早速、いつも購入しているシャンプーの店舗で
ローズマリー/ラベンダーの香りをみつけたので
いつもの香りから変更してみました。

予定のないお休みは、家族や友人を誘って
積極的に自然と関り、心身ともに健康な状態で
仕事に取り組めるようにします。

prisma 多対多をjoinして検索

過去に少しハマったので、備忘録として残しておきます。

prisma is 何 ?

TypeScriptのORMです。

公式はこちら
https://www.prisma.io/

構成

例えばeラーニングの様なサイトを作っているとします。

システムには受講者と講座が必要なので、それぞれ受講者テーブル(User)と 講座テーブル(Course)を用意します。

Userテーブル

idnickname
1太郎
2花子

Courseテーブル

idname
1国語
2算数
3理科
4社会

UserOnCoursesテーブル

iduserIdcourseId
111
212
313
421
522
624

中間テーブルのUserOnCoursesを用意します。


受講者側から見ると
太郎くん→「国語」と「算数」と「理科」を受講します。
花子さん→「国語」と「算数」と「社会」を受講します。

講座側から見ると
国語→「太郎」くんと「花子」さんに受講されます。
算数→「太郎」くんと「花子」さんに受講されます。
理科→「太郎」くんに受講されます。
社会→「花子」さんに受講されます。

受講者は複数の講座(対多)を受講し、講座も複数のユーザー(対多)に受講されます。

よって「User」と「Course」が多対多の関係になっており、それを中間テーブル「UserOnCourses」によって関連づけられています。

schema.prismaは下記のようになっています。

// schema.prisma

model User {
  id Int @id @default(autoincrement())
  nickname String
  ・
  ・
  ・
  courses UserOnCourses[]
}

model Course {
  id Int @id @default(autoincrement())
  name String
  ・
  ・
  ・
  users UserOnCourses[]
}

model UserOnCourses {
  user User @relation(fields: [userId], references: [id])
  userId Int
  course Course @relation(fields: [courseId], references: [id])
  courseId Int
  @@id([userId, courseId])
}

やりたいこと

国語の受講者を全員取得したい

// TypeScript  

const users = await this.prisma.user.findMany({
    select: {
      id: true,
      /**
       * ・
       * ・
       * ・
       */
    },
    where: {
      courses: {
        some: {
          courseId: {
            equals: 1 // Courseテーブルの国語のid,
          },
        },
      },
    },
  })

これで、国語を受講している太郎くんと花子さんの二人が取得されます。

因みに実際に発行されるSQLはこんな感じ

SELECT
  u."id"
FROM 
  "User" AS u
WHERE (
  (u.id) IN (
    SELECT 
      u1."id" 
    FROM 
      "User" AS u1 
    INNER JOIN "UserOnCourses" AS uoc 
      ON (uoc."userId") = (u1."id") 
    WHERE (
      uoc."courseId" = 1 AND 
      u1."id" IS NOT NULL
    )
  ))
;

以上