株式会社Jurabi

株式会社Jurabi Jurabiは世界の関係を表象していくために現実社会を素早くモデル化し、実装しています。その一環としてグラフデータベース(truncus graph)を創り続けており、世界一便利なものを目指しています。

なんでこんなことをやったのか 筆者が所属している会社には、AWSのいろいろなサービスを試行するためのプレイグラウンド的なアカウントがあり、筆者もそのアカウントに参加させてもらっています。 あるとき、CloudFormation Templa...
25/06/2023

なんでこんなことをやったのか 筆者が所属している会社には、AWSのいろいろなサービスを試行するためのプレイグラウンド的なアカウントがあり、筆者もそのアカウントに参加させてもらっています。 あるとき、CloudFormation Template で Webアプリサーバーを立ち上げ、それをHTTPS化して Cognito と連携させてみる、という作業をやっていました。まずは AWS Certificate Manager (ACM) を使って、HTTPS化に必要なSSL証明書を発行しようとしたのですが、その証明書が正しくドメインにひも付いていることを証明するために、DNS に証明書のIDを示す CNAME レコードを登録する必要があることが分かりました。 使用したドメイン自体は、これも試行作業用に作ったドメインなのですが、その管理は別アカウントの Route 53 で行われています。そこで、この試行作業用ドメインのDNS管理もプレイグラウンドアカウントで行えないかな、と考えたのがきっかけです。 権限移譲手順 手順としては下記となります。 対象ドメインを Route 53 のホストゾーンとして管理しているアカウントで、そのドメインの編集権限を別アカウントに移譲するようなポリシーを作成する 続いて、上記ポリシーを移譲先アカウントに適用するロールを作成する 移譲先のアカウントは、コンソールにログインした後、上記ロールに切り替える 以上です。 もう少し説明します 実際にやってみたら、いろいろと調べることが出てきましたが、手順を整理すると「以上」になります。以下、行間を埋めていきましょう。 移譲対象となるホストゾーンを元々管理しているアカウントを Account-A、移譲先のアカウントを Account-B で表すことにします。 1. 移譲ポリシーの作成 移譲用のロールにアタッチされるポリシーです。Account-A で作業します。 IAM コンソールの「ポリシー」の画面で「ポリシーの作成」をクリックします。 「ポリシーの作成」画面で「JSON」をクリックします。 ここに下記のJSONをコピペします。 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "route53:GetHostedZoneCount", "route53:ListHostedZonesByName" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "route53:*", "route53domains:*" ], "Resource": "arn:aws:route53:::hostedzone/" } ] }...

目次 1. なんでこんなことをやったのか […]

この記事は、2022/08/31 時点で調査・分析した結果です。この結果そのものより、脆弱性を評価したステップが役に立てれば幸いです。 こんにちは。にしやまです。 私が携わっているプロジェクトでdockerイメージの脆弱性スキャンの結果の分...
21/06/2023

この記事は、2022/08/31 時点で調査・分析した結果です。この結果そのものより、脆弱性を評価したステップが役に立てれば幸いです。 こんにちは。にしやまです。 私が携わっているプロジェクトでdockerイメージの脆弱性スキャンの結果の分析と対応を検討することになりました。こういう仕事は苦手ですが、一度しっかりやることで免疫がつきますので、みなさんも御付き合いください。 はじめに dockerイメージの脆弱性スキャンについては、 Amazon ECR の ベーシックスキャン を使用しています。ベーシックスキャンは Clair プロジェクトの共通脆弱性識別子 (CVE) データベース を利用しています。 今回スキャンしたdockerイメージの脆弱性のほとんどは、ベースイメージに使用した php-8.0-fpm-bullseye で見つかっているので、 php-8.0-fpm-bullseye のスキャン結果として分析を進めていきたいと思います。 DockerFileはこちらを参照してください。 Debianのセキュリティ問題に対する対応 Debianは全てのセキュリティ問題に対応するわけではなく、問題によってトリアージするようです。 こちらは、Wikipediaからの引用です。 CVE があっても、すぐにパッケージの更新が行われるわけではありません。 修正することが緊急ではないが、後で修正される可能性があるマイナーな問題である場合、「postponed」というタグを付けます。LTS にはポイントリリースがないので、これはより深刻な問題がある場合や、 小さな問題がたくさん積み重なっている場合を意味します。 修正しない正当で強い理由がある場合 (例: ソースが未コンパイル、未出荷である、重要でなくバックポートが難しい、重要でなく逆依存に影響する API 変更が必要)、「ignored」タグを付けます。 LTS リリースのバージョンが影響を受けない場合(通常、脆弱性のあるコードがそのバージョンに存在しないため)、"not-affected" のタグを付けます。関連コミットを参照するのは良い習慣であり、良いテストです(cf. data/CVE/list の "NOTE: Introduced" )、脆弱性コードはしばしば上流のリリース間で名前が変更されたり分割されています。 そのパッケージが LTS リリースでサポートされていない場合、「終了」タグを付けます (Stretch のサポートされていないパッケージの一覧は、現在 debian-security-support:security-support-ended.deb9 で見ることができます。このファイルを更新し、必要なら dla-needed.txt に debian-security-support を追加してください -- README.source を参照してください)。 重要度(severity)が「重要でない(unimportant)」に設定されている(これはめったに使われないはずで、通常セキュリティチームによって行われます)。...

