いいかんじに Bundler で管理されていない Gem を使いたい

2023-11-16 23:59:59 +0900

前回作成した irb-theme-draculabundlergem が管理されているプロジェクトで利用したい。 利用したいが、そのままでは利用できないです。 これは gembundler で管理されているので、 Gemfile に書いていない gem は利用できないです。

対処案

bundler で管理されていない gem をどうしても利用したい場合は以下のような方法が考えられます。

  1. :100: Gemfile に追加: 正攻法。ただ複数人で開発しているなどの場合色付けだけの機能で追加するのかというと…
  2. :+1: 古きよき方法: setup.rb を利用して、対象 gem の必要ファイルをインストールする。
  3. :poop: 実行する Ruby$LOAD_PATHgem のパスを追加: 強引にパスを追加して require することで解決。

ということでそれぞれ方法をみてみましょう。

Gemfile に追加

正攻法ですね。便利で全員が使い、必要なら追加しましょう。 どうしても利用したい場合でプロジェクトの Gemfile に書きたくない場合はプロジェクトを管理しているバージョン管理システム にコミットしないなどオペレーションを行いましょう。 管理方法が大変なのでこの方法はないなと。

古きよき方法

rubygems が生まれる前の方法をとりましょう。ここでは setup.rbsite_ruby に必要なファイルをインストールしてくれます。 便利なやつです。

使い方

$ gem install setup # gem でイントールします。
# インストールしたい gem のリポジトリをコピーなどして手元にもってきましょう。
$ cd /path/to/install/gem
$ setup.rb install # gem のインストールが行なわれます。
$ cd /path/to/your/project
$ bundle exec ruby your/scrip.rb

これでできるのですが問題点があり、この方法では利用したいプロジェクト以外でも利用できてしまうので特定のプログラムだけで site_ruby を読み込むとかしていいかんじに使い分けるには少し工夫が必要です。 全部の Ruby プログラムで利用したい訳ではないのでこの方法については断念。

実行する Ruby の $LOAD_PATH に利用する gem のパスを追加

この方法は単純で、プログラム側で必要なファイルを読み込む時のみ利用する。 利用するファイル(require "irb/theme/dracula/light" を書いているファイル)で利用したい gem へのパスを $LOAD_PATH へ追加します。 $LOAD_PATH への追加方法としては以下の方法があります。

  1. 環境変数 ($RUBYLIB) に指定: 環境変数を利用するごとに指定することができる。
  2. 実行時に指定: 実行時に -I/path/to/gemruby の引数に利用可能。利用するごとに指定する必要がある。
  3. 実行ファイルで指定: 設定ファイルを読み込んで実行するような場合では楽。

ここでは 実行ファイルで指定 する方法を見ていきましょう。

実行対象のプログラムは irb です。 irb~/.irbrc を読み込んで起動するため、 ~/.irbrc に以下のような設定を書きます。

# Reline 0.4.0 以上に対応した irb のバージョンチェック
if Gem::Version.new(IRB::VERSION) >= Gem::Version.new("1.9.0")
  # gem のインストールされるパスを取得。rbenv を利用している場合は以下
  # preview 判では version に previewX や 0 がついたりするので * を付与し、検索
  ld_path = File.join(ENV["RBENV_ROOT"], "versions", RUBY_VERSION + "*", "lib", "ruby", "gems", RUBY_VERSION.sub(/\d+$/, "0*"), "gems")
  # 読み込む gem 対象のパスを取得
  gem_path = File.join(Dir.glob(File.join(ld_path, "irb-theme") + "-*").last, "lib")
  $LOAD_PATH.unshift(gem_path) # LOAD_PATH に追加
  $LOAD_PATH.uniq! # LOAD_PATH に追加した重複してた場合削除
  require "irb/theme/dracula/light"
end

この設定を書いたら Ruby3.3.0-preview3 以上にして bundle exec irb と実行してみましょう。

かった!

おわり

gem は入ってるけど、プロジェクトで利用できないなあとおもい使えるようにしたいということでやってみました。 今回の irbRuby 2.2 以下だとデフォルトでインストールされているのでそもそも Reline の新しいバージョン(0.4.0)をサポートしていないのこの方法を利用してみました。

irb の補完の色がいじれるようになったのでかっこよくしてみた

2023-11-08 23:59:59 +0900

Reline0.4.0 になり、タイトルのとおり irb補完画面の色を好きなように変更できるようになりました。

変更できるようになったので dracula 風のテーマを gem としてリリースしました!!!! リポジトリは以下です!!!

katsyoshi/irb-theme-dracula - GitHub

インストール

ということで使いかたを。まずは gem i irb-theme-draculaインストール します。 ダークライト を作りました。 ダーク は明るい コンソール 向けに、 ライト は暗い コンソール 向けに作っています。 インストール後は irbrc ファイルに require "irb/theme/dracula/dark"require "irb/theme/dracula/light" を追加。

irb を実行し、補完をしてみましょう。まず、irbrc ファイルになにもかかないデフォルトの場合は以下

次に ダークrequire "irb/theme/dracula/dark" を書いた場合は以下

最後に ライト require "irb/theme/dracula/light" の場合は以下

おわり

irb も便利になってカスタマイズができるようになりました。色とか考えたくないひとは gem にして一発で決まるようにすると便利ですよ。たぶん。

新しいキーキャップ手にいれたよ!!!!

2023-06-27 23:59:59 +0900

最高だったイベント 第一回keebkaigi 行った影響で、キーボードをいじりたくなりました。 今利用している corne cherry でかなり満足しているため、 新規につくるとかはあまりやる気はないので、見た目(キーキャップ)や触った感じ(キースイッチ)を替えようかとおもいます。

見た目と触った感じ

見た目の変更としてキーキャップを海外のサイト Drop.com遊舎工房 から買いました。 買ったのは以下の4つ!

SA プロファイル1 が好きでいつものように遊舎工房へ行ったら展示品でアルファベットだけのを見つけたので即購入。 一つだけだと寂しいので、なんとなく Drop.com を眺めていたら、 SA プロファイル でいくつか安くなっていたので購入。 現時点では、MAXKEY SA PurpleDOMIKEY ABS Doubleshot SA Cyberpunk Pumper を市松模様に交互にキャップをはめて使っています。

触った感じの変更として キースイッチTalp Keyboard で買っています。

