rubyのleveldbを使うとwarningが出るようになった

  • このエントリーをはてなブックマークに追加

RubyのLevelDBのGemは有名なものが2つあります。私は前者の方をよく利用していました。

Ruby2.7で利用してみると大量のWarningが出るようになりました。キーワード引数の代わりにハッシュを渡すと出るようです。

leveldbfiddlerに依存しており、fiddlerが原因でした。

1
/var/lib/gems/2.7.0/gems/fiddler-rb-0.1.2/lib/fiddler.rb:51: warning: Using the last argument as keyword parameters is deprecated

これを対応するのもあれなので、せっかくなのでRocksDBを利用するようにしてみます。

参考

sequelのafter_commit

  • このエントリーをはてなブックマークに追加

DBのライブラリとしてsequelを良く使います。使い勝手が好みです。

Modelを利用しないでトランザクションを利用する時は次のような処理を書きます。

1
2
3
4
5
db = Sequel.connect(...)
db.transaction do
db[:xxx].insert(...)
db[:xxx].where(...).update(...)
end # commit

何を寝ぼけていたのか、こんな処理を書いてしまっていました。
commit前に更新通知の送信をしているので、受信側はcommit前にメッセージを受け取り更新前の情報を参照してしまいます。

1
2
3
4
5
6
7
8
9
db.transaction do
cond = db[:xxx].where(...).select(...).first
if cond
db[:xxx].insert(...)
else
db[:xxx].where().update(...)
mq.publish(...) # 更新通知をMessageQueueに送信する
end
end # ここでcommit

もちろんtransactionブロックを抜けたところにロジックを書いても良いですが、それだと上記のように複雑な条件文の中にあると、一律実行する事はできずにフラグを用意する必要があります。

そこでafter_commitもしくはafter_rollbackを使います。

1
2
3
4
5
6
7
8
9
10
11
db.transaction do
cond = db[:xxx].where(...).select(...).first
if cond
db[:xxx].insert(...)
else
db[:xxx].where().update(...)
db.after_commit do
mq.publish(...) # 更新通知をMessageQueueに送信する
end
end
end

注意点は、after_commitで変数を参照している場合、ブロックの最後の値になるという事です。threadのようにその時の変数の値を渡すことができません。以下の例ではafter_commitのブロック中ではx=10ではなくx=11になります。

1
2
3
4
5
db.transaction do 
x = 10
db.after_commit { puts x } # x = 11
x = 11
end

MySQL(InnoDB)の空振りDeleteでデッドロック

  • このエントリーをはてなブックマークに追加

delete-insertパターンを処理しているところでデッドロックが発生しました。

1
#<Sequel::SerializationFailure: Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction>

ネクストキーロックやギャップロックは分かっていたのですが、横着して書いたせいか件数チェックをしないでレコードが無い場合でもDELETEを行っていたのが原因です。トランザクション分離レベルはInnoDBデフォルトの「Repeatable Read」です。

トランザクション分離レベルを変更しろという記事を結構見るのですが、トランザクション分離レベルの変更はアプリケーションの設計に大きな影響を与えるため、気軽に変更するのは反対です。今回は、件数を確認して削除対象レコードが存在する場合のみDeleteを実行するようにしました。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 駄目
db.transaction do
db[:xxx].where(...).delete
db[:xxx].insert
end

# 空振りdeleteを回避する
db.transaction do
if db[:xxx].where(...).count > 0 # for_updateもした方が良い
db[:xxx].where(...).delete
end
db[:xxx].insert
end

参考

今回の件とは直接関係はないけど、分離レベルとロストアップデートの話

国勢調査2020

  • このエントリーをはてなブックマークに追加

渋谷区に住んでいます。
渋谷区の知人の皆が配布期間が始まってから早々に封書が届いている中、一向に届きませんでした。渋谷区は対面での配布は行っておらず封書が投函される事になっています。

Twitterで「国勢調査 来ない」「国勢調査 届かない」で検索すると、届かない人はそれなりに居るみたいです。

