mojavy.com

hekyllのimpress.jsスライドを自動的にグリッド配置するjekyllプラグイン

March 26, 2013 at 08:37 PM | categories: jekyll, impress.js, ruby |

hekyllimpress.jsjekyllテンプレのようなものだけど、スライドの位置を個別に指定する必要があってめんどうだったので適当なグリッドに配置するプラグインを書いた。

jekyllのプラグインについて

https://github.com/mojombo/jekyll/wiki/Pluginsに必要なことは大体書いてある。

jekyllのディレクトリに_pluginsディレクトリを作り、その中に*.rbをおいておけば自動的にロードされる。 プラグインの種類はおおまかに以下の4通り。サンプルは本家wikiにあるのでメモもかねて概要だけ。

  • Generators
    • カテゴリ別とか期間別といった任意のルールでページを生成する
  • Converters
    • hamlとかjsonとかのフォーマット変換をする
  • Tags
    • liquidテンプレートエンジンのタグを追加する
    • たとえば、{{ your_tag }} というタグをつかいたければ、Liquid::Tagを継承したクラスをつくって、Liquid::Template.register_tag('your_tag', Jekyll::YourTag) などとする
  • Filters
    • liquidのフィルタを追加する
    • フィルタとはいいつつどんな関数でも登録できる
    • 適当にモジュールをつくって、Liquid::Template.register_filter(Jekyll::YourModule)とすると、{{ 'arg' | your_filter }} のようにして呼びだせる

ソース

wikiで説明されているpluginの書き方を踏まえた上で、それを完全に無視する方法で実装した。 Postクラスを拡張してhekyllにあうようにliquidに渡すデータを上書きしてるだけ。

もっといい方法はあると思う。

def once(tag)
  unless (@__once_executed__ ||= []).include? tag
    yield
    @__once_executed__ << tag
  end
end

module Jekyll
  class Post

    def grid_position
      pos = @site.posts.index(self)
      siz = Math::sqrt(@site.posts.size).ceil
      {
        "x" => 1000 * (pos % siz),
        "y" => 1000 * (pos / siz),
      }
    end

    once(:redefine_to_liquid) do
      alias __old_to_liquid to_liquid
      def to_liquid

        dat = self.data["data"]

        if dat.nil?
          self.data["data"] = self.grid_position
        end
        __old_to_liquid
      end
    end

  end
end

https://gist.github.com/taksatou/5244991

まとめ

impress.jsをつかっておいて単なるグリッドというのもどうかとは思いますが、位置決めをする部分をかえればなんとでもなるのでひまなときにがんばればいいと思います



Rainbow for Common Lisp 作りました

February 19, 2013 at 11:55 PM | categories: ruby, common lisp |

lisp

昨日のテンプレを流用して今日はcl-rainbowという地味なライブラリの宣伝をします。

https://github.com/taksatou/cl-rainbow

cl-rainbowとは、rubygemにあるrainbowをCommon Lispに移植したものです。 これを使うとターミナルの出力を簡単に色付けできます。

インストール

現在(2013-02-19) quicklisp登録申請中です。登録されれば以下でインストールできます。

(ql:quickload 'cl-rainbow)

使い方

以下のように使います。

(setf cl-rainbow:*enabled* t)
(print (cl-rainbow:color :red "red string"))
(print (cl-rainbow:color #x5599ff "rgb color code"))
(loop for c across "RAINBOW" do (format t "~A" (cl-rainbow:color (random #xffffff) c)))

特に解説は不要だと思いますが、端末はカラー表示に対応している必要があります。

RGBのカラーコード指定すると、256色にダウンサンプルして一番近い色を表示します。

その他、例にはのせてませんが、端末が対応していれば斜体や太字にもできます。詳細はソースを見てください。

まとめ

ログ出力のときとかにちょっと便利なときがあるかもしれません。

リードマクロで文字列リテラルをごにょごにょして色付けできるようにするともうちょっと便利になるような気がするので、そのうちチャレンジしてみたいと思います。

フィードバック等ありましたらコメント頂けるとうれしいです。



tmuxでalcの英単語を引く

January 11, 2013 at 10:00 PM | categories: ruby, tmux, english |

english

2013-01-15追記 規約違反とのコメント頂いたのでスクレイピングするスクリプトを削除しました。

tmuxのcommand-promptを使うと任意のコマンドをインタラクティブに実行できます。 これをつかってtmux上でalcの英単語を表示できるようにしたら思いの外便利だったので紹介します。

まず、alcの検索結果をスクレイビングしていい感じに表示するコマンドをつくります。 rubyのnokogiriとrainbowに依存してますが、ぼくがつくった適当なスクリプトでよければこれを使って下さい。

# 2013-01-15 削除しました

これをパスの通った場所にalcという名前で保存して、.tmux.confに以下の設定を追記します。

unbind C-a
bind C-a command-prompt "split-window -h 'alc %% | lv -c'"

C-aにバインドしてますがお好みのキーに変えてください。 rainbowで色付けしてるのでエスケープシーケンスを解釈できるpagerをつかって下さい。

これで.tmux.confをリロードして、prefix-key C-a とかするとtmux上にプロンプトが表示されるので、そこで調べたい単語を入力します。 そうすると新しいpaneに結果が表示されます。pagerを閉じると自動的にpaneも閉じます。



ワンライナーでウェブサーバを起動する方法

July 18, 2012 at 12:30 PM | categories: python, web, ruby |

ruby

とりあえずウェブサーバがたちあがりさえすればいいときは、pythonのSimpleHTTPServerを使うのが便利です。 起動したカレントディレクトリ以下のファイルをブラウズできるので、テスト用のスタティックなスタブデータを一時的に配置したいときとかにも使えます。最近の一般的なlinuxディストリビューションであればデフォルトではいってるpythonで使えると思います。

$ python -mSimpleHTTPServer 3333

デフォルトポートは8000ですが、引数で指定することもできます。
ちなみにrubyでもwebrickを使って同様のことができますが、こちら で紹介されているwebrickのワンライナーは長すぎて覚えられないのでいつもpythonを使ってます。

でもリクエストに応じたロジックを入れたい場合はrubyのsinatraの方が便利です。

$ ruby -rsinatra -e 'get("/"){sleep 3}'

ポートを変更する場合は以下のようにします

$ ruby -rsinatra -e 'set :port,3333; get("/"){sleep 3}'

参考



rubyのワンライナーで便利な変数まとめ

July 08, 2012 at 06:30 PM | categories: ruby |

ruby

$.

現在の行番号を表します。awkでいうNRと同じです。

ruby -ne 'puts "#{$.},#{$_}"'

$-i

この値を文字列で上書きするとin-place置換を行うようになります。オリジナルのファイルはここで指定した文字が拡張子についたファイルとして保存されます。オリジナルファイルが不要なら空文字を設定すればOKです。

ruby -ne 'BEGIN{$-i=".old"}; puts($_) if /foo/' path/to/file

$/

入力の区切り文字を表わす文字です。デフォルトは改行です。

ruby -ne 'BEGIN{$/=","}; p $_'

$, 、$;

$, はjoinのデフォルト区切り文字で、$; はsplitのデフォルト区切り文字です。 ワンライナーではjoinとsplitをよく使うと思うので、BEGINで上書きしておけばワンライナーを多少短く書けます。

ruby -ne 'BEGIN{$,="\t";$;=","}; puts $_.split.join'

まとめ

まだ他にも知らないテクニックがたくさんありそうですが、新しく見つけたら追記していきます。

参考



About Me

pic
mojavy

Recent posts






Categories



Badges