@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Windows上でWSLを使った開発環境を作る

WSLも仮想マシン(?)なので、MacでのDockerと同じくファイルの同期が遅いようです。 そこでDeveloping in the Windows Subsystem for Linux with Visual Studio Code を参考にして、ファイルをWSL上で置いて、Windows上のVSCodeから編集出来るようにします。

この手順はとても簡単です。 VSCodeRemote Development - Visual Studio Marketplaceをいれて、WSLからcode .を実行すれば、それで終わりです。

WSL上に開発環境をつくるのに、ほかにもいろいろなツールを入れます。 そのメモを残します。

WSL

WSL のインストール | Microsoft Docs

wsl --install

を実行すれば良いようです。

f:id:ledsun:20211102221906p:plain
WSLをインストール中

あっさりいきすぎてあまりよく覚えていません。

sudo apt update && sudo apt upgrade

忘れがちですが、パッケージの更新はしておきましょう。

Windows Terminal

コマンドプロンプトとかPowerShellとか使い分けるのが難しいですし、見た目もちょっと微妙なのでWindows Terminalを入れます。

www.microsoft.com

Windows Terminalはタブで複数のセッションが開けます。

f:id:ledsun:20211102222243p:plain
タブでいろいろなターミナルが開けます

僕はPowerShellはあまり上手く使いこなせていないので、既定のシェルをUbuntuに設定すると便利です。

デフォルトだとUbuntuの新しいセッションをはじめた時に、ディレクトリがWindows側のホームディレクトリになります。 WSL側のホームディレクトリになって欲しいので、 Start Windows Terminal in WSL2 home directory – Dan O'Sullivan's blog を参考にして設定しました。

f:id:ledsun:20211102222655p:plain
コマンドラインbash.exe ~に設定

どういう仕組みでディレクトリが変わるのか、まるでわかっていません。

Node.js

WSL 2 上で Node.jis を設定する | Microsoft Docs

ubuntuの場合は、Node.jsを直接インストールするとnpm i -gするときにsudoを求められます。 とくにバージョンにこだわりがない場合でも、nvmを使うのが無難です。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

Nodeの最新版を入れるとwebpackの実行時にエラーが出ました。 Webpack build failing with ERR_OSSL_EVP_UNSUPPORTED - Stack Overflow を参考にしてLTSを入れました。

ターミナルを開き直して

nvm install --lts

を実行します。

Ruby

RubyMacでrbenv + ruby-buildを使っています。 Install/Use rbenv (Ruby) on Windows 10 Linux WSL(2) | by Hervé Leclerc | alter way | Mediumを参考にして同じ環境を作ります。

ubuntuの場合はデフォルトでは.bash_profileがありません。 追加すると、bashrcが読まれなくなります。 パスは.bashrcに追加します。

echo 'export PATH=$HOME/.rbenv/bin:$PATH' >> ~/.bashrr

GitHub - rbenv/rbenv: Groom your app’s Ruby environment

これだとrubyが見つからないので、

eval "$(rbenv init - bash)"

も.bashrcに追加します。

Fork

Git用にForkを使っています。 Launch git-fork app from WSL - DEV Communityに従ってalias fork='/mnt/c/Windows/System32/cmd.exe /c "%USERPROFILE%\\AppData\Local\Fork\Fork.exe "$(wslpath -w -a .)'を設定すれば、WSLの任意のディレクトリからForkが起動できます。

ただ、次のリンクにあるように、ファイルのモードの違いが変更として検出されます。

差分管理として使うのは、ちょっと怪しいです。 今のところ、コミットはVSCodeのGit機能を使って、Forkは対話リベースにだけ使っています。

open-cli

これは入れたというか、前から使っていたのを試しにつかったら動いて驚きました。

npx open-cli 'http://localhost:8000/dev/development.html'

で、Windows側のブラウザ開くんすよ。びっくりー

