@ledsun blog

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

PostgreSQLのcreateuserで作ったユーザーのパスワードって何になるんだろうか?

PostgreSQLのユーザー作成 - @ledsun blogPostgreSQLのユーザーを作成しました。 パスワードを指定しませんでした。 このとき作成したユーザーにはどのようなパスワードが設定されるのでしょうか? ユーザー名と同じになるのでしょうか?それとも乱数で初期パスワードが設定されるのでしょうか?

createuserコマンドを使ってユーザーを作成したので、そのマニュアルを確認します。

www.postgresql.jp

-P --pwprompt このオプションが指定されると、createuserは新しいユーザのパスワードのプロンプトを表示します。 もしパスワード認証を使う予定がなければ、これは必要ありません。

-pオプションはつけませんでした。 この場合、パスワード認証を使わないようです。 つまりパスワードは設定されていない、あるいは設定されていても無視されるようです。

では、パスワード認証以外の認証には何があるのでしょうか?

www.postgresql.jp

trust認証が指定されるとPostgreSQLは、サーバに接続できる全ての人に対して (データベーススーパーユーザさえも)その人が指定する任意のデータベースユーザ名としてのアクセス権限が付与されていると想定します。

これみたいです。 HomebrewでインストールしたPostgreSQLはTrust認証が有効になっていそうです。

Changing your (Homebrew) PostgreSQL configuration from trust to md5

というそのものズバリな記事があります。 これを参考に自分の環境の設定を確認してみます。 まず設定ファイルpg_hba.confの場所を確認します。

~►psql postgres                                                            09:27
psql (14.2)
Type "help" for help.

postgres=# show hba_file;
              hba_file
-------------------------------------
 /usr/local/var/postgres/pg_hba.conf
(1 row)

つぎにpg_hba.confの内容を確認します。

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust

trustがいっぱい出てくるので、Trust認証が有効になっているようです。

村づくりゲームのNPCが生身の人間としか思えない 4

人間には物語に触れて登場人物に共感すると、自分を客観的にみれるようになる性質があります。 原理はよくわかりませんが、あります。 この漫画のストーリーはこれを丁寧に描きます。 主人公はゲームの登場人物に感情移入し、自分を客観視するようになり、自分を変えようと努力をはじめます。 丁寧にストーリーを描いているので力強く興味が引かれます。 その一方でもう一つの大きな柱である謎のゲームに関しては一向に謎が解き明かされません。 そのくせチラチラと怪しいフラグを見せてきます。 先は気になるし、お話は楽しめるし、次の巻が楽しみです。

PostgreSQLのユーザー作成

Railsアプリケーションの開発環境を構築するときに時々はまります。 ローカルにインストールされているPostgreSQLを使うとアプリケーションごとにPostgreSQLのユーザーが微妙に違うことがあります。

例えばpostgresというユーザーがないと次のようなエラーが起きます。

~ bundle exec rails db:create
2022-03-02 15:00:59.447 JST [52724] FATAL:  role "postgres" does not exist
connection to server at "localhost" (::1), port 5432 failed: FATAL:  role "postgres" does not exist
Couldn't create 'xxxx' database. Please check your configuration.
rails aborted!
ActiveRecord::NoDatabaseError: connection to server at "localhost" (::1), port 5432 failed: FATAL:  role "postgres" does not exist

というわけでpostgresというユーザーを作成します。シェル上で次のコマンドを実行します。

createuser postgres

ふたたびrails db:createします。

~ bundle exec rails db:create
2022-03-02 15:08:44.447 JST [52953] ERROR:  permission denied to create database
2022-03-02 15:08:44.447 JST [52953] STATEMENT:  CREATE DATABASE "xxxx" ENCODING = 'unicode'
PG::InsufficientPrivilege: ERROR:  permission denied to create database
Couldn't create 'xxxx' database. Please check your configuration.
rails aborted!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  permission denied to create database


Caused by:
PG::InsufficientPrivilege: ERROR:  permission denied to create database

Tasks: TOP => db:create
(See full trace by running task with --trace)

データベースを作成する権限が足りていません。 権限を追加しましょう。

~ psql postgres
psql (14.2)
Type "help" for help.

postgres=# ALTER USER postgres CREATEDB;
ALTER ROLE
postgres=# \du
                                      List of roles
    Role name    |                         Attributes                         | Member of
-----------------+------------------------------------------------------------+-----------
 postgres        | Create DB                                                  | {}
 shigerunakajima | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

