Hatena::ブログ(Diary)

ブックマクロ開発に このページをアンテナに追加 RSSフィード Twitter

2012/01/05

WEBのテーブルをicalに変換するサンプル

予定表がテーブルで出力されているとき、icalやRSSに出来たら便利だなと思って他ので。


ical形式にしてみた。

#!/usr/bin/env ruby
require 'rubygems'
require 'mechanize'
require 'scanf'
require 'kconv'
$KCODE=‘u’
## データサンプル
#b = mech.page.search("//tr[@tmpl='LOOP EVENT_LIST']")
#b[13].search('td[1]').text #=> "1月12日(木)"
#b[13].search('td[2]').text #=> "第165回知能システム研究発表会"
#b[13].search('td[3]').text #=> "11月18日(金)"
#b[13].search('td[4]').text #=> "当日のみ"
#b[13].search('td[5]').text #=> "〔関東〕国立情報学研究所"


class IPSJEvents
    include Enumerable
     def initialize()
         url = "http://www.ipsj.or.jp/cgi-bin/ipsj_calendar.cgi"
        @mech = Mechanize.new
        @mech.get url
        #puts @mech.page.to_s.toutf8
        ##pp @mech.page.search "//table"
    end
    def parse_event()
        event_tr_list = @mech.page.search("//tr[@tmpl='LOOP EVENT_LIST']")
        @events = event_tr_list.map{|tr|
            # "開催日"は期間があるので日付にする
            str = tr.search('td[1]').text
            {"開催日" =>           tr.search('td[1]').text.strip,
            "名称"    =>           tr.search('td[2]').text.strip.toutf8,
            "url"     =>           tr.search('td[2]/a').attr('href'),
            "論文応募締め切り日" => tr.search('td[3]').text.strip,
            "参加締切日" =>         tr.search('td[4]').text.strip,
            "開催地"     =>        tr.search('td[5]').text.strip
            }
        }
    end
    def each(&block)
        self.parse_event unless @events
        @events.each{|e|
            yield e
        }
    end
    def to_ical
        require 'icalendar'
        require 'date'
        cal = Icalendar::Calendar.new
        self.map{|e|
            next if e["開催日"].strip == ""
            s_month,s_day,s_wday,e_month,e_day,e_wday = e["開催日"].scanf('%d月%d日(%s)〜%d月%d日(%s)')
            start_date = Date.new(2012,s_month,s_day)
            end_date   = Date.new(2012,e_month,e_day) if e_month
            e["開催期間"] = [start_date,end_date]
            cal.event do
                event = Icalendar::Event.new
                dtstart start_date if start_date
                dtend end_date if end_date
                summary "#{e['開催地']}-#{e['名称']}"
                url "#{e['url']}"
                description "#{e['url']}\r参加締切日:#{e['参加締切日']}\r論文応募締め切り日:#{e['論文応募締め切り日']}\r"
            end
        }
        cal.to_ical
    end
end


ipsj = IPSJEvents.new
#a= ipsj.map{|e| e}
puts ipsj.to_ical

2012-01-07追加

ついでに電子情報通信学会もやってみた。

#!/usr/bin/env ruby
#
require 'rubygems'
require 'mechanize'
require 'kconv'
$KCODE='u'


class IEICEEvents
    include Enumerable
    def initialize()
      @mech = Mechanize.new
      @url = "http://www.ieice.org/ken/program/index.php"
      @event_list = []
    end

    def parse_event
      table = @mech.page.search('//table[@cellpadding=2 and @width="100%"]').last
      event_tr_list = table.search('tr').select{|tr|  tr.search('td[1]').text.gsub(/\s+/,"").toutf8 !="開催日"}
      event_tr_list.each{|tr|
            e= { 
              "開催日" => tr.search('td[1]').text.gsub(/\s+/,"").toutf8.strip,
              "開催地" => tr.search('td[2]').text.gsub(/\s+/,"").toutf8.strip,
              "名称" => tr.search('td[3]').text.gsub(/\s+/,"").toutf8.strip,
              "研究会" => tr.search('td[4]').text.gsub(/\s+/,"").toutf8.strip,
              "論文応募締め切り日" => tr.search('td[5]').text.gsub(/\s+/,"").toutf8.strip,
            }
            links = tr.search('td[6]//a').select{|a| a.text =~ /プログラム/}
            e["url"] = links.first.attr('href') if links.size>0

            @event_list.push e
      }
    end
    def next_url
        return nil if @mech.page.links.select{|a| a.text =~ /次/}.size<1
        next_url = @mech.page.links.select{|a| a.text =~ /次/}.first.href
    end
    def get_all
        loop { 
          @mech.get @url
          self.parse_event
          @url = self.next_url
          #puts @url
          break if @url==nil
        }
        @event_list
    end
    def each(&block)
      self.get_all.each{|e|
        yield e
      }
    end


    def to_ical
      require 'icalendar'
      require 'date'
      require 'scanf'
      cal = Icalendar::Calendar.new
      self.each{|f|
        start_date=nil
        end_date =nil
          start_date,end_date = f["開催日"].split('-').map{|e| e.gsub /2012年/, ""}.
                                      map{|e| e.scanf("%d月%d日(%1s)")}.
                                      map{|e| [2012,e[0],e[1]]}.
                                      map{|e| 
                                        d= nil
                                        begin
                                            d= Date.new(e[0],e[1], e[2])
                                        rescue =>err
                                          #puts err
                                        end
                                        d
                                      }
          cal.event do
            event = Icalendar::Event.new
            dtstart start_date if start_date
            dtend end_date if end_date
            summary "#{f['開催地']}-#{f['名称']}"
            url "#{f['url']}"
            description "#{f['名称']}--#{f['url']} 参加締切日:#{f['参加締切日']}:論文応募締め切り日:#{f['論文応募締め切り日']}".gsub /\n/, ""
          end
      }
      cal.to_ical
    end