もともとは リニア と呼ばれるタイプの キースイッチ3 が好きでしたが、感触が最近飽きてきたので、 タクタイル と呼ばれるタイプの キースイッチ を利用するようになっています。さらに最近は重めの方が好きなのかもしれないという状況です。 Durock T1 Shrimp をどこか4で見かけたので購入。見た目もよく、タクタイルだったので結構気に入ってます。 KTT MatchaKBDiy hp typeDurock T1 Shrimpcorne cherryバックライトLED がきつく感じはじめたので購入。 KTT Matcha をしばらく利用してたのですが、タクタイル でもちょっと音が気になるのと、軽すぎる感じでした。 音が気になったので今時点では KBDiy hp type を利用しています。この キースイッチ は少し重いです。

ついでに TRRS ケーブル を変更しました。これは アマゾン でてきとうに

おわり

気分転換にキーボードのキースイッチとキーキャップ変更とを行ってみました! 自作キーボードはいいぞ。


  1. 背が高いプロファイルや統一された高さなど様々なプロファイルがあります。キーキャップに関することのくわしくは 自作キーボード温泉街の歩き方 の キーキャップの湯のお誘い ver2 を参考にしてください。 

  2. 2023/6/30 時点、 Talp Keyboard では販売終了。 

  3. 音が鳴るようなタイプやクリック感があるようなタイプ様々なタイプがあります。くわしくは 遊舎工房 のキースイッチの説明 を参考にしてください。 

  4. たぶん twitter.com@takkanm@talpkeyboard のついーと。 

Zellij はじめました

2023-06-19 23:59:59 +0900

はい。タイトルの通り、 Zellij をはじめてみました。 切っ掛けは以下のツイートを見つけたので。

というっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっことでね、はじめます。

Zellijとは?

Rust 製の tmux クローン。 はやってますね Rust

Install

つかってるのが Gentoo Linux なので portage からもはいります。

$ sudo emerge zellij

他の OS やソースコードからのインストール方法は公式から見て入れてください。

Customize

tmux のクローンとあり、カスタマイズもかなりできるようです。 とりあえず、起動してみましょう。

$ zellij

デフォルトでもナビがあり、簡単に利用できて便利です。が、キーバインドが気に食わないので変更しましょう。 といってもカスタムするファイルを書いていませんでしたね。初期設定を標準出力に zellij setup --dump-config で出せるので リダイレクト なり、 コピペ なりでファイルを作りましょう。保存先はどこでもいいのですが、標準で読み込んでくれる $HOME/.config/zellij/config.kdl がいいでしょう。ファイル形式は KDL となっていますがなんんもわからん。

keybinds clear-defaults=true {
  shared {
    bind "Ctrl g" { SwitchToMode "Normal"; }
  }
  normal {
    bind "Ctrl t" { SwitchToMode "Tmux"; }
  }
  tmux {
    bind "c" { NewTab; SwitchToMode "Normal"; }
    bind "o" { FocusNextPane; SwitchToMode "Normal"; }
  }
}

keybinds でキーバインドの設定がデキルのですが、 clear-defaults=true を指定してあげることで デフォルト のキーバインドを消すことができます。モードがたくさんあり、そのモードに対してそれぞれキーバインドを設定することができます。上記の例では、Normal モードで Ctrl t を押すと、Tmux モードに入ります。ここで、c を入力すると新しい tabShell が動きます。今どのモードに居るのかわからなくなっても必ず Normal モードへ Ctrl g で戻れるように shared に設定してあります。 こんな感じで設定は簡単にできます。

おわりに

かんたんに zellij の現在(2023/6/20 バージョン 0.36.0 で確認。最新バージョンは 0.37.0。)の設定をみてきました。カスタムできるのはキーバインドだけじゃなく、カラースキーム、レイアウトなどなど様々に変更できるので御参考までにーーーー。 ねむい。

趣味はvaporware造りです v.0.0.1

2023-05-25 23:59:59 +0900

RubyKaigi2023に行ってきたのは別エントリにしたのでこのエントリでは LT で話しした内容の説明などをしていこうかと思います。

Presentation

LT申し込みまで

RubyKaigi2023 松本でやるし発表もしたいが、ネタがないなとおもってたら本編の方の CFP1 が閉じられてた2。 とはいえ今年は COVID-19 の制限も無くなるから LT あるとおもうので LT 出せたらいいなあと考えてた。 そうこうしているうちに Ruby30th で今はまだないものだけど…って matz がいったものを造ろうとなりました。

LT の応募サイト開くまでにネタが幸い見つけることができ、実装をはじめることにした。

実装

ということで、通るかどうかわからないですが、発表できるように準備をはじめました。 準備といっても実際は実装どこまでできましたーというような発表にする予定だったので そのまま実装をしています。

実装予定は発表にもあった通り、以下の予定ですすめて、最後に fiddle で読み込めるように実装していました。

  1. 四則演算: Integer の計算ができること
  2. 変数: 変数が使えること
  3. 制御構文: forif などの基本的な制御構文が使えること
  4. メソッド: メソッドが定義でき、利用できこと

を目標に実装をすすめていましたのでそれぞれの進捗を

四則演算

とくに詰まる点もなく、AST をもとに assembler へ変換するだけでいけた。

変数

これが一番大変だった。教科書cherry-picking しながら進めてたために、 実装でわからん部分が出てきたのでインターネット介して gdb リモートデバッグの講習を受けながら実装。 もともとここか制御構文までで終わるだろうなあと予想してたが、SEGV 出しながらもなんとかくりあ。

制御構文

はじめは素直に if 文を実装。ここも上記の理由によりなんもわからんとなり、別の人の実装 を参考に実装。 if 文だけじゃつまんないというか、とくになにもできないのでループ文を追加しようとしました。 はじめは for 文を実装しようと考えましたが、なんとここで重大なことに気がつきました。 Rubyfor のことはなにもしらない。ということに。そういえば for x in 1..10; puts x;end とか書けるけど そもそも Range クラスや Array 作る必要あるよな?ということで一旦 for はやめに。

ということでここは while 文を実装して、fibonacci を求めることができるようになりました。

メソッド

ここは変数、制御構文ができれば作るだけなら問題はなかったように思えます。 ただほんとうに作るだけだったので、引数なし、定数を返すだけのメソッドの確認しか行なっていないです。 ここの実装にたどり着くとは思っておらず、最後のRubyKaigi直前の6連休に入ってから実装できてしまったので あんまりブラッシュアップできていないです。 引数の扱い、変数の利用、などなど確認をとれておらずにいますが動いたので fiddle で読み込めるように。