GitHub - sindresorhus/open: Open stuff like URLs, files, executables. Cross-platform.

Supports WSL paths to Windows apps.

すごい

あとやりたいと思っていること

感想

思ったより、環境設定で困りませんでした。 プログラマとして、WindowsとWSLだけで生きていくことも出来そうな気がしてきました。

JUDGE EYES:死神の遺言 Remastered

4月30日に買って、約半年ようやく終わった。 何も知らないのではじめたのでもっと短いエピソードだと勝手に思ってたんです。 予想より長くて複雑なお話でした。

サイドケースと呼ばれる、本筋と関係ない探偵のお仕事もモリモリだし。 追いかけるシーンで、しっかり「ちょ、待てよ!」と小ネタが入ってたりボリューム満点でした。 プレイ時間は80時間くらいだったと思います。

割と三枚目的なシーンもあったりして、キムタクもこういう役やるんだなーっと新鮮でした。

天才王子の赤字国家再生術10

9巻まで読み直すのが大変でした。

今回は成長した主人公の妹フラーニャ様が活躍する回でした。 フラーニャ様が有能キャラになったことで、主要キャラクターが舞台にそろったのでしょうか? フラーニャ様が正統派ヒーローになった、一方で、主人公のウェインがダークヒーローっぽいポジションに移り、 ここがクライマックスにむけて折り返しなのかもしれません。 先が楽しみです。

主人公の目指すゴールが明かされていないので、終着点をどこにもってくるのかは、推測できません。 また、主人公とヒロイン達の関係もどこら辺に落ち着くのか、推測できません。 謎です。

1月からアニメ化するようです。 一巻は最初の山場まで、テンポ良く進むので、 今回のクールで1巻全部出来ると、テンポが良くて良さそうです。

.NET FrameworkのPrintPreviewControl.Documentプロパティは.NET 4からInvalidatePreviewメソッドを呼ぶ

とあるアプリケーションの対象とする.NET Frameworkのバージョンを上げたところ

printPreviewControl.Document = pd;

という、一見、副作用がなさそうなソースコードの有無で振るまいが変わるようになりました。

調べてみたら、表題の通り、PrintPreviewControl.Document プロパティに値をセットしたときに

  • .NET 2 ~ 3.5 の間で InvalidatePreview メソッドが呼ばれない
  • .NET 4 以降は InvalidatePreview メソッドが呼ばれる

という違いを確認しました。

検証用のリポジトリ は次です。

github.com

参考

ヘッドセットとMacBook ProのBluetooth接続が上手く行かない

現象

現象は次の動画の通り。

gyazo.com

一度接続します。 20秒経つと切断されます。

型番

  • MacBook Pro (15-inch, 2018)
  • AfterShokz OpenMove AFT-EP-000022

OpenMoveの1世代前の型です。

試したこと

mac - Bluetooth headphones disconnect a few seconds after connecting on macOS - Ask Different

Try resetting the Bluetooth module.

Shift-Option click the BT menu bar item > Debug > Reset the Bluetooth module.

とあるので、やってみました。

f:id:ledsun:20211029090912p:plain
Bluetoothモジュールをリセット

ダメでした。

ほかに試してダメだったこと

  • MacBook Proの再起動
  • ヘッドセットのリセット

上手く行く組み合わせ

ほかの手元にあるMDR-1000XはMacBook ProBluetooth接続が出来ました。 MacBook ProBluetoothモジュールが壊れているわけではなさそう。

AfterShokz OpenMove AFT-EP-000022はWindows PCやAndroidとのBluetooth接続が出来ました。 AFT-EP-000022側の問題でもなさそう。

AfterShokz OpenMove AFT-EP-000022の機種か個体との相性なのでしょうか?

20211220追記

試したら繋がりました。Mac側で何かしらアップデートがあったのでしょうか?原因は謎です。

あと、

OpenMoveの1世代前の型です。

