hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

fish shellのprompt_pwdを少し改造する

イントロ

日々fish shellを使っているのですが、
プロントの表示を変更したくなりました。 ただ、単純には変更できなかったのでカスタマイズしてみました。 というお話です。

一般的なやり方

fish shell で プロンプト を変更する場合は以下のコマンドを打ちます。

fish_config

ブラウザが起動して設定を選択することでプロンプトを変更できます。
選択して好きな設定にできます。

fish.rubikitch.com

変更した点

例えば以下のディレクトリで作業していた場合

/Users/hotoolong/.ghq/github.com/hotoolong/translate.nvim

変更前のプロンプトの表示は以下になります。(私の設定の場合)

~/.g/g/h/translate.nvim (master|✔) $ 

これでもいいのですが、 現在作業しているディレクトリと親のディレクトリも省略しないで表示してほしいのです。

なぜなら、githubディレクトリ構造だとオーナー名/リポジトリ名 になっているため、 自分が作業しているディレクトリがどのリポジトリ配下のかというのいちいちチェックしたくなかったからです。

ということで
いろいろ調べてみたのですが、
デフォルトでは省略されている名称のサイズは変更可能なのですが、
ディレクトリだけ省略を変更するようなオプションは見受けられませんでした。

ちなみに 省略名称のサイズを3に変更したい場合はconfigに以下のように設定します。

set -g fish_prompt_pwd_dir_length = 3

こうすることで

~/.ghq/git/hot/translate.nvim (master|✔) $

というように表示されます。
これはこれで便利ですが、やはり親ディレクトリもフルで表示されてほしい。

プロンプトで表示しているディレクトリ情報は prompt_pwd で取得できます。
コードは以下にあります。

https://github.com/fish-shell/fish-shell/blob/master/share/functions/prompt_pwd.fish

prompt_pwd の内容はfish_prompt_pwd_dir_length 以外の 変更できないようです。
そこで関数を上書きしてみました。

最後の処理が省略して表示している処理になります。

string replace -ar '(\.?[^/]{'"$fish_prompt_pwd_dir_length"'})[^/]*/' '$1/' $tmp

この処理を変更して

set -l folders (string split -rm2 / $tmp)
echo (string replace -ar '(\.?[^/]{'"$fish_prompt_pwd_dir_length"'})[^/]*/' '$1/' $folders[1]'/')$folders[2]'/'$folders[3]

として/の右2つ分を取得してそれ以前のデータは既存のように省略データにしてつなぎ合わせています。
こうすることで

~/.g/g/hotoolong/translate.nvim (master|✔) $

となりました。 これで少し作業が捗りそうです。

Neovim用の翻訳プラグインを作った

イントロ

DeepLなどで翻訳が比較的簡単にできるようになっているのですが、
vimから離れずに翻訳したいと思いプラグイン入れてみるとNeovimに対応されてなかったのがプラグインを作ろうと思ったきっかけです。

ただ、よく調べると同様のプラグインは既にあり、
それを使えばよかったのですが勉強の為、作ることにしました。

使い方

リポジトリは以下にあり、興味がある方は使ってください。

github.com

訳したい行で以下のコマンドで翻訳してくれます。

:Tranclate

翻訳した範囲を選択しても同様に翻訳できます。

まとめ

完全に個人用に作成していますが、
機能変更なの要望があればお待ちしています。

(9/28-10/14)[Kindle] Kindle本 プライムデーセール インプレスグループ

イントロ

今回は 9月28日(月)~10月14日(水)にかけてプライムデーセール インプレスグループが開催されています。
いつものようにpickupしていきます。