こんにちは。にしやまです。 私が携わって […]

AWSのリソース(S3、SQS etc.)を使用した試験を行う際には、実際のAWSを使用するよりもLocalstackを使用した方が不要な課金も発生せず、また試験環境の準備も簡単に行う事が出来ます。この記事では、Localstackを使用し...
19/06/2023

AWSのリソース(S3、SQS etc.)を使用した試験を行う際には、実際のAWSを使用するよりもLocalstackを使用した方が不要な課金も発生せず、また試験環境の準備も簡単に行う事が出来ます。この記事では、Localstackを使用してS3を使用する単体試験を行う方法について説明します。この記事で使用したソースコードはレポジトリに置いてあります。 環境 Java JDK17 Gradle 7系 Gradleの依存関係 dependencies { implementation group: 'software.amazon.awssdk', name: 's3', version: '2.20.78' } Localstackの準備 Localstackの公式のやり方に従ってLocalstackを準備します。今回は、docker-composeを使用しました。 version: "3.8" services: localstack: image: localstack/localstack ports: - 4566:4566 # LocalStack Gateway environment: - DEBUG=1 - SERVICES=s3 - DOCKER_HOST=unix:///var/run/docker.sock AWSクライアントの準備 ローカル端末のAWS SDKからS3にアクセスするためには、accessKeyとsecretKeyが./aws/credentialsに指定されている必要があります。 Javaコードから指定する事も可能ですが、実際にしようする際にはインスタンスロールでアクセスすることになるため、Javaコードで直接指定する事はありません。 aws cliのインストール aws configureの実行 localstack用の設定はaccesskeyとsecretkeyは任意の文字列(dummy等)で問題ありません(設定が存在する必要はあります)。 S3へのアクセス形式の違い 現在のAWS SDKはS3にアクセスする際に標準ではvirtual-host styleを使用するようです。Localstackは標準ではpath style想定しているために、AWS SDK標準の設定でS3にアクセスするとエラーになります。 path styleとvirtual-host styleについては、...