って、書いたのですが、OpenMoveはこれ一種類しかないみたいです。

f:id:ledsun:20211220091956p:plain
価格.comに記載されている AfterShokz一覧

Rails 5.2からGemfileと.ruby-versionに期待するRubyのバージョンを記載するようになった

いくつかののRailsアプリケーションを触っていると、アプリケーションによってGemfileにRubyのバージョンが書かれていたり書かれていなくて不思議でした。 Rails 5.2からはbin/rails newしたときに、作成するGemfileにRubyのバージョンを記載するようになりました。

github.com

つまり、GemfileにRubyのバージョンが書かれていないのは、そのアプリケーションがRails 5.1 以前のバージョンで作られたからでした。

GemfileにRubyのバージョンが書かれるようになったのはHerokuで自動的に環境を作成するさいに、Rubyのバージョンを決定するためのようです。 .ruby-versionの方は、rbenv/rvmでRubyのバージョンを決定するためのようです。

重複しているのはどうなの?と思いますが

https://github.com/rails/rails/pull/30016#issuecomment-321400071

I think we've crossed wires here a bit. Given that I originally requested this feature, perhaps I was unclear with the rational. I'm fine with the fact that the version is duplicated between .ruby-version and Gemfile. Just as long as they're set by default.

If at some point rbenv learns to read the version from a Gemfile, then we can drop the .ruby-version. But until that I'd like that to stay.

rbenvがGemfileからRubyのバージョンを読み取ってくれないので、両方使っているそうです。

JScriptコンパイルエラーの怪

{
    // 判定
}

こういう何もしないJavaScriptファイルがあります。 Windowscscriptコマンドで実行するとあるときはコンパイルエラーをおこし

f:id:ledsun:20211027151704p:plain
コンパイルエラーがおきます

あるときはコンパイルエラーを起こしません。

f:id:ledsun:20211027151740p:plain
コンパイルエラーがおきません

JavaScriptの内容は全く同じなのに不思議ですよね (答えはファイル名にあります。)。

WSH(JScript)でコードを書いてみる - バグ取りの日々

WSHのcscript/wscriptのアプリは以前のWindows環境を元に作成されており、また今後のバージョンアップは絶望的であるため、日本語環境WSHの標準文字コードShift_JISになります。

そうです。ファイルのエンコードUTF-8のためおきています。 でも、コメントですよ?文字化けしたってソースコードに関係無いはずじゃないですか。

もう一個合わせ技があります。 改行コードをLFにするとコンパイルエラーがおきます。 CRLFにするとコンパイルエラーはおきません。 知ってたら簡単な話なんですが、知らないとなかなか改行コードの差に思い至らなくて特定に時間が掛かります。 丸一日掛かったりします。

しかも、gitにautocrlfてあるじゃないですか。 改行コードを自動的にLFからCRLFに変えるやつ。 つまり、個人の環境毎に起きたり起きなかったりするんですよ。 怖いですねー。

プログラミング女子絵本三作

エイダ・ラブレスは世界で最初のプログラマーと称される女性です。1815年生まれ。19世紀の産業革命の頃に生きていました。 バッベジの解析機関を見て、それが完成するまえに解析機関を使ったプログラミングをしたと言われています。 完成していない機械を使ったプログラミングとは何でしょうか? そもそもどうやったプログラムを機械に読ませるのでしょうか? 詳しい話は絵本を読むとわかります。

グレース・ホッパーはCOBOLの開発者として知られている女性です。 1906年生まれ、第二次世界大戦をきっかけに海軍に入りプログラマになりました。 30年くらい前まで生きていました。 COBOL以前に、高水準言語の開発者であり。 サブルーチンの開発者であり、最初のコンパイラの開発者であります。 現代プログラミング言語の母といって差し支えない人物です。 ほかにも虫のバグとプログラムのバグのエピソードもあったりエピソード盛りだくさんです。