Fiddle で利用できるようにする

定義したメソッドを C言語 の関数として見えるようにしてあげればいいので、 そうしたら、あっさりとうごいてしまった3。この時点で連休の終わりの方だったのは覚えている

発表準備

もともとGW前の連休には実装を終らせてGWの連休中に発表資料作成とできたところまでの実装のブラッシュアップを 行なう予定でしたが、目標の実装が見えてるとなるとどうしても実装したくなって実装の方を進めてました。

もともと発表は Rabbit を利用して英語で行う予定でしたが、LTはとくに うちあわせのために資料を先に出すとかなかったのでとりあえず日本語で作成しました。 実装おわっていないというか実装に時間掛けすぎたのと、RubyKaigiへ持っていくPCをあたらしくしたので 冒険はできずに素直に Google スライド 利用して作成、 後日 Rabbit で清書するということにしました。

発表資料自体は 5/8 or 5/9 ぐらいに作成し終っていました。デモなしで発表練習するとちょうど時間通りに おわるのでこの資料作成完了時点ではこれでよしとしてました。 この時点でも資料はすくたなくとも英語にしようとは考えて資料は作成していました。

当日

当日の朝、資料作成というか資料の英語変換をやっていて、やっているうちに 実際発表してなにができてなにができてないみたいなこと言ったとしても なにがなんだかわからんよなとなったので急遽デモをやって、実行できること示すように少し変更しました。

当日はセッションききながらかなり緊張していました、直前のセッションのトラブルもあったので。 聞いた人はわかるとおもうのですが、発表が途中でおわったのはこういった事情があったのでああいう発表になりました。

後日

発表当日の昼飯時に、 @ukstudiocookpad のイベントとして 手を動かして振り返る RubyKaigi 2023 が5/18にあるからきてよと誘われたのでいくことにしました。 この会では、デキテイナカったデモを最後までやりきっています。

書き直し

手を動かして~ のあとに Rabbit への清書を行ないました。 いままでもいくつかの発表は Rabbit でやってたのですが、 Rabbit テーマ を作りたい作りたいと思っていたので今回は時間もあるのでつくることにしました。 とはいってもほぼ @yu_suke1994リポジトリをコピーしただけなんでうが……

まとめ

RubyKaigiLT で話ししたことをまとめました。 実装の話はもうちょっと詳しく書きたいけど、そもそも実装もすすめたいしでなかなか書けていないですね。

次回作もご期待ください 完


  1. Call For Proposal。ずっと Call For Paper だとおもってたので知ったときえってなった。 

  2. 2023-01-31 締切で完全にネタない状態だった。 

  3. もともとの発表予定ではここまでしかできなかったんですよーって濁す予定でしたが思っている以上に実装がすすんでしまった。 

RubyKaigi2023 @MATZ本

2023-05-15 23:59:59 +0900

行ってきたのでまとめます。LT やったのですが、 LT の話はまた今度。

Day -1

前日は恒例の Asakusa.rbpredrinkup に行ってました。ここでは、 nobu とかとはなししたりしてすごしました。 drinkup は次の日のため終了後すぐさま帰宅し、就寝した。

Day 0

この日は、 RubyistsOnRails というすばらしいイベント列車があったのでノータイム 1 8時の会に参加申し込み。6時に起床し、7時に出発。 会ではRubyistと話しながら、山見ながら、松本に到着。 松本に到着後飯として みよ田 という蕎麦屋に直行。 蕎麦を食べた直後、松本城へ。松本城では まつもとさん 集団を見つけたので、みんなで Matz本城 背景に記念撮影。まつもとさん一行は開発者会議があったらしく記念撮影後すぐにわかれました。 われわれは、この記念撮影後松本城観光し、もう一軒蕎麦屋へ昼食へ。二軒目の蕎麦屋は 蕎麦倶楽部佐々木 へ。

そんなことしてたら宿がチェックイン可能になったので、荷物置くのと下着類を購入しひとやすみ(10min程)。

Day 0 最大のイベント、 KeebKaigi へ!ここで豪華ノベリティを大量に頂きました!!!1とくによいのが城キーキャップで松本城を3DプリントしたISO エンターキーを頂きました。しかしながらこのキー差すキーボードがないので知人に譲る予定です。

KeebKaigi 自体もたいへん面白い Kaigi で楽しめました。とくに、 t-code の紹介のLT、頭文字Vなどよかったです。 KeebKaigi 後は懇親会には参加せず、友人とかるく夕飯をして宿へ。

Day 1

ここまででも大変楽しいものでしたが、RubyKaigi本番 はこの日から。

1日目の朝食は会場行く途中でもともと聞いていた店の 栞日 さんへ。 会場開いて登録したあとノベリティの列をみてげんなりしてたので一旦スポンサーブースをうろうろしてた。 この日聞いたセッションは以下です。

Matz Keynote

毎年恒例 Matz のキーノート。

昼飯

ランチはたまたま居合わせた6人で おきな堂 へ。名物のボルガライスとリンゴジュースを。シードルがあったので一緒にいったひとへオススメしてたりした。

The future vision of Ruby Parser

コミッターの spikelaf さんによるパーサーの開発話。魔窟じゃないよーなんかいってまいましたが、難しい問題を丁寧にひとつひとつ倒していった話をしていました。

Make Regexp#match much faster

去年 ReDoS の対応をしたコミッターの発表。正規表現の可能性を話してくれています。

High-performance real-time 3D graphics with Vulkan

Valkan を Ruby で利用できるようにした話。このあたりは LT への緊張感でほとんど覚えていないです。

Power up your REPL life with types

去年の TRICK Winner で今回の話は irb を利用しているときにどういう感じで補完が出るのか、出すためにどのような型推論を行なっているのかの話だったとおもう。

LT

しゃべった

オフィシャルパーティー

つかれたのでそこそこで帰った

Day 2

朝飯は 珈琲茶房かめのや へ。ここもワンオペで配膳されるまで少し時間がかかった。というか、朝食べくるひといないのかどこもワンオペだったので Day 3 も早めに出るようにしようとなった。

On Ruby and ꝩduЯ, or How Scary are Trojan Source Attacks

昔他の言語で話題になった Ruby のコード的には正しいが、見た目ではわからない 不正な文字が入ったときの対策のはなしでした。

Build a mini Ruby debugger in under 300 lines

