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

週刊Railsウォッチ: ruby-gitでGit操作、最近のruby/debug、stdgems.org、Windows 365 Cloud PCほか(20210720後編)

こんにちは、hachi8833です。

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙏

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

お知らせ: 今週木金は祝日のため、来週は週刊Railsウォッチの代わりに通常記事を公開します。

🔗Ruby

🔗 ruby-git(Ruby Weeklyより)

ruby-git/ruby-git - GitHub


つっつきボイス:「RubyからGitを操作できるgemがあるんですね」

# 同リポジトリより
g = Git.open(working_dir, :log => Logger.new(STDOUT))

g.index
g.index.readable?
g.index.writable?
g.repo
g.dir

g.log   # returns array of Git::Commit objects
g.log.since('2 weeks ago')
g.log.between('v2.5', 'v2.6')
g.log.each {|l| puts l.sha }
g.gblob('v2.5:Makefile').log.since('2 weeks ago')

g.object('HEAD^').to_s  # git show / git rev-parse
g.object('HEAD^').contents
g.object('v2.5:Makefile').size
g.object('v2.5:Makefile').sha

g.gtree(treeish)
g.gblob(treeish)
g.gcommit(treeish)
# (略)

「インストールコマンドがsudo gem install gitなの、わかるけどちょっと面白かった」「内部でGitコマンドを使っているみたい」

「Gitのコマンドはひととおり使えそうかな」「★も1,500超えですね」「たしかにRubyでGitコマンドをシェル経由で呼び出して標準入力を自分で取ったりするより使い勝手はいいでしょうね: こういうGitバインディングがRubyで使えるのはよさそう👍」

🔗 dry-transformer

dry-rb/dry-transformer - GitHub


つっつきボイス:「dry-transformerは、dry-rbシリーズの割と新しいgemだそうです」「新しいといっても2年前ぐらいかな」

「こんなふうに変換のパイプラインを記述できるらしい: mapperやreducerを思わせますね」

# dry-rb.orgより
class MyMapper < Dry::Transformer::Pipe
  import Dry::Transformer::ArrayTransformations
  import Dry::Transformer::HashTransformations

  define! do
    map_array do
      symbolize_keys
      rename_keys user_name: :name
      nest :address, [:city, :street, :zipcode]
    end
  end
end

mapper = MyMapper.new

mapper.(
  [
    { 'user_name' => 'Jane',
      'city' => 'NYC',
      'street' => 'Street 1',
      'zipcode' => '123'
    }
  ]
)
# => [{:name=>"Jane", :address=>{:city=>"NYC", :street=>"Street 1", :zipcode=>"123"}}]

参考: MapReduce - Wikipedia

「dry-transformerは以下の記事で知りました↓」「CSVのエクスポート/インポートやRSSのパース、コードハイライトなどに使えるとある: たしかにパーサーにはいいかも」

Dry::Transformer::HashTransformationsをインポートするとハッシュを受けるパイプを作れるみたい」

# 同記事より
class HanamiMasteryAdapter < Dry::Transformer::Pipe
  import Dry::Transformer::HashTransformations

  define! do
    deep_symbolize_keys
    nest :address, %i[city zip]
    rename_keys login: :name
  end
end

hash = {
  'id' => 1
  'login' => 'John',
  'city' => 'NY',
  'zip' => { 'number' => 1234 }
}
adapter.call(hash)
# => { id: name: 'John', address: { city: 'NY', zip: { number: 1234 } } }

「できればdry-transformerがうまくハマるような、もうちょっと複雑な例をコードで見たいですね: MapReduce的な処理は複数プロセス間でのデータのやりとりがメインになる印象が強いんですが、この記事だと1個のプロセス内でやるシンプルなコード例しか載っていない」「たしかに変換を1個作るだけだとありがたみがわかりにくいかも」「さまざまな変換処理をパイプでつなぎ替えて出力を変えられるとか、そういう実例が欲しい」

🔗 最近のruby/debug