マーガレット・ハミルトンは、アポロ11号の月着陸プログラムを書いた女性です。 1936年生まれ、まだ生きています。 アポロ計画の飛行プログラムの開発責任者であり、「ソフトウェア工学」という名称を世に広めた人物です。 エイダ・ラブレス賞の二回目の受賞者がグレース・ホッパーで、5回目の受賞者がマーガレット・ハミルトンなのも面白い点です。

参考

RailsをセキュリティチェックするGem

www.youtube.com

で、紹介されているなかで

を、試してみました。

どちらも使うのはめちゃ簡単です。

Gemfileに次のような記述を追加します。

group :development do
  gem 'brakeman'
  gem 'bundler-audit'
end

あとは

bundle 
bundle exec brakeman
bundle exec bundle audit

とすれば実行できます。

実行結果

つぎのようにズラズラっと情報が出てきます。 試したRailsアプリケーションのRailsのバージョンが古いために出てきている情報が多いです。 まずはRailsのバージョンを上げてから、再度チェックしてみるのがよさそうです。

brakeman

~ bundle exec brakeman
Loading scanner...
Processing application in /Users/shigerunakajima/lodqa-db
Processing gems...
[Notice] Detected Rails 5 application
Processing configuration...
[Notice] Escaping HTML by default
Parsing files...
Detecting file types...
Processing initializers...
Processing libs...ed
Processing routes...
Processing templates...
Processing data flow in templates...
Processing models...
Processing controllers...
Processing data flow in controllers...
Indexing call sites...
Running checks in parallel...
 - CheckBasicAuth
 - CheckBasicAuthTimingAttack
 - CheckCrossSiteScripting
 - CheckContentTag
 - CheckCookieSerialization
 - CheckCreateWith
 - CheckCSRFTokenForgeryCVE
 - CheckDefaultRoutes
 - CheckDeserialize
 - CheckDetailedExceptions
 - CheckDigestDoS
 - CheckDynamicFinders
 - CheckEscapeFunction
 - CheckEvaluation
 - CheckExecute
 - CheckFileAccess
 - CheckFileDisclosure
 - CheckFilterSkipping
 - CheckForgerySetting
 - CheckHeaderDoS
 - CheckI18nXSS
 - CheckJRubyXML
 - CheckJSONEncoding
 - CheckJSONEntityEscape
 - CheckJSONParsing
 - CheckLinkTo
 - CheckLinkToHref
 - CheckMailTo
 - CheckMassAssignment
 - CheckMimeTypeDoS
 - CheckModelAttrAccessible
 - CheckModelAttributes
 - CheckModelSerialize
 - CheckNestedAttributes
 - CheckNestedAttributesBypass
 - CheckNumberToCurrency
 - CheckPageCachingCVE
 - CheckPermitAttributes
 - CheckQuoteTableName
 - CheckRedirect
 - CheckRegexDoS
 - CheckRender
 - CheckRenderDoS
 - CheckRenderInline
 - CheckResponseSplitting
 - CheckRouteDoS
 - CheckSafeBufferManipulation
 - CheckSanitizeMethods
 - CheckSelectTag
 - CheckSelectVulnerability
 - CheckSend
 - CheckSendFile
 - CheckSessionManipulation
 - CheckSessionSettings
 - CheckSimpleFormat
 - CheckSingleQuotes
 - CheckSkipBeforeFilter
 - CheckSprocketsPathTraversal
 - CheckSQL
 - CheckSQLCVEs
 - CheckSSLVerify
 - CheckStripTags
 - CheckSymbolDoSCVE
 - CheckTemplateInjection
 - CheckTranslateBug
 - CheckUnsafeReflection
 - CheckUnsafeReflectionMethods
 - CheckValidationRegex
 - CheckVerbConfusion
 - CheckWithoutProtection
 - CheckXMLDoS
 - CheckYAMLParsing
Checks finished, collecting results...
Generating report...

