GNU screen 自分用使い方メモ

12 月 7 2008 In: Linux

GNU screenが便利なんだが、最近使い始めたばかりで使い方を忘れやすいのでメモ。
ちなみにGNU screenってのはとっても語弊のある説明をするとシェルをタブ化+便利機能満載にするプログラムだと考えてくれ。
(詳しくはググってね)

設定ファイル .screenrc

自分のscreenの設定ファイル『.screenrc』はこんな感じ↓


escape ^J^J
hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w"
defhstatus "^En:^Et"
startup_message off
autodetach on
defscrollback 3000

デフォルトではCtrl+aがエスケープ(?)になっているんだけど、エディタやシェルのショートカットキーを衝突するのでCtrl+jに変更。
hardstatus欄の内容は画面下段に今表示しているscreenの状態を表示してくれる。
そのほかの細かい設定の説明は省略

よく使うキー

※キーを初期設定のままにしている方はCtrl + j を Ctrl + a に読み替えて下さい><

  • Ctrl + j c 新しいスクリーンを作成
  • Ctrl + j n 次のスクリーンに切り替え(FirefoxにおけるCtrl + Tabと同義)
  • Ctrl + j Esc コピーモード。カーソルキーを動かし、1回目のスペースで始点を設定、2回目のスペースで終点指定と同時にコピー。ちなみにviのショートカットキーで移動可能。
  • Ctrl + j ] 貼り付け
  • Ctrl + j d デタッチ。スクリーンの状態を保持したままスクリーンから抜ける。screen -rで保持しているスクリーンに戻る
  • Ctrl + j S 画面を上下に分割
  • Ctrl + j Tab 画面分割状態の時に別画面へ移動
  • Ctrl + j X 画面分割状態の時、操作中の画面を閉じる。(分割を解除するだけでスクリーン自体は消えない)

今把握していてよく利用する機能はこんな感じ。

その他

ロギングも出来るらしいがやったことない。また後で試して追記する予定。

UbuntuでIPアドレスを固定する

11 月 26 2008 In: Linux, Ubuntu

UbuntuでIPアドレスを固定する方法について。
※Ubuntu 8.10で試しました

これまでRH系しか使ったことが無かったので、/etc/sysconfigディレクトリが無くて心底焦りました><
ググると下記のやり方で行けるとのこと

/etc/network/interfacesを開き、eth0を編集
※編集前(DHCPを使用する設定)


auto eth0
iface eth0 inet dhcp

※編集後(IPを固定。アドレスなどは適宜ご自身の環境に置き換えて下さい)


auto eth0
iface eth0 inet static
address 192.168.11.18
netmask 255.255.0.0
network 192.168.11.0
broadcast 192.168.11.255
gateway 192.168.11.1

RHELやCentOSだと/etc/sysconfig/network-scripts/ifcfg-eth0 にeth0を設定するんだけど、
Ubuntuだと/etc/network/interfaces にすべてのネットワークアダプタの設定をするのね。
ファイルが違うし若干記述方法違うけど大体内容は一緒なのであんまり問題ではなさげ。

FirefoxにVimperator入れてみたら涙目www

10 月 5 2008 In: vim

FirefoxにVimperator入れて「vi風に操作できるSUGEEEEEEEEEE!!」とかほざいて小躍りしてたんです。
ふと画面上部を見上げたらメニューバーが無い><

あたふたしながらググると以下の解決策が。

:set guioptions=mT
:mkvimperatorrc

ひとまず表示はおk

んでこのエントリ書くためにコピペしようとCtrl-Vしたら貼り付け出来ないorz
「p打ったら貼り付けられるんじゃね?」とかおもったらページ遷移しやがったOTL

結論:Shift-Insertって便利だよね^^

じゃなくて「説明書はよく読みましょう」ってとこか…
ぶっちゃげvi使っている身分にゃこのプラグインは便利なんで、しばらく四の五の言いながら頑張って使っていきます><

ただいまメンテナンス中

10 月 1 2008 In: お知らせ

