Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20180511)ArelがRailsにマージ、RailsのGDPRエンジン、RubyでWebAssembly、VS IntelliCodeのAIレビュー機能ほか

こんにちは、hachi8833です。長い休みがあるとウォッチに載せたいものがモリモリ増大してしまうので削るのが逆につらいです。

夏日のウォッチ、いってみましょう。心なしかRust成分が多めになりました。

各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ

Rails: 今週の改修

まずはRails 6.0向けのmasterブランチから。

ArelがRails本体にマージ

変更量が莫大なのでdiffはなしです。

ここしばらく、Arelの歩調をActiveRecordに合わせる作業が続いていました。Railsのあらゆるリリースで新しいArelリリースが必要であり、ArelのリリースもRailsのリリースに合わせて行われます。
両者を調和させるためにはコストがかかりますが、Arelを別gemとしてメンテし続ける余裕がありません。
Reverse dependencies for arel | RubyGems.org | your community gem hostをチェックしたところ、(Arelに依存する他の)gemのほとんどがActiveRecordに依存しているため、今回の変更はエコシステムに大規模な依存を新たに強いるものではありません。ActiveRecordの新バージョンに依存する、新バージョンのArelを今後リリースしますので、(他の方々も)引き続きアップグレードはスムーズにできます。そのためにはActiveRecordがインストールされている必要があります(ただし読み込みもrequireもしません)。
トップレベルのArel定数名を変更する予定はありません。
同PRより大意


つっつきボイス: 「activerecord/lib/arel.rbに置かれたってことか」「Arelのgemは今後もあるんでしょうかね?」

rails/arelを見に行ってみると、aae413bでgemspecなどいくつかのファイルを残してソースがごっそり消えてますね。


rails/arelより

has_one_attachedhas_many_atacched共通で使えるバリデーション

class User < ActiveRecord::Base
  has_one_attached :avatar
  has_many_attached :highlights

  validates :avatar, presence: true
  validates :highlights, presence: true 
end

今後こんなふうに書けるようです。


つっつきボイス: 「これはActiveStorageの改修ですね」「ほんとだ: 修正はこんだけ↓」「presence validationってあるのは添付ファイルが存在するかどうかのチェックってことみたい」

# activestorage/lib/active_storage/attached/one.rb#L16
+    def blank?
+      attachment.blank?
+    end

RailsのWelcomeスクリーンのキャラクターを多様化


同PRより

この間からジェンダーフリーなど多様性を志向した改修が増えつつあるので、こちらも対応が進んでいるようです。動物とか恐竜とか宇宙人とかロボットだったらこういうときに楽ですね。


つっつきボイス: 「もうこの流れは必然ですね」「LGBTは外見と関係ないから絵には表さないはず」「イヌまだいるのかな?あネコだったか(ΦωΦ)」「次は車椅子のメンバーも...と思ったらしっかり入ってました」「『でもリーダーは白人男性ね』が暗黙だったらどうしよう😁😂」

追記: こういった多様化に初めて気づいたのは、「ゴーストバスターズ」がアニメ版になったときに映画版にはいなかった車椅子のレギュラーメンバーがいるのに気づいたときでした。随分昔ですが。

ImageProcessing gemを導入

# Gemfile#L91
   gem "google-cloud-storage", "~> 1.8", require: false
   gem "azure-storage", require: false

-  gem "mini_magick"
+  gem "image_processing", "~> 1.2"
 end
# Gemfile.lock#L268
+    image_processing (1.2.0)
+      mini_magick (~> 4.0)
+      ruby-vips (>= 2.0.10, < 3)

つっつきボイス:MiniMagickImageMagickってどういう関係でしたっけ」「ImageMagickはCか何かで書かれた画像処理ライブラリで、以前はRMagickというRubyバインディング経由で使っていたのが、MiniMagickの方が軽いとかメモリ食わないとかでよく使われるようになってきた感じですかね」「なるほど!」「libvipsっていうもっと軽くて速いライブラリを使う方向に進むみたいですね」「それでruby-vipsというバインディングが導入されたと」

# 同PRより
real time in seconds, fastest of five runs
benchmark       tiff    jpeg
ruby-vips.rb    0.85    0.78    
image-magick    2.03    2.44    
rmagick.rb  3.87    3.89    

