Hatena::ブログ(Diary)

sho-hの日記

2018-03-24

今日はMatsue.rb定例会だった

| 23:22 |  今日はMatsue.rb定例会だったを含むブックマーク

今日はMatsue.rb定例会だったので貯めてた作業を幾つかやっつけた。春が近づいてるのか人がたくさんだった。以下の作業をした(現時点ではまだいずれも取り込まれるかわかってない)。一方で今日はるりまの作業はお休みした。

最後のPRはちょっと気に入ってて、did_you_meanに手を入れて引数を間違えるArgumentError起こすと(わかる範囲で)正しいものを教えてくれるというもの。

require 'did_you_mean/experimental'

Dir.glob('*', 0, 1, 2)
# test.rb:n:in `glob': wrong number of arguments (given 4, expected 1..2) (ArgumentError)
# Did you mean?
#                  Dir.glob( pattern, [flags], [base: path] )
#                  Dir.glob( pattern, [flags], [base: path] ) { |filename| block }

Array.new(3, "foo", "bar")
# test.rb:n:in `initialize': wrong number of arguments (given 3, expected 0..2) (ArgumentError)
# Did you mean?
#                  Array.new(size=0, default=nil)
#                  Array.new(array)
#                  Array.new(size) {|index| block }

a = [1,2,3]
p a.slice(1, 2, 3)
# test.rb:n:in `slice': wrong number of arguments (given 3, expected 1..2) (ArgumentError)
# Did you mean?
#                  ary.slice(index)
#                  ary.slice(start, length)
#                  ary.slice(range)

実は前から欲しかったんだけど、どう実現しようかなと思ってたら @hanachin_さんのQiitaをみてひらめいたのでPRにしてみた。これはもしや沖縄Ruby会議効果でもあるのでは?などと思ったりもした。現時点だと少なくともCIに怒られてるのは直さないといけなさそうだけど...。

次回は4/21(土)の予定ですので松江近辺の人はよかったらどうぞ。

2018-02-28

奨学金を完済した

20:09 |  奨学金を完済したを含むブックマーク

以下のような感じで奨学金を完済した。

  • 2種を30万円、1種を2百忘れた万円借りた
  • 2種は月3000円ずつ、1種は月1万ちょっとずつ返済
  • 高校在学中に1種も申請したけど2種のみを借りれた
  • 大学進学後に1種を再申請して進学後半年くらいで切り替えた

途中から1種のみになり残額も減ってくると割といつでも返済出来る感漂う金額になった。だけど、車のローンなど利子があるものの方が毎月の金額も高く痛いので、どちらかというとそちらを繰り上げ返済して奨学金の方はのんびり返させてもらった。10年以上はかかった。ありがとう奨学金。名前だけは「学生ローン」とかに変えた方がいいと思うけど、助かりました。

2種で利子がうんたらって最近も見るけど、とりあえず、1種に借り換えれるチャンスを逃さないところから頑張ったらいいと思う2月末。

なお、今後浮くお金についてはiDeCoさんに吸わせる事にしたので出費はトントンです。

2017-12-10

Redmineプラグインをgem化して使いたい

| 12:06 | Redmineプラグインをgem化して使いたいを含むブックマーク

本記事はRedmine Advent Calendar 2017の12/10の記事です。昨日は@GEROMAXさんのプロジェクト管理ツールを導入させるためのあてつけがましいアプローチでした。

Redmineを利用する側として便利というお話ではなく、管理する側として便利ではないか?というお話です。近頃Redmineサーバで遊ぶんですが、プラグインインストール/更新を現状より楽にしたいと思う事があります。

