python のスクリプト(.py) を作って、スクリプト内で自分自身のファイル名を種痘する場合のお話です。
abc.py ファイル を実行した場合に、 abc.log のようなログファイルを作る際に使えます。
ここからは、次のようにしてモジュールを読み込む必要があります。
ディレクトリを除いたファイル名
ディレクトリに対してこれを実行すると、ディレクトリ名が取得できます。
ファイル名(拡張子なし)
|
path.splitext(path.basename(__file__))[0] |
“.” で文字列を区切ってリストにします。 “a.b.c” のように “.” が2つ以上ある場合は 最後の “.” で区切って (“a.b”, “c”) を返します。
path.basename(__file__)[0] をファイルの存在するディレクトリで実行した場合も同じ結果になります。 (crontab などで実行すると思わぬ結果になります。 “a/b.py” が (“a/b”, “.py”) になります。)
ディレクトリ
絶対パス
|
path.abspath(path.dirname(__file__)) |
上の相対パスを path.abspath
で絶対パスにしています。
Ruby で サイトマップ を作成する gem を紹介します。
sitemap_generator
sitemap_generator を使うと、サイトマップが簡単に作成できます。 Ruby だけでも使えます……が、ここでは Rails の上で私が使用した方法を紹介します。
使用方法
環境は次の通りです。
- Ruby 2.0.0p451
- Rails 4.1.0
- sitemap_generator 5.0.2
Gemfile
に sitemap_generator
を 追加して bundle install
します。
rake sitemap:install
を実行します。 config/sitemap.rb
というファイルが作成されます。
- このファイルに記述したサイトマップ生成スクリプトは rake sitemap:refresh によって更新されます。
config/sitemap.rb
が作成される他は特になにも起こりません。 sitemap_generator
の tasks.rb
を覗いてみるとよくわかります。
sitemap.rb
を編集します。
- デフォルトでは ルート(“/”)へのサイトマップが3つ作成されます。 それら3つは
changefreq
が異なりますが、いらないので削除します。 コード内に SitemapGenerator::Sitemap.include_root = false
を記述します。
SitemapGenerator::Sitemap.create_index = true
を記述して、サイトマップのリストを作成します。
- サイトマップの作成を
ping
で通知します。 Google と Bing に届くように設定します。 Yahoo! は Google と検索エンジンが同じであるため Yahoo! の設定は必要ありません。
|
SitemapGenerator::Sitemap.ping_search_engines( :google => 'http://www.google.com/webmasters/tools/ping?sitemap=%s', :bing => 'http://www.bing.com/webmaster/ping.aspx?sitemap=%s') |
lastmod
, priority
, changefreq
などを出力したくない場合には、それぞれの値に nil
を設定します。
rake sitemap:refresh
が実効されるように、 crontab
に記述します。
javascript を使ってテーブルをソートすることになった。ドットインストールを見ると複数項目でソートする方法まで載っている・・・が、これを一般化してどんなテーブルでもソートできるようにするにはどうするか考えてみた。公開されているライブラリもあるんですけどね。
続きを読む javascript でテーブルをソートする方法 →
Ruby On Rails のシステムの中でツールチップを表示しようと思ったときのメモです。
やることは単純で、クリックされたらヘルプを表示して、もう一度クリックされたらヘルプを隠すというものです。はてなマークがクリックされたらツールチップを表示・非表示するということです。
実装は javascript (jQuery) と CSS で行いました。そして Rails の helper に便利メソッドを作りました。以下がそのコード。
環境
- Ruby 1.8.7p374
- Rails 3.0.1
- jQuery 1.4.3
基本
|
.help-tooltip { max-width: 600px; background-color: #fff; display: none; z-index: 10; font-size: 12px; position: static; border: solid 1px black; padding: 2px; } |
|
$('.help-tooltip-trigger').live( 'click', function () { $(this).next().slideToggle('fast'); } ); |
上のように javascript と css を記述して、次のように HTML を書きます。
|
<span class="help-tooltip-trigger"> <img src="image/quotation.png" style="width:16px;height:16px;" /> </span> <div class="help-tooltip"> <p>ヘルプメッセージ</p> </div> |
image/quotation.png はクリックするモノです。その画像をクリックすると表示・非表示が切り替えます。
正確にいうなら、画像を囲んでいる span をクリックすると、その直後のタグの表示・非表示を切り替えます。つまりクリックするものは画像でなくてもよく、もっというならツールチップ以外にも使えるということです。
helper の活用
Rails には helper というものがあるので活用してみます。
|
def help_tooltip(message, size = '16x16') result = content_tag(:span, {:class => 'help-tooltip-trigger'}) do image_tag 'icons/question.png', :size => size end result += content_tag(:div, {:class => 'help-tooltip'}) do raw message end return result end |
このメソッドを次のようにして使うと、上に書いた HTML のように出力されます。
|
<%=help_tooltip '<p>ヘルプメッセージ</p>', '16x16'%> |
2番目の引数はデフォルト値を設定しており、引数がなくてもいいようにしています。
私がこの tooltip 表示を書き始めたら ほかの人が随所で真似し始めたので、もっと楽にできる helper のメソッドを作ったというお話でした。
Ruby で 2 つ のキーを使ってハッシュをソートする場合、 下のように書くことができます。
|
array.sort!{|a, b| a[:value_1] <=> b[:value_1] || a[:value_2] <=> b[:value_2] } |
それでは 3 つ のキーでソートする場合はどのようになるでしょうか。
|
array.sort{|a, b| a[:value_1] <=> b[:value_1] || a[:value_2] <=> a[:value_2] || a[:value_3] <=> b[:value_3] } |
これ以上キーを増やしていくとコードを書くのが大変なので、 3 つ 以上のキーでも楽にソートできるよう、比較するメソッドを作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
# @param [Array] array the hash array which you want to compare elements # @param [Array] value_names value name to compare, like [:value_1, :value_2, ...] # @param [Array] orders compare order. To compare order like SQL # 'order by value_1 desc, value_2 asc' then [-1, 1] def multicompare(a, b, value_names, orders) if value_names.length == 0 return 0 else value_name = value_names[0] return (orders[0] * (a[value_name] <=> b[:value_name])) || multicompare(a, b, value_names[1..-1], orders[1..-1]) end end array.sort{|a, b| multicompare(a, b, [:value_1, :value_2, :value_3], [1, -1, 1]) } |
A Life Summary of an Gypsy