peak memory use in kb
benchmark   peak RES
ruby-vips.rb    43864
rmagick.rb  788768

[Rails] MiniMagickでPDFのページ数を取得するときはフォントエラーに注意!

STIで逆方向の関連付けを自動推定

ここからは、Ruby on Rails 5.2 リリースノート | Rails ガイドのプルリクです。Railsウォッチでプルリクを取り上げるときに番号を書いといてよかったとこういうときに思います。過去に取り上げたかどうかすぐ検索できるので。

# activerecord/lib/active_record/reflection.rb#L657
         # from calling +klass+, +reflection+ will already be set to false.
         def valid_inverse_reflection?(reflection)
           reflection &&
-            klass.name == reflection.active_record.name &&
+            klass <= reflection.active_record &&
             can_find_inverse_of_automatically?(reflection)
         end
# 同PRより
class Post < ActiveRecord::Base
  belongs_to :author
end

class SpecialPost < Post; end

class Author < ActiveRecord::Base
  has_many :posts
  has_many :special_posts
end

# 以下のどちらも使いたいけど2番目がちゃんと動かなかった
author.posts.first.author
author.special_posts.first.author

つっつきボイス: 「おー、こういうふうに書けるようになったと」「STIとどう絡んでるのかなこれ...」「これも修正はピンポイントですね」

# activerecord/lib/active_record/reflection.rb#L658
         def valid_inverse_reflection?(reflection)
           reflection &&
-            klass.name == reflection.active_record.name &&
+            klass <= reflection.active_record &&
             can_find_inverse_of_automatically?(reflection)
         end

「お、この方とっても印象的なお顔」「ActiveRecordの有名なコミッターですよ」「Sean Griffinさんっていうんですね: ということはkamipoさんより前からActiveRecordをガンガンやってる?」「そんな感じだったかと」


github.com/sgrifより

「sgrifさんのactivity見ると、なんかrust-lang/rustとか入ってるんですけど」「(・・;)」「Rust本家のコードまでやってるとは...」「Rustってもう嗜みになりつつあるのかな」「👍☺☺☺」


github.com/sgrifより

composed_ofカラムを用いたwhereメソッドの引数に配列オブジェクトを渡した場合に展開されない問題を修正

# 同PRより
david_balance = customers(:david).balance
Customer.where(balance: [david_balance]).to_sql

# 修正前: WHERE `customers`.`balance` = NULL
# 修正後: WHERE `customers`.`balance` = 50
# activerecord/lib/active_record/sanitization.rb#155
             if aggregation = reflect_on_aggregation(attr.to_sym)
               mapping = aggregation.mapping
               mapping.each do |field_attr, aggregate_attr|
-                if mapping.size == 1 && !value.respond_to?(aggregate_attr)
-                  expanded_attrs[field_attr] = value
+                expanded_attrs[field_attr] = if value.is_a?(Array)
+                  value.map { |it| it.send(aggregate_attr) }
+                elsif mapping.size == 1 && !value.respond_to?(aggregate_attr)
+                  value
                 else
-                  expanded_attrs[field_attr] = value.send(aggregate_attr)
+                  value.send(aggregate_attr)
                 end
               end
             else

つっつきボイス:composed_ofってこういうのだったんですね↓」「こういうのも展開できるって知らなかったなー」

参考: Rails.composed_of - Qiita

Rails

Rack PushでリアルタイムWebアプリをWebから切り離す(Ruby Weeklyより)


同記事より

これ訳してみたいです。


追いかけボイス: 「ActionCable的なものをRackのレイヤでやるぜ、みたいな話かな?まあシンプルなpushくらいしかやらないならこれでもいいってのはありそう」

RubyGarageが実際に使っている精選gem 57種


同記事より

この記事で時間を使ってしまったので、後のつっつきは軽めとなりました🙇。


つっつきボイス: 「これ参考になりそう」「57種も」「知らないやつを中心にざざっと見てみましょうか」

  • ActiveRecord: 「act-as-taggable-on、★多い」「morimorihogeさんが『昔のgemにact-asなんちゃらという名前が多かった』って言ってた」「deep_clonableだって」「ちゃんと動いてくれるかな...ゴク」