end


ieicie = IEICEEvents.new

puts ieicie.to_ical

簡単

mechanizeは簡単なのでもっと普及して良いと思うよ。

2012/01/03

cygwinのapt-cyg decygportを有効無効を切り替える

cygwinの本家パッケージは数が足りないのでcygwin追加パッケージをコンパイル済みで配布してくれてるcygwportを使うと便利だ

cygport-enable

#!/bin/sh
apt-cyg update -m ftp://ftp.cygwinports.org/pub/cygwinports

cygport-disable

#!/bin/sh
apt-cyg update -m  ftp://ftp.jaist.ac.jp/pub/cygwin/

2012/01/02

ニコニコ動画のダウンロード動画をipod / iphone用に変換する

ニコニコ動画でまとめてダウンロードしたので、今度はipod classic で持ち運びたくなった。

そのままでもmp4にしたら、itunesに登録出来る。でもipodに転送できない。

f:id:takuya_1st:20120102160955p:image:w450

ffmpeg使って変換できた

/usr/local/share/ffmpeg/ にipod用の変換プリセットが用意されていた。

takuya@air:~/Desktop$ ls /usr/local/share/ffmpeg/
libvpx-1080p.ffpreset       libvpx-720p.ffpreset       libx264-ipod320.ffpreset        
libx264-lossless_max.ffpreset     libx264-lossless_slower.ffpreset
libvpx-1080p50_60.ffpreset  libvpx-720p50_60.ffpreset  libx264-ipod640.ffpreset        
libx264-lossless_medium.ffpreset  libx264-lossless_ultrafast.ffpreset
libvpx-360p.ffpreset        libx264-baseline.ffpreset  libx264-lossless_fast.ffpreset  libx264-lossless_slow.ffpreset

macでffmpeg のインストールは→ http://d.hatena.ne.jp/takuya_1st/20111224/1324748368

debianのプリセットは /usr/share/ffmpeg にありました。

変換してみた。

ffmpeg -i sm1639267.mp4 -fpre /usr/local/share/ffmpeg/libx264-ipod320.ffpreset tmp.mp4

あとはコレをまとめて変換っと

for i in `ls sm* ` ; do  ffmpeg -i $i -fpre /usr/local/share/ffmpeg/libx264-ipod320.ffpreset out_$i

itunesに登録

これはドラッグドロップ

ipod と同期

f:id:takuya_1st:20120102161504j:image:w320


これで一仕事おわりっと。

ニコニコ動画の検索結果一覧からビデオIDをまとめて取り出す。

ニコニコ動画で、検索結果一覧をたどって、動画IDを保存する。動画のIDをちまちま取り出すのがめんどくさくなった。かっとなってやった。

require 'rubygems'
require 'mechanize'

def search( *tags )
    tags = tags.map{|e| e.split }.flatten
    video_ids = []
    m = Mechanize.new
    m.max_history = 2 # mechanize で1M超すファイルをDLし続けると履歴がメモリオーバーになる。
    link = "http://www.nicovideo.jp/search/#{tags.join('+')}?sort=f"
    begin
        m.get link
        list = m.page.links.map{|e| e.href}.map{|e| e =~/watch\/(sm[0-9]+)/ ; $1}.select{|e| e} 
        link =  m.page.search("/html/head/link[@title='次のページ']/@href") 
        video_ids.push list
    end while m.page.search("/html/head/link[@title='次のページ']").size>0 
    video_ids.flatten
end

やってみる

search( "JOYSOUND配信中", " VOCALOID 殿堂入り" ).size
#=> 758
search( "JOYSOUND配信中", " VOCALOID 殿堂入り" )[0..10]
#=>["sm16133185", "sm16133185", "sm16110005", "sm16110005", "sm16104322", "sm16104322", "sm15977003", "sm15977003", "sm15679694", "sm15679694", "sm15622476"]

できた。

2012/01/01

ニコニコ動画をダウンロードする。Rubyで。

ニコニコ動画を保存してitunesに転送しようかなと。

インストール

パッケージは、sora_hの物を使うことにした。

gem install niconico

ドキュメントには書いてないけど、ruby1.9でしか動かない。1.9が好きになれない僕には、ちょっと不満。

ダウンロードする。

require 'niconico'

nico = Niconico.new('takuya@example.com','*****') #ログインメアド、パスワード
nico.login
$stdout = open("out.flv", "w")
puts nico.video("sm12345456").get_video
$stdout.flush

一覧を取り込む

初音ミクなどのボカロランキングをまとめてダウンロードする。