AWSのリソース(S3、SQS etc. […]

自分が携わっているとある案件ではCircleCIで全てのpushに対してテストを実行、featureブランチへのpushはテストが通ったらそのfeatureの評価用の環境に自動デプロイという流れにしている。これはSPAの結構込み入ったUIの...
13/06/2023

自分が携わっているとある案件ではCircleCIで全てのpushに対してテストを実行、featureブランチへのpushはテストが通ったらそのfeatureの評価用の環境に自動デプロイという流れにしている。これはSPAの結構込み入ったUIのアプリケーションのために、開発メンバーだけでなくプロダクトオーナーからできるだけ早く動作についてフィードバックを受けるため。 しかし最近、この運用で少し問題が出てきた。それは 評価用環境にデプロイするにはテストが必須だが、テストが通る前のアプリケーションをプロダクトオーナーに見て貰いたい場合がある。 例えばUIのルック&フィールやインタラクションの使い勝手を部分的に確認して貰って方向性が正しいかコンセンサスを取るのに、その観点で不要なテストまで通すと手間がかかりすぎる事がある。 一方で、正式にレビューを出す場合はプルリクエストを作成するので、プルリクエストを作成した後からはテストまで全て通してほしい。 feature以外のブランチ(現状はgithub flowなのでメインしかないが)へは、常にtestも実行してよい。 というものだった。テストの作り方の問題も勿論あるが、フィードバックのサイクルを可能な限り早くしたいというこれまでの進め方とは少々そぐわない。 というわけでCircleCIで、プルリクエストが作成されていなかったらテストを実行しない方法について調べたが、どうもCircleCIのwhen statementではできないようだ。(参考: 仕方がないので、環境変数を見てrunの中で制御することにした。以下は抜粋。 test: steps: - attach_workspace: at: /tmp/build-workspace - run: name: Test command: | cd /tmp/build-workspace if [[ "$CIRCLE_BRANCH" =~ feature/.* ]]; then if [[ -n "$CIRCLE_PULL_REQUEST" ]]; then yarn test --run; fi; else yarn test --run さて問題は全てのpushとプルリクエストに対してパイプラインを実行する設定だが、CircleCIの設定を見る限り、「全てのpushに対して実行」「プルリクエスト及びデフォルトブランチに対して実行」の2つのみのようだ。これでは困るなと思ったが、以下の機能がリリースされていた。 この方法を使うと、Only build pull requestsで常にビルドを実行するデフォルトブランチのカスタマイズができるようだ。これによって、featureへのpushも常にビルドできるようになるようだ。コードはリンク先にサンプルがあるので、それを元にすれば問題なく動作した。

自分が携わっているとある案件ではCirc […]

【おすすめ書籍】「継続的デリバリーのソフトウェア工学」「継続的デリバリー」と銘打たれていますが、CDに限らない現代的なソフトウェア開発のための工学的アプローチを扱った本ですチームで開発を進める中で、工学的なアプローチについて疑問を持つ方々に...
09/06/2023

【おすすめ書籍】

「継続的デリバリーのソフトウェア工学」

「継続的デリバリー」と銘打たれていますが、CDに限らない現代的なソフトウェア開発のための工学的アプローチを扱った本です
チームで開発を進める中で、工学的なアプローチについて疑問を持つ方々に打ってつけの一冊

#おすすめ書籍
#継続的デリバリーのソフトウェア工学

本書はソフトウェアに関する諸問題を、「工学」に基づいて解決する方法を実利的&...

インターフェー型のVPCエンドポイントをを利用して、AWS の プライベートサブネット内にある EC2上で稼動しているコンテナから CloudWatch Logs にログを送信する方法です。 を参考にしています。 基本的には docker ...
05/06/2023

インターフェー型のVPCエンドポイントをを利用して、AWS の プライベートサブネット内にある EC2上で稼動しているコンテナから CloudWatch Logs にログを送信する方法です。 を参考にしています。 基本的には docker run のオプションで --log-driver=awslogs を指定してやるとコンテナの出力するログが CloudWatch Logs に送信されます。インターネット経由で接続する場合は、これで十分ですが、AWS のVPC内の EC2 上で Docker コンテナが稼動している場合は外部のインターネット経由ではなく、 AWS の内部経路(PrivateLink)を使って CloudWatch Logs に接続したほうがよいでしょう。 図にすると以下のような感じでしょうか。 CloudWatch Logs に接続するためのエンドポイントを作成するには、「VPC」>「エンドポイント」>「エンドポイントを作成」の画面で、「サービス」として com.amazonaws.REGION.logs を選択します。下図は、フィルターに logs と入力したときの候補を表示しています。 サービスを選択した後、エンドポイントをアタッチするVPCとサブネット、およびセキュリティグループを選択して、「作成」をクリックします。 CloudWatch Logs に接続するエンドポイントが作成できたら、以下のように --log-driver=awslogs の --log-opt に awslogs-endpoint を設定します。 docker run \ --log-driver awslogs \ --log-opt awslogs-region=ap-northeast-1 \ --log-opt awslogs-group=my-logs-group \ --log-opt awslogs-stream=my-logs-stream \ --log-opt awslogs-endpoint= \ your-image awslogs-endpoint に設定するURLは、作成された「エンドポイント」画面の「詳細」タブの「DNS名」でコピーすることができます。 以上で、EC2上で稼動する Docker コンテナから CloudWatch Logs にログが送信されるようになります。

インターフェー型のVPCエンドポイントを […]

はじめに 前回の記事で、ChatGPT APIを使用して電話応答を実現するプログラムを作成しました。 今回は入出力をテキストではなく音声に対応させます。 プログラム 音声に対応したプログラムをChatGPTに作ってもらう せっかくなので、プ...
05/06/2023

はじめに 前回の記事で、ChatGPT APIを使用して電話応答を実現するプログラムを作成しました。 今回は入出力をテキストではなく音声に対応させます。 プログラム 音声に対応したプログラムをChatGPTに作ってもらう せっかくなので、プログラム自体もChatGPTに作ってもらいましょう。 ChatGPTに下記の質問メッセージを入力しました。 音声の質問をテキストに変換してGhatGPT APIの入力として、ChatGPT APIの出力を音声に変換して回答するpythonプログラムを作ってください。 以下がChatGPTの回答です。 以下は、SpeechRecognitionとGoogle Text-to-Speech(gTTS)を使用して、音声の質問をテキストに変換し、ChatGPT APIを使用してテキストの質問に回答し、回答を音声に変換するPythonプログラムの例です。このプログラムはPython 3で動作します。 まず、必要なパッケージをインストールします。 pip install SpeechRecognition gTTS playsound 次に、以下のPythonコードを使用して質問を行う音声を録音し、テキストに変換し、ChatGPT APIに送信し、応答をテキストとして取得し、音声に変換して再生します。 import speech_recognition as sr import requests from playsound import playsound from gtts import gTTS # ChatGPT APIのエンドポイントとAPIキー API_ENDPOINT = " API_KEY = "YOUR_API_KEY" # 音声からテキストに変換する関数 def transcribe_speech(): r = sr.Recognizer() with sr.Microphone() as source: print("質問してください...") audio = r.listen(source) print("音声を受信しました。テキストに変換しています...") try: text = r.recognize_google(audio, language="ja-JP") print("質問: " + text) return text except sr.UnknownValueError: print("音声を解析できませんでした。もう一度お試しください。") return "" except sr.RequestError as e: print("音声の変換に失敗しました。以下のエラーが発生しました: {0}".format(e)) return "" # ChatGPT APIに質問を送信して回答を取得する関数 def get_chatbot_response(question): headers = { "Content-Type": "application/json", "Authorization": "Bearer " + API_KEY } data = { "prompt": question, "max_tokens": 50 } response = requests.post(API_ENDPOINT, headers=headers, json=data) if response.status_code == 200: return response.json()["choices"][0]["text"].strip() else: print("ChatGPT APIへのリクエストが失敗しました。ステータスコード: {0}".format(response.status_code)) return "" # テキストを音声に変換して再生する関数 def speak_text(text): tts = gTTS(text, lang="ja") tts.save("response.mp3") playsound("response.mp3") # メインの処理 def main(): while True: question = transcribe_speech() if question: response = get_chatbot_response(question) if response: print("回答: " + response) speak_text(response) if __name__ == "__main__": main()...

目次 1. はじめに2. プログラム2. […]

これまでWebアプリケーションのUIの自動テストにはtesting libraryを導入してある程度の実績があったものの、あくまでもtesting libraryはコンポーネント単位のテストであり、E2Eテストが自動化できていないという課題...
05/06/2023

これまでWebアプリケーションのUIの自動テストにはtesting libraryを導入してある程度の実績があったものの、あくまでもtesting libraryはコンポーネント単位のテストであり、E2Eテストが自動化できていないという課題が残っていた。ここ最近品質保証のタスクを割り振られることが多くなってきたので、ちょうどいい機会だし重い腰を上げてE2Eテストの自動化を試みる事にした。 まずはツールの選定だが、調べてみるとPlaywrightがかなり有力そうだったので、まずはPlaywrightを導入してみた。以下はPlaywrightを使った画面のテストをする上での覚書。 要素の取得 ページ内の要素を取得する場合、CSSセレクターを用いた方法と画面に表示される文字列やtitle属性の文字列をベースに探す方法がある。 CSSセレクターを用いる場合、PageあるいはLocatorオブジェクトのlocateメソッドを用いる。Page #$などのメソッドもあるが、こちらは推奨されていないようだ。 label value ... ... ... // pageはPlaywrightのPageオブジェクト const locator = page.locator('label:has-text("' + labelValue + '") + br + select'); また、locatorを用いて要素を探す場合、hasオプションで絞り込みを行う事ができる。また、locatorの返り値のLocator型自身がlocator()を持つため、locatorのチェインが行える。例えば次のようなHTMLを考える。 header1 ... ... ... header2 ... ... ... ...

これまでWebアプリケーションのUIの自 […]

はじめに 会社のロゴを刷新しようという話が出たので、画像生成AIを試してみようという話になり、試してみることにしました。 ロゴ作成ツールは昔から生成ツール的なものがありますが、それらはいくつかの質問に答えると、多くのテンプレートからその内容...
05/06/2023

はじめに 会社のロゴを刷新しようという話が出たので、画像生成AIを試してみようという話になり、試してみることにしました。 ロゴ作成ツールは昔から生成ツール的なものがありますが、それらはいくつかの質問に答えると、多くのテンプレートからその内容に沿った結果をたくさん提案してくれるものが一般的だったと思います。たとえば、LogoAIなど。 LogoAI 今回は画像生成なので自分が指示した画像を作ってもらうことになります。 最近の画像生成AIたち Mid Journey 私が最初に知った画像生成AIはMid JourneyでDiscordに参加して、実際に触ったりもしました。いまは、無料で使えなくなっているようでした。 DALL:E, DALL:E2 OpenAIが出している画像生成AIです。DALL:E2を一番試したかったのですが有料版しかありませんでした。また次の機会にしたいと思います。 Stable Diffusion これも、画像生成AIが話題になった時に2番手くらいに有名だった気がします。無料で簡単に試せる「Stable Diffusion Playgound」があります。「Dream Studio」は無料クレジットがもらえる範囲であれば無料で使えます。 Stable Diffusion Playgound Dream Studio Microsoft Bing Image Creator Microsoftが DALL:Eをを利用した画像生成サービスを公開していました。これも「ブースト」と呼ばれるクレジットの範囲であれば再生でき、「ブースト」がなくても再生に時間がかかるるものの使えるようです。 今回は、無料で使える Microsoft Bing Image Creatorを使ってみることにしました。 会社のロゴデザイン作成 早速、ロゴデザインを作成してみた 「日本のグラフデータベース会社のロゴ」というシンプルな指示をしてみました。グラフデータベースのグラフ構造を表現してくれたようです。 logo design for japanese graph database company 画像生成1枚目 会社のビジョン・ミッションを指定してみた 次に会社のビジョン・ミッションを加えて生成してみました。どうでしょう。「世界の関係を表象していく」ようなイメージは少し表現されたでしょうか。 simple logo design for graph database company with this vision & mission Representing the relationships of the world, To quickly systemize and easily improve the models of reality....

目次 1. はじめに2. 最近の画像生成 […]

GraphQLを調査 現在関わっているプロジェクトにGraphQLを適用して、一般的なAPIの口を用意できないか?という話があがり、GraphQLが適用できそうか調査した。 結論としては、あまり導入するメリットが無さそうだとなったが、メモを...
04/06/2023

GraphQLを調査 現在関わっているプロジェクトにGraphQLを適用して、一般的なAPIの口を用意できないか?という話があがり、GraphQLが適用できそうか調査した。 結論としては、あまり導入するメリットが無さそうだとなったが、メモを残しておく。 GraphQLと対象プロジェクトのデータでのギャップ 既存のプロジェクトのデータをGraphQLのスキーマ定義で表現できるのか?について調べた結果、いろいろとギャップが出た Genericsに該当するものが無い 型パラメータ部分をinterfaceかunionかで無理やり回避くらいしか無いか? Mapがうまく取り扱えない Key-Valueのペアのリストで表現 type HogeKeyValue { key: HogeType value: HogeValue } type Fuga { name: String hoge: } 無駄に一段ネストされる CustomScalarTypeで回避 Mapの時点でスカラーとなってしまうため、この先のデータハンドリングができなくなる Enumがとても単純にしか定義できない 対象プロジェクトでは、インターフェース⇒Enumの実体が複数実装という形でデータを持てるが、これが表現できない GraphQLではenumはunionで表せない type定義でラップするなどしないといけない インターフェースが定義できるが、実際の型にもフィールド定義が必要で手間 interface NamedEntity { name: String } type Person implements NamedEntity { name: String age: Int } type Company implements NamedEntity { name: String employeeCount: Int }...

目次 1. GraphQLを調査1.1. […]

はじめに 先日、サイバーエージェントから、大規模日本語モデル(LLM)であるOpenCalmが公開されました。 昨今、何かと話題のChatGPTがありますが、OpenCalmの最大の特徴は、学習データが日本語であること、そしてオープンソース...
22/05/2023

はじめに 先日、サイバーエージェントから、大規模日本語モデル(LLM)であるOpenCalmが公開されました。 昨今、何かと話題のChatGPTがありますが、OpenCalmの最大の特徴は、学習データが日本語であること、そしてオープンソースだということです。 パラメータ数は68億で、GPT-3の1750億(GPT-4のパラメータ数は未公開)に比べてかなり少ないですが、日本語に特化しているということで、この差がどの程度埋められるのかが気になります。 今回は、まずは簡単に試してみた結果を紹介します。 実行環境 Google Colabolatory上で実行しました。 実行には transformers accelerate が必要なため、事前にインストールしておきます。 pip install transformers accelerate OpenCalmには下表の6つのサイズの異なるモデルがありますが、一番大きいopen-calm-7bは無料のGPU(T1)ではエラーになってしまったため、有料のGPU(A100)を使いました。...

目次 1. はじめに2. 実行環境3. […]

住所

Taito-ku, Tokyo
110-0005

ウェブサイト

アラート

株式会社Jurabiがニュースとプロモを投稿した時に最初に知って当社にメールを送信する最初の人になりましょう。あなたのメールアドレスはその他の目的には使用されず、いつでもサブスクリプションを解除することができます。

共有する