300 行といったなあれは嘘だ。という話。Ruby の Debugger を200 行くらいでつくったはなしでした。

昼飯

種村 で蕎麦と岩魚と日本酒。

Revisiting TypeProf - IDE support as a primary feature

Ruby に梱包されている TypeProf が遅いので速くして、また書いている途中でもエラーがでたときどうするかとかの説明をしていました。まだ利用できていないので試したくなるものだった。

Ruby Implementation of QUIC: Progress and Challenges

Unasuke 大先生のライフワーク、 Ruby の QUIC 対応のはなし。Python での実装はどうとかのはなしで今回は実装がすすんでいるようでよかった。とはいえ道程はまだまだかかりそう。

afternoon break

お昼休憩後は Jeremy Evans や Maxime の話を聞いていたが疲れてなにも覚えていない。

Leaner Drinkup at RubyKaigi 2023

この日は Leaner さん主催の drinkup へ行きました。ここでは主に日本を飲んですごしました。でここで、spikelaf が kaigi でも話してた lrama が Ruby 本体のとりこまれ、 Ruby 3.3.0-preview1 がリリースされました!なんかさわいでるなと思たらリリース作業シテイタトハ… drinkup 終了後は onk とふたりで近所のワインバーへ行き、軽くのんで宿へ帰りました。

宿帰ったら ESM さんのノベリティの Rubyメソッドかるた でみんなでわいわいしながら遊んでました。

Day 3

この日の朝食は 山山食堂 というところでしました。

Committers and the Worldのあと

今回は Matz本 ということで会場にいる「まつもとさん」一同会して写真を撮ることを目的としてあつめてました。写真は以下になります

Ruby + ADBC - A single API between Ruby and DBs

須藤さん の発表で、 ADBC で DB へ接続し、さらのその接続からのよみかきの高速化のはなしでした。あいかわらずすごいなと思いながら聞いていました。

Ruby JIT Hacking Guide

国分さん の新作 RubyJIT。PRみた感じだとやってるネタにてるなあとおもってたけど、アプローチがすこし違い、またこちらは直接ELFを書いているようなのでまだちがうようだ。とはいえ今やっていることは似ているのであとで参考にしよう。

After Party and Music Mixin

STORESさんアフターパティーpixivさんruby music mixin にいってきました。両方ともサイコーでした!!!!

Day 4

一人で野沢温泉村いって温泉はいって、ジンのんで、ビールのみいこうと一旦山おりたら温泉にしか飲むとこなかったのでもどったりして帰りました。

おわり

今回のRubyKaigi久しぶりのFull開催で大変楽しめたのですが、LTとは言えはじめての発表があり、心から楽しめたかというとあれですが、すごく楽しかったし、刺激になりました。来年の那覇は本編に出せるようになんとか精進します!!!


  1. 海外の人が登録して行ったほうがいいんじゃないかと一瞬思った 

趣味は vaporware 造りですv0.0.0

2023-03-21 13:59:59 +0900

プログラマー三大勉強はしたけど、実装はしたことないものといえば CPU、OS、コンパイラーなのです1が、先日 ruby30th 誕生日会のキーノートで matz が “Static Compiler for Ruby” という今はまだない vaporware として 挙げていたのでこの static compiler を作ろうとなりました。

katsyoshi/vaporware - GitHub

Goal

Ruby のコードを static compile できるようにする。

コンパイル先のターゲットは x86 とします。 ARMRISC-V などは今回の実装ではターゲットにしないです。

とはいえすべての Ruby の機能を実装すると時間がかかりすぎるので個人で無理のない範囲 で作ろうとします。無理のない実装範囲は以下なのかなと

  1. 四則演算
  2. 変数
  3. メソッド
  4. 制御構文
  5. プリミティブ型

この5つの機能を実装する予定です。

実現する機能以外のことについて

5つの機能を実現すること以上のことはやらない予定です。 やらないこととしては 最適化GC 、 外部ファイルで定義したメソッドやクラスの読み込みは実装しない予定です。 実装しない個人的意見を以下に書いていきます。

最適化は Ruby のコードを単純に 機械語 におとしただけでは現在の RubyVM より速くならないと考えているからです(要確認)。 LLVM IR などへの変換ではなく、 機械語 なのは LLVM をインストールする必要があるなどして 面倒なのが大きいです2。あとバージョン毎に LLVM IR が異なるのも現状では対応しにくい点となっています。

GC (Garbage Collection: ガベージコレクション) についてはそもそもクラスをサポートできない、 変数などのメモリを確保しておく時間が長いプログラムを対象としないので今回はスコープ外としています。

外部ファイル読み込みについてですが、外部ファイルの読み込みして コンパイル するだけなら そこまで問題にはならないと考えていますが、外部ファイルで定義された メソッドクラス を 事前に コンパイル して最後に リンク するのは型が不定になるのでサポートするのは難しいと考えています。

実装方針

Goal までの実装は 低レイヤを知りたい人のためのCコンパイラ作成入門 を参考にすすめていきます。 最初に コンパイラー を実装するものとして C 言語 がたぶん勉強してきてうかぶと思います3C 言語 だと 機械語VM のバイトコードへ落とすことのできる資料が多いので選択しています。 とは言っても Ruby からの脳内変換はある程度必要なので慣れているというのもあります。

実装としては AST(Abstract Syntax Tree: 構文抽象木) から愚直に x86 アセンブラ をファイルへ書き出し、 そこから C コンパイラー (gcc or clang) をつかって機械語へ コンパイル します。 フルフルの Ruby を実装するわけじゃないので依存する gem の依存も極力減らしたいです。

実装環境

  • CPU: Ryzen Thread Ripper 1950x
  • gcc: 12.2.1
  • clang: 16.0.0
  • OS: Gentoo Linux
  • Linux Kernel: 6.2 系

パーサー

まず、AST を得るために パーサー が必要なのですが、 Ruby の構文は複雑なのでここは頑張らないようにします。ここをどうやって解決するのかというと RubyVM::AbstractSyntaxTreeRipper をつかうのか、parser.gem をつかうのかを決めるひつようがあります。今回というかしばらくは parser.gem を利用して AST を得ることにします。 ゆくゆくは RubyVM::AbstractSyntaxTree への置き替えはするよていです。

ここはそのまま parser.gem のチュートリアルどおりにすれば AST が得られます。

require "parser/current"