時系列

  • 9月28日にコールセンターに電話。区役所に電話して欲しいとのこと。(このコールセンター何のためにあるんだ..)
  • 9月28日に区役所に電話。9月30日まで配布期間が延長されているので待って欲しいとのこと。
  • 9月30日。封書の投函が無いので区役所に電話。住所を伝えたところ、まだこの地区は配布がされていないので、明日、明後日まで待って欲しいとの事。
  • 10月2日。封書が投函されていないので区役所に電話。住所を伝えたところ、まだこの地区は配布されていないとの事。土日に配るからそれでも来ない場合はもう一度電話して欲しいとのこと。
  • 10月5日。封書が投函されていないので、区役所に電話。住所を伝える。週末に配布はしたが住居だと思わなくて投函しなかったとのこと。(何度も住所を伝えてる意味はいったい…)
    • この一連の流れも伝えて、郵送で送って欲しい旨を伝える。明日には届くとの事。
    • ※なお私が住んでいるところは見た目はどう見ても会社ではなく住居です。
  • 10月6日。届かなかった。
  • 10月7日。夕方に封書が届いた。

オンラインで回答するにしても、封書が必要なのが辛い。
自分が住んでいる地区が、配布がまだなのか、配布したが投函されなかったのかをオンラインで確認できるようにして欲しい。まだ配布がされていないのであれば区役所に電話はしないし、スキップされているなら、電話して配布要求できるからです。

5年後の国勢調査は、マイナンバーカードあたりを使って配布物が不要になっている事を望みます。
今回、オンラインで回答できる点は良かったです。

rubyでjavaのoptionalのようなことをしたい

  • このエントリーをはてなブックマークに追加

以下のようなことをもっとスマートに書きたい。

1
2
3
4
5
6
h = {}
node = doc.at_css(".title")
unless node.nil?
h[:title] = node.text
h[:href] = node.attr("href")
end

Ruby2.6にはthenというメソッドが追加されました。これと2.3で追加されたsafe operation nagigatorを利用します。

thenはselfを引数としたブロックを評価し、ブロックの結果を返します。

1
2
ret_val = obj.then{ |x| val } # obj == x
# ret_val == val

&.と組み合わせる事でjavaのoptionalみたいな事ができます。orElseみたいな事はできません。

1
2
3
4
5
6
7
8
9
10
11
12
h = {}
doc.at_css(".title")&.then{ |node|
# doc.at_css(".title")の結果がnot nilの場合、nodeに値が入ってこのブロックが実行される
h[:title] = node.text
h[:href] = node.attr("href")
}
# もしくはきちんと戻り値を使ってハッシュを作る
# ただしdoc.at_css(".title")がnilの場合、hがnilになる.
h = doc.at_css(".title")&.then{ |node|
h[:title] = node.text
[ :title, node.text, :href, node.attr("href") ]
}.to_h

DOM操作をするとき、unless nil判定が多くなるので、省略できて便利!

1
title = node.at_css(".title")&.text

参考

RubyでHashの分割代入をしたい

  • このエントリーをはてなブックマークに追加

Rubyで分割代入をしたい。values_atを使えば出来そう。

1
2
3
4
5
6
h = { :a => 1, :c => 2 }
a, b, c = h.values_at(:a, :b, :c)

# a = 1
# b = nil
# c = 2

さらにRuby2.7では pattern match を使ってNestしたHashもいけるみたい。
ただ、pattern matchは試験実装なので使うとwarningが出ます。

1
2
3
4
5
6
7
8
9
h = { :a => 1, :b => 10 }
h in {a:, b:}
# a = 1
# b = 10

h = { :a => { :b => 100 }}
h in {a:{b:}}
# a => undefined
# b = 100

参考

ロジクールのマウスにPrintScを割り当てる

  • このエントリーをはてなブックマークに追加

ロジクールのマウスM590を利用しています。
このマウスは左側面にボタンが2個ついており、何かの操作を割り当てる事ができます。

ボタンの割り当て設定はLogicool Optionsというソフトを使いますが、PrintScを割り当てる事ができません。

無理矢理設定する

