rcmdnk's blog
Last update

20131004_mygist_200_200

Gistを新たに載せようと思ったら なにやらURLが見つからないとのエラーが出て 新たにGist入のページが作れなくなってたんですが、 どうやらGitHubでのGistのURLが変更されたみたいです。

さらに変更

追記: 2016/04/22

2016年4月にさらなる変更が入ってます。

追記ここまで

エラー

新たにGist入りのページ{% gist xxxx %}を作って generateしてみたところ

$ rake generate
## Generating Site with Jekyll
unchanged sass/screen.scss
Configuration from /octopress/_config.yml
Building site: source -> public
Liquid Exception: Gist replied with 302 for https://raw.github.com/gist/6824298/ in 2013-10-04-test.md
/octopress/plugins/gist_tag.rb:88:in `get_gist_from_web'
/octopress/plugins/gist_tag.rb:27:in `render''`'`

こんな感じのエラーが出て作れなくなってました。 このページを外して既にGistが入ってるページ有りきでgenerateする場合は大丈夫。

Octopressのissueを見に行ったらやはり指摘されていて、 ちょっと前にGitHubのGistのrawのURLが変わった様です。

以前は

 https://raw.github.com/gist/GIST_ID/ (+FILE_NAME)

と言った形だったのが

 https://gist.github.com/raw/GIST_ID/ (+FILE_NAME)

こんな感じに。 さらにこのページは

 https://gist.github.com/USER/GIST_ID/raw(+/FILE_NAME)

というページにリダイレクトされます。 以前どうだったかイマイチ覚えて無いですが、Gistの各ページも

 https://gist.github.com/USER/GIST_ID/

の様に今はユーザー名が入るようになっています。

各Gistページは今もUSERを除いても上のURLへリダイレクトされる様になってるみたいですが、 rawのページの場合は

 https://gist.github.com/GIST_ID/raw(+/FILE_NAME)

の様に書いてもリダイレクトされません。その代わりに上に書いた rawディレクトリが用意されているのかも。

いじれにしろ、このraw.github.comのURLをgist_tag.rbがチェックしていたので 古いURLを見に行って無いよ、と言われてたわけです。

以前、既にGistを入れていたページについては、rawページのキャッシュが .gist-cacheに残っていて、ある場合は上のrawのチェックを行わないので OKだった模様。 (ただし、下に書く様に何かが変わっている。。。)

対処法

Ocotpressのissue/pull requestを見に行ったら半月ほど前に気付かれて議論されてる途中でした。