このブログ、ずいぶん放ったらかしにしてたなぁ・・・(ーー;

いつの間にか海外からコメントスパム喰らってたり無駄記事が散乱してたんで、
再度メモ書きブログとして復帰させるようメンテ中です。

キター><

compiz3 on Flickr - Photo Sharing!
compiz on Flickr - Photo Sharing!

  • ATi製のウンコドライバ入れなくても動きます
  • 「# sudo aptitude install compizconfig-settings-manager」して「システム - 設定 - Advanced Desktop Effects Settings」から利用したい効果を選ぶだけ

最近雑多な事で時間なくなり過ぎ。
コードを弄る暇も無くなってるよorz

そんなワケで整理の為にメモ

・姉貴が一眼レフのデジカメ(10万円)を買う気。
 パソコンで操作するのは俺の仕事ってのは既に決定事項。 保存だけなら出来るが補正なんて無理っすY(>_<、)Y
 というか撮影もその内させられるなコレは…。
 撮影に関するウマーな本って誰か知らない?

・初めてのPythonが読み進まないなぁ。
 「速く読む」事を意識して進めるか。

・「ショーシャンクの空に」を借りてきた。今週中に見る。

・彼女ともっとコミュニケーションを取りたい。
 問題はそれ以外にやりたい事とどう兼ね合いを取るか。

・はてなブクマとRSSリーダーの眺め方を考え直す必要あり。
 ぶっちゃけ眺めるのは1日5分でよくね?

・XPが重い。後で消す。
・八割の作業はUbuntuでいい。残り二割が異常に煩わしい。
・その二割が姉貴関係。一度姉貴関係の作業を始めるとこっちの時間が取れなくなる。
 平行作業するにはLinuxで姉貴作業を行うしかない。

・「ヒント:仮想化」そんなワードが頭をよぎった件。

・Ubuntu最新はしばらく様子見。固まったら手を出す。

・たまった作業を効率よく片付けるには見える化して順位付けを行う。
 明日の電車内はその作業を行う。
・エヴァのレンタルは来月からだったorz

遂に『初めてのPython』をゲットしますた★

4 月 16 2008 In: Python, 書籍

数少ないPythonの書籍の中で、「これだけはガチ!」とよく言われているオライリーの『初めてのPython』を15日にゲットしましたよ★

ええ、先月と同じく衝動買い自分へのご褒美です><

いやーしかし相変わらずオライリーの書籍は値段が高いっ>_<
先月の時点で『初めてのPython』を買いたかったんですけど、税込み5000円越えの素敵価格に圧倒され、前回はなくなくvim本だけ手に持って帰宅(´・ω・`)

しかしDjango弄っててPythonの文法自体を知らないことがしばしばネックになっていたので、「4月はPythonの本何か買うかなー」って計画していました。
アマゾンで安くてウマーな本が無いか見てたんだけど、「これは!」と思える本が無い。
というかPythonは書籍の総数自体が少ない(´・ω・`)
お金をかけない方法として、ネット上の公式翻訳ドキュメントを読むという手もあるんですが、電車の中で読めないのは個人的に痛い…orz

そんなわけで今月は奮発しちゃいました\(^o^)/
まだ読み始めたばかりなので書評は出せないけど、今のところおいしく頂けております^^

こいつでDjangoを使ったコード作成がもっとシャキサクになる予感(`・ω・´)

[django]ModelForm(newforms)でValidateしてみる

4 月 13 2008 In: Django

ModelForm(newforms)でValidate

JavaScript使ったXSSを防ぐために、ModelForm使ってURLFieldをValidateしてみたよ\(^o^)/

newformsでのバリデーションのやり方は以下の公式ドキュメントを参照
フォームやフィールドのバリデーションコードを自作する

まとめると以下のようになります。

  • バリデーションはフォームのクリーニングを行ったとき(フォームのis_validを呼び出したとき)に実施される。
  • クリーニングは次の3つの過程が順に行われる。
    • フィールドサブクラスのclean()メソッド
    • フォームサブクラスのclean_<fieldname>() (<fieldname> はフォームフィールドを指す属性名) メソッド
    • フォームのサブクラスの clean() メソッド

今回は「元々URLFieldが持っているバリデートをかけつつ、別途JavaScriptを使用したXSSを防ぐための自作のバリデートをかけたい」と考え、2番目を実施することにしました。

でも公式ドキュメントを読んでもclean_<fieldname>()の使い方サッパリわかりませんorz
『このメソッドはパラメタ無しで呼び出されます。』って書いてあるから「引数なしのメソッド」のことかと思ってテキトーにコード書いたら『引数が一個必要だぞブルアァァァ』って言われました(´・ω・`)
さて、今日もググるか…λ

Review Board素敵すぐるwww

ググってたら早速コード見つけたお^^
↓の30-31行目あたりです。
ユーザ登録時の使用可能文字制限 | Diffビューア | Review Board
Review Boardキタ!! しかもmonologistaさんの所のじゃん!!><
# 何気にReview BoardはSEO効果があるような気が><

そんなわけでコード書いてみる

monologistaを参考にしつつテケトーに書いてみる。


class Url(models.Model):
    url_id = models.AutoField(primary_key=True, editable=False)
    url = models.URLField(max_length=1024, verify_exists=False)
    page_title = models.CharField(max_length=512, blank=True)
    description = models.TextField(blank=True)
    added_date = models.DateTimeField(default=datetime.now)
    tags = models.ManyToManyField(Tag, blank=True, null=True)

    class Admin:
        pass

    def __unicode__(self):
        return self.page_title

class UrlForm(ModelForm):
    class Meta:
        model = Url

    def clean_url(self):
        """
        URLとして使用可能な文字かどうか調べる。
        参考:http://www.ipa.go.jp/security/awareness/vendor/programming/a01_02_main.html

        return ” if($url =~ m|[^;/?:@&=+\$,A-Za-z0-9\-_.!~*’()%]|);
        “”"
        url = self.cleaned_data[’url’]

        regexp = re.compile(’[^;/?:@&=+\$,A-Za-z0-9\-_.!~*\’()%]’)
        result = regexp.search(url)

        if result != None:
            raise ValidationError, gettext(”Error URL.”)

「clean_url()でreturnしてねぇwww」とかツッコミどころ満載っす><
さて、これを動かしてXSS起こすURLを入れてどうなるかというと…

『URLを正しく入力してください。』

…ハイィ?『Error URL.』とフォームに表示されるはずなんですけど…何故日本語に(ーー;
まぁいいや。別のURLでも入れよう。とりあえず「http://gash/aogebatoutoshi.mp3」って入れるか。

『URLを正しく入力してください。』

ヤバイwww作り方ミスったかもwww
最後にうちのブログ「http://www.notgeekerror.net/」を入れてみるか\(^o^)/

…ちゃんと動いてる(´・ω・`)

この動きは…まさか…まさか!!

ちょwww newformsのURLField何やってんのwww

newformsのURLField近辺のソース(django/newforms/field.py)を見たら素敵な正規表現がwww


url_re = re.compile(
    r'^https?://' # http:// or https://
    r'(?:(?:[A-Z0-9-]+\.)+[A-Z]{2,6}|' #domain...
    r'localhost|' #localhost...
    r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
    r'(?::\d+)?' # optional port
    r'(?:/?|/\S+)$', re.IGNORECASE)

.(ドット)を含まないローカルドメインはDjango的には『死んでください』ってことなのかーorz
っていうかnewformsだとURLFieldのバリデートが強化されてやがるーorz
でもgeniricviewのURLFieldは普通に『<』とか『>』『()』とかくぐり抜けてくれるーorz

さて、これからどうすっかな〜

  • URLFieldをそのまま使う
  • ドット無しのローカルドメインに対応すべくフィールドのcleanメソッドを自作
    # そいやドット無しのローカルドメインって、RFC的には有りなのかな?無しなのかな?
  • どっちにしてもviews.pyを書かなきゃwww

Djangoの開発版であるDjango 0.97pre を使うために、Ubuntu 7.10に開発版Djangoをソースコードからインストールしました。以下はそのまとめ。

  1. 既に0.96をインストールしている場合であれば事前に削除。
    自分はuniverseリポジトリからSynapticでインストールしていたので、Synapticを使って削除しました
  2. 自分の好きな場所にDjangoの開発版をSubversionからチェックアウト。
    今回は/usr/local以下に配置しました。

    
    cd /usr/local
    sudo svn co http://code.djangoproject.com/svn/django/trunk/ django-trunk
    
  3. PythonのSITE-PACKAGESディレクトリにシンボリックリンクを作成。
    Ubuntu 7.10であれば、SITE-PACKAGESディレクトリは /usr/lib/python2.5/site-packages になります。

    
    sudo ln -s /usr/local/django-trunk/django /usr/lib/python2.5/site-packages/django
    
  4. django-adminのシンボリックリンクを作成。
    
    sudo ln -s /usr/local/django-trunk/django/bin/django-admin.py /usr/local/bin/django-admin
    

試しに動かして見たところ、どうやら動いてくれているようです( ^ω^)
python manage.py shellで色々弄ってみたら、ModelFormもありました\(^o^)/
これで最新機能をイジり倒せるぞ〜><

参考
Djangoのインストール

常山さんに教えてもらったModelFormを使えば楽にvalidate出来そうな気がしたのでテケトーにコード書いて早速トライ★

…あれ?python manage.py runserverしたら「ModelForm何て知らねぇぞゴルァ」とか言われてる。

このエラーは…まさか…まさか!!(某ATの清麿風に)


# python manage.py shell
In [1]: from django.newforms import *

In [2]: Model(タブ押し)
ModelChoiceField          ModelMultipleChoiceField  

In [2]: form(タブ押し)
form_for_fields    form_for_instance  form_for_model     forms

0.96に無い機能キター!!

さ、これを機に0.97preへの移行計画を立てようか。

想定されるコト

  • Ubuntuにapt使って入れてるんだけどこいつを削除
  • 代わりに0.97preをソースから拾ってくる。
  • 本家見るとzipは0.96までしか用意されていないような。
    ってことはsvnでHEADから拾ってくることになるのかな?
  • ソースからのインストール方法知らないから多分時間かかるな〜。
    まぁ『django インストール 0.97』あたりでググればなんか当たるでしょ\(^o^)/

Sponsors