つっつきボイス:「ruby/debugのドキュメントが全面的にリライトされたそうです🎉」「_ko1さん精力的に活動していてスゴい」

「1.0.0のリリースを目指しているようです↓」「今はv1.0.0.beta8なのね」

🔗 stdgems.org

同サイトは、以下のブログサイトにあった情報を独自ドメインに切り出したもののようです。

参考: Idiosyncratic Ruby

つっつきボイス:「ruby-jp Slackでこのstdgems.orgを見かけました」「おぉ、Rubyバージョンごとのdefault gemsとbundled gemsのリストをここで見られるんですね、これは地味にありがたい!」


stdgems.orgより

「こういうリストはそんなに頻繁に使わないんですけど、たまに探し回るんですよ」「たしかに」「gemのバージョン番号もちゃんと書かれているのがいいですね: Gemfile.lockで競合が発生したときにデフォルトでインストールされるgemのバージョンを調べることがあるんですが、こういう情報があると助かります: いいサイト👍」

🔗 その他Ruby

つっつきボイス:「mrubyではなくmruby/cの変更ですね」

mrubyc/mrubyc - GitHub

「CRubyのFixnumとBignumがIntegerに統合されたのはいつだったかな...Ruby 2.4か↓」「もうだいぶ前なんですね」

参考: Ruby 2.4 unifies Fixnum and Bignum into Integer | BigBinary Blog

後でやってみると、Ruby 2.5.9やRuby 2.6.8では以下のwarningを出してIntegerが返り、Ruby 2.7.4とRuby 3.0.2ではwarningなしでIntegerが返りました。

irb(main):001:0> Fixnum
(irb):1: warning: constant ::Fixnum is deprecated
=> Integer

🔗 セキュリティ

🔗 Open Source Vulnerabilitiesデータベース


つっつきボイス:「Open Source VulnerabilitiesはGoogleがやっているプロジェクトのようですね」「現在の脆弱性交換スキーマ定義はこんな感じらしい↓」

# 同記事より
{
        "id": string,
        "modified": string,
        "published": string,
        "withdrawn": string,
        "aliases": [ string ],
        "related": [ string ],
        "package": {
                "ecosystem": string,
                "name": string,
                "purl": string,
        },
        "summary": string,
        "details": string,
        "affects": [ {
                "ranges": [ {
                        "type": string,
                        "repo": string,
                        "introduced": string,
                        "fixed": string
                } ],
                "versions": [ string ]
        } ],
        "references": [ {
                "type": string,
                "url": string
        } ],
        "ecosystem_specific": { see spec },
        "database_specific": { see spec },
}

「あるとありがたい情報ですしGoogleがこういうプロジェクトをやるのも理解できるけど、他の企業とかも巻き込んでアライアンス主体の運用になればプロジェクトの継続性についてより安心できるかなと思いました」「CVEはIDの付与と基本情報やリンクの提供にとどまっていますけど、ちゃんと継続的に運用されていますよね」「スキーマも欲しいけど継続的運用の方が欲しい」

参考: CVE - CVE

🔗クラウド/コンテナ/インフラ/Serverless

🔗 大きなGitリポジトリの操作


つっつきボイス:「はてブでバズっていた記事です」「シャロークローンはよく使われていて、パーシャルクローンも見た覚えがあったけど、リファレンスリポジトリ周りの話は初めて見た」


同記事より: リファレンスリポジトリの活用例

「こうした個別の手法や概念は昔からGitにありますが、ゲームなどのように画像などのアセットが多い大規模なサービスを扱うようになると、この記事で解説されているようなことが関連してくるでしょうね: 通常の開発だとなかなかそこまではいかないかもしれませんが」「なるほど」「GitHubのような大規模リポジトリサービスを構築する場合に必要になりそうですね」

「このgit fetch --unshallow知らなかった↓: シャロークローンで最初はスキップして取り込まなかったコミットを改めて全部取り直せると記事にもある」「へ〜!」