# moiristo/deep_cloneableより
# Conditional includes
pirate.deep_clone include: [
  {
    treasures: { gold_pieces: { if: lambda{|piece| piece.is_a?(Parrot) } } } },
    mateys: { unless: lambda{|matey| matey.is_a?(GoldPiece) }
  }
]

ship.deep_clone include: [
  pirates: [ :treasures, :mateys, if: lambda {|pirate| pirate.name == 'Jack Sparrow' } ]
]
  • 有限状態機械: 「AASMは前にもウォッチで言及した覚えが」「DSLでお気楽に書けるヤツ」「この間某案件で使おうと思ったのに使わずに進んじゃった😢」

  • バージョニング: 「papertrail」「後になって履歴欲しいとか言われたときに使ったり」

  • i18n: 「GlobalizeはRailsガイドの推奨リストに入ってましたね」

  • テスト: 「database_cleanerは、最近のRailsはシステムテストがあるから要らなくなったんですよね?」「Rails5.1ならもうほぼ要らないでしょうね」

「前は何でこれが必要だったんかな?勝手にデータ消してくれるぐらいに思ってたけど」「えっと、特にcapybaraでしかもJavaScriptをテストするときなんかにRailsのサーバーが別スレッドでもうひとつ立ち上がるじゃないですか: Railsってコネクションプールがスレッド単位なんですけど」「ふむふむ」「でRSpecって、テスト中にトランザクションを張って、テストが1件終わるたびにトランザクションをロールバックしてデータを消してから次のテストに進む、みたいなのが通常の戦略なんですね」「ところがコネクションプールが違っているとトランザクションの外から参照できなくなっちゃうんですよ: だからdatabase_cleanerでこの戦略をトランザクションを使わないように変えて、テストのたびに(明示的に)データを消すという戦略に切り替えないといけなかったんですね」「おーなるほど!😲」「それがRails 5.1のシステムテスト(SystemTestCase)になってからは、ActiveRecordが1つのデータベースだけを参照するように変わったおかげで、別スレッドでWebサーバーが動いていてもRSpecが動くスレッドとRailsが動くスレッドが常に同じものを参照するようになって、それでdatabase_cleanerが要らなくなったんですね」「素晴らしい〜☺: database_cleanerって雑に設定するとすっごく遅くなってたし」

Rails: システムテストをRSpecで実行する(翻訳)

「あれ、まだfactory_girlのまんま?」「database_cleanerといい、最新じゃないのかな?」