puts Parser::CurrentRuby.parse("(1 + 2) * 3 / (5 - 4)")

きょうはここまで

とりあえず手を動かしはじめましたが、ななななんと、似たような機能が実は Ruby 3.3 向けに JIT として入ったようです4。 ということでねこの話はね、勉強の話しかないんですが一旦 Goal まで作ってみましょうね。


  1. 個人差があります。 

  2. Gentoo Linux 使っているので毎回コンパイルしているので本当にめんどう。バイナリあるよとかそういう正論は受け付けていないです。 

  3. 時代によって変わるかも。Java だったり、Lisp だったりする人がいるかも。 

  4. https://github.com/ruby/ruby/pull/7448 

Update rubygems using Rust for Ruby 3.2

2023-01-03 23:59:59 +0900

以前このブログRust を利用して rubygems を作成した rust_uuidRuby 3.2 がリリース によりコンパイルできなくなったのでその修正顛末。

環境

system failed version succeed version
ruby 3.2.0 3.2.0
gem 3.4.1 3.4.2
bundler 2.3.19 2.4.2
rb-sys 0.9.29 0.9.53
magnus 0.3.2 0.4.4

what’s happened?

Ruby 3.2 が出てたのでアップデートして試してみるかーとおもいコマンドを実行!!!!

$ bundle exec rake build
.
.
...
error[E0425]: cannot find value `RUBY_ABI_VERSION` in the crate root
  --> /path/to/cargo/dir/registry/src/github.com-1ecc6299db9ec823/rb-sys-0.9.29/src/ruby_abi_version.rs:14:73
   |
14 | pub const __RB_SYS_RUBY_ABI_VERSION: std::os::raw::c_ulonglong = crate::RUBY_ABI_VERSION as _;
   |                                                                         ^^^^^^^^^^^^^^^^ not found in the crate root

For more information about this error, try `rustc --explain E0425`.
error: could not compile `rb-sys` due to previous error
warning: build failed, waiting for other jobs to finish...
gmake: *** [Makefile:564: target/release/librust_uuid.so] エラー 101
rake aborted!
Command failed with status (2): [/usr/bin/gmake...]
/path/to/rbenv/versions/3.2.0/bin/bundle:25:in `load'
/path/to/rbenv/versions/3.2.0/bin/bundle:25:in `<main>'
Tasks: TOP => build => compile => compile:x86_64-linux => compile:rust_uuid:x86_64-linux => copy:rust_uuid:x86_64-linux:3.2.0 => tmp/x86_64-linux/rust_uuid/3.2.0/rust_uuid.so
(See full trace by running task with --trace)
bundle exec rake build  63.55s user 10.61s system 541% cpu 13.705 total

おーなるほどなるほど、 cargorb-sysRuby 3.2 に対応していないバージョンつかってるんだなと理解。cargo を更新っするぞい。

うpだて cargo ぱっけーじ

ということで cargo build が通るようにパッケージを更新するぞい。 cargobundler 同様、 cargo update でいい感じにアップデートしてくれます。

$ cd ext/rust_uuid
$ cargo update
$ cargo build
   Compiling magnus v0.3.2
error[E0432]: unresolved import `crate::ruby_sys::ruby_rstring_consts`
  --> /path/to/cargo/dir/registry/src/github.com-1ecc6299db9ec823/magnus-0.3.2/src/r_string.rs:23:47
   |
23 | use crate::ruby_sys::{rb_str_to_interned_str, ruby_rstring_consts::RSTRING_EMBED_LEN_SHIFT};
   |                                               ^^^^^^^^^^^^^^^^^^^ could not find `ruby_rstring_consts` in `ruby_sys`

error[E0599]: no variant or associated item named `RSTRING_EMBED_LEN_MASK` found for enum `ruby_rstring_flags` in the current scope
   --> /path/to/cargo/dir/registry/src/github.com-1ecc6299db9ec823/magnus-0.3.2/src/r_string.rs:368:38
    |
368 |             f &= ruby_rstring_flags::RSTRING_EMBED_LEN_MASK as VALUE;
    |                                      ^^^^^^^^^^^^^^^^^^^^^^ variant or associated item not found in `ruby_rstring_flags`

error[E0599]: no variant or associated item named `RSTRING_EMBED_LEN_MASK` found for enum `ruby_rstring_flags` in the current scope
   --> /path/to/cargo/dir/registry/src/github.com-1ecc6299db9ec823/magnus-0.3.2/src/r_string.rs:968:42
    |
968 |                 f &= ruby_rstring_flags::RSTRING_EMBED_LEN_MASK as VALUE;
    |                                          ^^^^^^^^^^^^^^^^^^^^^^ variant or associated item not found in `ruby_rstring_flags`

Some errors have detailed explanations: E0432, E0599.
For more information about an error, try `rustc --explain E0432`.
error: could not compile `magnus` due to 3 previous errors

cargo update しましたが、やっぱり駄目でしたね。今度は magnus が駄目そう。 Cargo.toml を見てみると、 magnus = { version = "0.3", features = ["rb-sys-interop"] } と指定してあり、 version 0.3 系が駄目そうということが類推されます。ということで公式ページを見ると新しいバージョンが出ているのでこちらにします。

--- a/ext/rust_uuid/Cargo.toml
+++ b/ext/rust_uuid/Cargo.toml
@@ -10,7 +10,7 @@ crate-type = ["cdylib"]
 [dependencies]
 rb-sys = "0.9"
 rb-allocator = "0.9"
-magnus = { version = "0.3", features = ["rb-sys-interop"] }
+magnus = { version = "0.4", features = ["rb-sys-interop"] }

 [dependencies.uuid]
 version = "1.1.2"

再度ビルド!

$ cargo update
$ cargo build
   Compiling rust_uuid v0.1.0 (/home/katsyoshi/Program/Ruby/rust_uuid/ext/rust_uuid)
    Finished dev [unoptimized + debuginfo] target(s) in 0.18s

おおっ通りました!やったね!

build

ということ cargo build 通ったので gem install しましよう。

