2015 年 1 月の記事一覧です(6 件)

さくらVPSのUbuntuが Booting from hard disk で止まってしまった時の対処方法

今朝、CVE-2015-0235 in Ubuntu に対応する為、このブログが動いているさくらのVPS(Ubuntu 12.04)を下記記事を参考にアップデートした。

12.04 - CVE-2015-0235 How to update eglibc to 2.15-0ubuntu10.10 - Ask Ubuntu

で、アップデート後は再起動したほうがいいだろうと思い、sudo reboot を実施、すると "Booting from hard disk" のメッセージで止まりOSが起動しなくなってしまった。

再インストールという最悪の事態を覚悟しながら、ググりまくり、同一現象を記したほぼ唯一の記事を発見。

さくらのVPSでUbuntuが起動しなくなった時の対処法 | てきとうメモてきとうメモ

殆ど記事通りの手順で復帰することが出来た。再インストールする気満々でしたので、本当に助かりました。
大まかな内容としては、

  • Booting from hard disk で止まっているのは GRUB2 が壊れている可能性があるので修復する必要がある
  • さくらVPSのISOイメージインストールからUbuntuデスクトップをライブ起動させる
  • Ubuntuデスクトップで固定IPを振り、apt-get が使えるようにする
  • boot-repairをインストールする
  • boot-repairを起動させ、ブート修復をして再起動

一昔前に流行ったKNOPPIXや、WindowsPEでリカバリするようなイメージですね。
慣れれば難易度が高い作業ではないけれども、リブート時にこのようなリスクを内包しているのは考えもの。ただこれが、さくらVPSのUbuntu使用時にだけ発生するものなのか、そうでないのかはちょっとわからない。とりあえず、UbuntuデスクトップのISOイメージはどこかに用意しておいたほうがよいかもしれない。


[CSS]Google Code Prettify をカスタマイズする

このブログ内でのソースコード表示には google code prettify を使っていますが、そのカラーテーマを作っている方がいらっしゃったので使わせていただきました。

Color themes for Google Code Prettify

適用させると、このようになります。これは Tomorrow Night Blue というテーマです。

# -*- coding: utf-8 -*-

from datetime import datetime

def timesince(dt, default=u"記事が投稿されました"):
    """
    timesince filter
    http://flask.pocoo.org/snippets/33/
    を日本語ローカライズしflashに対応させたもの
    """

    now = datetime.now()
    diff = now - dt

    periods = (
        (diff.days // 365, u"年"),
        (diff.days // 30, u"ヶ月"),
        (diff.days // 7, u"週間"),
        (diff.days, u"日"),
        (diff.seconds // 3600, u"時間"),
        (diff.seconds // 60, u"分"),
        (diff.seconds, u"秒"),
    )

    for period, unit in periods:

        if period:
            return u"この記事は投稿から {0:d} {1:s} が経過しています".format(period, unit)

    return default

あと、Google Code Prettify に CDN があることをついでに発見したので併せて適用させました。下記コードを記述します。場所は</body>の直前がいいのかな。

<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>

ちなみに私は CDN 積極的に使いましょう派ですw


[Python]ハイフン(-)が含まれるスクリプトファイルをインポートする

Pythonでハイフン(-)が含まれるスクリプトファイルはimport文でインポート出来ないっぽい。例えばこのようなスクリプトファイルがあって

Python 3.4.2 (default, Oct  8 2014, 19:29:32)
Type "copyright", "credits" or "license" for more information.

IPython 2.3.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: cat test-dayo.py
# -*- coding: utf-8 -*-

def import_module():
    print(__name__)

if __name__ == '__main__':
    import_module()

importしようとすると、IPythonの場合、ハイフンが含まれたスクリプトファイルが補完されない(IPython賢い)

n [2]: import te
telnetlib  tempfile   termios    test       tests      textwrap

In [2]: import test
test   tests

無理やりimportしようとすると怒られる(四則演算と誤認識されるのだろうか?)

In [2]: import test-dayo
  File "<ipython-input-2-77e219196389>", line 1
    import test-dayo
               ^
SyntaxError: invalid syntax

なので __import__ を使う

In [3]: module = __import__('test-dayo')

In [4]: module.import_module()
test-dayo

ハイフンは含めない方が無難でしょうか

参照
Pythonでスクリプトを動的にimportする - Qiita


[Python][Twitter] twitterbot をようやくPython3対応させた

やるやる詐欺だった twitterbot 3アカウントの Python3 対応ですが、ようやく完了しました。

ネックになっていたのは、Python3 未対応なモジュール( tweepy と pit )の代替をどうするか。結局 tweepy は twython へ、pit に関しては configparser をベースにして似たようなものを自作しました。

これらのbotは大体2008年夏から2009年初頭くらいに作ったもので、(OAuth対応などちょくちょく修正はあったものの)6年ぶりに大幅にリファクタリングしましたw

あと、これらの twitterbot は Bitbucket にプライベートリポジトリで管理しているのですが、そのうちのひとつスクレイピングじゃないやつは GitHub の公開リポジトリへ引越ししました。

aoshiman/keibanews-bot

これには大した理由はないのですが、いつも Bitbucket ばかり使っていて、GitHub は殆ど dotfiles の管理だけに使っていたので 常々リポジトリが寂しいなあと思っていたところなのです。 botとして使うには(twitterでアプリケーション登録やtokenを発行しないといけないので)敷居が高いですが、feedの更新情報の保持の仕方など、botスクリプトの参考になれば幸いです。


[Python]ConfigParserのitems()の結果を辞書で受け取りたい

こういうiniファイルがあるとして

$cat test.ini
[aoshiman]
name=aoshiman
email=aoshiman@example.com

これをConfigParserで読み込む

Python 3.4.2 (default, Oct  8 2014, 19:29:32)
Type "copyright", "credits" or "license" for more information.

IPython 2.3.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import configparser

In [2]: config = configparser.ConfigParser()

In [3]: config.read("test.ini")
Out[3]: ['test.ini']

各セクションはsections()で取れる(今回は1セクションしかないけど)

In [4]: config.sections()
Out[4]: ['aoshiman']

で肝心の該当セクションにあるアイテムを取得するにはitems("aoshiman")を使うが、タプルで返してくる

In [5]: config.items("aoshiman")
Out[5]: [('name', 'aoshiman'), ('email', 'aoshiman@example.com')]

今回、各アイテムに辞書でアクセスしたかったのでやり方を調べていたら、なんのことないdictで包んであげればよかった。

In [6]: dict(config.items("aoshiman"))
Out[6]: {'name': 'aoshiman', 'email': 'aoshiman@example.com'}

やり方は他にも色々ありそうだけど、今回はこれでOKでした。

参考
python - Convert ConfigParser.items('') to dictionary - Stack Overflow


PAGE TOP