RubyFlowにはつい最近紹介されていたのですが、後で元記事をチェックすると記事ソースのどこにも日付がありませんでした(´・ω・`)。redditに2016年12月のエントリがあるので、どうやらこれより新しいということはなさそうです。

「そういえばfactory_girlがfactory_botに改名されたのって、factory girlって言葉自体がよろしくないってことみたいですね」「たぶんそうだと思います: 女工哀史とか富岡製糸場みたいなものが連想されるのかも」

shoulda-matchersもひところよく見かけた気が: should好き派とキライ派といたような覚え」「どこかに『shouldなんか使っちゃダメだ』って書いてあったんでそうしてます☺」「expectで書けという感じで」「simplecovは...?」「カバレッジ出すやつ」「あ、そういえばオレオレアプリに入れてた」
should形式が盛んだったのはRSpec2系でしたっけか: 3あたりからexpectが推奨になって滅びていった」「僕はshould嫌いじゃなかったんですけどね」

  • スタイル: 「rubycriticも前に扱った」

Ruby:「プリマドンナメソッド」の臭いの警告を私が受け入れるまで(翻訳)

  • デバッグ: 「letter_openerってデバッグでしたっけ?」「テスト中にメール飛ばないようにできるからでしょうね」

  • 認証/承認: 「rolifyは初めて見た」

# RolifyCommunity/rolifyより
class User < ActiveRecord::Base
  after_create :assign_default_role

  def assign_default_role
    self.add_role(:newuser) if self.roles.blank?
  end
end
  • API: 「apipie-railsも知らなかった: アピパイ?」「APIドキュメント生成するやつみたい」「アノテーションっぽく書くとドキュメントが生成されるのか」「DSLってことですよね」
# Apipie/apipie-railsより
api :GET, '/users/:id'
param :id, :number
def show
  # ...
end

ActiveMerchant を使ってPayPal Express Checkout の与信取得と回収機能を導入する


braintreepayments.comより

  • ファイルアップロード: 「fogはロゴかわいい↓」「cloud(雲)にかけてfog(霧)かな」


fog.ioより

# fog/fogより
require 'fog'

compute = Fog::Compute.new(
  :provider           => 'Rackspace',
  :rackspace_api_key  => key,
  :rackspace_username => username
)

# boot a gentoo server (flavor 1 = 256, image 3 = gentoo 2008.0)
server = compute.servers.create(:flavor_id => 1, :image_id => 3, :name => 'my_server')
server.wait_for { ready? } # give server time to boot

# DO STUFF

server.destroy # cleanup after yourself or regret it, trust me
  • ビューヘルパー: 「meta-tagsはSEOタグをよしなに付けてくれるヤツ」
# kpumuk/meta-tagsより
<% title 'Member Login' %>
<% description 'Member login page.' %>
<% keywords 'Site, Login, Members' %>
<% nofollow %>
<% noindex %>
<% refresh 3 %>

gdpr_rails: RailsのGDPRエンジン


同リポジトリより

各所で話題になってますね。

Cucumberが10歳に(Ruby Weeklyより)

RailsのフロントエンドテストのJavaScript周りの秘訣(Hacklinesより)


つっつきボイス: 「社内でJavaScriptと戦ってる勢に」「訳してみたい」

その他記事など


つっつきボイス:Tailwind.cssはこの間ちょっと使ってみた」


tailwindcss.comより


つっつきボイス: 「ざわ...ざわ...」

Ruby trunkより

Sleepy GC作ってみたお(Ruby Weeklyより)

またしてもnormalpersonさんですね。Ruby WeeklyにRuby issueがエントリされるのは珍しいかもです。


つっつきボイス: 「Sleepy GCって前からはなさそうですね」

マルチスレッドで同じファイル内の異なる定数を自動読み込みするとデッドロック

# 同issueより
# a.rb
autoload :Foo, __dir__ + "/b"
autoload :Bar, __dir__ + "/b"

t1 = Thread.new { Foo }
t2 = Thread.new { Bar }

t1.join
t2.join

# b.rb
module Foo; end
module Bar; end

提案: Fiberのyield/resumeのパフォーマンス向上


つっつきボイス: 「スレ長い!」「コミッターが続々登場してるし」「libcoroって?」「最後の方見るともう何か作り始めてますね↓」

参考: Making coroutines fast - RethinkDB

Ruby

RubyでWebAssemblyする(Ruby Weeklyより)


つっつきボイス: 「これはmrubyでやってるんですね」「それにしてもこの変換の多さ↓...😁」「長い旅路😁」

Ruby script → MRuby bytecode → C → emcc (Emscripten Compiler Frontend) → LLVM → Binaryen → WebAssembly

Rubyのハッシュ的な構文をParsletに実装する方法(Ruby Weeklyより)

# 同記事より
require 'parslet'

class MyParser < Parslet::Parser
end

class MyTransformer < Parslet::Transform
end

require 'minitest/autorun'
require 'parslet/convenience'

class MyParserTest < Minitest::Test
  def test_parses_a_comma
    input = %Q{,}
    parser = MyParser.new.comma
    tree = parser.parse_with_debug(input)
    refute_equal nil, tree
  end
end

Rubyのクラス名で非ASCII文字が使えるようになる件について(Hacklinesより)


同記事より


つっつきボイス: 「非ASCII文字のupper/lowerがRuby 2.6でサポート...だと?」「クラス名でとか、やりたい人だけ体当たりしてみて欲しいっす😢」

参考: Feature #13685: Update Unicode data to Unicode Version 10.0.0 - Ruby trunk - Ruby Issue Tracking System

slacktyping: RubyのSlack向けジョークアプリ

つっつきのときは今ひとつよくわからなくて勘違いしてましたが、後で落ち着いて動画を見てみると「誰かが入力を始めた途端に、あたかも別の人というか自分が入力中であるかのように下に"xxx is typing..."を表示させる」というやつでした。「今のところ誰も嫌がってないみたいよ♡」だそうです。

ko1さんによるRuby 3コンカレンシー(Ruby Weeklyより)


つっつきボイス: 「ついにGUILD情報来た!」

その他Ruby記事


つっつきボイス:sonic-piで言うライブコーディングは、ライブ会場で音楽を作り出す方のライブコーディングですね↓」

ライブコーディング入門:Sonic Pi篇パート1


つっつきボイス: 「お子様がお生まれになったのをHello Worldで表してました↑」「めでたい!」「雑学ですが、英語圏では生まれた赤ちゃんに『Welcome』って声かけるのが定番だそうです」


↑最初これを見たときに何だろう?と思ったら、以下への返しのようでした。


つっつきボイス: 「RailsとWebpackerの、『基本的にこう使ってくれ』みたいな公式なユースケースが欲しいですね」


そういえばRubyKaigi 2018も近いですね。



クラウド&コンテナ

KubernetesでPostgreSQLを動かして得た知見(Postgres Weeklyより)

Googleの「.app」ドメイン登録サービス(WebOps Weeklyより)


get.appより


つっつきボイス: 「.appって、hstsを強制することでhttpsを強制するドメインじゃありませんでしたっけ」「ここで.appドメインを登録できるみたい: 知人が早速何か登録してました」「ドメインハイエナが集まりそう☺」

Railsアプリの認証システムをセキュアにする4つの方法(翻訳)

超高速リアルタイム検索「Algolia」の中の人が語る(WebOps Weeklyより)


つっつきボイス: 「Algoliaは前にウォッチでも取り上げたのを思い出しました: 訳してみたいけどやらせてもらえるかしら...」

参考: Algoliaを利用してサイト内検索機能を実装する | WEB EGG

その他クラウド&コンテナ

SQL

RubyでのPostgreSQLデータ読み込みを高速化する(Hacklinesより)

scalingpostgres.comというドメインまで取ってるんですね。

「データベースは何を?」「ぽすぐれです、今後も」(Postgres Weeklyより)


つっつきボイス: 「タイトルから未来のデータベースの話かと思ったらインタビューでした」

PostgreSQLのテーブルスペースのすべて(Postgres Weeklyより)

# 同記事より
postgres=# create tablespace space2 location '/tmp/space2';
CREATE TABLESPACE

postgres=# \db+
                                  List of tablespaces
    Name    | Owner |  Location   | Access privileges | Options |  Size   | Description
------------+-------+-------------+-------------------+---------+---------+-------------
 pg_default | alice |             |                   |         | 22 MB   |
 pg_global  | alice |             |                   |         | 573 kB  |
 space2     | alice | /tmp/space2 |                   |         | 0 bytes |
(3 rows)

参考: PostgreSQL 9.4ドキュメント テーブル空間

ORは避けよう(Postgres Weeklyより)


つっつきボイス:ORは使いすぎに注意?」「まあそうっすね☺」

「SQLにおけるORは、使い始めると急にクエリが複雑化するんですよね: 使うにしても小さいWHERE句にカプセル化するような使い方に限らないと、容易に地獄化する」「参照記事はパフォーマンスに関する話だけど、使いすぎると普通にアプリでコード書いてても相当読みづらくなります」「↓これでもめっちゃ単純な方だけどぱっと見だけでは把握不能」

Hoge.where(name: 'piyo').or(Hoge.where(name: 'foo')).or(Hoge.where(name: 'baa')).where(age: @age).order(id: :desc)

その他SQL関連

JavaScript

NGXS: Angular.js向けステート管理ライブラリ(JavaScript Weeklyより)


ngxs.gitbook.ioより


つっつきボイス: 「ほーAngular用」「みんなステート管理欲しいんですね」

JSで任意サイズの整数を使うBigInt(JavaScript Weeklyより)

Googleのドキュメントです。

// 同記事より
1234567890123456789n * 123n;
// → 151851850485185185047n

つっつきボイス: 「Rubyにはとっくにあるやつですね」

参考: library bigdecimal (Ruby 2.5.0)

サービスワーカー、する?(JavaScript Weeklyより)

この間のウォッチでも取り上げましたが一応。


jakearchibald.github.ioより

参考: Service Worker の紹介  |  Web  |  Google Developers

Dojo 2.0登場(JavaScript Weeklyより)

過去記事を検索したら大昔のbabaさん記事が出てきました。

dojoを使いこなすための細かいTIPS

参考: Dojo Toolkit - Wikipedia


ja.wikipedia.orgより

その他JavaScript

CSS/HTML/フロントエンド

Webデザインをがらっと変える新しいCSS機能(Frontend Focusより)

See the Pen Height based grid example by Zell Liew (@zellwk) on CodePen.

LayerJS: 素のHTMLをインタラクティブに(Frontend Focusより)


layerjs.orgより

「素のHTML」が目を惹きました。

「もっと見る」ボタン(Frontend Focusより)

その他CSS/HTML/フロントエンド

言語よろず大部屋

Runic言語が登場(Hacklinesより)

リポジトリからまるわかりのように、Crystal言語で書かれてます。

  • 汎用コンパイラ言語(ライブラリ、バイナリ、埋め込みなど)
  • C並に高性能(でもCより安全)
  • 目に優しいRuby風構文(でも型あり)
  • 最小限のランタイムでもポインタなどの重要な要素が使える
  • 別プロジェクトでクロスプラットフォーム標準ライブラリの開発進めるかも

しかしrunic(ルーン文字風の)というネーミングは紛らわしすぎるのでは(´・ω・`)。