== Brakeman Report ==

Application Path: /Users/shigerunakajima/lodqa-db
Rails Version: 5.0.7.2
Brakeman Version: 5.1.1
Scan Date: 2021-10-21 04:40:52 +0900
Duration: 1.512554 seconds
Checks Run: BasicAuth, BasicAuthTimingAttack, CSRFTokenForgeryCVE, ContentTag, CookieSerialization, CreateWith, CrossSiteScripting, DefaultRoutes, Deserialize, DetailedExceptions, DigestDoS, DynamicFinders, EscapeFunction, Evaluation, Execute, FileAccess, FileDisclosure, FilterSkipping, ForgerySetting, HeaderDoS, I18nXSS, JRubyXML, JSONEncoding, JSONEntityEscape, JSONParsing, LinkTo, LinkToHref, MailTo, MassAssignment, MimeTypeDoS, ModelAttrAccessible, ModelAttributes, ModelSerialize, NestedAttributes, NestedAttributesBypass, NumberToCurrency, PageCachingCVE, PermitAttributes, QuoteTableName, Redirect, RegexDoS, Render, RenderDoS, RenderInline, ResponseSplitting, RouteDoS, SQL, SQLCVEs, SSLVerify, SafeBufferManipulation, SanitizeMethods, SelectTag, SelectVulnerability, Send, SendFile, SessionManipulation, SessionSettings, SimpleFormat, SingleQuotes, SkipBeforeFilter, SprocketsPathTraversal, StripTags, SymbolDoSCVE, TemplateInjection, TranslateBug, UnsafeReflection, UnsafeReflectionMethods, ValidationRegex, VerbConfusion, WithoutProtection, XMLDoS, YAMLParsing

== Overview ==

Controllers: 8
Models: 10
Templates: 25
Errors: 0
Security Warnings: 4

== Warning Types ==

Cross-Site Request Forgery: 2
Redirect: 1
Remote Code Execution: 1

== Warnings ==

Confidence: Medium
Category: Cross-Site Request Forgery
Check: CSRFTokenForgeryCVE
Message: Rails 5.0.7.2 has a vulnerability that may allow CSRF token forgery. Upgrade to Rails 5.2.4.3 or patch
File: Gemfile.lock
Line: 123

Confidence: Medium
Category: Cross-Site Request Forgery
Check: ForgerySetting
Message: `protect_from_forgery` should be configured with `with: :exception`
File: app/controllers/application_controller.rb

Confidence: Medium
Category: Remote Code Execution
Check: CookieSerialization
Message: Use of unsafe cookie serialization strategy `:marshal` might lead to remote code execution
Code: Rails.application.config.action_dispatch.cookies_serializer = :marshal
File: config/initializers/cookies_serializer.rb
Line: 5

Confidence: Weak
Category: Redirect
Check: Redirect
Message: Possible unprotected redirect
Code: redirect_to((targets_path + "?grid[f][users.email]=#{User.find_by!(:username => params[:username]).email}"))
File: app/controllers/users_controller.rb
Line: 7

bundler audit

~ bundle exec bundler audit
Download ruby-advisory-db ...
Cloning into '/Users/shigerunakajima/.local/share/ruby-advisory-db'...
remote: Enumerating objects: 7123, done.
remote: Counting objects: 100% (2007/2007), done.
remote: Compressing objects: 100% (1079/1079), done.
remote: Total 7123 (delta 731), reused 1348 (delta 565), pack-reused 5116
Receiving objects: 100% (7123/7123), 1.36 MiB | 11.61 MiB/s, done.
Resolving deltas: 100% (3215/3215), done.
ruby-advisory-db:
  advisories:   522 advisories
  last updated: 2021-10-12 11:21:05 -0700
  commit:   3d02c5e6a0f4ad9416db2e1474a14f6047d1e432