これはMechanizeでさくっと。

 require 'mechanize'
 nico = Niconico.new('takuya@example.com','*****')
 nico.login
 url = "http://www5.atwiki.jp/hmiku/pages/4386.html"
 m = Mechanize.new
 m.get url
 list = m.page.iframes.map{|e| e.src}.map{|e| e =~ /\/(sm[0-9]+)$/ ; $1}
 list.each{|e|
 video= nico.video(e)
 open("#{e}.flv", "w"){|f| f.write video.get_video }
 }



これで一括ダウンロード。もちろんシングルスレッドで動作させる。マルチスレッドだとダウンロードは出来ない。ニコニコ動画は複数スレッドでつなぐと応答してくれないからね。。。

一応マルチスレッド版もある

#--coding: utf-8 
require 'niconico' # ruby 1.9限定 
require 'openssl' 
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Thread.abort_on_exception=true

class Niconico
  class Downloader
    require 'thread'
    def initialize(address,pass)
      @address,@pass = address, pass
      @q = Queue.new
      @client = Niconico.new(@address,@pass)
      @client.agent.max_history=1
      @client.login
    end
    def add_download_list(sm_id)
      @q.push sm_id
    end
    def worker
      t = Thread.new{
          begin
            sm_id = nil
            retry_cnt = 1

            loop{
              sm_id = @q.pop
              video = @client.video sm_id
              open("nicovideo/#{video.title}.#{video.type}", "w"){|f| f.w
              break if @q.empty?
              sleep 10
            }
          rescue => e
            @q.push sm_id unless e.inspect =~ /not found/
            puts e
            retry_cnt = retry_cnt + 1
            sleep 10*retry_cnt
            @client.login
            retry
          end
      }
      return t
    end
    def start_download
      (0..3).map{|i| t = self.worker;sleep 10*i;t }
    end
  end
end

マルチスレッドで

require 'mechanize'
downloader = Niconico::Downloader.new "takuyaXXXXXX**@gmail.com", "**password**" 
url = "http://www5.atwiki.jp/hmiku/pages/4386.html" 
 
m = Mechanize.new 
m.get url  
m.max_history = 2 
list = m.page.iframes.map{|e| e.src}.map{|e| e =~ /\/(sm[0-9]+)$/ ; $1} 
list.each{|e|  
  downloader.add_download_list e 
} 
 

threads = downloader.start_download
threads.map{|t| t.join}
puts :end

マルチスレッド版だから速いというわけ無く、単にマチスレッドを使って、ビデオIDをPostしたら待ちキューに入ってワーカーが淡々とダウンロードを繰り返す。これをつかって、drubyで完全マチスレッドをポート指定で待ち受けてたり。

2011/12/30

homebrew でMacコマンドをLinuxのGNU風に置換する

Macのコマンドは正統派UNIXなので、Gnuコマンドの系統とはちょっと違う。UNIXだから同じと言っても、やっぱ違うのは気になる。

gnuコマンドにそろえる。

BSDユーザーなら気にならないかもしれないけど、GNU Linuxユーザーの私はどうも気になる。

coreutilsをインストールしてそろえる

brew install coreutils --default-names

コマンドが競合しないかドキドキしながらインストール。

2ヶ月使ってみて。

brew のインストールでたまにエラーになるけど。ほとんど問題ないです。

問題が出たっぽい場合の対処法:一時的にオフにする。

Brewで入れたコマンドを一時的にオフにしすればいい

brew unlink coreutils

オフを元のオンに戻すときは

brew link coreutils

簡単ですね。


色がカラフル。

ls --color=auto

などLinuxで当たり前のことが出来るようになるので、とてもうれしいです。


2012/02/07追記

最新版のHomeBrewでは、/libexec/gnubinに標準コマンド名でln されているらしい。

    All commands have been installed with the prefix 'g'.

    If you really need to use these commands with their normal names, you
    can add a "gnubin" directory to your PATH from your bashrc like:

        PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"

正直意味ないんと思うんだけど、ばかみたいにalias列挙するより数段ましだよね。

brew edit coreutils

インストールファイルを編集して g を付けないようにも出来る。

 def install
   system "./configure", "--prefix=#{prefix}" #, "--program-prefix=g"
   system "make install"

どうせ,alias とかPATH通すなら、これでいいかと思ったり。

2011/12/29

Chromeのインスタンス検索のパケット代はGoogleに請求書出したい

Chromeをどうしても使うことがあるので、面倒だけどつかってる。

インスタント検索が復活する

インスタント検索がオフにならない。

検索設定でオフにしても、オフにならない。

調べてみたら・・・

アドレスバー検索からのショートカットにインスタント検索設定が含まれてた。

アドレスバーからの検索を次のように設定した

f:id:takuya_1st:20111230050528p:image

http://www.google.com/search?num=30&hl=en&safe=off&q=%s

Googleのインスタント検索が復活するタイミング

・Chromeへのログインユーザをスイッチする。

・Googleサイト(Gmailなど)へのユーザーをスイッチする

・Gmalへログイン・ログオフする。

・アドレスバーから検索する。

これらのタイミングで、検索設定のCookieが書き換わってデフォルトに戻っちゃう。

googleはAppsアカウントの統合とマルチログインを始めた辺りからどうもSSOのセッション管理が変だ。

しかも今回はChromeへのログインも絡んでた。もういや。Opera世界に引きこもる。



インスタント検索のパケット代はGoogleに請求したい。

3G回線でインスタント検索なんてやられたら堪らない。電車移動中でインスタント検索なんてやられたら。憤死しそうだ。


インスタント検索、そのパケット代はgoogleが払ってくれよな

OperaでWEBページからApp Store を開く方法

OperaでAppStoreなどのプロトコルハンドラを関連づければ出来ます。

AppStoreにアクセスしたら

AppStoreでSafariでこいよと言われて悲しい。FireFoxやChromeだと、プロトコルに関連づける?って聞いてくれる。

原因はAppleがOperaにプロトコルへリダイレクトしてくれないことだろう

AppStoreのWEBページにアクセスしたら

f:id:takuya_1st:20111230044032p:image:w300

すかさずFireFoxとして認識させる

f:id:takuya_1st:20111230044033p:image:w300

するとプロトコルの登録を聞かれるので、

f:id:takuya_1st:20111230045737p:image:w300

f:id:takuya_1st:20111230044036p:image:w300

f:id:takuya_1st:20111230045735p:image

プロトコルを登録する

f:id:takuya_1st:20111230045736p:image:w600

めでたし

f:id:takuya_1st:20111230044038p:image






感想

プロトコルハンドラってFuckinな感じ。できればMimeTypeでやってほしいと思うんですけどね・・・。


プロトコルハンドラは https:// みたいなプロトコルを指定するんだけど。絶対足りなくなるし、管理できなくなる。

そのために、HTTP通信にはMimeTypeとMimeハンドラがあるんだからそっちでやってほしいと思うんですが。Googleはなんでプロトコルにしたんだろうか。まぁたぶん、通信しなくても関連付けアプリを使えるからアンドロイドのためだと思うけど。だけども、あまりに好きになれない。


プロトコルハンドラでいきなりローカルAPPが起動するから、すごく脆弱だと思うんだけどさ・・・

passwd コマンドでワンタイムのパスワードを作る

Windowsには、パスワードに初回ログイン時のみ有効なものがある。ユーザーはログイン時にパスワードを変更する。

これをLinuxでやるには

passwd -e 

をたたけば良いらしい


参考

http://www.debian.org/doc/manuals/debian-reference/ch04.ja.html

2011/12/27

XpathでRSS広告を外す至高のメニュー

Xpathって条件かけるんですよね。プログラミング言語で、IF分や正規表現マッチをすると、条件の再利用がめんどくさいのでXpathでやってみた。

XpathでRSS広告以外のエントリを取得する

/rss/channel/item[not(contains(./title,"PR"))]

PHP5.2xなら

SimpleXMLが使えるのでとても便利。

<?php
$xml = file_get_contents($url);
$sxml = simplexml_load_string($xml);
$sxml->xpath("/rss/channel/item[not(contains(./title,\"PR\"))]");

これでOK。

解説

item[not(contains(./title,"PR"))]
  • [xxxxx]で、itemノードのうちxxx の条件にマッチする物を取り出す
  • [ not xxxx] で itemノードのうち xxxx の条件にマッチしない物を取り出す
  • contains() でitemノード以下属性から文字列を含む物を取り出す
  • ./title で item/titleノードの文字列を検索対象にする
  • PR で文字列があるかどうかをマッチさせる。
  • これらの条件は () 括弧で囲む
  • contains は関数。

応用

./title の代わりに、@href などを使うと、itemノード属性値文字列が対象になる。

or やAndでつなぐ [ xxx and yyy ] または [xxx or yyy ]

xpathが便利なんだけど、しばらく使わないと使い方忘れて右往左往するので、よく使いそうな使い方で暗記することにした。

Xpath最高ですね。

xpath便利です。

協力してくれたM先生ありがとうございました。


2012-01-09 追記 ちなみにHTMLを扱うときは

<?php
$url = "http://b.hatena.ne.jp/";
$html = file_get_contents($url);

$doc = new DOMDocument();
$doc->strictErrorChecking = FALSE;           #どうせエラーいっぱいだからチェックしない
$doc->loadHTML($html);
$xml = simplexml_import_dom($doc);
$list = $xml->xpath("//body");
echo var_dump($list[0]);

http://drewish.com/content/2007/08/using_simplexml_with_html

みっちゃんありがとう。感謝します。


参考資料

http://itref.fc2web.com/xml/xpath.html

http://www.mulberrytech.com/quickref/XSLT_1quickref-v2.pdf

2011/12/24

URIのエンコードをコマンドにしていつでも呼べるようにしておくと便利だと思う。

URIのエンコードをコマンドにしていつでも呼べるようにしておくと便利だと思う。

v8エンジンが確実だと思ったけれど、V8はコマンドプロンプトから呼んでもShebangで呼べない。



URIencodeがコマンドから呼べるように

encodeURI

 1 #!/usr/bin/env ruby
 2
 3 require 'uri'
 4 str = ARGV.join if ARGV.size > 0
 5 str = STDIN.read unless ARGV.size > 0
 6 puts URI.encode(str)

decodeURI

 1 #!/usr/bin/env ruby
 2
 3 require 'uri'
 4 str = ARGV.join if ARGV.size > 0
 5 str = STDIN.read unless ARGV.size > 0
 6 puts URI.encode(str)

これで便利になる。

オレ専用のrubygems配布サイトが欲しいですね。

オレオレRubyGems配布サイトを作りたいと思った。


やりかた

Route477さんがやってる。→http://route477.net/d/?date=20100720


インストール

gem install geminabox

サーバの起動

設定ファイル config.ru を書いて「rackup config.ru -p 9292」とかするとgemサーバが起動する。

ruファイル
require "rubygems"
require "geminabox"
Geminabox.data = "/var/geminabox-data" # …or wherever
run Geminabox

配布するgemの追加

管理画面からアップロードする。

f:id:takuya_1st:20111225033502p:image

geminaboxはWeb UIを持ってるので、ブラウザでlocalhost:9292とかを開くと管理画面が表示される。ここからgemファイルをアップロードすることができる。

WEB-UIの起動

rackup -o 192.168.95.210 -p 8888 config.ru

または、手動で追加

$ gem inabox foo-0.1.2.gem

としてもいい (初回は「Host:」と聞かれるので、「http://localhost:9292/」などと入力する)。

オレオレ配布サーバーからのgemのインストール

自前のgemサーバを追加する(この情報は~/.gemrcに保存されている)。

$ gem sources -a http://localhost:9292/

感想

Sinatraはえらい。


おまけ

rackupコマンドの使い方

takuya@debian00:~$ rackup config.ru -h
Usage: rackup [ruby options] [rack options] [rackup config]

Ruby options:
  -e, --eval LINE          evaluate a LINE of code
  -d, --debug              set debugging flags (set $DEBUG to true)
  -w, --warn               turn warnings on for your script
  -I, --include PATH       specify $LOAD_PATH (may be used more than once)
  -r, --require LIBRARY    require the library, before executing your script

Rack options:
  -s, --server SERVER      serve using SERVER (webrick/mongrel)
  -o, --host HOST          listen on HOST (default: 0.0.0.0)
  -p, --port PORT          use PORT (default: 9292)
  -O NAME[=VALUE]          pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '/usr/bin/rackup -s SERVER -h' to get a list of options for SERVER
      --option
  -E, --env ENVIRONMENT    use ENVIRONMENT for defaults (default: development)
  -D, --daemonize          run daemonized in the background
  -P, --pid FILE           file to store PID (default: rack.pid)

Common options:
  -h, -?, --help           Show this message
      --version            Show version

参考:その他

Route 477 - geminaboxで「俺専用gem配布サーバ」を立てる

geminaboxでローカルにgemをホストする – Aerialarts

ImageMagick で PDF を分割する

f:id:takuya_1st:20111225031835p:image


PDFも手軽に扱いたいですね。

imagemagickのコンバートでPDFを分割しようとした。

takuya@air:~/Desktop$ convert  200905_015-088.pdf -resize 480 dest*.png
sh: gs: command not found
convert: Postscript delegate failed `200905_015-088.pdf': No such file or directory @ error/pdf.c/ReadPDFImage/664.
convert: missing an image filename `dest*.png' @ error/convert.c/ConvertImageCommand/3015.

gsがないとエラーになる。

そういうことなので、Macは準備に色々必要らしい。

準備

brew install gs

これで準備完了。Windowsでも、CygwinでもGSをインストールしたら準備完了です。GSはGNUにおいてある。

実行

convert gunmaweb4-110213050747-phpapp02.pdf dst.png

デキアガリ

f:id:takuya_1st:20111225031835p:image


結論


便利なソフトウェアを探すより、それらがベースにしているGNUソフトウェアのコマンドから使用方法を覚えてメモっておく方が便利。

何より、コマンドなのでメモ帳に貼るだけで終わり。コマンドがあれば再現できる。画像手順書?何それおいしいの?

Windowsで無線ネットワークを共有する

Windowsを無線LANコンバーターとしてチョッと使う.

図の通りです。

無線→有線。

f:id:takuya_1st:20111225031409p:image




Windows7は仮想Wifiが準備されているので、Wifiのブリッジにもなる。



有線→有線も同じように出来ますね.

HomeBrewの仕組みについてまとめておく

Homebrewを使っている。MySQLが入らなくて困ったので、改めてまとめ直す。

f:id:takuya_1st:20111225030915p:image



Homebrewとは、Macportsに取って代わりそうな、Macでのパッケージインストーラ

home brew インストール

ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)”

homebrew で使う用語について

用語本来の意味makeのアナロジー
Brewビール醸造するmake する
HomeBrew自家醸造つまり、自分でビルドする意味
Cellerビール貯蔵庫つまり、インストール先
Kegタル、熟成用つまり、makeの材料
Formula調理法つまりビルド手順が書かれたスクリプト

自分でパッケージをビルドして使うってのを、アナロジーで、ビールを自家醸造して、保存して飲むってこと。で表現している。

手順(調理法formula)通りにパッケージをビルド(醸造brew)して保存(/usr/local/cellerに格納)して、使う(/usr/loca/binにリンク)ってことです。

基本操作

とりあえずこれだけ覚えておけば使える。

インストール
ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)” # homebrewインストール
パッケージを探す
brew search mysql

