2013年04月13日

コマンドtypoった時にzshから勝手につぶやくようにした

@siritori 氏が時々 「えりっくさんが本日初めてのtypoをしました。 #shellinfo」 などとtweetさせているのを見て、 うわあ僕もやりたあい! なんて思ってたのでとりあえず実現してみました。 いわゆるパクリってやつです。

事前に つぶやき専用コマンド tweet-command を試してみた: 麦汁三昧 で導入している tweet-command が必要になります。

それからタイトルでzshと書いているように zshを使っている必要があります。 必要なバージョンは知らないけど5.0.0とか使ってればきっといけるよ!

で、以上の条件が整っていれば後は簡単。 以下の関数を~/.zshrcにでも放り込んでおけばいける。

command_not_found_handler () {
  echo "zsh「ふえぇ、麦汁さんまたtypoだよぉ……。$0 なんてコマンド存在しないよぉ……」" | tweet > /dev/null 2>&1 &
  return 127
}

こうしておけば例えば

$ sl

なんてよくあるtypoした時などに

zsh「ふえぇ、麦汁さんまたtypoだよぉ……。sl なんてコマンド存在しないよぉ……」

どうやらzshちゃんはcommand not foundな時に command_not_found_handler って関数を定義していればそれを実行してくれるらしいよ!

とりあえずechoで文を吐いてそれをtweetコマンドに食わせて tweetコマンドの標準出力、標準エラー出力は盛大に投げ捨てて、 すぐ帰ってくるようにつぶやく処理はバックグラウンドに投げてる。

関数の最後のreturn 127 は再度エラーを投げ直しているような感じ。

@siritori 氏のshellinfo は回数を数えてたりもするようだけど 今回はとりあえずcommand not foundを拾うのだけ……。

タグ:zsh typo
posted by 麦汁 at 10:24 | Comment(0) | TrackBack(0) | zsh | このブログの読者になる | 更新情報をチェックする

2013年04月11日

Emacsが死んだ時に勝手に嘆きTweetするようにした

基本的にEmacsがないと何もできないほどにEmacsに依存しているので Emacsが突然死してしまった場合に備えて 自動的にTwitterに向けて嘆くようにしてみました。

環境はMax OS XにてHomebrewで入れたEmacs23ちゃん。多分CocoaEmacsってやつ。

あと、事前準備として つぶやき専用コマンド tweet-command を試してみた | 麦汁三昧 で導入したtweet-commandが必要。

でまあ、とりあえず Emacsの死活監視のためのshell scriptの用意。

死んでる間に何度でもつぶやこうとされたら困るので つぶやいた後は ~/.emacs.dead というファイルを生成し、 それがある場合にはつぶやかないようにしている。

#!/bin/sh

emacs_process=`/bin/ps ux | grep Emacs.app | grep -v grep`

if [[ ${emacs_process[@]} = "" ]] ; then
  file="$HOME/.emacs.dead"

  if [[ ! -e $file ]] ; then
    echo "Emacs落ちたし帰りたい @mugijiru" | tweet
    touch $file
  fi
fi

こんな感じのを ~/bin/check_emacs.sh とかいう場所に適当に保存して実行権限を付与。

そしてcrontabで

PATH="/Users/mugijiru/bin:/Users/mugijiru/.rbenv/shims:/bin:/usr/bin:/usr/local/bin"

* * * * * check_emacs.sh

とでも書いておけば、 毎分毎分Emacsが生きているかを確認して死んでいたら嘆くことができる。

しかしまあ、ひとしきり嘆いた後には再度Emacsを立ち上げるわけで そいつがまた死んだ時も嘆きたいわけで。

そのために、Emacsを起動した時には 嘆いて後に作られる「死んでるの確認したよ」のファイルを削除してあげたい。

ってことで ~/.emacs.d/init.el の最後の方にでも適当に

(if (file-exists-p (expand-file-name "~/.emacs.dead"))
    (delete-file (expand-file-name "~/.emacs.dead")))

とか書いておく。

これでEmacsが再び死んだ時にも嘆くことができる。

なんだけどこれだと(滅多にしない)正常終了時にも嘆いちゃうので、 ~/.emacs.dead を作成してから死ぬことに。 こいつがあればcheck_emacs.shちゃんが嘆かないからね。

ってことでやはり ~/.emacs.d/init.el の最後の方に

(add-hook 'kill-emacs-hook
          '(lambda nil
              (shell-command (concat "touch " (expand-file-name "~/.emacs.dead")))))

なんて書いておく。

以上で 「Emacsが異常終了したら自動的に嘆きTweetをする」 ってのが実現。

というわけで私がTwitterで 「Emacs落ちたし帰りたい @mugijiru」 などとつぶやいている時は哀れんでやってください。

posted by 麦汁 at 22:16 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする

2013年04月10日

動画ページURL収集のRubyスクリプト

割とどうでもいいことも記事に起こすって目標があった記憶があるから 割とどうでもいい記事書きます。

最近仕事でPHPしているので プライベートでちょろっとだけRuby書いて遊んでます。

今日はその中のひとつであるURL収集用スクリプト。

ぶっちゃけ、あるサイトをスクレイビングしているだけなので超簡単。

#!/usr/bin/env ruby

# スクレイビング用にMechanizeさんにお世話になる
require 'mechanize'

agent = Mechanize.new

url = 'http://***********/' # 趣味がバレるのでURLは伏せる:p

# get_urls.rb 20140404
# と実行したら
# http://***********/20140404.html を取得するように
url += ARGV[0] + ".html" if ARGV[0]

# ページ取得
agent.get(url)

# 各テーブル内に必要な情報があるのでとりあえずテーブル拾う
tables = agent.page.search("div.txtBody > table")

# 各テーブルを解析
tables.each do |table|
  tds = table.search("td")

  # 各セルを解析
  tds.each do |td|
    links = td.search("a")

    # このページから動画へのリンクは数字のみ含まれているのでそういうリンクを取得
    movie_links = links.select {|link| link.text =~ /^\d+$/ }

    # そのセルに目的のリンクがなければ次へ
    next if movie_links.empty?

    # 画像のalt属性に動画タイトルがあるのでそれを出力しておく
    img = td.at("img")
    puts img["alt"]

    # 動画のリンクをそれぞれ出力
    movie_links.each {|ml| puts ml["href"] }
  end
end

実行したら、こんな感じのテキストファイルができる。 (実際に取得したデータではありません)

オッス! 漢だらけのふんどし大会!
http://movie.example.com/video_id=92871
http://movie.example.com/video_id=92878
美人すぎる男たちの宴
http://vids.example.com/video832171
http://vids.example.com/video832198
http://vids.example.com/video832211

あとはタイトルを見て適当に必要そうな動画のURLだけ残して ほげほげしている感じ。

コードのコメントなどを真面目に読んだ方なら気付いていると思いますが 対象のサイトは毎日ページを更新しているので このスクリプトを適当に ~/bin/get_urls.rb という位置に保存して crontab で

PATH="/home/mugijiru/bin:/home/mugijiru/.rbenv/shims:/bin:/usr/bin:/usr/local/bin"

5 2 * * * get_urls.rb > $HOME/video_urls/`date +'\%Y\%m\%d'`.urls

とか書いて毎日取得している感じ。 cronの環境変数周りとかdateの書き方とか よくわからんしなんか面倒だよねってこれを書いてて思った。

ま、いい加減だけど巡回の手間が省けてるので良し。幸せになれてる。

posted by 麦汁 at 22:32 | Comment(0) | TrackBack(0) | ruby | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。