$ cd /path/to/rust_uuid
$ bundle exec rake build
cd tmp/x86_64-linux/rust_uuid/3.2.0
/usr/bin/gmake
generating target/release/librust_uuid.so (release)
cargo rustc --target-dir target --manifest-path ../../../../ext/rust_uuid/Cargo.toml --lib --release -- -C linker=gcc -L native=/path/to/rbenv/versions/3.2.0/lib -L native=/path/to/rbenv/versions/3.2.0/lib -L native=/home/katsyoshi/.local/lib:-L/home/katsyoshi/.local/lib: -C link-arg=-lm -l pthread
   Compiling libc v0.2.139
   Compiling proc-macro2 v1.0.49
   Compiling quote v1.0.23
   Compiling unicode-ident v1.0.6
   Compiling clang-sys v1.4.0
   Compiling regex-syntax v0.6.28
   Compiling syn v1.0.107
   Compiling rb-sys-env v0.1.1
   Compiling libloading v0.7.4
   Compiling nom v7.1.2
   Compiling aho-corasick v0.7.20
   Compiling magnus v0.4.4
   Compiling bindgen v0.60.1
   Compiling getrandom v0.2.8
   Compiling uuid v1.2.2
   Compiling cexpr v0.6.0
   Compiling regex v1.7.0
   Compiling magnus-macros v0.3.0
   Compiling rb-sys-build v0.9.53
   Compiling rb-sys v0.9.53
   Compiling rb-allocator v0.9.6
   Compiling rust_uuid v0.1.0 (/path/to/rust_uuid/ext/rust_uuid)
    Finished release [optimized] target(s) in 12.03s
cd -
mkdir -p tmp/x86_64-linux/stage/lib/rust_uuid
/usr/bin/gmake install target_prefix=
generating target/release/librust_uuid.so (release)
cargo rustc --target-dir target --manifest-path ../../../../ext/rust_uuid/Cargo.toml --lib --release -- -C linker=gcc -L native=/path/to/rbenv/versions/3.2.0/lib -L native=/path/to/rbenv/versions/3.2.0/lib -L native=/home/katsyoshi/.local/lib:-L/home/katsyoshi/.local/lib: -C link-arg=-lm -l pthread
    Finished release [optimized] target(s) in 0.02s
installing rust_uuid.so to /path/to/rust_uuid/lib/rust_uuid
/usr/bin/install -c -m 0755 rust_uuid.so /path/to/rust_uuid/lib/rust_uuid
cp tmp/x86_64-linux/rust_uuid/3.2.0/rust_uuid.so tmp/x86_64-linux/stage/lib/rust_uuid/rust_uuid.so
rake aborted!
Running `gem build -V /path/to/rust_uuid/rust_uuid.gemspec` failed with the following output:

WARNING:  description and summary are identical
WARNING:  open-ended dependency on benchmark-ips (>= 0, development) is not recommended
  use a bounded requirement, such as '~> x.y'
WARNING:  open-ended dependency on rake (>= 13.0.0, development) is not recommended
  if rake is semantically versioned, use:
    add_development_dependency 'rake', '~> 13.0', '>= 13.0.0'
WARNING:  open-ended dependency on rake-compiler (>= 0, development) is not recommended
  use a bounded requirement, such as '~> x.y'
WARNING:  open-ended dependency on rb_sys (>= 0, development) is not recommended
  use a bounded requirement, such as '~> x.y'
WARNING:  open-ended dependency on rspec (>= 0, development) is not recommended
  use a bounded requirement, such as '~> x.y'
WARNING:  See https://guides.rubygems.org/specification-reference/ for help
ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
    You have specified rust based extension, but Cargo.lock is not part of the gem files. Please run `cargo generate-lockfile` or any other command to generate Cargo.lock and ensure it is added to your gem files section in gemspec.

/path/to/rbenv/versions/3.2.0/bin/bundle:25:in `load'
/path/to/rbenv/versions/3.2.0/bin/bundle:25:in `<main>'
Tasks: TOP => build
(See full trace by running task with --trace)
bundle exec rake build  32.87s user 4.33s system 291% cpu 12.741 total

なるほど? Cargo.lock ファイルもあるし問題なさそうだな。よくわからんので rubygems のリポジトリでエラーメッセージを探してみます。

すると以下のようなコード

  def validate_rust_extensions(builder) # :nodoc:
    rust_extension = @specification.extensions.any? {|s| builder.builder_for(s).is_a? Gem::Ext::CargoBuilder }
    missing_cargo_lock = !@specification.files.include?("Cargo.lock")

    error <<-ERROR if rust_extension && missing_cargo_lock
You have specified rust based extension, but Cargo.lock is not part of the gem files. Please run `cargo generate-lockfile` or any other command to generate Cargo.lock and ensure it is added to your gem files section in gemspec.
    ERROR
  end

なろほどなろほど、プロジェクトの root 直下に置いておく必要があるのね。でもそのファイルどういうものなの?

gem, bundler update

ってなわけで、今度は正式に rubygems で正式にサポートされ、 bundler でも gem を作成するときにも bundle gem --ext=rust gem_nameスケルトンが作成されるようになりました。ということでこれを利用して Cargo.toml を作ってみましょう

$ bundle gem --mit --ext=rust gem_name
ERROR: "bundle gem" was called with arguments ["rust", "gem_name"]
Usage: "bundle gem NAME [OPTIONS]"

ok, ok, これは bundler のバージョンが古いな

$ bundle version
Bundler version 2.3.19 (2022-07-27 commit 4f496f93e6)

さっきの PR は入ったのは Ruby 3.2 リリース直前なのでまだ入ってないよなとおもったけど、実際は Gemfile.lockBUNDLED WITH2.3.19 を指定してるだけだったのです。 なので対象の 2 行を削除して bundle update を実行し、続いて rust サポートした gem を生成して、 Cargo.toml を見てみましょう。

$ bundle gem --mit --ext=rust gem_name
Creating gem 'gem_name'...
MIT License enabled in config
Changelog enabled in config
Initializing git repo in /path/to/rust_uuid/gem_name
      create  gem_name/Gemfile
      create  gem_name/lib/gem_name.rb
      create  gem_name/lib/gem_name/version.rb
      create  gem_name/sig/gem_name.rbs
      create  gem_name/gem_name.gemspec
      create  gem_name/Rakefile
      create  gem_name/README.md
      create  gem_name/bin/console
      create  gem_name/bin/setup
      create  gem_name/.gitignore
      create  gem_name/.github/workflows/main.yml
      create  gem_name/LICENSE.txt
      create  gem_name/CHANGELOG.md
      create  gem_name/Cargo.toml
      create  gem_name/ext/gem_name/Cargo.toml
      create  gem_name/ext/gem_name/extconf.rb
      create  gem_name/ext/gem_name/src/lib.rs