RubyistのためのGo言語入門

RustコードをRubyで実行するには

# 同記事より
#[macro_use]
extern crate helix;
extern crate idna;

ruby! {
    class Domain {
        def to_ascii(domain: String) -> Option<String> {
            let result = idna::domain_to_ascii(&domain);

            return result.ok();
        }
    }
}

Rust 1.26リリース

Announcing Rust 1.26 - The Rust Programming Language Blog


rust-lang.orgより

その他言語

rustic: 素朴な、ひなびた

その他

Shopifyのインターンが学んだことを晒す(Hacklinesより)

GitHubが「Checks API」を公開(WebOps Weeklyより)


blog.github.comより


つっつきボイス: 「CIの結果がこんな感じで統合表示されるみたい」「お、ちょっとよさげ」

Visual Studio IntelliCodeのAIレビュー機能


つっつきボイス: 「これは衝撃...」「今後増えることはあっても減ることはないのかも」「AIのサジェスチョンって、『こういうときは皆様こういうふうにお書きになってらっしゃいます: 理由はわかりませんが』っていう感じになりますよね☺」「☺」

その他のその他


つっつきボイス: 「ポモドーロタイマー、流行ってますよね☺」「このツイートで初めて知りました」

参考: ポモドーロタイマー|ポモドーロ・テクニック実践ツール

