週1でも日記

  • このサイトに書かれていることは間違っているかもしれませんので、ご注意ください。
  • 非推奨環境: フォントの大きさが Unreadable な xterm 上のテキストブラウザ
2005][07][08][09][10][11][12][
2006][01][02][03][04][05][06][07][08][09][10][11][12][
2007][01][02][03][04][05][06][07][08][09][10][11][12][
2008][01][02][03][04][05][06][07][08][09][10][11][12][
2009][01][02][03][04][05][06][07][08][09][10][11][12][
2010][01][02][03][04][05][06][07][08][09][10][11][12][
2011][01][02][03][04][05][06][07][08][09][10][11][12][
2012][01][02][03][04][05][06][07][08][09][10][11][12][
2013][01][02][03][04][05][06][07][08][09][10][11][12][
2014][01][02][03][04][05][06][07][08][09][10][11][12][
2015][01][02][03][04][05][06][07][08][09][10][11][12][
2016][01][02][03][04][05][06][07][08][09][10][11][12][
2017][01][02][

2017年06週036日星期0 12:00:00 AM 00:00:00

トラックバック - http://d.hatena.ne.jp/yshl/20170205

2017年05週029日星期0 12:00:00 AM 00:00:00

トラックバック - http://d.hatena.ne.jp/yshl/20170129

2017年01週001日星期0 12:00:00 AM 00:00:00

[]ELVM に PostScript バックエンドを追加してみよう 22:27 ELVM に PostScript バックエンドを追加してみようを含むブックマーク

ELVM に PostScript バックエンドを追加しようとしてmake ps は通るようになったけど、make elc-ps が通らない。

どこから手を付ければいいのかもわからないんだけど、どうすりゃいいんだろう。

shinichiro_hshinichiro_h 2017/01/02 10:46 PostScript欲しかったのでありがたいですー。ご存知かと思いますが elc-ps は target/ps.c を EIR 化したものが機能しているかをチェックしています。これが通るとたぶん self-host できると言えるかと思います。

で、修正は EIR (+8cc) 特有のハマりどころがあるので結構わかりにくいですよね。こんな感じで直るようでした。

http://shinh.skr.jp/t/0001-Fix-PostScript-backend-on-EIR.patch

yshlyshl 2017/01/02 21:20 修正いただきありがとうございます。
make elc-ps が通ることを確認しました。
バックエンドを書く時は EIR と 8cc の制限も気にしなけばならないという事でしたか。
そういえば、Ruby や Python のバックエンドで 1<<24 となっている部分は文字列の中ですね。バックエンドの C プログラムで 1<<24 と書いてしまうと、elc.c を EIR にコンパイルした時に、オーバーフローするコードが生成されるということですか。
( 実は elc-ps が何なのか、よくわかっていませんでした。セルフホスティング用の何かなんだろうなくらいで。)

トラックバック - http://d.hatena.ne.jp/yshl/20170101

2016年52週365日星期5 12:00:00 AM 00:00:00

トラックバック - http://d.hatena.ne.jp/yshl/20161230

2016年49週345日星期6 12:00:00 AM 00:00:00

Rubyディレクトリ名を連結して相対パスを得たい時は File.join より Pathname を使った方がよい 00:38 Ruby でディレクトリ名を連結して相対パスを得たい時は File.join より Pathname を使った方がよいを含むブックマーク

Rubyディレクトリ名を連結したい場合によく使われるメソッドに File.join がある。

File.join において、空文字列 '' は特に何も影響を与えない '.' と似たようなものだと思いがちである。

File.join('a','','b') # => "a/b"

しかし、第一引数が空文字列 '' の場合root ディレクトリからの絶対パスになってしまう。

File.join('','a','b') # => "/a/b"

要は '/' を間に入れて単純に連結しているだけであり、Rubyリファレンスにもそう書いてある。(参照)

うっかり第一引数に空文字を渡して root ディレクトリからのパスが現れるのを防ぎたい場合は、Pathname を使うとよい。

require 'pathname'

Pathname('a').join('','b').to_s # => "a/b"
Pathname('').join('a','b').to_s # => "a/b"

Rubyディレクトリ名を連結して相対パスを得たい時は Pathname より File.join を使った方がよい 00:38 Ruby でディレクトリ名を連結して相対パスを得たい時は Pathname より File.join を使った方がよいを含むブックマーク

Rubyディレクトリ名を連結したい場合によく使われるクラスに Pathname がある。

require 'pathname'

Pathname('a').join('b') # => "a/b"
Pathname('a')+'b'       # => "a/b"
Pathname('a')/'b'       # => "a/b"

この Pathname インスタンスは、'/' で始まる文字列を連結すると、絶対パス解釈し、それまでのパス無視してしまう。

require 'pathname'

Pathname('a').join('/b') # => "/b"
Pathname('a')+'/b'       # => "/b"
Pathname('a')/'/b'       # => "/b"

ちなみにリファレンスでは、+ と / の方には 「other が絶対パスなら単に other と同じ内容の Pathname オブジェクトが返されます。」と書かれている (参照) が、 join の方には「与えられたパス名を連結します」程度しか書かれいていない。(参照)

うっかり '/' で始まる文字列を渡して絶対パスになるのを防ぎたい場合は、File.join を使うとよい。

File.join('a','/b').to_s # => "a/b"

で、結局どうすればいいの? 00:38 で、結局どうすればいいの?を含むブックマーク

ディレクトリトラバーサル攻撃とかを気にする必要があるなら、信頼できない文字列は全部細かくチェックするしかないんじゃないですかね。'/' 以外にも '..' が渡される場合とかもチェックする必要がありそうだし。

私は別にこの辺詳しいわけではないので、実際は何かいい方法があるのかもしれませんが。

うっかりミスを防ぐ程度なら、相対パスが欲しい場合は File.join第一引数に '.' を付けるようにするとか?

File.join('.','','a','b') # => "./a/b"
トラックバック - http://d.hatena.ne.jp/yshl/20161210
2005)(07)(08)(09)(10)(11)(12)(
2006)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2007)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2008)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2009)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2010)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2011)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2012)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2013)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2014)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2015)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2016)(01)(02)(03)(04)(05)(06)(07)(08)(09)(10)(11)(12)(
2017)(01)(02)(
374911