Gem 'gem_name' was successfully created. For more information on making a RubyGem visit https://bundler.io/guides/creating_gem.html
$ cat Cargo.toml
# This Cargo.toml is here to let externals tools (IDEs, etc.) know that this is
# a Rust project. Your extensions depedencies should be added to the Cargo.toml
# in the ext/ directory.

[workspace]
members = ["./ext/gem_name"]
resolver = "2"

というようなファイルが得られるので真似して作成しちゃいましょう。

[workspace]
members = ["./ext/rust_uuid"]
resolver = "2"

そうしたらもう一度ビルドしてしまいます!

$ cargo generate-lockfile
$ git add Cargo.toml Carog.lock
$ bundle exec rake build
/usr/bin/gmake install target_prefix=
generating target/release/librust_uuid.so (release)
cargo rustc --target-dir target --manifest-path ../../../../ext/rust_uuid/Cargo.toml --lib --release -- -C linker=gcc -L native=/path/to/rbenv/versions/3.2.0/lib -L native=/path/to/rbenv/versions/3.2.0/lib -L native=/home/katsyoshi/.local/lib:-L/home/katsyoshi/.local/lib: -C link-arg=-lm -l pthread
   Compiling rust_uuid v0.1.0 (/path/to/rust_uuid/ext/rust_uuid)
    Finished release [optimized] target(s) in 0.26s
installing rust_uuid.so to /path/to/rust_uuid/lib/rust_uuid
/usr/bin/install -c -m 0755 rust_uuid.so /path/to/rust_uuid/lib/rust_uuid
cp tmp/x86_64-linux/rust_uuid/3.2.0/rust_uuid.so tmp/x86_64-linux/stage/lib/rust_uuid/rust_uuid.so
rust_uuid 0.1.0 built to pkg/rust_uuid-0.1.0.gem.
$ bundle exec rake install
/usr/bin/gmake install target_prefix=
generating target/release/librust_uuid.so (release)
cargo rustc --target-dir target --manifest-path ../../../../ext/rust_uuid/Cargo.toml --lib --release -- -C linker=gcc -L native=/path/to/rbenv/versions/3.2.0/lib -L native=/path/to/rbenv/versions/3.2.0/lib -L native=/home/katsyoshi/.local/lib:-L/home/katsyoshi/.local/lib: -C link-arg=-lm -l pthread
    Finished release [optimized] target(s) in 0.03s
installing rust_uuid.so to /path/to/rust_uuid/lib/rust_uuid
/usr/bin/install -c -m 0755 rust_uuid.so /path/to/rust_uuid/lib/rust_uuid
cp tmp/x86_64-linux/rust_uuid/3.2.0/rust_uuid.so tmp/x86_64-linux/stage/lib/rust_uuid/rust_uuid.so
$ bundle exec ruby -rrust_uuid -e 'puts RustUUID.v4'
2eb053de-8ae7-4669-853b-95f06c872300

ようやっと通ったああぁあ!!!!

conclusion

実際は11月の末あたりに head でコンパイルできないなあと気がついていたのですが、そのうち直るやろと思っててなにもしなかったのです。いざ Ruby 3.2 がリリースされたときに試して動かなかったのでやっと対応してみました。

ということで正式に Rust がサポートされるようになったのでまた YARUKI がでてきますね。

それはそうと今度は、jekyllRuby 3.2 で動かなくなった。

お名前ドットコムのメールがうざすぎたので DNS を Cloudflare に移行して快適生活

2022-10-15 23:59:50 +0900

katsyoshi.org の登録先を お名前ドットコム にしてたけど、広告のようなメールとか届くし 更新案内と広告の違いがわからない感じのメールが大量にくるのでやめようやめようと思ってたのでいいかげん変えてみた話。

準備

準備として移行先のレジストラを選定します。 移行先としては普通のレジストラとクラウド業者がやっているレジストラがあると思いますが、今回は以下3つを候補にしました。

  1. Google Domains: Google がやっているやつ。メールとか Google なんで DNS まで Google にするのは心理的抵抗が強い。
  2. Route 53: みんなつかってる AWS のサービス。仕事で利用しているので、プライベートは別のがいいかな。
  3. Cloudflare の DNS: みんなだいすき低価格 CDN 業者の Cloudflare がやってる DNS サービス。

GoogleAWS は言わずと知れた巨大企業でサービスがなくなるということはないとおもうが、 仕事で利用したり、情報全部預けたりしているところなので選択する理由が個人的には弱い。 個人利用でガンガン変えたり、 VPC でネットワーク構築するわけじゃないので Cloudflare でいいかなと。

お名前ドットコムでの作業

レジストラを移管する前に現在登録してある WHOIS 情報 を確認します。 これは移管作業で移管作業用コードが WHOIS 登録者にメールが送られてくるのでどのメールアドレスかの確認です。 ここでWHOIS 情報公開代行 を利用している場合は、 WHOIS を一旦登録時のものに変更します1

移管

移管作業としては新規レジストラで移管依頼を参考に移管依頼ページを開きます。 開いたら、旧サービスから移管コードの発行を行ないます2。 移管コードを Cloudflare 側で入力してしばし待機。

しばらくしたら、レコードが登録されるので完了です。

おわり