pickup

  • 個人開発をはじめよう!クリエイター25人の実践エピソード (技術の泉シリーズ(NextPublishing)) (¥990)

  • これでできる!はじめてのOSSフィードバックガイド 「つよいエンジニア」になるための実績の育て方 (技術の泉シリーズ(NextPublishing)) (¥990)

  • AWSを使って学ぶ監視設計 (技術の泉シリーズ(NextPublishing)) (¥880)

  • レベルアップNode.js (技術の泉シリーズ(NextPublishing)) (¥880)

  • スターティングgRPC (技術の泉シリーズ(NextPublishing)) (¥880)

  • 迷わない!困らない!レガシーフロントエンド安全改善ガイド (技術の泉シリーズ(NextPublishing)) (¥880)

  • AWS音声活用術!Amazon Connect実践入門 (技術の泉シリーズ(NextPublishing)) (¥880)

  • 雰囲気で使わずきちんと理解する!整理してOAuth2.0を使うためのチュートリアルガイド (技術の泉シリーズ(NextPublishing)) (¥880)

  • 「Auth0」で作る!認証付きシングルページアプリケーション (技術の泉シリーズ(NextPublishing)) (¥880)

  • はじめて学ぶバイナリ解析 不正なコードからコンピュータを守るサイバーセキュリティ技術 (OnDeck Books(NextPublishing)) (¥880)

  • スクレイピング・ハッキング・ラボ Pythonで自動化する未来型生活 (技術の泉シリーズ(NextPublishing)) (¥990)

  • Markdownライティング入門 プレーンテキストで気楽に書こう! (技術の泉シリーズ(NextPublishing)) (¥990)

  • Scratch本格入門 命令機能詳細・プログラミング作法・デバッグがわかる (OnDeck Books(NextPublishing)) (¥880)

  • mruby/cの小さな世界 (技術の泉シリーズ(NextPublishing)) (¥880)

まとめ

インプレスグレープはIT系の書籍も多く、最近のトレンドの本が多いのでとても参考にしています。
積読が増え気味ですが少しずつ読んでいきます。
他の書籍が気になる方はこちらのリンクからどうぞ!

Ruby 3.0.0 preview1 の インストール

イントロ

Ruby 3.0.0 preview1がリリースされました。

www.ruby-lang.org

RBS、Ractorなど新しい機能が試してみたいところですね。

手順

ruby-build の アップグレード

まずruby-buildのバージョンアップをしましょう。

$ brew upgrade ruby-build

インストール時のメッセージにOpenSSLのバージョンに関して注釈があります。

ruby-build installs a non-Homebrew OpenSSL for each Ruby version installed and these are never upgraded.

To link Rubies to Homebrew's OpenSSL 1.1 (which is upgraded) add the following
to your ~/.config/fish/config.fish:
  export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"

簡単に訳すと

ruby-build はインストールされた Ruby のバージョンごとに、Homebrew ではない OpenSSL をインストールしますが、これらは決してアップグレードされません。
RubyをHomebrewのOpenSSL 1.1(アップグレードされている)にリンクさせるには、次のように追加します。

あなたの設定ファイルに:
  export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"

私の場合はシェルがfishなので
このexportは設定できないのでset -xでglobalに設定します。

set -x RUBY_CONFIGURE_OPTS --with-openssl-dir=(brew --prefix openssl@1.1)

ruby の インストール

install list を確認

rbenv install --list は stable のみが表示されるためまだ3.0は表示されません。

$ rbenv install --list
2.5.8
2.6.6
2.7.1
jruby-9.2.13.0
maglev-1.0.0
mruby-2.1.2
rbx-5.0
truffleruby-20.2.0
truffleruby+graalvm-20.2.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all' to show all local versions.

--list-all ですべてが表示されるので3.0.0-preview1が追加されていることを確認しましょう。

ローカルのOpenSSLバージョン確認

ローカルのOpenSSLのバージョンを確認

$ openssl version
OpenSSL 1.1.1g  21 Apr 2020

同じバージョンなので設定したものをつかってもらうことにします。

rbenv install

普通にインストールすると

$ rbenv install 3.0.0-preview1
Downloading openssl-1.1.1g.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46
Installing openssl-1.1.1g...

このようにOpenSSLのインストールから開始されます。
先程の RUBY_CONFIGURE_OPTS のオプションを追加しておくと設定されたOpenSSLを使ってもらえます。

 $ rbenv install 3.0.0-preview1
Downloading ruby-3.0.0-preview1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.bz2
Installing ruby-3.0.0-preview1...

上記のようにRUBY_CONFIGURE_OPTSを設定しているとrubyのインストールが始まります。 こうすることでインストール時間も節約できますね。

$ rbenv local 3.0.0-preview1
$ ruby -v
ruby 3.0.0preview1 (2020-09-25 master 0096d2b895) [x86_64-darwin19]

Enjoy Ruby life!

RSpec初心者向け勉強会の動画がとても良かった

イントロ

RSpecの初心者向け勉強会が紹介されていました。

blog.jnito.com

勉強会の内容を動画で公開してくれています。
最近RSpecをあまり書いておらずトレンドも追えてなかったのでとても為になる内容でした。

気になった内容

テストの書くべきところ