番外

あと必要なのは身を任せる勇気だけ


つっつきボイス: 「そのうち無人運転カーみたく『えー、昔は人間が手術してたの?危なくね?』みたいになりそうですね😁」

未来の電源はどんなふうに

西洋おみくじ「オブリーク・ストラテジーズ」

ポイントは「煮詰まってる、困ってるときにだけ」「1回限り引く」ことです。
根拠はありませんが、たぶん周りに人がいないときにやるのがよい予感がします。

こういうのは「当たる・当たらない」ではなく、偶然の力を借りて自分の行動パターンを軽くかき乱し、いつもは通らない道を発見するのが目的ぐらいに考えています。理詰めだけでやってるといつも同じ道ばかり通ることになるので。一種他力のヒューリスティックというか。

参考: ブライアン・イーノ - Wikipedia -- 「オブリーク・ストラテジーズ」作者の1人です。km professional 3を読むと、本人自身も頻繁に使っているようです。元祖ドッグフーディングというか。

参考: ドッグフーディングとは 意味/解説 - シマウマ用語集

そ、その年は...


今週は以上です。明日はRejectKaigiですね。よい週末を!

バックナンバー(2018年度)

週刊Railsウォッチ(20180427)Rails開発者アンケート2018結果発表、「次に学びたい言語」、各種カンファレンス目白押しほか

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

WebOps Weekly

webops_weekly_banner

Postgres Weekly

postgres_weekly_banner

Frontend Focus

frontendfocus_banner_captured

JavaScript Weekly

javascriptweekly_logo_captured

Github Trending

160928_1701_Q9dJIU


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。