まずRedmineプラグインインストール方法ですが、plugins以下にプラグインgit cloneなどで置きます。(以下を参照

プラグインがmigrationを要求する場合はコマンドも実行しないといけないようですがまだ実行した事はありません。

また、以下についてはわかっているのですが、実際にインストール/更新するのは手作業なんですよね。たぶん。

まだわかってない事(解決したい事)

以下の点が悩み所でした。

  1. プラグインのバージョン指定方法のうち、もっともお薦めのやつ
    • 割とgit clone masterしてるREADMEが多い(観測範囲のみ
      • masterは最新の開発コミットが入ってる可能性があってお好きでない
      • 更新のための事前検証環境とか作る時に日によって結果が変わりそう
    • というか実はgit clone(特に--depth=1や-bでバージョン指定)は自分でしたくない
      • とりあえずはリリース済みの最新安定バージョンを指定なしで使いたい
  2. プラグイン脆弱性が万が一あった場合にそれを検知する方法がよくわからない
    • 少なくともbundler-auditは今は使えない(gem化すると使える)

Redmineは何年もありがたく使わせてもらってるんですが、プラグインの更新は bundlerでgemを更新だけするとか、時にはバージョンを固定するとか段々したくなってきたのでそれが実現できないかと思っています。

gem化できるとインストールも更新もし易いですし、バージョンの固定も簡単です。あとruby-advisory-dbに載せれるようになるのでbundler-auditが使えるようになります。(インストール済みのプラグインの一覧を取る必要があると思うのでvulsでもプラグインは現状対応できないんじゃないかと思ってますけどどうなんでしょう。是非試してみたいところ)

個人的にはいい事しかないのですが、Redmineサイドもリソースは有限ですので、もし対応したくても事情があったり、ちょっと厳しかったりするかもしれません。チケットを作ってますので、共感してもらえそうなら、賛成的な反応してもらうとかあると採用してもらう確率が上がったりするかもしれません。ちょうどVote Count Listのお話もありましたし。

と、ここまでが本題です。よかったら+1くださいませ。明日は@yassan168さんです。お楽しみにー。


ここからはおまけです。ちょっとやってみたい人のみ読んでもらう程度でいいかもしれません。自作のプラグインでは強引にgem化してるのですが以降ではその方法などを(ひとさまのgem化方法を真似てもう一手間加えてるだけです)。これでも一旦は僕の希望を満足できますが、使うプラグインが多いと意味ありません。なので標準でgem化されると嬉しいですね。

ファイル構成

重要なのは以下の2つのファイルです。init.rb及び他のファイルは通常のプラグイン同様に作成します。

  • plugin root
    • init.rb
    • lib/<gem name>.rb
    • ...

README.mdには「Gemfile.localに書くかpluginsディレクトリgit cloneしたら使えます」と書いておいてください。git cloneはできればmasterじゃないと嬉しいけどバージョン更新のたびに更新するのがしんどければ...まぁ仕方ありませんよね。

仕組み

Gemfile.localにこれから作るgemが書いてあるので、lib/<gem name>.rbが必ず読まれます(Gemfileにrequire: <パス>を指定していなければ)。それを利用してinit.rbを読み込みます。最低限の作業としてはこれだけです。具体的にはredmine_github_hook gemのようにするといいでしょう。

ただし、これだけだと以下の3つの問題があります。

  1. 他の人がpluginsディレクトリを覗いた時に何もないので混乱する
  2. plugin_assetsを使う場合に自動でコピーされないのでいくつかのアクセスが404になる
  3. redmine:plugins:migrateタスクを呼び出してない

1. の方はpluginsディレクトリの下に道標のファイルを残す程度でいいかと思います。sidebar_hideプラグインにPull Requestを投げてみているのですが、このような形でどこに実体があるかを示しています。gemインストール先にsymlinkを貼る事も考えましたがGemfileに必ずrequire: falseを指定しないといけなくなるので止めました。

2. の方は強引にRedmine::Plugin#mirror_assetsを呼んでしまっています。このような形なのですが、これはもう少し改善したいところですね。前述のRedmine本体向けのチケットには多少考慮したパッチが付いていますが、TODOとかも書いてあったりします。あんまり頑張っても内部構造知りませんから無意味かもしれませんし。

3. はdb:migrateのタイミングで常に呼び出すようRakefileに細工したらいいと思いますが、タイミングわけないと何か困るのかしら?アンインストールと対称じゃなくなる?

おわりに

一部のプラグインでは解決したかった事はとりあえず解決でき、かつ以下のような状態になりました。

これでRedmineのありがたみを引き続き享受しながら、少々楽になる事ができました。あとはできればRedmine側でなんとかなればと思いますが、それはお茶でも飲みながら待つとします。

では改めて明日は@yassan168さんです。お楽しみにー。

SECCON 2017 Online CTFに少しだけ参加した

| 16:58 | SECCON 2017 Online CTFに少しだけ参加したを含むブックマーク

チームで500点取って434位だった。解いた問題のwrite upは以下のチームの置き場に置く予定。

2017-11-12

CODE BLUE CTF 2017に参加した

| 15:00 | CODE BLUE CTF 2017に参加したを含むブックマーク

136点取って154位だった。もう少し時間欲しかったな...。解いた問題は以下のチームのwrite up置き場に置いた。

cryptoは4つめまでくらい解けてもいいんじゃないかと思ったけど、時間的に1番目の後はすぐに4番目に着手して解けきれず時間切れでおしまいorz。やっぱライブラリツール類を初めから準備しておかないとダメだ。とりあえず隔離環境としてVagrantfileを毎回作ってるけど、今回はPython用にasdfな環境を用意しはじめたのでまずはそこを短くするところからかな...

asdf触ってみた

| 15:00 | asdf触ってみたを含むブックマーク

RWCで範囲が広いrbenv的なやつ教えてもらったので隔離環境で試してみる。Python向けにpyenvとか手で入れるなら言語が増える度にそうなるので嫌だった。rbenvを捨てるかrubyプラグインを使わないかにしないといけないと教えて貰っていたが、1個に絞れるならrbenvである必要はない(というか中でrbenvもpyenvも呼ばれてるのかしら?)のでこれにする。

ぐぐりにくいので名前はひどいけど、anyenvだと `$ anyenv install rbenv` して `rbenv install` するみたいな流れになるので今知ってる範囲だとこちらの方が好ましい。Rubyは--HEADでruby-buildインストールしてるのでそれで困りそうだから本格的に移行はせずにまだ仮想環境だけだけど。

gitが入ってる状態で、READMEの通りにしてインストール

$ sudo apt-get install -y automake autoconf libreadline-dev libncurses-dev libssl-dev libyaml-dev libxslt-dev libffi-dev libtool unixodbc-dev
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.4.0
$ echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
$ echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc

シェルを再読み込みしてあとはRubyPythonを入れてみる。

$ asdf plugin-add ruby       # Ruby用のプラグインインストール
$ asdf install ruby 2.4.2    # Ruby 2.4.2をインストール
$ asdf plugin-add python     # Python用のプラグインインストール
$ asdf install python 2.7.14 # Python 2.7.14をインストール
$ asdf install python 3.6.3  # Python 3.6.3をインストール

使ってみる。

$ ruby -v
No version set for ruby
$ asdf global ruby 2.4.2
$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]

$ python -V
No version set for python
$ asdf global python 3.6.3
$ python -V
Python 3.6.3

以下を見るに、gem installした時も環境が汚れそうにない(/home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0にインストールされそう)。pipで同じ情報を見る方法がまだわからない。asdf plugin-updateすればプラグインの更新まではできそう。

$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.6.13
  - RUBY VERSION: 2.4.2 (2017-09-14 patchlevel 198) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0
  - USER INSTALLATION DIRECTORY: /home/vagrant/.gem/ruby/2.4.0
  - RUBY EXECUTABLE: /home/vagrant/.asdf/installs/ruby/2.4.2/bin/ruby
  - EXECUTABLE DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/bin
  - SPEC CACHE DIRECTORY: /home/vagrant/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
    - /home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0
    - /home/vagrant/.gem/ruby/2.4.0
    ...

以下がプラグインの保存先みたいだけど、このレポジトリを覗くにrbenvは使ってなさそう。

$ cd ~/.asdf/plugins/ruby/
$ git remote -v
origin	https://github.com/asdf-vm/asdf-ruby (fetch)
origin	https://github.com/asdf-vm/asdf-ruby (push)

$ git branch
* master

うーん、以下ら辺を見るに「このバージョンのRubyはこのURLな」とだけするからrc1とかも簡単に入りそうだけどそれは微妙だ。anyenvの方がいいかもしれない(使った事ないけどあっちはいまのところラッパーでない事だけがつらい)。branchを見たのはbranchによってオプションを指定する事ができるかもと思ってだけどそれ以前の話だった。

PRもIssueも見当たらないけど皆それでいいのかしら?(rbenvのruby-buildみたいにする事になると思うのだけど

とりあえず隔離環境でだけ使う事にしてもう少し詳しくなろう。でもanyenvにする気がする。

2017-08-07

8/26(土)は Matsue.rb 定例会

| 09:24 |  8/26(土)は Matsue.rb 定例会を含むブックマーク

8/26(土) 09:30〜17:00 に松江テルサ別館 2F で Matsue.rb の定例会をやります。87 回目の定例会でございます(募集ページをDoorkeeperに移したので久しぶりに書きました)。

はじめての方は(できればでいいので) PC をご用意くださいませ。m(_ _)m