Ref: [#1363] Asking username to gist plugin

Ref: Gist plugin url is broken.

追記: 2013/10/06

プルリクエストが他にもいくつかあったみたいですが、 結局ユーザー名を使わないで今まで通り使える感じでマージされた様です。

Ref: gist_tag.rb

追記ここまで

上の方では/USER/GIST_ID/raw(+/FILE_NAME)を取りに行っています。 この場合はユーザー名が必須なので自分のGitHubのユーザー名を _config.ymlから取ってきたり 引数で与えたり(もしくはGIST_IDの前にユーザー名をつけたり) してますが、場合によってはこれまでの記事の書き換えが必要になるので面倒です。

下の方は/raw/GIST_ID/の方を使っているので、これまでと殆ど変わりありません。

最終的にOctopressでどの様な形を採用するかわかりませんが、 取り敢えず現状自分で入れた対処法は下の方を採用してこんな感じ。

gist_tag.rb.diff
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
diff --git a/plugins/gist_tag.rb b/plugins/gist_tag.rb
index 2549ea7..201e8a7 100644
--- a/plugins/gist_tag.rb
+++ b/plugins/gist_tag.rb
@@ -21,14 +21,14 @@ module Jekyll
     end
 
     def render(context)
-      if parts = @text.match(/([\d]*) (.*)/)
+      if parts = @text.match(/([a-zA-Z\d]*) (.*)/)
         gist, file = parts[1].strip, parts[2].strip
-        script_url = script_url_for gist, file
-        code       = get_cached_gist(gist, file) || get_gist_from_web(gist, file)
-        html_output_for script_url, code
       else
-        ""
+        gist, file = @text, ""
       end
+      script_url = script_url_for gist, file
+      code       = get_cached_gist(gist, file) || get_gist_from_web(gist, file)
+      html_output_for script_url, code
     end
 
     def html_output_for(script_url, code)
@@ -46,7 +46,7 @@ module Jekyll
     end
 
     def get_gist_url_for(gist, file)
-      "https://raw.github.com/gist/#{gist}/#{file}"
+      "https://gist.github.com/raw/#{gist}/#{file}"
     end
 
     def cache(gist, file, data)
@@ -72,7 +72,29 @@ module Jekyll
 
     def get_gist_from_web(gist, file)
       gist_url          = get_gist_url_for gist, file
-      raw_uri           = URI.parse gist_url
+      data = get_web_content gist_url
+      data = handle_gist_redirecting data
+      if data.code.to_i != 200
+        raise RuntimeError, "Gist replied with #{data.code} for #{gist_url}"
+      end
+      data            = data.body
+      cache gist, file, data unless @cache_disabled
+      data
+    end
+
+    def handle_gist_redirecting(data)
+      if data.code.to_i == 302
+        redirected_url  = data.header['Location']
+        data = get_web_content redirected_url
+        if data.code.to_i != 200
+          raise RuntimeError, "Gist replied with #{data.code} for #{gist_url}"
+        end
+      end
+      data
+    end
+
+    def get_web_content(url)
+      raw_uri           = URI.parse url 
       proxy             = ENV['http_proxy']
       if proxy
         proxy_uri       = URI.parse(proxy)
@@ -84,11 +106,6 @@ module Jekyll
       https.verify_mode = OpenSSL::SSL::VERIFY_NONE
       request           = Net::HTTP::Get.new raw_uri.request_uri
       data              = https.request request
-      if data.code.to_i != 200
-        raise RuntimeError, "Gist replied with #{data.code} for #{gist_url}"
-      end
-      data              = data.body
-      cache gist, file, data unless @cache_disabled
       data
     end
   end

これ自体、新しいGistですがきちんと表示されています。

下の方のpull requestにある内容だと最後にdataが余計に取られてるので注意です。

このgistのURL変更に加えて、renderの最初でtextを評価してる部分を変更してあります。

変更前を見ると分かる通り、例えばGIST_IDだけを与えるとき、

{% gist 6840247 %}

最後に%の前に空白がないと 弾かれてコードが載りません。 エラーも出ないのでたまにこの間違いをして コードが載ってないのに後から気づいたりしました。 前はプラグインの中を見てなかったので、数字を入れる場合は%の前だと空白を 入れないと悪さをするのかも、とか思ってましたが、 単にgist_tag.rbの問題でした。 勿論、他のタグの場合は最後に空白はあっても無くても大丈夫です。

さらにif全体を見ると、 余計な物が入っていたりそもそもGIST_IDを与えない場合はエラーを出さずに 空欄にする仕様みたいですが、 むしろエラーを出してもらった方が嬉しいと思うので 上の様にtext内に空白がある(gistタグの引数として2つある)場合は2つ目をファイル名に、 ない場合には全体をGIST_IDとして渡してしまって、見つからない場合は その後のチェックでエラーを出して貰えばよい、というようにしてあります。

それから、自分のバージョンは古いのでtextの中から GIST_IDを数字だけで検索してましたが、 文字列も含むようになった?らしいので 1(自分のとこでは今のところないですが) 現在のOctopressのmasterにあるgist_tag.rbにならって 文字列検索も追加してあります。

キャッシュされるrawのコード

上で問題となってるのはrawの部分なんですが、 以前、キャッシュされてるファイルを見ると中身が空でした。

実際、Gistを載せてあるページのhtmlを見てみると

1
2
<div><script src='https://gist.github.com/6840247.js'></script>
<noscript><pre><code></code></pre></noscript></div>

の様にnoscript内のcodeに記述がありません。 JavaScriptが動かない環境では見たことがなかったので気づかなかったんですが、 今まではすべてこうだったようです。

これが、今回のURLのアップデートの結果かどうがわからないですが、 今回新しく付けたGistはちゃんとcode内にコードが載ってます。 (このページのソースを見てみてください。) 以前もエラーは出てなかったし、ちゃんとURLを見に行ってたはずなんですが。

Gistのページを直接貼り付ける

ちなみに、今回Gistでエラーが出るようになった時にちょっと検索してたら こんなものを見つけました。

Ref: SEO Friendly Gists

このGeneratorは元々、Gistのページで用意されているJavaScriptだけ貼り付けるとコードが ページには貼り付けられないのでSEO的に弱い、ということから コードも貼り付けよう、と言うことで作られたみたいなんですが、 上のgist_tag.rbがやってることと全く同じ事をしてくれます。

Octopress以外で、Gistをちょっと貼り付けたいときに 適当なツールが無いときにnoscript付きで貼り付けたい時には便利かな、と。

rake cleanの 不具合?

ここで今回もう1つ気づいたのが、キャッシュが残ってるから。。。 という時に、そういえばrake cleanでキャッシュとか消さないんだろうか? と思って見てみたら

desc "Clean out caches: .pygments-cache, .gist-cache, .sass-cache"
task :clean do
  rm_rf [".pygments-cache/**", ".gist-cache/**", ".sass-cache/**", "source/stylesheets/screen.css"]
end

こんな感じでやはり消すようになってました。 今回上手く行かなくなった後も、取り敢えずrake cleanしてみて、という風に 実行してるので、キャッシュが残ってる事自体がおかしい訳です。

Ref: Octopress - rake clean 不具合! http://www.mk-mode.com/octopress/2013/07/24/octopress-problem-rake-clean

こちらの方のブログを見ると、そもそもrm_rfの使い方がおかしいようだ、とのこと。 (ワイルドカードの指定が間違っている。)

Octopressのpull requestにも似たようなのがあったのですが、

Ref: Clean should clean the specified directories

2年前にポストされたもので、対処されないまま1年前にcloseされてます。

環境に依るのかもしれませんが、自分の手持ちのMacやCygwinなどでは 全部上手く行きません。 先に上げた方のブログの人もrubyのバージョンを戻したりしても駄目だったとのこと。

取り敢えず上の2つには同じ様にglobを使った対処法が載ってるので

こんな感じで変更。

これでrake cleanをしてみるとちゃんと.gist-cacheの中身が消えました。

自分のところでこれまできちんと消せてたかわからないのですが、 さしあたり、screen.cssについては直接ファイル指定をしてるので、 毎回rake cleanした後にgenerateするとscreen.cssを作り直します、 みたいになるのできちんと消えてると思ってました。

ただ、キャッシュに残ってたファイルを見てみたら、一番古いGistでも それを初めて使った日付で作られてたままだったので、 どうもこれまで一度もきちんとキャッシュを消して無かったようです。。。

Octopress公式で無視されたのが、環境依存によるもので他の人には問題になってないのか キャシュなので、大概の場合は問題にならないので見逃してる/無視してるのかわかりませんが、 掃除したつもりなのに掃除されてないのは良くないのでやはり直しておきたい所。

Octopressのコードの表示@Octopress2.5

OctopressのGistのコード表示はGitHubの仕様変更によって だいぶ前から表示がおかしくなってました(行数とコードがちぐはぐになったり)。 この辺りは

Ref: OctopressのGist表示の調整

のところで以前直しました。ただ、まだおかしな所があって直しきれてません。

後、色も暗いのも明るいのもちょっと気に入らなかったので自分で作ってます。

Ref: ソースコードの表示色

上のGistの問題があってからOctopressの公式ページを除いてみたら、 Gistの問題は治ってるし、 また、ハイライトも落ち着いた感じのいい感じになってます。

Ref: Gist Tag

Ref: Include Code

追記: 2013/09/15

よく見たらちょっとおかしな表示になってます。

ファイル名無しの物はgistのURLへのhtmlのコードになっていて、 ファイル名を指定したものはそのgistのページそのもの?のhtmlが コードの所に書かれてます。

Gistに関して、2.5を取ってきて試してみたところ、 取り敢えず現在あるファイルは壊れてて上手く出来ず、少し前の historyをさかのぼって消された関数とかを入れることで なんとか通りましたが、上の様におかしな表示になってます。

取り敢えずやろうとしてることはGitHubで提供されてるJavaScript を無視して直接コードを取ってきて通常のcodeblock同様の 形にしてしまおう、ということっぽいです。 (仕様変更がちょこちょこ起こるので)。 ただ、2.5とかはまだちゃんと整備されてません。

追記ここまで

変更日が書いてないですが、ちょっと前まではコードは濃いグリーンの背景の 昔のままで、Gistも行数がずれたままだったので最近ページを作り直したみたいです。

この色は、現在のOctopressのmasterではなくて、 2.5のブランチにあるsassのファイルを使うと出来ます。

2.5自体は、色々と仕様変更があって、プラグインなどが素直に使えなかったりするので 導入は結構面倒そうですが、sassのファイル郡だけであれば導入は簡単です。 もし、自分で変更して無ければ 2.5ブランチにあるファイル で自分のsassにあるファイルを上書きしてあげればOKです。

ちょっと自分でいじったところとの対応を考えながら変更を加えないと行けないですが、 Gistとかの枠組みとか、上手く言ってないところは取り入れたいと思ってます。 ハイライトの色も結構いい感じだと思います。

Sponsored Links
Sponsored Links

« MacでGNU screen使用時utmpが無いと言われる Octopressでチェック用に高速にgenerate/previewする »

}