パッケージ・インストール

brew install mysql   #mysql をインストール

パッケージの有効化、無効化

brew unlink mysql # mysqlを一時的に無効にする。
brew link mysql # mysql を有効にする。

パッケージ一覧の更新

brew update   #  formula を更新
brew upgrade  #  更新があるパッケージを再ビルドする

Brew設定を見る

Brewでつかうためのビルド設定を見る。

takuya@air:~$ brew --config
HOMEBREW_VERSION: 0.8
HEAD: c9eca803d676961ead136b07ab145cc1e826b314
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CELLAR: /usr/local/Cellar
HOMEBREW_REPOSITORY: /usr/local
HOMEBREW_LIBRARY_PATH: /usr/local/Library/Homebrew
Hardware: quad-core 64-bit sandybridge
OS X: 10.7.2
Kernel Architecture: x86_64
Ruby: 1.8.7-249
/usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
Xcode: 4.2
GCC-4.0: N/A
GCC-4.2: build 5666
LLVM: build 2336
Clang: 3.0-211.1
MacPorts or Fink? false
X11 installed? true


本家にWgetを実例にした例が載っている。

使い方

brew install wget

をはじめ、必要な使い方は本家の最初に書いてあるよ。

パッケージがインストールされたらどこに行くか。

$ cd /usr/local
$ find Cellar
Cellar/wget/1.12
Cellar/wget/1.12/bin/wget
Cellar/wget/1.12/share/man/man1/wget.1