GUIから設定できないなら、設定ファイルを直接弄ってしまおう。
設定ファイルの場所はC:\Users\{ユーザー名}\AppData\Roaming\Logishrd\LogiOptions\devices\です。このディレクトリの下に接続しているデバイス毎にディレクトリがあります。私の場合は6b01b。そのディレクトリの中にある6b01b.xmlが設定ファイルです。

1
2
3
4
5
6
... devices/
6b01b/
6b01b.xml
6b01b.rav
Flow/
6b01b_********.json

該当箇所を見つけるのが難しいですが、最初にキーを適当に設定しておきます。例えばF12を設定します。そしてLogicool Optionsは閉じておきます。
F12のキーコードは123なので、vkey="123"の場所を探します。そしてPrintSc(VK_SNAPSHOT)は44なのでvkey="44"に変更します。(キーコード参考)

このままではLogicool Optionsが設定ファイルを再読み込みしないので、Windowsを再起動します。すると、PrintScが割り当てられた状態でマウスが使えるようになります。

Logicool Options上では以下のようにSys Reqと表示されますが、特に問題は発生していません。

設定ファイルの探し方

レジトストリかファイルに記録しているはずなので、設定を弄ったときにどのレジストリかファイルの操作が行われたのかを監視すれば良いです。MicrosoftのProcess Monitorを使います。
ソフトの使い方はこのページでは説明しません。

NetlifyのTLS証明書の更新が失敗する件

  • このエントリーをはてなブックマークに追加

このようなメールが届いて、CustomDomainのTLS証明書の自動更新が失敗しました。

1
2
3
4
5
6
7
8
Title: [Netlify] Failed attempt to renew your TLS certificate

Failed to renew TLS certificate for <my-domain>

The TLS certificate for <my-domain> will expire on Jun 28, 2020. We tried to renew it, but got this error message:

SniCertificate::CertificateInvalidError: Unable to verify challenge for www.hedgehog.studio
We’ll keep trying — in most cases of failure, we succeed on the next attempt. However, it’s still a good idea to check the certificate status in your site’s SSL/TLS settings.

原因はCNAMEで設定している、****.netlify.com****.netlify.appに変更になっていたからです。公式サイトには変更のお知らせはどこにも無く、メールでの通知のみでした。

しかもメールには「No action required: sites without custom domains moving to netlify.app」とあるので、何もしなくて良いんだなとスルーしてました。

対処

  • DNSのCNAMEレコードの変更
1
2
before: cname www <my-site>.netlify.com.
after: cname www <my-site>.netlify.app.
  • _redirectsの更新(.appの2行を追加)
1
2
3
4
5
http://<my-site>.netlify.app/* https://blog.orz.at/:splat 301!
https://<my-site>.netlify.app/* https://blog.orz.at/:splat 301!

http://<my-site>.netlify.com/* https://blog.orz.at/:splat 301!
https://<my-site>.netlify.com/* https://blog.orz.at/:splat 301!

もしかしたら、失敗はたまたまだったのかもしれないけど、念のため.comから.appに変更しました。

メール本文

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Hello,

A reminder that starting April 14, 2020, sites without a custom domain are being moved from your-site.netlify.com to your-site.netlify.app. New websites will also have URLs ending with netlify.app, unless you specify a custom domain.

Why the change? We're investing in the security and stability of our infrastructure, and this step is necessary on that journey.

It's important to note your existing sites will continue to operate properly using their current URLs. We expect some users may have configured redirects. If you have configured redirects on our service referring to your-site.netlify.com directly, we recommend you take action to add a second copy of them for your-site.netlify.app.

If you have no redirects like that, there's no action required on your part, but we wanted to inform you well ahead of the change in case you have any questions. Additional details are provided below if you'd like to read more. Thanks for being part of the Netlify community!

-Team Netlify

Will my current sites continue to work?
Absolutely. Any sites already deployed to your-site.netlify.com will continue to operate, just as they do now. Traffic to any your-site.netlify.com address will be forwarded to your-site.netlify.app seamlessly and automatically, using a 301 redirect. (This tells browsers and search engines that the site has moved, so they know the new location.)