動画の12:25

システムとして重要な点を書くのは当然なんでしょうが、
System Testに重きをおいて書いていくのがいいという内容でした。

これはよくE2E(End to End)をいかに作っておくかがRailsバージョンアップする際にも鍵になる。
ような話を勉強会に参加したときによく話が盛り上がります。
E2Eを如何に作って置けるかがプロジェクトをうまくすすめる上でも効率がいいですね。

Capybaraの支援ツール

動画の8:10

github.com

を紹介していました。
これはChromeのExtensionでブラウザ操作をCapybaraのコードをジェネレートしてくれます。
これは便利そうですね。

github.com

は知っていたのですが、
それより以前に作らてていますし、
操作ごとに追加されているのを確認できるので使いたいところだけ使うこともできそうです。
これはいいですね。

まとめ

このような勉強会は有意義ですね。とても為になりました。
余談ですが、 最後の方に伊藤さんがイケメンだという話が出てたのがダンディな感じでイケメンですねw

Rubyの継承元のクラスの別メソッドをsuperで呼び出す

イントロ

Rubyの継承先で継承元のメソッドを単純に呼び出すにはsuperを使いますが、
継承元の別メソッドを呼び出したい場合にどうしていいのかわからなかったので調べてみました。

詳細

class A
  def test1(*args)
    puts "A#test1:args(#{args})"
  end

  def test2(*args)
    puts "A#test2:args(#{args})"
  end
end

class B < A
  def test1(*args)
    puts "B#test1:args(#{args})"
  end

  def test2(*args)
    method(:test1).super_method.call(*args)
    puts "B#test2:args(#{args})"
  end
end

B.new.test2('test')
# => A#test1:args(["test"])
# => B#test2:args(["test"])

Aを継承したBのtest2メソッドを呼び出しているのですが、
test2の処理でAクラスのtest1メソッドを呼び出したくなった場合に
以下の処理で呼び出しています。

method(:test1).super_method.call(*args)

method(:test1)でMethodオブジェクトを取り出して
super_methodで親のAクラスのtest1メソッドのMethodオブジェクトを呼びだせます。
これは便利ですね。

参考URL

親クラスの別のメソッドを呼ぶ - Qiita
class Method (Ruby 2.7.0 リファレンスマニュアル)

vimの置換で改行、タブを挿入する

イントロ

度々vimの置換処理で改行やタブを追加して置換するケースがあるのですが、 挿入するためのキーバインドを忘れてしまうのでもう少し調べてみたという内容です。

やり方

改行に置換したいケースで 私がよく利用するのはjsのコードで;の後に改行を無作為に入れたいケースです。

:%s/;/;^M/g

というようなコマンドを入力します。 ^Mはそのまま文字列で入力するのではなく制御文字として挿入します。 ^Mの入力方法はCtr-vとCtr-mで入力可能です。

これで目的は達成できました。

忘れっぽい

^M を入力するための Ctr-vとCtr-m なのですが、
頻繁に利用するわけではないので 脳内で\nを使って改行を挿入しようとするのですが、これだと出来ないんだったわ。
なんだっけ?
のような感じでググることを何度か繰り返していました。

そもそもCtr-vがよくわかってなくCtr-vとCtr-mがセットになっていてこれが何を意味してるのか分からないなという感じでした。
これ別々のコマンドなのかな?とおもい調べてるとhelpに書いていました。

helpを確認してみると

CTRL-V
Insert next non-digit literally.
Up to three digits form the decimal value of a single byte.
The non-digit and the three digits are not considered for mapping.
This works the same way as in Insert mode (see above, |i_CTRL-V|).

Note: Under Windows CTRL-V is often mapped to paste text.
Use CTRL-Q instead then.

Ctr-vの後に入力された文字を非数字文字にして挿入されるようです。 ですのでその後に入力されるCtr-mはEnterでも代替できました。

改行以外でTABを入力する場合もCtr-vとCtr-i Ctr-vとTABキーでも入力可能でした。

ちなみにWindowsではCtr-vはペーストに割り当てられていることがよくあるのでCtr-qで代用できるそうです。

これで結構スッキリはしました。なんとか記憶に定着されそうです。

参考

https://vim-jp.org/vimdoc-ja/cmdline.html#c_CTRL-V https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97 https://ja.wikipedia.org/wiki/ASCII#ASCII.E5.88.B6.E5.BE.A1.E6.96.87.E5.AD.97