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
    )
  ))
;

以上

カラーユニバーサルデザインを意識した適切な色の選択と情報を伝える工夫

はじめに

色は、さまざまな情報を伝える上でとても重要な役割を果たします。しかし、色ばかりに頼った情報設計をしてしまうと、一般的な色の見え方と異なったように見える色弱の方々にとっては、かえって情報が伝わりづらくなってしまう可能性があります。

アプリケーションの開発においても、情報が複雑化してくると色を使い分けてグループ化したり整理することも多くなるかと思います。
こういった情報設計における配色を行うとき、より多くの人に快適に使ってもらうために大切な考え方として、カラーユニバーサルデザイン(CUD)という考え方があります。

人間の色覚の多様性に対応し、より多くの人に利用しやすい配色を行った製品や施設・建築物、サービス、情報を提供するという考え方を「カラーユニバーサルデザイン(略称CUD)」と呼びます。

引用元: NPO法人 カラーユニバーサルデザイン機構

今回は、さまざまな色の見え方と、具体的にどのような設計で改善を図ることができるのかについて考え、Google Chromeでのタイプ別の色の見え方を確認できる機能についてもご紹介したいと思います。

色の見え方について

色の見え方には、一般的な色覚のC型と異なるものとして大きく3つのタイプがあります。日本では、男性の約5%、女性の約0.2%がC型とは別のタイプで、後天的な色覚の変化も合わせると対象者は約500万人程度といわれています。それぞれのタイプや強度によって、色の見え方に違いがあります。

1. P型 / Protanope-type (1型)
赤色を感じることが難しい。

 

2. D型 / Deuteranope-type(2型)
緑色を感じることが難しい。
(最も多いタイプ)

 

3. T型 / Tritanope-type (3型)
青色を感じることが難しい。

カラーユニバーサルデザインの3つのポイント


カラーユニバーサルデザイン機構では、「カラーユニバーサルデザインの3つのポイント」として、下記のように挙げています。

「カラーユニバーサルデザインの3つのポイント」

a. できるだけ多くの人に見分けやすい配色を選ぶ。

b. 色を見分けにくい人(場合)でも情報が伝わるようにする。

c. 色の名前を用いたコミュニケーションを可能にする。

引用元: NPO法人 カラーユニバーサルデザイン機構

a. できるだけ多くの人に見分けやすい配色を選ぶ

色には「色相(色味の違い)」「彩度(色の鮮やかさ)」「明度(色の明るさ)」の3要素があります。

下記は、暖色系と寒色系の色を組み合わせると色が見分けやすくなる例です。

同色系であっても、コントラストを高くすることで色覚問わず多くのユーザーにとって情報を見やすくすることができます。
彩度の「高い」「低い」の組み合わせ、明度の「明るい」「暗い」の組み合わせも、色の区別をつけやすくするためには適しています。

  

b. 色を見分けにくい人(場合)でも情報が伝わるようにする

色だけでなく形を変えたりアイコン等の要素を併用することで、色に依存しないデザインで情報を伝えることができます。

また、文字や線を太くするだけでも面積が大きくなり、色を感じやすくすることができます。

  

c. 色の名前を用いたコミュニケーションを可能にする

色の名前を用いてやりとりがされる可能性があるものには、色の名前を記載することで、コミュニケーションが図りやすくなります。

  

特にaとbについては、アプリケーションの情報設計を考えるときには配慮しておきたいポイントになるかと思います。
W3Cのウェブコンテンツアクセシビリティガイドライン(WCAG)でも、十分なコントラストを確保することや、色を唯一の視覚的手段としないことなどが含まれています。

Google ChromeのDevツールで色の見え方をエミュレート

Google Chromeのデベロッパーツールには、色覚特性の見え方で実際の画面をエミュレートできる機能があります。
こちらは誰でもかんたんに確認できるので、知っておくと便利かと思います。

● 使い方
1. Google Chromeを開き、デベロッパーツール(F12キー)を起動します。
2. 右上にある3点リーダーアイコンをクリックします。
3. 「その他のツール」をクリックし、「レンダリング」をクリックします。