Importantly, we have no plans to ever stop forwarding netlify.com addresses or force a migration. We understand your established domain names and inbound links to your site are important to you. After the update, links to your sites will continue to work, just as they do now. The only change will be that netlify.app will display in the URL bar, whether visitors click on a link or type your site name in directly.

Testing is now enabled—and easy to do.
We've enabled testing for the migration from sitename.netlify.com to sitename.netlify.app and you may start testing it today, especially if:

You browse via yoursitename.netlify.com start using yoursitename.netlify.app
you have redirects or other configuration pointing to or referencing https://yoursitename.netlify.com
Again, there's no action required on your part, but we wanted to inform you the option to test is available.

Will this impact my SEO?
No. Forwarding traffic to a new domain extension using a 301 redirect is a proven technique that search engines are well aware of. Your inbound links will not be affected. Your search engine rankings will not be affected.

What if I have a custom domain?
There will be minimal impact to sites with custom domains, and no need to update your DNS if it's configured according to our standard documented setup. This is true whether you purchased a domain through us or brought it with you from another provider.

Will my site take longer to load?
It takes just a couple of milliseconds to direct a .com URL to .app. Your users will not perceive any additional load time. And since browsers cache 301 redirects, there will be no speed impact for page loads after the first connection.

What about HTTPS?
We’re doing our part for a more secure web. Every Netlify site deployed uses a free certificate from Let’s Encrypt. Your certificates will continue to work and your sites will continue to be encrypted with no action required.

Do I need to update my site or application?
In most cases, no. This change is very unlikely to impact the way your application functions, as all requests will automatically be forwarded to netlify.app on your behalf.

What about new sites?
Any site you deploy after April 14, 2020 will receive a shiny new .app URL that you’ll see displayed in the Netlify dashboard. However, for simplicity’s sake, even new sites will be forwarded to the right place should anyone mistakenly type the netlify.com domain. We want things to be as simple and seamless as possible.

What if I use a proxy in front of Netlify?
Since Netlify operates as a global CDN, we don't encourage customers to use proxies or services like CloudFlare in front of Netlify. Using a non-Netlify proxy isn't a configuration we officially support. (For more details, read the community post 'why not proxy to Netlify.') If you do need to use a third-party proxy, you will want to carefully test your application after the migration. Some proxies expect content returned and won't be successful navigating the 301 redirect.

What if I have questions or concerns? We're here to help! Please join the discussion in the community or if you are on a paid plan including support, you can contact support directly.

2mのUSB-Cケーブル(Display対応, PD対応)

  • このエントリーをはてなブックマークに追加

USB Type Cのケーブルはたくさん種類があります。このサイトが参考になります。

規格もたくさんあって、適当に購入すると、スマホの充電は出来るのだけどPCのDisplay接続には使えなかったり、PDに対応していなかったりするわけです。Amazonでケーブルを購入しようとすると、嘘くさい製品(規格違反の製品)が溢れていて、購買意欲が無くなります。

また、2mのものを探すと途端に製品が無くなります。
その理由は、2m以上になるとThunderbolt3の超高速通信である40Gbpsは非対応となり、その半分の20Gbpsになるからだと思います。ケーブルが長いと超高速通信ができないみたいです。

2mでDisplay接続に使用できるまともなUSB-C<=>USB-Cケーブルを探すのは大変なので、いくつか製品を紹介します。

PDは不要!! 5Gbpsで十分だ!とにかくケーブルを長くしたい。という事であれば、SANWAの5mのリピーターがあります。

参考サイト

Microsoft Wordの設定を全てリセットする方法

  • このエントリーをはてなブックマークに追加

デフォルトのレイアウトを弄っていたら、元に戻せなくなってかなり困ったのでリセットする方法を探しました。なお、再インストールではリセットできませんでした。

リセットの方法

こちらのMicrosoftのページ「Word のユーザー オプションとレジストリ設定をリセットする方法」からファイルをダウンロードします。

ダウンロードしたファイルを実行するだけです。レジストリを弄るので事前にバックアップを取得した方が良いです。

参考サイト