インストールの時にリンク

$ ls -l bin
bin/wget -> ../Cellar/wget/1.12/bin/wget

それぞれ保存される。

  • /usr/local/bin   にコマンドのエイリアスが。
  • /usr/local/Cellar/ にコマンドの実体が

オリジナルBrewery 自家製パッケージの作り方。

brew create http://foo.com/bar-1.0.tgzCreated /usr/local/Library/Formula/foo.rb

既存のものをCustomizeにするには

brew edit wget

Brewの書式はRubyそのものである。

require 'formula'
class Wget < Formula
  homepage 'http://www.gnu.org/wget/'
  url 'http://ftp.gnu.org/wget-1.12.tar.gz'
  md5 '308a5476fc096a8a525d07279a6f6aa3'

  def install
    system "./configure --prefix=#{prefix}"
    system 'make install'
  end
end

次のエントリが詳しいので目を通すと良い。

Homebrew 使い方メモ

Formula を自作するなど、詳しい使い方が書いてある。


brewコマンドの使い方。まとめ


Homebrewの使い方一覧Command Consequence


brew install foo fooをインストール

brew install --HEAD foo fooのHEADバージョンをインストール

brew install --force --HEAD foo fooの新しいHEADバージョンをインストール

brew search インストール可能なすべてのformulaを表示