ツール下部のブロックに、「レンダリング」というメニューが追加されます。
クリックしてスクロールすると、「色覚異常をエミュレート」という項目があります。

・「エミュレーションなし」

・「1型 2色覚」を指定

前述した1型,2型,3型の3タイプはもちろん、他にもコントラストの確認や無彩色の状態もこのツールで確認できるようになっています。

このツールを使用して、実際にどのようにウェブサイトやアプリケーションが見えることがあるのかを確認できるため、適切な配色を行いたいときに参考にすることができます。

おわりに

色覚の違いによって起こる問題には、目的に応じた色の選択と、その組み合わせを理解し情報を適切に伝える工夫が大事であることを、作り手として改めて感じました。
当たり前のことであっても、実際に意識してできているか、自分にとっては細かいところや少しの差でも、実際は大きく違って見えることもある、ということを忘れず、すべての人にとって情報が正しく機能するものづくりを目指したいと思います。

そして結果的には、色覚問わずすべての人にとってより使いやすいサービスになることへつながっていくと思いますので、、情報の受け手に配慮する姿勢は常に持ち続けたいです。

アクセシビリティを意識したサービス提供ができるよう、自分に何ができるかを考え、基本的な知識を身につけることはもちろん、各ガイドラインを参考に適応できるところはどんどん進めて、今後もサービスの改善に努めてまいります。

  

  

楽天新春カンファレンス2024

1月25日に、楽天新春カンファレンス2024が品川で開催されました。
昨年に引き続き今年も多数の楽天店舗様が来場されました。

SDGs施策

店舗様への配布物は今回よりSDGsの観点から会場内でのチラシ配布(紙媒体)をNGとなりデジタルデータでの案内となりました。SDGsの流れはさすが、大手楽天さんは取り入れていました。
さらに、名刺交換ではなく、ブースへ訪れた店舗さまの入場券に印字のQRコードを読み取ることで来場者様として確認、フォローしていく形でした。

今年も社員が入れ替わり協力してブースでご案内させていただきました。
多くの店舗様、担当者様とお話させていただきました。

楽天SHOP OF THE YEAR 2023

楽天SOY2023記事にも書いてありますが、らくらくーぽん導入44店舗様が楽天SOY2023に選ばれました。らくらくーぽんは楽天SOYに選ばれる店舗様を始めとし、多くの店舗様にご利用いただいております。

楽天SOY2022はこちら

導入累計5,000店舗

導入累計5000店舗突破いたしました。
今後も、店舗運営の一助となれるようサービスの発展に努めてまいります。

SDGs「持続可能な開発目標」

SDGs 企業の取り組み

身近なところでも、SDGsへの取り組みやロゴなどを目にする機会が増えてきました。
楽天カンファレンス2024に参加して、ブログでも記載しましたが、入場券に印字のQRコード使用や、ちらしペーパーレス化、企業のSDGsの取り組みを感じるようになってきました。
身の回りでも意識していけるものがありますね。
経営統合しグループ会社となった日本ECサービス社さんも取り組んでいますね。
自分も出来ることから始めていきたいと思います。

オフィスで実践できるSDGs取り組み

■ペーパーレス化
■有給休暇の取得促進
■省エネ カーボン・オフセットに取り組む
■環境にやさしい製品を利用
■防災対策の強化
■働きやすいオフィスレイアウトの導入
■評価体制の見直し
などなど調べるとありますね。
グリニッジの取り組みとしても 有給休暇取得促進はまさしくこれは絶賛取り組み中です。笑。
当社では、時間単位の有給も柔軟に取得できることでより働きやすい環境になっています。


省エネカーボンにつながるものとしては、個人的にですが、、今回初めて、電気自動車にのりました!
そちらを今回少し紹介したいと思います!

電気自動車