ということで DNS の登録を Cloudflare へ移管しました。 お名前ドットコム はあのメールさえなければ続けたのかもしれない。 が更新警告と普通のメールの違いがあまりにもわからないので捨てることにしました。 Cloudflare で不満があったらまた変更すると思いますが、快適な生活になりました(たぶん


  1. 前に移行しようとしたとき、.org のドメインは WHOIS 情報書き変えられなくて移行失敗。現在この制限はなくなったので移行。 

  2. こいつが見つけにくく、お名前ドットコムからは見つけられずに移管レポートブログから発見。 

Communicate on IPv6 from home

2022-10-12 23:59:50 +0900

家のネットワークからインターネットへ出るとき IPoE を使ってたけど、家庭内 LAN のネットワークは IPv6 を off にしていた。 この LAN 内 IPv6 化していなかった理由としては、昔 Linux (だけじゃないかも)が IPv6 が利用できる状態だと 先に IPv6 で繋ぎにいこうとして IPv6 で通信できなかったら IPv4 にフォールバックするという挙動で、すごくストレスフルだった。 この挙動の対処として、カーネルレベルで IPv6 を off にしてました。 そうこうしているうちに契約している ISP が IPv6 オプションなしで IPoE を利用できるようになったので、 とりあえず IPoE だけを利用できるようにして、家庭内の LAN はそのままという状態にしていました。 いいかげんこの家庭内 LAN のネットワークを IPv6 化し、インターネットと IPv6 で通信できるようにした顛末をのこす。のこします。

家庭内 LAN 環境

  • ゲートウェイ: NEC IP38X/1210 (YAMAHA RTX1200)
  • PC: 6.0.0-gentoo

IPoE 化と家庭内 LAN の IPv6 化

設定は YAMAHA の設定例集に載ってあるのでそれを参考にします。 IPoE 化はこの設定例でいけるのですが、どうも設定したときにミスったらしく、 LAN の IP アドレスが IPv4 ではインターネットへ出ることができるが、 IPv6 ではインターネットへ出ることができない状態になってしまいました。

旧設定

どのような設定だったかは以下に

ip route default gateway tunnel 1
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 prefix ra-prefix@lan2::/64
ipv6 lan1 rtadv send 1
ipv6 lan1 dhcp service server
ipv6 lan2 address auto
ipv6 lan2 secure filter in 1010 1011 1012 2000
ipv6 lan2 secure filter out 3000 dynamic 100 101 102 103 104 105 106
ipv6 lan2 dhcp service client ir=on
ngn type lan2 ntt
tunnel select 1
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e00::feed:100
 tunnel enable 1
ipv6 filter 1010 pass * * icmp6 * *
ipv6 filter 1011 pass * * tcp * ident
ipv6 filter 1012 pass * * udp * 546
ipv6 filter 2000 reject * * * * *
ipv6 filter 3000 pass * * * * *
ipv6 filter dynamic 100 * * ftp
ipv6 filter dynamic 101 * * domain
ipv6 filter dynamic 102 * * www
ipv6 filter dynamic 103 * * smtp
ipv6 filter dynamic 104 * * pop3
ipv6 filter dynamic 105 * * tcp
ipv6 filter dynamic 106 * * udp

この設定ではインターネットとは IPv4 でしか通信できていない状態でした。 でこのトラブルシュートとして知人(@n_kane, @paina) のちからを借りてどこまで通じてどこから通じないかを確認しました。

troubleshooting

とりあえず ping6traceroute6 で通じていないことを確認します。

$ ping6 -c 3 google.com

PING  google.com(nrt13s55-in-x0e.1e100.net (2404:6800:4004:824::200e)) 56 データ長(byte)

--- google.com ping 統計 ---
送信パケット数 3, 受信パケット数 0, パケット損失 100%, 時間 2067ミリ秒

$ traceroute6 google.com
traceroute to google.com, 30 hops max, 80 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *

通ってないですね。 先述したように PC は IPv6 を on にしたばかりなのでクライアント側の設定でブロックしていないかを確認します。 まずクライアント側で考えられるのは iptables でのパケットフィルタリングですね。 ルーターの下にある PC なので、ここでブロックすることは低いのですが、確認します。

# ip6tables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

なにもフィルタリングしていないですね。 ということで、クライアント側には問題なさそうですね。 どこまで通じてどこまで通じていないのか別のエンドポイントで確認します。

まず、手元と相手で tcpdump 利用してパケットが送っているか届いているかを確認します。

# tcpdump -nei enp8s0f0 icmp6
dropped privs to pcap
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on enp8s0f0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
22:35:41.158558 00:a0:de:69:40:9d > 33:33:ff:51:5e:63, ethertype IPv6 (0x86dd), length 86: fe80::212:e2ff:fe70:6144 > ff02::1:ff51:5e63: ICMP6, neighbor solicitation, who has 2409:10:a5c0:1f00:d903:ddb5:851:5e63, length 32
22:35:58.765783 ee:60:51:38:43:9c > 33:33:ff:00:00:01, ethertype IPv6 (0x86dd), length 86: 2409:10:a5c0:1f00:5ce3:afcb:9bb2:5c1b > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has 2409:10:a5c0:1f00::1, length 32
22:36:09.249427 ee:60:51:38:43:9c > 33:33:ff:00:00:01, ethertype IPv6 (0x86dd), length 86: 2409:10:a5c0:1f00:5ce3:afcb:9bb2:5c1b > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has 2409:10:a5c0:1f00::1, length 32

送れてはいるようで対向側にも届いていたらしく戻りのパケットは送ってたようですが、手元では戻ってくるパケットは見えていないですね。

ということはやはりルーターの設定が悪そうということが推察されますね。 設定のどこが悪いのかあやしいところを見ていきます。

最初に怪しいとおもったのはルーターのフィルターまわりです。一旦、no ipv6 interface secure filer in で全部無効化しましょう。しかしとくに変りはないです。これはフィルターが原因ではなさそうですね。

次にあやしい点は以下2つの設定

  1. ipv6 interface address
  2. ipv6 interface prefix

上のコマンドは ISP から自動で振ってきている IP を割り当てる設定で、下のコマンドは ISP から振ってきた IPv6 のプレフィックスを付けるようにするための設定となります。 どうもこの下のコマンドが邪魔なようです。 no ipv6 interface prefix で無効化できるので一旦外してみましょう。 すると

$ ping6 -c 3 google.com
PING google.com(nrt20s18-in-x0e.1e100.net (2404:6800:4004:81c::200e)) 56 データ長(byte)
64 バイト応答 送信元 nrt20s18-in-x0e.1e100.net (2404:6800:4004:81c::200e): icmp_seq=1 ttl=57 時間=6.53ミリ秒
64 バイト応答 送信元 nrt20s18-in-x0e.1e100.net (2404:6800:4004:81c::200e): icmp_seq=2 ttl=57 時間=2.73ミリ秒
64 バイト応答 送信元 nrt20s18-in-x0e.1e100.net (2404:6800:4004:81c::200e): icmp_seq=3 ttl=57 時間=2.81ミリ秒

--- google.com ping 統計 ---
送信パケット数 3, 受信パケット数 3, パケット損失 0%, 時間 2002ミリ秒
rtt 最小/平均/最大/mdev = 2.731/4.023/6.532/1.773ミリ秒

のように通りました!勝ったッ!第三部完!

おわり

以前中途半端に設定したおかげで IPv6 有効化に時間が掛ってしまった顛末をまとめました。 これで家のネットワークから IPv6 で通信できるようになりました。 ありがとうございました!

次回 katsyoshi.org お名前.COM やめるってよ