*1

みたびrails db:createします。

~ bundle exec rails db:create
Created database 'xxxx'

成功します。

参考

*1:HomebrewでインストールしたPostgreSQLなので、macOSのログインユーザーと同じ名前のユーザーもいます。

Ruby 2.5にはBundlerが含まれない

最近、Rubyをはじめた人からRuby 2.5*1の環境で次のエラーが出たという相談を受けました。

rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.7.5
  3.0.3

エラーメッセージ通りbundleコマンドがないので、gem install bundlerすれば良いです。 なんですが、よく考えるとBundlerがRuby本体に同梱されるようになって3年です。

Ruby 2.6.0 Released

Bundler is now installed as a default gem.

今からRubyをはじめた人からすると摩訶不思議な現象ですよね。

*1:Ruby 2.5はもうメンテナンスされていませんが、事情があります。

FormData

FormData

先週、Form要素のデータがそのまんま欲しくて、はじめて使いました。 そのときは次のようにJSON形式で送信しました。

const formData = new FormData(document.bookForm);
const name = formData.get("name");
const age = formData.get("age");
const data = {
  name,
  age
};

jQuery.ajax({
  type: "post",
  url: "/books/,
  data: JSON.stringify(data),
  contentType: "application/json"
});

developer.mozilla.org

The FormData object lets you compile a set of key/value pairs to send using XMLHttpRequest.

と、あるのでずいぶん昔からあるAPIみたいです。 次のように使われていたようです。

javascript - How to send FormData objects with Ajax-requests in jQuery? - Stack Overflow

var xhr = new XMLHttpRequest(),
    fd = new FormData();

fd.append( 'file', input.files[0] );
xhr.open( 'POST', 'http://example.com/script.php', true );
xhr.onreadystatechange = handler;
xhr.send( fd );

この書き方の場合はmultipart/from-data形式で送信されるようです。

entries()があるので、ES6以降も拡張されているようです。

参考情報

異世界で土地を買って農場を作ろう 5

20代風の見た目の主人公いくつなんだ・・・

f:id:ledsun:20220304051344p:plain
陶芸人間皿割る皿割る~

「陶芸人間皿割る皿割る~」が出てきたのが、ボキャブラ天国です。 放映されたのが1992~1996年です。 30年くらい前のネタです。 僕自身はボキャブラ天国は見たことありますが、このネタは記憶にありません。検索して見つけました。


www.youtube.com

ピンクレディーの1978年の「透明人間」の歌詞「透明人間あらわる~」のパロディです。 ボキャブラ天国の15年くらい前です。 もとの歌を知らないのでボキャブラ天国で見てても意味はわからなかったと思います。


www.youtube.com

「透明人間あらわる」のフレーズの元ネタの大栄映画「透明人間現る」は1949年でした。 30年空きます。 阿久悠氏が12歳ときのネタを42歳の時に入れたようです。

www.youtube.com

ちなみに特撮撮影が同じ円谷英二氏の1954年の東映の「透明人間」はAmazon Prime Videoで見れます。

もっと遡ると1934年のイギリス映画 で、1897年のH・G・ウェルズの「透明人間」です。

www.aozora.gr.jp

125年後に異世界でパロディソングを歌われるとはH・G・ウェルズの想像力をもってしても思いつかなかったことでしょう。

異世界に飛ばされたおっさんは何処へ行く?8

謎の変化を遂げる化け物13号、対する主人公タクマは毘沙門天の加護を受けた刀を得て対峙。13号は倒せるのか?

ストーリーは「スーパーヒーロー」パターンです。 異世界転生物はチート能力を得ることが多いので、異能を抱えた人の悩みを描く「スーパーヒーロー」パターンになることが多そうなのですが、実際は少ないです。

5巻のあとがきによると、この漫画は途中でアナログからデジタルに変わったそうです。 全然、気がつかなかったので、頑張って差を見比べてみました。 3巻の14話からじゃないかなあと見ました。どうなんでしょう?

警視庁草紙 1

news.yahoo.co.jp

で気がつきました。山田風太郎小説の漫画化作品です。

主人公男性が色っぽく描かれていて良いです。 明治物の怪談チックな雰囲気出てて好きです。

f:id:ledsun:20220226093409j:plain
小ネタが仕込まれているコマ

小ネタが仕込んであったりして作者の方、山田風太郎が好きなんだろうなあっと思いました。