Insecure Source URI found: git://github.com/KishiKyousuke/facebox-rails.git
Name: actionpack
Version: 5.0.7.2
CVE: CVE-2021-22885
GHSA: GHSA-hjg4-8q5f-x6fm
Criticality: High
URL: https://groups.google.com/g/rubyonrails-security/c/NiQl-48cXYI
Title: Possible Information Disclosure / Unintended Method Execution in Action Pack
Solution: upgrade to ~> 5.2.4.6, ~> 5.2.6, >= 6.0.3.7, ~> 6.0.3, >= 6.1.3.2

Name: actionpack
Version: 5.0.7.2
CVE: CVE-2020-8166
GHSA: GHSA-jp5v-5gx4-jmj9
Criticality: Medium
URL: https://groups.google.com/forum/#!topic/rubyonrails-security/NOjKiGeXUgw
Title: Ability to forge per-form CSRF tokens given a global CSRF token
Solution: upgrade to >= 5.2.4.3, ~> 5.2.4, >= 6.0.3.1

Name: actionpack
Version: 5.0.7.2
CVE: CVE-2020-8164
GHSA: GHSA-8727-m6gj-mc37
Criticality: Unknown
URL: https://groups.google.com/forum/#!topic/rubyonrails-security/f6ioe4sdpbY
Title: Possible Strong Parameters Bypass in ActionPack
Solution: upgrade to >= 5.2.4.3, ~> 5.2.4, >= 6.0.3.1

Name: actionpack
Version: 5.0.7.2
CVE: CVE-2021-22904
GHSA: GHSA-7wjx-3g7j-8584
Criticality: High
URL: https://groups.google.com/g/rubyonrails-security/c/Pf1TjkOBdyQ
Title: Possible DoS Vulnerability in Action Controller Token Authentication
Solution: upgrade to ~> 5.2.4.6, ~> 5.2.6, >= 6.0.3.7, ~> 6.0.3, >= 6.1.3.2

Name: actionview
Version: 5.0.7.2
CVE: CVE-2020-15169
GHSA: GHSA-cfjv-5498-mph5
Criticality: Medium
URL: https://groups.google.com/g/rubyonrails-security/c/b-C9kSGXYrc
Title: Potential XSS vulnerability in Action View
Solution: upgrade to >= 5.2.4.4, ~> 5.2.4, >= 6.0.3.3

Name: actionview
Version: 5.0.7.2
CVE: CVE-2020-5267
GHSA: GHSA-65cv-r6x7-79hv
Criticality: Medium
URL: https://groups.google.com/forum/#!topic/rubyonrails-security/55reWMM_Pg8
Title: Possible XSS vulnerability in ActionView
Solution: upgrade to >= 5.2.4.2, ~> 5.2.4, >= 6.0.2.2

Name: actionview
Version: 5.0.7.2
CVE: CVE-2020-8167
GHSA: GHSA-xq5j-gw7f-jgj8
Criticality: Unknown
URL: https://groups.google.com/forum/#!topic/rubyonrails-security/x9DixQDG9a0
Title: CSRF Vulnerability in rails-ujs
Solution: upgrade to >= 5.2.4.3, ~> 5.2.4, >= 6.0.3.1

Name: activerecord
Version: 5.0.7.2
CVE: CVE-2021-22880
GHSA: GHSA-8hc4-xxm3-5ppp
Criticality: Medium
URL: https://groups.google.com/g/rubyonrails-security/c/ZzUqCh9vyhI
Title: Possible DoS Vulnerability in Active Record PostgreSQL adapter
Solution: upgrade to >= 5.2.4.5, ~> 5.2.4, >= 6.0.3.5, ~> 6.0.3, >= 6.1.2.1