brew search foo インストール可能なformulaからfooを検索

brew search /foo/ 正規表現fooを検索

brew list インストール済みのformulaeを表示

brew list foo fooのインストールしたファイルを表示

brew info --github foo foo formulaのGithub履歴ページをブラウザで表示

brew info インストール済みのHomebrewパッケージのサマリーを表示

brew info foo インストール済みのfooのすべての情報を表示

brew home HomebrewのWebサイトをデフォルトブラウザで表示

brew home foo fooのWebサイトをデフォルトブラウザで表示

brew update HomebrewのformulaeとHomebrew自体をアップデート

brew remove foo fooのアンインストール

brew create [url] ダウンロード可能なファイルのURLのformulaを生成して$BREW_EDITORか$EDITORで指定されているエディタで開く

brew create url-of-tarball --cache formulaを生成して、tarballをダウンロードする。md5をformulaテンプレートに追加する。

brew create --macports foo どのようにfooをインストールするか調べるために、MacPortsパッケージ検索ページでfooを検索する。

brew create --fink foo Finkで同様のことを行う。

brew edit foo formulaを$HOMEBREW_EDITORか$EDITORで開く

brew link foo fooのインストールされたファイルのHomebrew prefixシンボリックリンク作成する。(Homebrewでインストールすると自動的に行われる。DIYインストールを行った場合に有用。

brew unlink foo Homebrew prefixシンボリックリンクを削除する。

brew prune Homebrewprefixからデッドシンボリックリンクを削除する。

brew outdated 利用可能なアップデートバージョンが存在するformulaを表示する。新しいバージョンをインストールするにはbrew install fooを実行する。

brew upgrade 利用可能なアップデートバージョンが存在するformulaをすべてアップグレードする。

brew --config Homebrewのシステム設定を表示する

brew --prefix Howebrew prefixのパスを表示する。(普通は /usr/local)

brew --prefix (formula) インストールされたformulaのパスを表示する。

brew --cellar Homebrew Cellarのパスを表示する。(普通は /usr/local/Cellar)

brew --cache Homebrew キャッシュダウンロードのパスを表示する。(普通は ~/Library/Caches/Homebrew)

brew doctor インストールの一般的な問題をチェックする。

brew audit すべてのformulaeのコードとスタイルの問題を検査する。

brew cleanup foo インストールしたすべてもしくは特定のformulaeの古いバージョンをcellarから削除する。すべての場合はbrew cleanupを実行する。

http://tech.caph.jp/2011/04/06/homebrewの導入と使い方/]

参考

http://w.koshigoe.jp/study/?%5Bsystem%5D%5Bosx%5D+Homebrew+%BB%C8%A4%A4%CA%FD%A5%E1%A5%E2

Mac デ Homebrew ノススメ

SQLiteでシングルクォートがエスケープできない

「\(バックスラッシュ)」を挿入してみたんですが それでは効果がないようで・・・。

で、少し調べてみたら解決策を発見。

「 シングルクォーテーション を エスケープ するには、 シングルクォーテーション を2つ重ねる」 = 「''」

とのこと。

http://www.android-navi.com/archives/android_1/sqlite/

つまり、

SQLiteでシングルクォートのエスケープはバックスラッシュ(¥マーク)でなく、二つ重ねるそうです

CygwinでCronサーバーを動かす

CygwinをつかえばWindowsでも簡単にCronを使うことが出来ます。いままでどうしてやらなかったんだ。便利すぎて大活躍。なぜ避けてきたんだ。そう思うくらい後悔したのです。



とりあえずデフォルトで入ってるみたい

インストール不要。Cygwin入ってたら不要。

takuya@amdE350:~$ apt-cyg install cron
Working directory is /setup
Mirror is ftp://ftp.jaist.ac.jp/pub/cygwin/
Package cron is already installed, skipping
takuya@amdE350:~$ 

設定する:cron-config

とりあえずやってみよう。

takuya@amdE350:~$ cron-config

起動すると以下の質問が聞かれる。


・Cronはサービスとして実行するのか

・Cronはどのユーザーで動かすか?

・通常のユーザー(つまり自分)なのか、特権ユーザなのか

・特権ユーザーは既存の物を使うのか、新規作成するか


僕はSSH用に作った特権ユーザーを使い回したのでそれでいい。

再起動してみてもちゃんと動いているのが確認できる。

f:id:takuya_1st:20111225025249p:image

というわけで設定すれば、これで完了。

あとは通常と同じです。

takuya@amdE350:~$ crontab -e 

みんな大好きインストールログ。

takuya@amdE350:~$ cron-config                                                             ##インストールコマンド
Do you want to install the cron daemon as a service? (yes/no) yes              #サービスとして使うか? YES
Enter the value of CYGWIN for the daemon: [ ]

You must decide under what account the cron daemon will run.
If you are the only user on this machine, the daemon can run as yourself.
   This gives access to all network drives but only allows you as user.
To run multiple users, cron must change user context without knowing
  the passwords. There are three methods to do that, as explained in
  http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd1
If all the cron users have executed "passwd -R" (see man passwd),
  which provides access to network drives, or if you are using the
  cyglsa package, then cron should run under the local system account.
Otherwise you need to have or to create a privileged account.
  This script will help you do so.
Do you want the cron daemon to run as yourself? (yes/no) no                     #サービスは一般ユーザーTakuya で動かすか? No

Were the passwords of all cron users saved with "passwd -R", or
are you using the cyglsa package ? (yes/no) no

Attempting to find or create a privileged user.
The following accounts were found: 'cyg_server' .
This script plans to use the name cyg_server for the new user,
which will only be able to run as a service.
Do you want to use another name (not an interactive account)? (yes/no) yes  # cygserver ユーザーあるけど、これつかう? yes

Please enter the password for user 'cyg_server':                                           # cygserver のパスワードちょうだい
Reenter:
Running cron_diagnose ...
WARNING: Your computer does not appear to have a cron table for takuya.
Please generate a cron table for takuya using 'crontab -e'                              # インストール終了。あとはcontab -e で

... no problem found.

ユーザーcygserverの追加を聞かれる。作っちゃうのが楽。SSHサーバーを入れてるときは、すでに作られているので、それを再利用する。


参考資料

http://d.hatena.ne.jp/poqute/20070307/p1

http://d.hatena.ne.jp/kkobayashi_a/20080605/p1

http://d.hatena.ne.jp/poqute/20070307/p1

http://sonic64.com/2004-06-23.html

GoogleAppsアカウントで、ichatを使う。

GoogleAppsアカウントで、ichatを使う。

google talksが無いのでichat を使う。Google Appsアカウントでも設定できる。

f:id:takuya_1st:20111225024200p:image

自動検出をOFF

ポイントは自動的に検出をOFFにすること

自動検出はDNSの設定や応答から、Jabberのポート検出する。コレはなくていい

hombrew でffmpeg を使う

MacのXCODEgcc からllvmに変更されているので、ffmpegのインストールでエラーになる。

llvmだとエラーになる。

gcc互換になるように指定する。

brew install --use-clang ffmpeg

これでOK。あっというまでした。


参考資料

Mac デ Homebrew ノススメ

2011/12/22

残念なEXCELプログラマには、高機能エディタをオススメする。

ネタにマジレスするか。


低級テキストエディタでせっせとコーディングしているあなた!そろそろ手がが疲れてきていませんか?

インデントや文字の位置揃え等、プログラムの本質以外の部分で時間を使う時代は終わりました!

そしてコメントは視覚的にもコメントらしくなり、「長文コメントのせいでソースが縦に長くなってスクロールめんどい」なんてこともありません!

僕たちプログラマーは、プログラミングに、Excelを使います! - m2

ネタがネタと分かっててもマジレスしたくなる。

Syntaxチェックくらいなら、朝飯前

Vimでもできるし、それなりにちゃんと作り込まれたエディタなら、シンタックスエラーを回避するなんて朝飯前

f:id:takuya_1st:20111222192954p:image

任意のプログラムでファイルを実行して、出力が下に出ます。IDEイラネ

インデントが多くとも横バーも出ない。

擬似的に、なんちゃってインデントしてくれる

ながいテキスト部分でさえ

f:id:takuya_1st:20111222192955p:image

画面の端にあわせて折り返し、

f:id:takuya_1st:20111222194947p:image

画面幅が変わってもインデントはそのまま

f:id:takuya_1st:20111222192957p:image

インデントも適当にしていても問題ない

「横スクロールが出てきてイヤだ。だからインデントは2だ。」とか、「インデントは4でないと読みにくい」とか。そういうことは折り返しのインデント維持機能が無い安物エディタ使ってる人の台詞です。

悔しかったらSakuraエディタと秀丸とvimでこれやってみろや

コード実行も出来る。

ファイルを実行するのに、真っ黒い画面すら要らない。Cygwinすら要らない。

任意のプログラムでファイルを実行して、出力が下に出ます。IDEイラネ

f:id:takuya_1st:20111222192958p:image

コードの実行にマクロなんて要らないんだから。


マクロなんて無くったってファイルの実行できるんだから!!



コメントだって折りたためる。

コメントが長文であったとしても

f:id:takuya_1st:20111222192959p:image

ちゃんと折りたたんで表示できる。

f:id:takuya_1st:20111222193000p:image

連番だって

連番だって箱形選択をくみあわせて最強

f:id:takuya_1st:20111222202715p:image

f:id:takuya_1st:20111222202714p:image



便利ですね。

Excelでそこまでやるかとおもうけど。EmEditorのネタっぽい機能だとマジレスになっちゃうんだよね

低級テキストエディタは●のことですよね。

Excel ¥1,2000。EmEditor ¥5,000

Excel ¥1,2000

http://ecx.images-amazon.com/images/I/41ACmB8ZTEL._SL500_AA280_.jpg

Amazon.co.jp: Microsoft Office Excel 2010 通常版: ソフトウェア

EmEditor ¥5,000

http://ecx.images-amazon.com/images/I/41WAOGtYOFL._SL500_AA280_.jpg

Amazon.co.jp: EmEditor Professional 2010: ソフトウェア

買ってて損はないと思いますよ。


手は疲れない。

vimでモード切り替えるとかEmacsでCtrl押しっぱなしとかそういうことにはならない。

たまにはEmEditorの良さを主張しようと書いておきたかった。


さぁ、変態エディタのEmEditorを使ってみてましょう。

ネタ元

http://d.hatena.ne.jp/miya2000/20111221/


条件付き書式で、シンタックスハイライト!とか考えたけど、ちょっと挫折したので、普通に変態エディタの良さを書いておいた



追記:訂正

最新版の秀丸さんは出来るようになってました。

http://s1-03.twitpicproxy.com/photos/large/478144932.png

http://twitpic.com/7woazo

すいませんでした。

秀丸さんスゲーね。折り返しのインデントはEmEditorだけだと思ってた。

2011/12/20

DDしたイメージをVmwarePlayer で動かす方法

DDしたイメージをVmwarePlayer で動かす方法

知ってると捗りそうなので、まとめておく


vmconveter は dd の raw かの変換をサポートしていない。どうするか?

qemuを使う

qemuLinuxのコマンド

qemu-img convert -f raw /path/to/hoge.dd.img -O vmdk /path/to/hoge.vmdk

これででVMへ変換される


Windowsにはqemuがないよ

Windows版作ってる人がいる。これを借りる。→http://homepage3.nifty.com/takeda-toshiya/

そこそこ時間かかるので我慢。




qemu でvdmxに変換した。

変換した結果はVmWareで起動可能。

しかしVmWareだとハードディスクのエミュレーションがうまく行かなくてWindows7がブルーバックになる。


Windows7/Vistaが起動直後にブルーバックになるのは、AHCIを設定すればたいていいける。

これでVmWare/VirtualBoxで起動可能。

Windowsのバックアップの良い方法はないか。

  • Windows7にバックアップと起動ディスクを作成機能が付いているのでそれを使う。
  • cygwinならDD出来る。でも起動中は出来ない予感。

参考資料

http://lab.hde.co.jp/2008/05/linuxvmware.html

http://www.saitoudaitoku.com/wordpress/?cat=32

http://www.h7.dion.ne.jp/~qemu-win/index-ja.html

http://homepage3.nifty.com/takeda-toshiya/

APT-Cacheしないと遅い ので設定した。

台数多いときに、一度にAPTするとさすがに重そうなので。

APT-Cacheしないと遅いだろうとおもって。APT-Cacheした。

サーバー側で

apt-chaceをインストール


利用側で次のように書く

echo 'Acquire::http { Proxy "http://192.168.95.210:3142"; };' >>  /etc/apt/apt.conf.d/02proxy

参考資料

http://transitive.info/2009/04/05/apt-cacher-ng/

http://blog.browncat.org/2007/11/debwebaptcacher.html