🔗言語/ツール/OS/CPU

🔗 Windows 365 Cloud PC


つっつきボイス:「Windows界隈がこれで盛り上がっていますね」「Twitterにも書きましたけど、企業のインターネット接続が果たして持つだろうかと思いましたね」「ああ、そこか!」「今はリモートワーク主体なので企業のネット回線にはそれほど負荷はかかっていませんけど、それが終わって全員出社するようになったときに負荷が一気に高まって詰まりそうな予感」「う〜む」

「多くの企業のインターネット接続が1Gbpsぐらいだとすると、社員がそこで普通にネット接続をシェアしている分には、社員全員がNetflixを見るみたいな無茶をしない限り問題ないんですが、Windows 365 Cloud PCのような感じで全員がリモートデスクトップ経由でVDIに常時接続すると回線が詰まるんじゃないかな」「それもそうですよね...」

参考: デスクトップ仮想化(VDI)の基本について学ぶ | IT価値創造塾

「逆に、社員同士での巨大ファイルのやりとりが非常に多い場合とかならWindows 365 Cloud PCの方がファイルのやりとりがクラウド内に閉じ込められる分軽くなるかもしれませんね」「なるほど」「シンクライアントの夢ふたたび感ある」「遅延がつらくなりそうなので、自分は使わないかな〜」

参考: シンクライアント - Wikipedia

🔗 Windowsリモートデスクトップ接続よもやま話

「最近調べたんですが、Windows 10リモートデスクトップのホスト機能はHomeエディションのみ利用不可で、たとえばProエディションとEnterpriseエディションでは同時に1台まで接続可能」「ふむふむ」「同時接続数はレジストリを変更すれば増やせるんですが、デスクトップ画面を表示できるのはあくまで1ユーザーのみで、他の同時接続はその画面をシェアする形になるので、いわゆるUnix系OSのマルチログイン的なことができないんですよ(別ユーザーで接続すると既存ユーザーはログアウトされる)」

「Windows Serverなら同時ログインデスクトップ数が2まで緩和されるので、たとえばAdministratorとoperatorが同時に異なるデスクトップを利用できるそうです」

参考: Windows10 - リモートデスクトップを有効にする方法 | PC設定のカルマ

「個人的にはHomeエディションでリモートデスクトップ接続が許可されて同時ログインデスクトップ数2まで使える方がうれしいかな: それが可能になればリモート接続でゲームができるから」「それはたしかに憧れの機能😆」「リモートPCにゲーム専用のユーザーを作っておけば、手元のPCのフォアグラウンドを落とさずにリモートでゲームを起動できるかなと思ってそのあたりを一生懸命調べたんですけど、どうやらWindows Serverじゃないとできないみたい」「残念」

「その一方で、Azureで動いているWindowsはマルチセッションが使えることが判明しました: このAzure Virtual Desktopがそうです↓」「へ〜!」「Azure環境ならマルチセッションで複数ユーザーが同時接続できるのに、通常のWindowsだと許されてなくて悲しい結論になってしまいました」

参考: Azure Virtual Desktop | リモート デスクトップ | Microsoft Azure

🔗 その他ツール(StatusCode Weeklyより)


つっつきボイス:「rfc.fyiはRFCファイルを爆速検索できるサービスですね」

「slowfil.esは何だろうと思ったら、https://slowfil.es/file?type=js&delay=2500みたいなURLをscriptタグとかで読み込ませると、遅延をかけたりステータスコードを404や500にしたレスポンスを返してくれるということらしい」「なるほど」「ごくたまに、開発中に遅いWebサイトを読み込ませるとどうなるかを手軽に試すときに使う感じかな」


後編は以上です。

バックナンバー(2021年度第3四半期)

週刊Railsウォッチ: GitHubによるdisable_joins解説、MemoWise gemでメモ化、RailsのDDoS攻撃対策ほか(20210719前編)

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

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

Ruby Weekly

StatusCode Weekly

statuscode_weekly_banner


CONTACT

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