「帝国」ロシアの地政学 「勢力圏」で読むユーラシア戦略

現在のロシアにとって第二次世界大戦の記憶は貴重なアイデンティティよすがとなっている。それは単にソ連という国家の勝利だったのではなく、ナチズムという悪に対する勝利だったのであり、ソ連はここで全人類的な貢献を果たしたのだという自負は現在も極めて強い。現在のロシアに暮らす諸民族に対しても、「共にナチスと戦った仲」だという意識は(ナショナル・アイデンティティとまでは言えないにせよ)一定の同胞意識を育む効果を果たしている。

プーチン氏が「ウクライナの非軍事化と非ナチ化を目指す」と主張*1するのは、こういう国民感情に訴えようとしたのでしょうか?

旧ソ連域内においては、ロシアの立場は真逆になる。ウクライナ危機や2008年のグルジア(現ジョージア)戦争の際に顕著に見られるように、ロシアは旧ソ連諸国に住むロシア系住民やロシア語話者に対して(国際法上の帰属とは関係なく)R2Pを負っているのだと主張し、法的親国の意向を無視した軍事介入を行った(第3章を参照)。

2022年のウクライナ侵攻も同じ考え方、なのでしょうか?

旧ソ連諸国の中には、①ロシア主導の政治・経済・安全保障枠組みに加盟し、ロシアと概ね共同歩調をとる国々(カザフスタンベラルーシアルメニア等)が存在する一方、②ここから距離を置いたり(ウズベキスタントルクメニスタン等)、③さらにはNATO欧州連合(EU)への加盟を目指す国々(ウクライナグルジア等)が存在する。

3の国々へ積極的に軍事介入しているようです。 ここがロシアにとっての分水嶺、例えばウクライナNATO加盟を黙認すれば他の国もこぞってロシア以外の勢力圏に鞍替えしそうな情勢、なのでしょうか?

20220227 追記

ロシアはこれだけ西側に協力しているのに、全く顧みられることがない。それどころかロシアの「勢力圏」を切り崩し、NATOを拡大させているというのは、一体どういうことなのだ。あまつさえ教師のような顔でロシアの国内問題に説教を垂れてくるとは傲慢ではないか

ロシアの感情面の不満としてわかりやすいです。

ロシア側はMAPを「引き返し不能地点」と捉えていた。これまでのパターンでは、MAPに加えられた国々は後に例外なく正式加盟を果たしており、したがってグルジアウクライナに対してMAPが発出されれば、両国の加盟はもはや秒読み段階であるとロシア側は考えたのである。

旧ソ連諸国がNATOに加入するのを大事だと捉えているようです。

その他のロシア関連情報

webpack-dev-serverでsource mapが見つからなくて警告がでる

github.com

を使ったJavaScriptプログラムをWebpackでビルドしています。 開発環境では、Google Chromeの開発ツールで次のような警告が表示されます。

f:id:ledsun:20220224212403p:plain
webpack-dev-serverでsource mapが見つからなくてでる警告

小さくて見にくいですね。 node_modules/deepcopy/umd/deepcopy.js.mapをダウンロードしようとして404になっています。

qiita.com

によるとwebpack.config.jsdevtoolオプションを設定すればよさそうです。 実際eval-source-mapを設定すると、この現象は解消されます。

理由はわかりません。npmパッケージに含まれるsource mapを使う代わりに、Webpackが生成したsource mapを使うようになるのかもしれません。

次のオプションも試してみました。

  1. eval
  2. eval-cheap-source-map
  3. eval-cheap-module-source-map
  4. cheap-source-map
  5. cheap-module-source-map
  6. source-map

eval以外ならどれでも解消されました。 オプションは全部で25個あります。 あと4倍も試してられない気持ちになりました。 なぜこんなにたくさんの選択肢があるのでしょうか? そしてそれぞれ何が違うのでしょうか?謎です。

結局、Developmentの章にある、evalの次の候補eval-source-mapを使うことにしました。 ↑のQiitaと同じ結論です。 根本的な解決になっていない感じはしますが、何か問題がおきたときに設定をまた見直そうと思います。

ウクライナのNATO加盟

https://www.hit-u.ac.jp/kenkyu/eusi/eusicommentary/vol59.pdf