Name: activesupport
Version: 5.0.7.2
CVE: CVE-2020-8165
GHSA: GHSA-2p68-f74v-9wc6
Criticality: Unknown
URL: https://groups.google.com/forum/#!topic/rubyonrails-security/bv6fW4S0Y1c
Title: Potentially unintended unmarshalling of user-provided objects in MemCacheStore and RedisCacheStore
Solution: upgrade to >= 5.2.4.3, ~> 5.2.4, >= 6.0.3.1

Name: kaminari
Version: 1.1.1
CVE: CVE-2020-11082
GHSA: GHSA-r5jw-62xg-j433
Criticality: Medium
URL: https://github.com/kaminari/kaminari/security/advisories/GHSA-r5jw-62xg-j433
Title: Cross-Site Scripting in Kaminari via `original_script_name` parameter
Solution: upgrade to >= 1.2.1

Vulnerabilities found!

Rails 5.0.7.2とMinitest 5.14.4で --verbose オプションをつけるとエラーがおきる

minitestをつかったRailsアプリケーションを5.0にアップデートするときに不思議な現象に出会いました。

bin/rails test は通るのに bin/rails test —verbose でエラーになる 不思議・・・です。

~ bin/rails test
Run options: --seed 4913

# Running:

.....SSSSSSS.....SS..........................................SSSS......SSSSSS...............

Finished in 1.496610s, 61.4723 runs/s, 76.1721 assertions/s.
92 runs, 114 assertions, 0 failures, 0 errors, 19 skips

You have skipped tests. Run with --verbose for details.
~ bin/rails test --verbose
Run options: --verbose --seed 56328

# Running:

Minitest::Result#test_a_request_is_finished_after_finish = 0.05 s = .
Minitest::Result#test_raise_RequestInvalidStateError_if_a_request_with_other_than_runnnig_state_finish = 0.00 s = .
Minitest::Result#test_that_it_counts_predicates_with_optional_ignore_predicates = 0.02 s = S


Skipped:
PredicateCollectorTest#test_that_it_counts_predicates_with_optional_ignore_predicates [/Users/shigerunakajima/lodqa-db/test/lib/predicate_collector_test.rb:22]:
The endpoint is unable.


Traceback (most recent call last):
    18: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:68:in `block in autorun'
  17: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:141:in `run'
   16: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:164:in `__run'
  15: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:164:in `map'
    14: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:164:in `block in __run'
  13: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.0.7.2/lib/rails/test_unit/line_filtering.rb:9:in `run'
   12: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:326:in `run'
  11: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:354:in `with_info_handler'
    10: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:367:in `on_signal'
   9: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:327:in `block in run'
    8: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:327:in `each'
   7: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:328:in `block (2 levels) in run'
     6: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:341:in `run_one_method'
   5: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:860:in `record'
    4: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:860:in `each'
   3: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/minitest-5.14.4/lib/minitest.rb:861:in `block in record'
     2: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.0.7.2/lib/rails/test_unit/reporter.rb:23:in `record'
   1: from /Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.0.7.2/lib/rails/test_unit/reporter.rb:70:in `format_rerun_snippet'
/Users/shigerunakajima/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.0.7.2/lib/rails/test_unit/reporter.rb:70:in `method': undefined method `test_that_it_counts_predicates_with_optional_ignore_predicates' for class `Minitest::Result' (NameError)

オプションをつけなければ動くので、最初はスルーしていました。 調べてみると、Rails 5.0はMinitest 5.10.1までしか対応していないようです。 Minitest 5.11でテストの結果のインタフェースが変わったため、Rails 5.0で本現象が起きるようになったようです*1

Rails 5.0が依存するMinitestのバージョン指定

https://github.com/rails/rails/blob/v5.0.7.2/activesupport/activesupport.gemspec#L25

s.add_dependency 'minitest',   '~> 5.1'

Rails 5.0が依存するMinitestのバージョン指定がメジャーバージョンまでの固定なので、何も指定せずにbundle installまたはbundle updateするとMinitest 5.14.4がインストールされて、本現象が起きます。

Rails 5.1.5でMinitest 5.11に対応