電気自動車(でんきじどうしゃ)とは、電気をエネルギー源とし、電動機(電気モーター)で走行する自動車である。略称は一般的にEV(Electric Vehicle、イーブイ)が用いられる。化石燃料を燃焼させる内燃機関(内燃エンジン)を持たないことから[注 1]、走行時に二酸化炭素(CO2)や窒素酸化物が出ないゼロエミッション車の1種である[1]。近い将来排出ガス規制や他の追随を許さないエネルギー効率の高さ[2][3]全固体電池の実用化の目処が立ったことなどから次世代自動車として最も期待されている[4]

出典: フリー百科事典『ウィキペディア(Wikipedia)』

脱炭素社会へ

日本政府は、2050年までに脱炭素社会を目指すことを宣言しています。
脱炭素社会とは、地球温暖化の原因となる温室効果ガスの排出量のうち、人間の活動によるものを「実質ゼロ」にする社会のことです。また、同じ意味を持つ言葉として「カーボンニュートラル」としても表現されます。温室効果ガスの排出量を「実質ゼロ」としているのは、どうしても削減しきれなかったCO2の排出量を、森林管理や植林による吸収量を差し引き、排出量を実質的にゼロにするということを意味しています。従来の自動車(ガソリン車)は、国内のCO2排出量の16%を占めているとされています。そのため、電気自動車に切り替えることで、CO2排出量を大幅に削減することができるのです。
政府は「2035年までに新車販売は電気自動車100%を実現する」と発表しています。
つまり、2035年にはガソリン車はほとんど販売されなくなるということです。
・・・・ほんとですかね。。

課題

日本は2009年に電気自動車が導入され、そのスピードは他国に比べても早かったといわれてます。
しかし、思うように普及が進んでいません。現在日本の電気自動車の普及率は国内における自動車市場全体の0.8%程のようです。ちなみに、電気自動車の普及率が世界トップの国はノルウェーでは
2021年11月時点でノルウェーの自動車市場全体の73.8%を占めています。なぜ日本は電気自動車の普及が進まないのでしょうか。それは、普及を進めるにあたって解決しなければならない課題があるからです。

【課題】充電インフラ

充電スタンドの不足が電気自動車の普及が進んでいない最大の原因があります。
確かに電気自動車に乗った際も持ち主の友達はどこにスタンドがあるか、とても念入りにチェックしていました。・・暖房をつけ続けると、結構電力が消費されるので、冬場は注意みたいですね。
そして、充電スタンドは、大きめのガソリンスタンドに備わっていると思ってたのですが、意外にないんですね。。・・・ちなみに今回は上り中央道双葉 SAで入れたときの写真です↓📷


ちなみにちなみに行きの下りの大きい談合坂SAでは充電スタンドは見なかったです。くだりは、都内で入れてきてるからいらないだろという認識で無いのか、たまたま見つけられなかったのかはわからないです。補充もガソリンのようにチャチャっとではなく、20分~30分かかり、また、スタンドによる、電気出力数?によっても時間は違うみたいです。

【課題】再生可能エネルギーへの転換

再生可能エネルギーへの転換です。脱炭素社会を目指して、電気自動車の普及を促してはいますが、実は電気自動車を生産する段階で温室効果ガスが発生してしまうという問題が発生してしまう。

SDGs目標に貢献

まだまだ課題はありますが、電気自動車が普及し、再生可能エネルギーへの転換が実現するならば、
SDGs目標7の「エネルギーをクリーンにそしてみんなに」
SDGs目標13の「気候変動に具体的な対策を」
の達成へと大きく貢献する要素となります。太陽光や風力発電、水力発電などの再生可能エネルギーへの転換は、温室効果ガスの排出を実質ゼロにする脱炭素社会の実現も夢ではないようです。脱炭素社会は人類が抱える気候変動という大きな課題を解決への1歩です。電気自動車が普及すれば、ガソリン車から出る排気ガスが無くなり、空気もきれいになります。このように電気自動車の普及は未来を良くするうえでも欠かせない取り組みなんですね。今後の電気自動車にも注目していきたいと思います。

家庭内、職場、外出先など、あらゆる場面で簡単に始められる、SDGsの取り組みを意識し地球にやさしい行動を心掛けたいと思います!

P.S 友達の電気自動車でスノーボードに行ってきました。🏂