NATO加盟には加盟国の全会一致が必要であり、国民の支持が高 いという理由だけで実現するわけではない。それでも、ウクライナの加盟に慎重な立場をとる同盟国に「口実」を与 えないためには、国民の支持は不可欠になってくる。 また、ウクライナの国内改革や欧州の安全保障環境に悪影響を及ぼしている東部での戦闘を終結させなけれ ば、NATO 加盟実現は遠のくばかりである。

2015年の情報です。 ロシアがチラチラしている時点でウクライナNATOに加盟する可能性はなさそうです。

それで

今のロシアにさらなる侵略を許せば、軍事力によって他の国を乗っ取ることに対してGOサインど出すことになります。

NATO加盟とかの大義名分はなくても、支援が必要という考え方が出てくるのかもしれません。

で、西の盟友アメリカはどう出るのでしょうか?

wedge.ismedia.jp

もし、ロシアが何らかの形でウクライナに侵攻後、14年クリミア併合時と同様、時間をかけ既成事実化させていくことに成功したとしたら、それは言うまでもなく、中国を台湾侵攻に踏み切らせる呼び水になる。

ロシア-ウクライナは直接関係ないけど、中国-台湾関係を考えると、指をくわえて見ているわけにもいかなさそうです。

こういうシチュエーションで日本から軍隊を派兵する可能性を1ミリも考えなくてもいい点で、憲法9条ってめちゃくちゃ便利なんですね。 島国で憲法9条を装備しているのチート感があります。

ドンバス

anond.hatelabo.jp

トラックバックから ドンバス - Wikipedia を読みました。

現在ドンバスとして知られる地域は17世紀後半、ドン・コサックが定住するまで無人の土地が広がっていた

ここから驚きです。 「肥沃な穀倉地帯ウクライナ」のイメージからは江戸時代に無人の地だったとは想像していませんでした。

ドネツィクは1869年にイギリスの実業家ジョン・ヒューズが製鉄所を建設、複数の炭鉱を開発。炭鉱景気に沸くほかの町も発展し、ロシア帝国のグベールニヤ(県)から出稼ぎ先を求めて大勢の小作農が集まった

明治時代に入ってから炭鉱、製鉄の町として発展し始めたようです。 日本で言うと筑豊炭田のようなイメージでしょうか?

1917-1922年のロシア内戦の結果、ドンバスは統合された。

Wikipediaの記述では、統合先が不明瞭ですがソ連の一部になったようです。

ホロドモール飢饉(1932年–1932年)

世界恐慌が起きて数年後、満州国が建国されナチスが政権を取り、第二次世界大戦に突き進んでいる頃でしょうか?

1941年から1942年に至るナチ占領下

第二次世界大戦中はナチスに占領され、戦後にソ連に戻ったようです。

1991年、ソビエト連邦からの独立

ウクライナ独立は、30年前。湾岸戦争の翌年です。

ドンバスの採炭業者は1993年に国内紛争を巻き起こしながらストライキを行った。 ドンバスの人たちは地域や企業や諸都市に権限移譲して欲しいから独立に賛成した

1994年まで続いた。ウクライナは単一国家に留まり、ウクライナ語は唯一の公用語として維持され、ドンバスにはいかなる自治権も与えられなかった

独立直後からモヤモヤしています。

レオニード・クチマ ウクライナ大統領は1999年に再選。 クチマは地域内の政治的支援を得るために、開発資金を用いてドンバスに経済的援助を与えた

イデオロギー的にモヤモヤしつつも経済的に落ち着いていたのでしょうか?

2014年4月、分離主義武装勢力(ノヴォロシア人民共和国連邦)とウクライナ政府の戦争。内戦の最中、分離独立派の〈共和国〉は2014年5月11日にドネツィクとルハーンシク両州の地位に関する住民投票を実施し自治を望ましいとする結果に

15年くらい時間が飛んで、なぜか内戦が起きました。

詳しいことはわかりませんが、ドンバスには独立派が居て、おそらくロシアから非公式に直接的な支援を受けている。 ウクライナ軍は直接的な戦闘は行っていた。

ロシアの言い分としては、ドンバスの独立派を表だって指示して、公式に軍事支援することのようです。 ロシア軍が侵攻したとして、ウクライナNATOに非加盟なら、欧米は直接的な軍事支援は出来なさそうに思えます。

あれ?もしかしてロシア vs NATOでなくて、ロシア vs ウクライナなんですか? すると戦力差が大きいので、クリミア半島と同じようにドンバスがロシアに併合される結果にしかならなさそうに思えます。

変数topをoffsetTopとclientTopにわけるまで