Add support for Minitest 5.11 by y-yagi · Pull Request #31624 · rails/rails · GitHub で、Minitest 5.11に対応しています。 Rails 5.1.5以降*2では本現象は起きません。

対応策

Gemfileにgem 'minitest', '5.10.1'を追記して本現象を回避しました。

このあとRails 5.1にアップデートする予定です。 そのとき同時に削除します。

異世界に落とされた…浄化は基本!

おっきいワンワンがでてくるのが「とんでもスキルで異世界放浪メシ」に似ています。 超絶魔力でワンワン達を従えているのと、無意識に既得権益者を攻撃していて不穏な感じにしているところが違います。

f:id:ledsun:20211019224934p:plain
黒くて大きいワンワン

アラフォー賢者の異世界生活日記~気ままな異世界教師ライフ~

オンラインゲームのトッププレイヤーが何かの間違いでオンラインゲームの世界に入ってしまい、チートライフを満喫する感じです。 設定は「異世界魔王と召喚少女の奴隷魔術」に似てますね。 違う点は、女性キャラがたくさん出てくる割りにエロくならないところでしょうか?

7巻では、世界設定の謎の匂わせが出てきて、先が気になります。

f:id:ledsun:20211019224137p:plain
骸骨かっこいい

Rails 4.2のtest-unitに苦戦する

Railsのバージョンを上げようと思って、3年ぶりくらいにRails 4.2のアプリケーションに触りました。 テストコードがあるのですが、test-unitです。 この組み合わせを触るのが久しぶりなので苦戦しました。 コミットログを見る限り、3年前に自分でテストコードを書いています。 残念ながら、すっかり忘れています。

テストを実行するのはrakeタスク

まず、テストの実行方法がわかりません。

RubyOnRails を使ってみる 【第 6 回】 テストの書き方によると

Rails のテストをまとめて実行するときには、rake タスクを実行します。

bundle exec rake test

でした。 こういうとき、るびまは古い記事をずっと残してくれていてありがたいです。

テストをペンディングするのはskipメソッド

テストの一部が外部のAPIに依存していました。 上手く通らないので、一時的にペンディングしたいです。 Pendingで探してたのですが、やり方がわかりません。

ruby on rails 3 - How to use the Pending module in ActiveSupport - Stack OverflowによるとRails 3にはpendingメソッドがあったようです。 Rails 3と4との間のコミットをあさって、 pending の代わりにskipを使えば良いという情報を得ました*1

なんか探索ルートを間違えたような気がしますが、解決したので良しとします。

特定のテストファイルを実行する時は環境変数TESTを使う

1つのファイルのテストだけを実行したい時があります。 このときは次のように、環境変数で実行するテストファイルを指定します。

rake test TEST=just_one_file.rb

同僚の id:sanfrecce-osaka さんに教えてもらいました。

追記

test-uintの情報を探したから苦労したのであって、Minitestで探せば良かった気がします。

script type moduleでCommonJSモジュールを読み込むとどうなるのか?

npm install debounce

してあるディレクトリで次のように、script type="module"を使って、debounceを読み込んでみましょう。

<html>

<head>
  <script type="module">
    import { debounce } from './node_modules/debounce/index.js';
  </script>
</head>

</html>

debounceはunderscore.jsのdebounce関数だけを切り出したCommonJSモジュールです。 HTTPサーバーを起動して、index.htmlを開くと、次のエラーが起きます。

Uncaught SyntaxError: The requested module './node_modules/debounce/index.js' does not provide an export named 'debounce'

exportされていないものをimportしようとしたエラーになります。

CommonJSモジュールはscript type="module"では使えません。 ということは、世の中に100万個あるnpmパッケージ*1の大半は使えなさそうです。 CommonJSモジュールをESモジュールに変換する汎用的な方法があれば、夢が広がるのですが・・・そんなことできるのでしょうか?