背景

offsetTopclientTopの使い分けについてです。 両者の違いはoffsetTopoffsetParentからの相対値で、clientTopはブラウザの左上からの相対位置です。

offsetParentと言われても意味不明ですが、ここではposition: absoluteなHTML要素の一番近い先祖のposition: relativeな要素です。次のようなイメージです。

<div id="offsetParent" style="position: absolute; witdth: 100px; height: 100px">
  <div class="offsetChild" style="position: relative; top: 10px; left: 10px; witdth: 100px; height: 100px"></div>
  <div class="offsetChild" style="position: relative; top: 20px; left: 40px; witdth: 100px; height: 100px"></div>
</div>

一つ目のoffsetChildoffsetTopは常に10pxです。 clientTopは縦スクロールの位置によって変わります。 offsetParentの左上がちょうど、ブラウザの左上と一致した時、offsetTopclientTopは同じ値になります。

課題

上の例のoffsetChildtop, leftを設定して良い感じの位置に表示するプログラムを書いています。 今までHTML要素の位置を設定するために、offsetTopとしての値しか扱っていませんでした。 変数名やプロパティ名もシンプルにtopとしていました。

ここ最近、First Meaningful Paint の最適化に凝っています。 First Meaningful Paint のためには、これから表示するdivが、ブラウザで表示されている領域の中にあるか外にあるかが重要です。 ブラウザでdivが表示されているか判定する - @ledsun blog で、考えたようにこの判定にはclientTopを使います*1

ここで困ったのがtopという名前だとoffsetTopを意味しているのかclientTopを意味しているのかわからないことです。 そして悩みはじめた時点では、offsetTopという既知の最高の名前があることを忘れていました。

解決

リファクタリングしながら3時間半考えて「いままでのtopが表しているのはoffsetTopだ」と天啓を得ました。

あとは1時間くらいゴリゴリっと名前を変えるリファクタリングして回って、15分くらいclientTopを取るAPIを追加して、10分でclientTopを使った新機能*2を実装しました。

2017年頃は、じっくり考えてから実装するスタイルでした。 いまはリファクタリングしながら考えるスタイルに変わりました。 「道がみつかるまで手を動かせなかった」から「手を動かせば道が見つかる」を経験的に学習したようです。 しかも、リファクタリングした結果、読みやすいソースコードまで手に入るオマケ付きです。

*1:記事中ではgetBoundingClientRectを使っていますが、実質同じ値です。

*2:FMP全体でなく、ある要素を描画するかどうかの基準に使っている要素を別の要素に変える実装です。

モニタスタンドを買うか考える

現在は43インチの液晶モニタを奥行き70cmの机にモニタアームをつけて置いています。 机の前端からモニタ面まで50cmありません。 モニタとの距離を調整するために頭を前後するため、姿勢が悪くなります。 モニタスタンドを机の後ろにおいて距離を90cm位にしたらどうなるのでしょうか?

イメージはこういう奴です。

モニタ*1の条件です。

  • 中心の高さ 114cm~147cm
  • サイズ 43インチ
  • 重量 6.8kg
  • VESA 200x200マウント

机は昇降式でモニタの位置は上下します。

悩ましいのはモニタスタンドは机と一緒に昇降しないので、立って作業するのは諦めないと行けなさそうな点です。

generate-google-calendar-linkのバージョンを上げました

github.com

特に機能は追加してません。 セキュリティアラートが来てたので、たまにはアップデートしようかな?と、そんな気分になりました。

7年ぶりに触るので、いろいろ環境が変わっていました。

  • CIがtravisCI。travisドメインが変わったとかで動かなくなっています。面倒臭いので、Github Actionsに移行しました。テスト実行するだけならテンプレート選んでポチポチするだけなので、簡単です。
  • SourceLabというクロスブラウザテスト環境。何も覚えていないので消しました。合わせてzuulとかkarmaとかのブラウザ向けのテスト実行環境も消しました。karmaの古いバージョンにセキュリティアラートがでていたので目的は果たせました。
  • power-assert。全然メンテナンスしない場合、アサーションエラーが詳しいことにうれしさがないことに気がつきました。
  • ES5。ソースコードもテストコードもES5だったので、ES6に書き換えました。
  • npm publish。Windows PC(のWSL)でnpm publishしたことが無かったので、publishしておきました。

「久しぶりにラジオ体操したら、ラジオ体操しただけなのに体のあちこちが痛い」気分です。