Planet Python Japan

RSS 2.0 ATOM
日本語で読める Python のお勧めフィードがありましたら nakagamiまで御連絡ください

2012-05-20

西尾泰和のはてなダイアリー

自然が創り出す美しいパターン

Amazonのおすすめが的確にハートのど真ん中を撃ちぬいてきたのでとても困っている(笑)

12:37:58

牌語備忘録 - pygo

[Python][Django][GAE] Python, virtualenv, virtualenvwrapper, Django and GAE のメモ

Install

for MacPorts and Pip

sudo port install py27-python
sudo port install py27-pip
pip-2.7 install virtualenv
pip-2.7 install virtualenvwrapper

Django in virtualenv

mkvirtualenv django13
(django13) $ pip-2.7 install django=1.3
(django13) $ django-admin.py --version
1.3
activate, deactivate
(django13) $ deactivate #抜ける
$ workon django13 #入る
(django13) $ 
Pythonのバージョンを指定する場合

インストールしてあるPythonのバージョンを指定

mkvirtualenv --python=python2.6 --no-site-packages py26dj13
(py26dj13) $ pip-2.7 install django=1.3

Django in GAE

Google App Engine の Django を使ってみる

New Application

GoogleAppEngineLauncher.app で アプリ作成

(django13) $ cd gae_django
(django13) $ django-admin.py startproject mysite
application: mysite
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app

libraries:
- name: django
  version: "1.3"
import os
# specify the name of your settings module
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
app = django.core.handlers.wsgi.WSGIHandler()
Run

GoogleAppEngineLauncher.app で Run して ブラウザでチェック

動いた

f:id:CortYuming:20120520154853p:image

Deploy

GoogleAppEngineLauncher.app で Deploy してみる

*** Running appfg.py with the following flags:
    --no_cookies --email=xxxxxxxx@gmail.com --passin update
Application: mysite; version: 1
Host: appengine.google.com

Starting update of app: mugirice, version: 1
Getting current resource limits.
Scanning files on local disk.
Error 400: --- begin server output ---
The 'python27' runtime is only supported for apps using the High Replication Datastore.
--- end server output ---
Password for xxxxxxxx@gmail.com: If deploy fails you might need to 'rollback' manually.
The "Make Symlinks..." menu option can help with command-line work.
*** appcfg.py has finished with exit code 1 ***

なぜに?(´・ω・`)

原因発覚 HRD これ原因

GAE で Python2.7 使うとデータストアを High Replication Datastore にする必要があるそうな。

既に旧デフォルトのMaser/Slaveデータストアで作成してる場合は、GAEのサイトで新しくアプリケーションを作らないといけない。

(今現在のデフォルトはHRD)

ちなみにこれ『Pythonプロフェッショナルプログラミング』に載ってた。まだ持ってない人は買うべき。

High Replication (default)

Uses a more highly replicated Datastore that makes use of a system based on the Paxos algorithm to synchronously replicate data across multiple locations simultaneously. Offers the highest level of availability for reads and writes at the cost of eventual consistency for some queries. Note: High Replication Datastore is required in order to use the Python 2.7 and Go runtimes.

データストアを High Replication Datastore で新しくアプリケーション作成してやったら、あっさりデプロイできた(・∀・)b



Link

参考サイト




2012-05-18

牌語備忘録 - pygo

[Ubuntu] サーバの設定ファイル管理『etckeeper』メモ

2012-05-17

牌語備忘録 - pygo

[Redmine][Rails] Redmine 2.0.0 にアップデートしてみた

1.4.1 から 2.0.0

基本、前回やったことを2.0.0にしてやっただけ。*1

『generate_session_store』のとこで

注記がでた

rake generate_session_store

Note: The rake task generate_session_store has been deprecated, please use the replacement version generate_secret_token

コマンド変わるのかな?

そのままで動いた。

けど db:migrate したらパーミッションエラー出たので chmode してみた。*2

$ rake generate_secret_token
$ rake db:migrate RAILS_ENV=production
Rails Error: Unable to access log file. Please ensure that /var/lib/redmine/2.0.0/log/production.log exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.
OpenIdAuthentication.store is nil. Using in-memory store.
Creating scope :open. Overwriting existing method Version.open.
Creating scope :active. Overwriting existing method User.active.
DEPRECATION WARNING: The InstanceMethods module inside ActiveSupport::Concern will be no longer included automatically. Please define instance methods directly in CollectiveIdea::Acts::NestedSet::Model instead. (called from include at /var/lib/redmine/2.0.0/lib/plugins/awesome_nested_set/lib/awesome_nested_set/awesome_nested_set.rb:58)
DEPRECATION WARNING: The InstanceMethods module inside ActiveSupport::Concern will be no longer included automatically. Please define instance methods directly in CollectiveIdea::Acts::NestedSet::Model instead. (called from include at /var/lib/redmine/2.0.0/lib/plugins/awesome_nested_set/lib/awesome_nested_set/awesome_nested_set.rb:58)
Creating scope :open. Overwriting existing method Issue.open.
$ sudo chmod 0666 /var/lib/redmine/2.0.0/log/production.log
$ rake db:migrate RAILS_ENV=production
$ 

Memo

特に引っかかるとこもなく、Redmine2 から Rails3.2 になって他は特にないのかな?

Link

参考サイト

*1:追記:20120517

*2:追記:20120517

2012-05-16

偏った言語信者の垂れ流し

[Python]IPアドレスを扱うライブラリIPyを使ってみる

IPyはIPv4、IPv6のアドレスを扱う際に便利なライブラリ。

IPy 0.75 : Python Package Index

PyPIにあるのでpipやeasy_installでインストールできる。

$ pip install IPy

試したのはPython 2.7、IPy 0.75

>>> from IPy import IP
>>> ip = IP('10.1.1.0/24')
>>> print ip
10.1.1.0/24
>>> '10.1.1.100' in ip
True
>>> '10.1.10.1' in ip
False
>>> len(ip)
256
>>> for addr in list(ip)[:5]:
...   print addr
...
10.1.1.0
10.1.1.1
10.1.1.2
10.1.1.3
10.1.1.4

似たようなので ipaddr-py ってのもあるらしい。

00:29:48

牌語備忘録 - pygo

[MacOSX] MacOSX で bash_completion いれてるのに terminal.app の bash で補完できない場合

(MaxOS10.7.4)

MacPorts でインストールした場合

Install

sudo port install bash_completion 
bashrc

設定書く

if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi
Check
port se #<-ここでタブ打つ...が補完されない

とりあえずの解決策

bash_profileに上記の設定書く

~/.bash_profile に下記設定 *1

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
source .bashrc

##下記は動かなかった
# if [ -f ~/.bashrc ]; then
#     source ~/.bashrc
# fi

# if [ -f ~/.bashrc ]; then
#     . ~/.bashrc
# fi

# if [ -f .bashrc ]; then
#     source .bashrc
# fi

なんでこうなるの?

Check
port se #<-ここでタブ打つ
port search

補完できた。

何で?

*1:追記:20120517

2012-05-15

西尾泰和のはてなダイアリー

つくりたいもの:ガイスターを低コストにプレイする方法

id:Yoshioriとガイスターをプレイしたい。一番低コストな方法は何か?

リモートで遊べるようにウェブアプリを作ろうと思ったこともあったが、僕がすぐに飽きてしまうかもしれないのであんまりコストを掛ける気にもならなかった。

お互いに嘘はつかないと信用するなら、チャットなんかで「Bの3を前へ」「前に進んで取ります」「赤でした」みたいなやり取りでもプレイできるかな?

22:47:58

偏った言語信者の垂れ流し

[Python][Django]Djangoのアプリケーションでmodelsモジュールを複数ファイルに分割する

Djangoのアプリケーションで、models.pyのコード量が多くなってきたので、複数のファイルに分割する話。

ハマりどころがあるので書いておく。試したのはPython2.7、Django1.4。

testapp/
  __init__.py
  models.py
models.py
from django.db import models

class Foo(models.Model):
    value = models.IntegerField()

class Bar(models.Model):
    value = models.IntegerField()

modelsをディレクトリにする

まず、models.pyと同じディレクトリ階層にmodelsディレクトリを作成し、__init__.pyとmodels.pyを分割したものを置く

testapp/
  __init__.py
  models/
    __init__.py
    foo.py
    bar.py
foo.py
from django.db import models

class Foo(models.Model):
    value = models.IntegerField()
bar.py
from django.db import models

class Bar(models.Model):
    value = models.IntegerField()

これだけでは、syncdbコマンドなどでモデルが認識されない。

__init__.pyの編集

syncdbコマンドなどでは、{アプリケーション名}.modelsのような名前のモジュールからModelクラスを継承したクラスを探している。つまり models/__init__.py で分割した各モジュールのモデルをインポートするようにすればよい。

__init__.py
from testapp.models.foo import Foo
from testapp.models.bar import Bar

さて、これで問題ないかと思いきや、もう一点変更しないとsyncdbで認識されない。

Meta.app_labelの変更

モデルが所属するアプリケーションの名前をapp_labelで設定する必要がある。app_labelを設定しない場合は、モデルが定義されたモジュールの1つ上の階層のモジュール名になる。

syncdbなどの際に、アプリケーション名とapp_labelが一致しないものは認識されない。

foo.py
from django.db import models

class Foo(models.Model):
    value = models.IntegerField()

    class Meta:
        app_label = 'testapp'
bar.py
from django.db import models

class Bar(models.Model):
    value = models.IntegerField()

    class Meta:
        app_label = 'testapp'

以上でsyncdbなどで認識される状態でmodelsを複数ファイルに分割できる。

14:02:17

牌語備忘録 - pygo

[Emacs]Emacs の ctags でのタグジャンプノメモ

上記リンクから引用

emacs 用

find app lib -name '*.rb' | xargs ctags -e

使い方(例)

emacs で C-x C-f してファイルを開く

app/controllers/customers_controller.rb

カーソルを Customer の上に移動

タグジャンプ M-. (Ctrl + [ して . または ESC + . または Alt + .)

ジャンプ先候補が表示されます

候補は Ctrl + N または Ctrl + P で選択、 Enter で確定、 Ctrl + G でキャンセル

タグジャンプ戻り M-* (Ctrl + [ して * または ESC + * または Alt + *)

ここから引用

2012-05-14

西尾泰和のはてなダイアリー

絵で描くオーバーライド

f:id:nishiohirokazu:20120514091251j:image

sig X{}
sig Y{}

pred p[r1, r2: X -> Y]{
#r1 < 3
#r2 < 3
(r1 + r2) != (r1 ++ r2)
(r1 ++ r2) != (r2 ++ r1)
(r2 ++ r1) != (r1 + r2)
no r1 & iden
no r2 & iden
}

run p for 4 int

追記

f:id:nishiohirokazu:20120515130000p:image

Alloyは「条件を満たす小さい事例を探す」ってタスクには抜群の使いやすさを発揮するな。

r1, r2, r1 + r2, r1 ++ r2, r2 ++ r1がそれぞれ異なる小さい例。ちなみにXが2個以下では例がなく、Yが2個以下だと6通りある。

sig X{}
sig Y{}

pred p[r1, r2: X -> Y]{
#r1 < 3
#r2 < 3
(r1 + r2) != (r1 ++ r2)
(r1 ++ r2) != (r2 ++ r1)
(r2 ++ r1) != (r1 + r2)

(r1 + r2) != r1
(r1 ++ r2) != r1
(r2 ++ r1) != r1

(r1 + r2) != r2
(r1 ++ r2) != r2
(r2 ++ r1) != r2

no r1 & iden
no r2 & iden
}

run p for 4 int

09:13:41

偏った言語信者の垂れ流し

[Python][Django]テスト用のRequestFactoryを使ってみる

Djangoでユニットテストを書く際にテストクライアントを使うことができますが、これはurls.pyを用意しないと使えません。

しかし、ビュー関数のみをテストする場合、Requestクラスのオブジェクトが必要になります。

django.test.client.RequestFactoryを使えば、GETやPOSTメソッドのRequestオブジェクトを簡単に生成できます。

試したバージョンは、Python2.7.2、Django1.4。

views.py

from django.http import HttpResponse


def my_view(request):
    return HttpResponse("OK")

このmy_view関数をテストする。

tests.py

from django.test import TestCase
from django.test.client import RequestFactory

from testapp.views import my_view


class MyViewTest(TestCase):
    def test_get_request(self):
        rf = RequestFactory()
        # /test/ をGETメソッドでリクエストした場合のオブジェクト
        request = rf.get('/test/')
        # view関数呼び出し
        response = my_view(request)
        # 結果を検証
        self.assertEqual(response.content, "OK")

参考

Django | Testing Django applications | Django documentation

2012/5/14追記

後で気づいたんだけど、テスト対象のコード例があんまり良くないね。この例だとrequestは何でもいい。実際にはrequestの内容を使ってフォーム生成とか各種値を読み取ったりしてるので、そう読み替えてください。

01:05:25

牌語備忘録 - pygo

[Git] Git を理解するためのメモ




[Redmine]Redmine 1.4.2 リリースされたけど 2.0.0 もリリースされそう

Redmine 1.4.2 が 2012-05-13 にリリース されたわけですが、

ロードマップ見ると 2012-05-15 に Rails3 対応の Redmine 2.0.0 がリリースされそうな感じ。

うーん、どうしよ(´・ω・`)

[GAE][Django]Google App Engine で使える Django のバージョンって?

GAE で Django 1.4 って対応してるのかな?と思って調べてみた。

(MacOSX10.7, GoogleAppEngineLauncher1.6.5)

lib 覗いてみる。

Mac の GoogleAppEngineLauncher.app を調べてみた。

$ cd /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib 
$ ls
:
django_0_96
django_1_2
django_1_3
:

0.96 と 1.2、それから 1.3 も使えるの?

ドキュメントには 1.2 しか使えなさそうに書いてるけど?

と思ったらリリースノートに書いてあった。

1.4 対応は何時になるかな?

[Ubuntu] Linux でユーザのログイン履歴を参照するコマンドのメモ

Command

last     # ユーザーのログイン履歴を参照する
lastlog  # 各ユーザーの最後にログインした日付を表示する
lastlog | grep root  # root でログインされているか
w        # ログインしているユーザ一覧

Link

参考サイト

2012-05-13

西尾泰和のはてなダイアリー

スタートAlloyに参加してきた日記

スタートAlloy : ATND

22:12:50

絵で描くAlloyの反射推移閉包

f:id:nishiohirokazu:20120513111328j:image

一般的に言えば関係のアリティが2とは限らないとか色々突っ込みどころはあるとは思いますが、最初の1歩としてはこんな感じの絵でイメージを掴ませる方が入りやすいのかも。

11:14:57

2012-05-12

西尾泰和のはてなダイアリー

Alloyガール:ミステリーを作る1

Alloyを使ったミステリー小説の生成に関して「どうやって作ろうか」と考えている過程も割と面白いので記録・公開することにしました。ブログに書かれる「自然言語で書かれたストーリー」とGithubのコミットログの形で進んでいく「コードで書かれたストーリー」が絡み合う「小説の生成過程の小説」です。

今までのAlloy関連記事はAlloyまとめ。特にAlloyで言語女子会殺人事件Alloyで言語女子会殺人事件2Alloyで論理パズルを生成Alloyでそれなりの難易度の論理パズルを生成あたりが関連するかな。

ミステリー部を作る

僕: Alloyさんの頭脳を生かしてミステリー小説を書くことができないだろうか

JS: 面白そう!

Al: それは私に聞いてる?だったら、まず貴方の考える「ミステリー小説」ってのがどんなものか定義して。

僕: えっと、まず人が殺される。

JS: そしてみんな誰が殺したのかわからない。

僕: 「みんなわからない」は間違いじゃない?犯人はわかるわけだし。

Al: そうとは限らないわよ。たとえば「事例1: AさんがBさんを連れて廃墟ビルに入り、自分だけトイレに行くとか言って外に出る。Cさんはそれとは独立に解体工事のために廃墟ビルを爆破する。」これでAとCは結果的に共犯としてBを殺しているけどもAもCもお互いにそのことを知らない。

僕: それは殺人事件じゃなくて事故のような…

Al: あら、じゃあ事故で人が死ぬのとと殺人事件で人が死ぬのの違いを明確にして。

僕: うーむ。

「意図」とは何か?

僕: それは「殺害の意図があったかどうか」だと思うけど…

Al: 「意図」とは何?

僕: うーん、事例1の場合、AもCも、事前にBが死ぬとは思ってないわけじゃない?「事例2: Aが事前に廃墟ビルの爆破時刻を知っており、その時間にBをビルの中に入れておけばBが死ぬだろうと予想していた。」これだとAがBを殺したと言える。逆に「事例3: CはAとBがビルに入ったのを目撃したが、ちょうど憎い相手だったので爆破すれば死ぬと予想した上で予定通り爆破を実行した。」これだとCがBを殺したと言える。Aも一緒に殺すつもりだったけどそれは失敗したわけだ。

Al: つまり「ある人Xが、Yが死亡すると予想し、実際にYが死亡する」が殺人事件の定義で、犯人はX?

僕: うん

Al: つまり「事例4: ある人Yがビルの屋上から飛び降りて、それを目撃したXがYが死ぬと予想し、実際に死んだ」はXを犯人とする殺人事件である。

僕: まったまった。えっと、「ある人Xが、*自分の行為によって* Yが死亡すると予想し、実際にYが死亡する」だな。

Al: 「事例3: DはAがビルに入ったのを目撃したが、ちょうど憎い相手だったので、Cに人が入った旨を伝えなかった。結果Cは予定通りビルを爆破し、Aは死んだ」は殺人事件ではない、と。

僕: むむむ。「自分に都合のいい事態が起きるように知っていることをあえて言わない」ってのはミステリーの頻出パターンのような気がするなぁ。「知っていることを言わない」も行為に含めてはどうか。

Al: いいわよ。行為には具体的には「知っていることを言わない」の他に「爆破」と「置き去り」があるのね。

僕: まあ、他にもナイフで刺すとか銃で撃つとか、いろいろね。

「謎」とは何か?

Al: で、殺人事件が起きたらそれはミステリー?

僕: いや、条件がだいぶ足りない気がする。

Al: 「事例5: Xさんがみんなの前でYさんを刺して殺しました」は殺人事件だけどミステリーじゃない、と。

僕: そうだねぇ、全然ミステリーじゃないねぇ。

Al: 何が足りないの?

僕: うーん、謎?

Al: じゃあ謎って何か定義して。

僕: えっと…

JS: 「誰が殺したのかわからない」!

僕: そうだ。それだ。

Al: 「事例6: Xさんが殺されました。誰が殺したのかわかりませんでした。終わり。」

僕: いや、それは困る。「犯人は文章の初期に登場する」「最終的には犯人が明らかになる」も必要だ。

謎はなぜ解ける?

Al: なぜ犯人が明らかになるの?

僕: え?

Al: 「犯人がわからない」という状態から「犯人がわかる」という状態への遷移は何が引き起こすの?

僕: それは…新しい情報だな。誰かが証言したりとか、物証が見つかったりとか。

Al: 「事例7: Xさんが殺されました。誰が殺したのかわかりませんでした。Yさんが『私が殺しました』と自供しました。謎は全て解けた!」

僕: いや、自供で解決するのは困る…

Al: 「事例8: Xさんが殺されました。誰が殺したのかわかりませんでした。Yさんが監視カメラに映ってました。謎は全て解けた!」

僕: ぐむむ…単独の物証で解決されるのも困るな…

Al: 「事例8: Xさんが殺されました。誰が殺したのかわかりませんでした。犯行時刻のアリバイがないのはAさんとBさん。凶器を入手可能なのはAさんとCさん。犯人はAだ!」

僕: あー。うーん、まだ簡単すぎる気はするけど、だいぶミステリーっぽくなったかなぁ??

Al: N個目の情報で犯人が確定するけど、N-1個目まででは確定しない、ってパターンなら探せるわよ。

強い証拠が多すぎると良くない?

僕: じゃあ、「登場人物の紹介」→「殺人事件発覚」→「情報収集」→「探偵役が『謎は全て解けた』宣言」→「謎解き」ってストーリー構成でどうだろう。

Al: どうだろう、って言われても。

僕: そういうストーリーで一筆お願いします。

Al: え、書けって言ってる?ムリムリ、まだ全然情報が足りないじゃない?

僕: 足りない?

Al: まず「犯人が明らかになる」とは何か。

僕: その人以外の犯行が不可能だとわかること。

Al: 「犯行が不可能だとわかる」とは何か。

僕: えーと、その人が犯人だと仮定すると他の情報と矛盾が起きる、ってこと。

Al: で、情報には例えばカメラに写ったなどの物証があるわけね

僕: うん

Al: 「事例9: A, B, Cさんの中に犯人がいます。Aさんにはアリバイがあります。Bさんにもアリバイがあります。犯人はCだ!」これは条件を満たすわね。

僕: ぐむむ…。確かに単独の証拠では犯人が確定しない。

Al: 単独の証拠で犯人が確定することを嫌ったのは、問題が簡単になりすぎるからでしょ?

僕: うん。

Al: だったら、単独の証拠で、ある登場人物が犯人でないと確定するのも問題が簡単になりすぎるんじゃない?

僕: あー、そうか、確かにそうだなぁ。

状況設定を考える

僕: じゃあこういうのはどうだろう。いくつかの「場所」があって、その場所の間の移動には1.5単位時間かかる。

Al: ふむ。

僕: つまり、あるタイミングで場所Xにいたなら、単位時間後にX以外の場所にいることはできない。2単位時間後にはどこにいる可能性もある。

Al: 続けて。

僕: そして、各場所は十分に狭く、そこの場所にいたなら他に誰がいたかは確認できる。

Al: Xが時刻t1にP1にいた、って情報からはXが単位時間後t2にP1以外にいない、ってことだけが言えるわけね。充分弱そうね。

僕: さらに、犯人は自分の犯行を隠す目的で嘘をつく可能性がある。

Al: いいねいいね、緩くなってきたね。

僕: しかも犯人が1人であるとは限らない。

Al: おっと。そこまで行くと制約が緩すぎね。「全員共犯で嘘を付いている」っていうトリビアルな解が存在するじゃん。

僕: うーん、でも「犯人は1人です」って宣言するのも不自然だし…。

Al: 「最後の一つの情報で犯人集団が一通りに定まる」って制約を満たすなら「登場人物の証言が次々に自己矛盾していき、最後の証言も自己矛盾して全員犯人」って解があるわね。うまく書けば意外と読者に気づかれないんじゃない?

僕: えー、でももうここでネタバレしちゃったしなぁ。物証かなにかでなんとかならないかな…

Al: なんともならないわね。物証と証言が一致する場合、それは犯人が正直なことを言っただけかもしれないので何の判断材料にもならない。一方、物証と証言が矛盾する場合、証言者が犯人であることがあっさり確定する。

僕: うーむ…

逆に正直者を導入したらどうか

Al: 「嘘をつく可能性のある人は最大N人である」と制約を明記するのが嫌だったら、似たような制約を別の表現で入れたらどう?たとえば「村の祭りではM人が神に捧げる踊りを踊る。この役に選ばれた村人は祭りの期間、宗教上の理由により絶対に嘘をついていはいけない」とか。

僕: なるほど。それならありかも。

Al: 誰が踊り子なのかも他の村人から聞くことにすれば村人間の相互作用があっていいんじゃない?

僕: つまり村人は「Xは踊り子だ」「Xは時刻Tに場所Pにいた」の2通りの発言ができる、と。

Al: まずは小さい規模で、容疑者3人、1人が犯人、1人が犯人をかばって嘘をつくかもしれない人、1人が踊り子で正しいことしか言わない、という設定でどれくらいの難易度の謎が生まれるか検証するべきね。

僕: 探偵役を導入して「彼の見聞きしたものは物証同様に正しい」としてもいいかもね。

Al: まあまずはそれも入れずにシンプルなモデルでスタートすべきよ。

僕: そうだよね、夢が広がってついついいろんな物を入れたくなってしまう。探偵役の見聞きした情報から、探偵が正直だとわかっている読者は犯人がわかるのだが、村の他の人にとっては探偵はよそ者で嘘をつく可能性があると考えられていて犯人を逮捕してくれないとか。で、証拠探しが始まる、というのはどうか。

Al: 物事を複雑にするの得意ね。まずは前半がうまく動くことを確認してからにしましょう。

次回予告

Github上でmystery.alsをいじりながら色々試して、それから自然言語での続きが書かれる感じ。

21:46:20

作りたいもの:はてなダイアリーのクローラ

増井さんの作りたいものリストを作ろうというスライドを見て「確かに『いつかやる』リストに入れてるだけじゃ発展しないから、公開しても問題ないものは公開したらいいなぁ」と思ったのでやってみました。

背景

僕は今まで10年以上Web上での日記をつけ続けているが、いろいろな理由で使うものは変わってきた。今ざっと思い出せるだけでKENTのCGI、PukiWiki、MovableType、Zope、COREBlog、tDiary、Blogger…。はてなダイアリーは今調べてみたら2007年から5年間も使っている。珍しく長く続いている。

しかし、今後5年10年と使い続けるだろうか?いままでなんだかんだで使うものが変わってきたことを考えると、いずれ他のサービスor自前CMSに乗り換える可能性は低くないだろう。で、やめる際にはこのはてなダイアリー上のコンテンツを静的なHTMLにしたりしたくなるだろうな。むしろ、自分の書いたコンテンツが他人のサーバ上にしかないって現状はあんまりよいものじゃないな。まだやめるつもりはないけど今のうちから定期的にクロールして手元に保存しておいたらいいんじゃないかな。

wgetで?いやいや、それは無理

「Web上のコンテンツをクロールして静的HTMLとして保存する」というとすぐに思いつくのはwget -rを使う方法だろう。だけど、はてなダイアリーの場合それを使いづらい。

僕のはてなダイアリーはd.hatena.ne.jp/nishiohirokazuに置かれている。じゃあその記事に貼られている画像は?おっとはてなフォトライフだからf.hatena.ne.jpだ。ドメインから違う。一時期はてなフォトライフに置くのを面倒に思ってGyazoを使っていたりする。その2つは間違いなく使っているが、他に使っていないか自信がない。じゃあ「外部ドメインに置かれていても画像だけはダウンロードする」ってことでOKか?むむむ、OKかどうか自身が持てない。

キレイにしたい

さらに言えば、単にはてなダイアリーのHTMLを静的にGETしただけだと色々汚い。

まあでもこれはクロールした後の工程として切り分けるべきか。

結局何が必要なのか

まあキレイにしたいとか色々あるけどそれは保留してスモールスタートにしたほうがいいだろうな。

21:11:16

牌語備忘録 - pygo

[Rails] 『第22回 Rails勉強会@東北』に参加しました

Rails3の記事を参加者でやっていく感じで

『Rails3でRubytterを使ってTwitterマッシュアップアプリを作る』


メモ

エラー出る

<% form_tag :oauth, method: :get do |f| %>

修正(%の後に=入れる)

<%= form_tag :oauth, method: :get do |f| %>

      # {site: "http://twitter.com"}
      {site: "http://api.twitter.com"}

『Rails 3 のルーティング定義について』

2012-05-11

西尾泰和のはてなダイアリー

Alloy関連ツールを2つ公開しました

おっと明後日はスタートAlloy : ATNDじゃないですか。と気づいたので慌てて自分のAlloy勉強用リポジトリの、ローカルの未pushの変更をpushしたり、スクリプトをキレイにしたりしていました。

https://github.com/nishio/learning_alloy

今回公開したのは2つ

allopy

以前show.pyって名前で特に説明もなしにリポジトリにおいていた、AlloyからExportされたXMLをサクサク対話的に加工できるツール。*1 Alloy自体のEvaluatorとかコピペ出来ないし面倒臭いじゃん?Alloyの側をいじって改善しようかと思ったけども、結果はXMLで出力できるんだから、別にそれをいじるのをAlloyでやる必要はないよね、Pythonの対話的インタプリタでやろう、という発想。以前公開していたものとの差分は、対話的な操作方法をメソッド冒頭のコメントに書いて、doctestを使ってそのままテストにした、ってところ。なのでコメントを読めば使い方わかるはず。コメントが間違ってないことはテストで確認済み。

https://github.com/nishio/learning_alloy/blob/master/allopy/allopy.py

一番ハイライトなところだけ載せとく

>>> load_global("test_target.xml")

>>> show_label()
sig:
  Int
  String
  seq/Int
  this/Person
  univ
field:
  love
skolem:
  $x

>>> get("Person")
UtilList([[u'Person$0'], [u'Person$1'], [u'Person$2']])

>>> get("love")
UtilList([[u'Person$0', u'Person$2'], [u'Person$1', u'Person$1'], [u'Person$2', u'Person$2']])

>>> get("$x")
UtilList([[u'Person$2']])

>>> get("Person$0").join(get("love"))
UtilList([[u'Person$2']])

>>> get("love").join(get("$x"))
UtilList([[u'Person$0'], [u'Person$2']])

コンソールでXML出力するツール

これは以前Alloyのコードを読んで「コンソールで使うためのサンプルが入っているじゃん!」と言っていたやつ。*2 自分が使いやすいようにいじったのを公開してなかった。いい名前が思いついてないのでNishioToolとかいうひどい名前になってますが、ようするに「人間がボタンを押さなきゃ次の解が出ないってめんどくさ、CPU余ってるんだから僕が1つ目の解を眺めている間にバックグラウンドでどんどん解を出せよ」というわけで、コマンドラインでNishioTool.sh foo.alsとかやると、解が連番のXMLでどんどん出力されるってものです。

これでようやくEmacsで書いてコンソールで実行するっていう普通の生活が出来るようになった!

本当は画像化したりとかも全部コンソールでやりたいんですけど、まだそのへんは未着手です。

追記

今唐突に思いついたけど、Alloyコード→解のXMLを自動化するツールができてて、解のXMLをPythonでいじるツールができてるんだから、次に必要になるのはPythonからAlloyのコードを手軽に生成するためのツールじゃないかな。

名前はPyalloy(ピャロイ)だな。

*1Alloyで出力したXMLをいじりやすくする

*2Alloyコードリーディング

19:16:02

牌語備忘録 - pygo

[MacOSX] MacPorts で 『bash-completion』メモ

Install

sudo port install bash-completion

bashrc

# bash-completion
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi

Install +bash_completion variant

mercurial
sudo port install mercurial +bash_completionp
git
sudo port install git-core +bash_completion

Optional Parts

Install +bash_completion variant automatically with all ports
+bash_completion

Link

参考サイト

2012-05-10

西尾泰和のはてなダイアリー

iPhoneアプリをバージョンアップする

よくよく考えたらいつも作りっぱなしでバージョンアップをしたことがなかった。

以上で2ポモドーロ(1時間) 見積もりでは1ポモドーロの予定だったんだけど、画像サイズが違うってツッコミやArchive、Distributeに意外と時間がかかったことによって2倍に伸びてしまった。ま、見積もりの2倍3倍時間かかるのはよくあること。初めての作業だしね。次回以降この計測によってより正確に見積もることができるだろう。

21:58:38

zshのfor文は便利だな

ちょっと2倍のサイズに拡大したいファイルが5つくらいあったんだけど、簡単。

f$ ls *.png
iPad_FREE_config.png   iPad_about.png         iPad_config.png        iPhone_FREE_config.png iPhone_about.png       iPhone_config.png

f$ mkdir out

f$ for i in *.png; do; echo $i; done
iPad_FREE_config.png
iPad_about.png
iPad_config.png
iPhone_FREE_config.png
iPhone_about.png
iPhone_config.png

f$ for i in *.png; do; convert -resize 200% $i out/$i; done

21:32:20

gitの各種オプションの使用頻度を可視化

ソースコードはこちら https://gist.github.com/2651961

引数にzshのhistoryファイルを指定して実行すると下のような解析結果が表示されます。bashとかで動くかは未確認。

残念ながら僕はzshに乗り換えたばっかりで500行しか履歴が溜まってなかったんだけどそれでも割と面白かった。できればもっと履歴の溜まっている人の解析結果が見たいな。すごく量が多くなってしまうって場合はif count < 2: breakの行を編集するといいかと。

僕のgitに関するコマンドの使用頻度(2回以上出現したもの)

add: 55
  -p: 14
  -u: 3
  js/main.js: 2
commit: 45
  -m: 41
    "add: 10 ←こういうシンプルなメッセージの時にcommit -mを使っているっぽい
    "fix: 4
    "clean: 2
    "make: 2
checkout: 24
  -b: 11
  master: 2
rebase: 13
  -i: 8
    master: 3
    js_insertion: 2 ←これはfeature branch
  --continue: 3
merge: 12
  --no-ff: 8 ←最近 --no-ffをつけるのが大事だと覚えた
reset: 11
  --hard: 3
branch: 10
  -D: 9 ← git branchを使う時はほぼ-Dでブランチを消すときのようだ
log: 8
  --oneline: 4
  --graph: 2 ←最近 alias gitlog="git log --graph --oneline" したんで使用頻度が落ちてる
cherry-pick: 6
status: 4
format-patch: 4
cherry: 3
clone: 3
  git@github.com:nishio/academy.git: 3
clean: 3
show: 2
diff: 2
init: 2
blame: 2

17:55:08

牌語備忘録 - pygo

[Ubuntu] Postfix インストール時に 『System mail name』を間違えたことに後から気付いた場合

上記ファイルに System mail name が書かれてるから修正する。

[Ubuntu]ルート宛のメールを転送する方法

さくらVPS の Ubuntu にて

aliases

root: username@hostname.com

設定を反映させる

newaliases

テストメール送信して確認

echo test|mail root

Link

参考サイト

2012-05-09

西尾泰和のはてなダイアリー

妻と一緒にいても生産性を下げないためにはどうすればよいか

Tweetに対する反応まとめ

nishio: 妻にWebDB Pressを渡して会社に行って帰ってきたら「プッシュ型メディアはエンジニアの生産性を下げる」を読んで「妻もプッシュ型メディア」とか言ってる

nishio: 既婚のエンジニアに聞きたい:妻と一緒にいても生産性を下げないためにはどうすればいいのか

不倫する

Yappo: 不倫する

nishio: 「不倫したらメディアが増えるだけじゃないか!」と怒ってます>妻

Yappo: 愛人はプル型メディアです。とお伝えください><


そうなのか…

例えば、妻を避ける

tokuhirom: unsubscribe

bulkneets: 無視するといいです

hayamiz: 例えば、妻を避ける


(><)

物理的ファイヤーウォール

pandeiro245: 僕はクローゼットの中で仕事してます。


それはなかなかよさそう!集中できそうだし。妻は広いクローゼットがうらやましいようです。

眠らす

U40: 眠らす

nagaseyasuhito: 正直難しい。妻が寝てからが勝負

家事を自動化する

ayakomuro: 食洗機、ルンバを買うといいと思います。


ルンバは買いました。食洗機は置く場所がないので買ってません。

発想がおかしい

kyoheif: 発想がおかしい.パートナーと一緒にいるときに生産的なことをしてはいけない.


[すばらしい洞察]


wraith13: 生産しないとダメ! これ以上の少子化は不味い!>< RT @kyoheif: @nishio 発想がおかしい.パートナーと一緒にいるときに生産的なことをしてはいけない

piyonori1971: プログラムを生産するのではなくプログラミングをする人間を生産するのです。少々時間かかりますが長期的にみて社会全体として生産性を下げないためには重要です。


妻が[なんというオヤジギャグ]と申しておりました

時間の共有

shuyo: 結婚するということは「時間」というもっとも貴重なものをあげたり共有したりするということです。


なるほど…つまり、

妻を生産力にする

w_sakurai: 妻が一人でも寂しくない趣味を作ってもらうとか

shin_semiya: 生産性の低下による遅れを取り戻すために妻を追加人員として投入する。

ayakomuro: 後は奥さんをエンジニアにするしかない気がします!\(^o^)/

ako_n: 妻と一緒にプログラミング

Ohka: エンジニアと結婚するのが一番だと思われますが、私は分かりません。

camloeba: 夫婦起業

myaaaaa_chan: 妻と仕事する。


これが最良の選択肢か…。

まとめ

というわけで奥さん、多分暇な時にこのブログを読んでいると思うのでこちらの件について実装を進めてくださいw 作りたいもの:ウェブページや雑誌をクリッピングし、画像の一覧を眺めて選択できるアプリ

21:51:44

作りたいもの:ウェブページや雑誌をクリッピングし、画像の一覧を眺めて選択できるアプリ

増井さんの作りたいものリストを作ろうというスライドを見て「確かに『いつかやる』リストに入れてるだけじゃ発展しないから、公開しても問題ないものは公開したらいいなぁ」と思ったのでやってみました。今回は僕のではなく、妻のつくりたいもの。妻は適当なCMSを拾ってきてPHPでガリガリやれば作れると考えているけども、要望を聞いてるとどうもそれよりよい方法がありそう。

要望:自分用のクックパッドがほしい

提案: それEvernoteでいいんじゃね

これを踏まえて再設計

まとめ

なんか顧客の要求を仕様に落としこむ作業みたいで、普段業務としてそれをやってないので割と面白い。他人の作りたいものを言語化するのも割りとありかもな。

追記

重大なコミュニケーションミスがあった

そうかー、だったら別にローカルのサーバでPHPでCMSってのも悪い選択じゃないか。

結論、顧客のニーズを汲み取る前に拙速な設計をしたけど無駄でした(><)

20:16:00

作りたいもの: 専門家の考える「よい状態」を実現に近づけるシステム

増井さんの作りたいものリストを作ろうというスライドを見て「確かに『いつかやる』リストに入れてるだけじゃ発展しないから、公開しても問題ないものは公開したらいいなぁ」と思ったのでやってみました。今回は早々に「自分がやることではない」と捨てて、リストに書いてすらいなかったことなのですが、公開するべきだと判断したので公開しておきます。

背景

今日の高木先生の日記(高木浩光@自宅の日記 - 「個人情報」定義の弊害、とうとう地方公共団体にまで)

現行個人情報保護法の「個人情報」の定義に不備があることを、これまでずっと書き続けてきた。「どの個人かが(住所氏名等により)特定されてさえいなければ個人情報ではない」(のだから何をやってもよい)とする考え方がまかり通ってしまいかねないという危機についてだ。

(中略)

私にできることはここまでです。ここから先は私の役割ではないと考えています。必要だと思われる方々で行動して頂くほかありません。昨年夏以来、次々と登場する事案に、私的な時間のほとんど全てを費やしてきましたが、そろそろ限界を感じています。「もしここで自分が書かなかったら」「そのままスルーになってしまうのではないか」そういう想いでこれまで走り続けてきました*4が、いったいいつまで続くのでしょう。私個人の行動ではなく、社会の仕掛けによってこれまでの各種問題が解決されていくようになっているべきです。欧州や米国に見られるような仕組みが早く日本にも確立されることを願ってやみません。

今朝の自分のツイート

高木先生があまりにパワフルだったがために、高木先生に任せておけばいいやと思ってしまった。それはいわば一人の有能なエンジニアが必死で消火しているおかげで大炎上しないプロジェクトのような状態だったのか。一人に負荷を押し付けないシステムづくりが必要、と。

反省

かつて僕も別件について「これは高木先生がやればいい」「高木先生が適任」「高木先生がやるべき」と考えたことがあった。今回の高木先生の日記を見て反省した。

HiromitsuTakagi:

そろそろ、メールアドレスの到達確認の前にID・パスワードを登録させるサービス(メールアドレスの誤登録防止措置がない)は、個人情報保護法の安全管理措置義務違反(個人情報を送る場合)及び、現行不正アクセス禁止法第五条違反(パスワードを送る場合)というコンセンサスを確立すべきときでは。


nishio: @HiromitsuTakagi 気をつけるべきことのチェックリストを作って公開し、既存のサービスをいくつかそのチェックリストで格付けしてやれば、みんな悪い格付けにされることを恐れてチェックリストを守ろうとするのでは?

https://twitter.com/#!/nishio/status/188918927970144256

格付けシステムの必要性

専門家・エンジニアが「よい状態」と考えている方向に、社会が動こうとしないのはなぜか?それは専門家の「なにがよい状態か」という判断基準が、ものごとの舵取りをしている専門外の人と共有されていないからだ。

いま、例えばいろいろな企業がプライバシーポリシーを明文化して公開している。これはよい状態だ。でも、もしプライバシーマーク制度がなかったら、それらの企業は「プライバシーポリシーを明文化して公開する」という選択をしただろうか?プライバシーマークという格付制度の存在によって「プライバシーポリシーが明文化される」という「よい状態」に近づいたのではないか?

専門外の人に「なぜそれは悪か」を理解せよといっても、前提知識が欠けていて高い教育コストが掛かる。社会を「よい状態」にするために、「なぜ」の理解は必須だろうか?「なにが悪か」の客観的に検証できるリストがあればよいのではないか?

「なにが悪か」のリストを作って公開し、それに基づいて対象を格付けしてやれば、社会がよりよい方向に進むのではないか?

僕の間違い

そこまで考えた僕は「これは僕ではなく高木先生がやるべき」と思ってしまった。理由は簡単、リストの内容の正しさを担保するためには、その分野で有名で信頼のある専門家が作るのが一番手っ取り早いからだ。

そして暗黙にもう一つの理由があった。僕の勤務先の親会社は、企業に対してソフトウェアを売っている。他者企業が作るウェブサービスに対して勝手に格付けをする行為は、回りまわって親会社に対する苦情や契約解除を盾にした脅しなどのめんどくさい現象を引き起こすことが予見できた。だから「自分ではできない」と判断した。この判断は今考えると甘ちょろいものだった。もし本気でやる気があるなら会社を辞めるなりなんなりいろんな選択肢はあったはずだ。だから突き詰めると「それほどのやる気はなかった」と言うしかないだろう。カッコ悪い。

そうやって自分のアイデアを自分で実現することから逃げたことで、その「リスト」の作成、公開、いろいろな形の圧力に対処するコストを全部高木先生に押し付けようとしてしまったわけだ。

昨日今日と、樋渡啓祐市長が高木先生に対して「上司に働きかける」「国会議員に働きかける」などの圧力をかけているのを見て、独立行政法人に勤めていてもその手の圧力と無縁ではないことがわかった。「高木先生がやるべき」という発想は明らかに間違いであった。

ならばどうすればいいか?

判断主体の不透明化

判断主体をなくしてしまうのは一つの手だ。「それが悪であるという考えが多くの専門家のコンセンサスである」という説得の仕方はどうだろうか。

そもそも、例えば高木先生が「これはよい、これは悪い」と主張しても、専門外の人はどれがその人だけの意見であって、どれが多くの専門家の間でコンセンサスとなっている意見なのかを判断できない。

専門家は自分の意見が正しいことの担保のために「これは『Xという理由で』悪い」と理由を強調してきた。しかし、説得対象が理由の理解をしようとしないのであれば、その選択肢は諦めるしかない。「理解しようとしない」となじっても何も進展しない。

「それが悪であるという考えが多くの専門家のコンセンサスである」という説得を行うにはどうすればいいだろうか。すでにある方法としては業界団体や学会などの提言だろう。一方で個人的には、集合知によってその「悪のリスト」を作ることができないか関心がある。

集合知の課題

作られた「格付けリスト」の社会的な信用がある程度高まれば、そこに判断主体として参加することは自分の専門知識をアピールすることになるから顕名でも参加者が増えて正のフィードバックが始まる。しかし、そこに到達するまでが問題だ。

まずリストを投稿する人が集まらない問題がある。匿名では自己顕示欲には繋がらないから、おそらく正義感が主要なモチベーションになると思われる。正義感を持った専門家が、十分な人数集まるだろうか。

もう一つの問題は、質が担保できるかどうかだ。正義感に燃えているからといって、その主張が適切であるとは限らない。善は主観なんだ。では「これを悪だと考えるエンジニアが89人中78人います」のような人数による重み付けはどうか?これもうまくいかないだろう。頭数を稼ぐのは簡単だ。であれば、行った判断の正しさによって、投稿者・投票者が重み付けされる必要がある。この「彼の判断は正しい」という判断自体が正しいかどうかもまた不明だ。

難しいけども不可能ではないと思う。GoogleがPageRankアルゴリズムによって機械的にウェブページの格付けを行ったように、個々の投稿者の判断がどの程度信頼出来るものか、個々の「これは悪である」という投稿がどれほど支持されているものか、を機械的に格付けできるアルゴリズムが存在するのではないか?それを使って特定の個人を判断主体にしないまま、実用的な価値を持った判断を行うシステムが作れるのではないか?

まとめ

昨日まで全くやる気がなくて放置していたので具体的なアルゴリズムなどには考えがいたっていません。具体的じゃないアイデアですみません。実現しないアイデアに価値なんかないので、この文章はほとんど無価値です。それでも、このまま公開しないで放置するよりは、公開したほうが社会のためにプラスになるだろうと判断しました。

13:46:24

偏った言語信者の垂れ流し

[Python]__main__.pyを使ったzipファイル実行を試してみた

トイプーこと id:atsuoishimoto が書いていた、zipファイルで実行可能なPythonアプリケーションを試してみた。

Zipファイル一個で実行可能なPythonアプリケーションを作ってみる - atsuoishimotoの日記

試した環境はWindowsXP、Python2.7。

__main__.py

# coding: utf-8
import SimpleHTTPServer
SimpleHTTPServer.test()

SimpleHTTPServerを実行して、カレントディレクトリをHTTPで公開するだけの単純なスクリプト。

compileallでコンパイルしてみる

ソースコードそのままでは芸がないので、zip化の前にcompileallでバイトコードを作ってみることにした。

C:\work\sandbox\zipapp>python -OO -m compileall __main__.py
Compiling __main__.py ...

これで __main__.pyo ファイルが作成される。

このファイルを圧縮ソフトでzip化し、 httpserver.zip という名前で保存した。

実行

C:\work\sandbox\zipapp>python httpserver.zip
Serving HTTP on 0.0.0.0 port 8000 ...

問題なく動きました。なかなか面白い。

00:21:31

2012-05-08

西尾泰和のはてなダイアリー

外国で野生の猿に噛まれた日記

右下に写っているのは僕の袖。人懐っこい猿だなーと油断してたらガブっと行かれました。

f:id:nishiohirokazu:20120504144113j:image

ちなみに狂犬病は日本では駆逐されて五十年以上経つけども、世界的にはまだまだ蔓延していて、2006年8月にフィリピンでイヌに噛まれて帰国してから11月に死亡した事例もあるらしい。潜伏期間は長い場合数年にも渡るので、なんともなさそうでも放置は厳禁、発病率は3〜6割で、発症すると治療法がないためほぼ100%死亡するらしい。

そんなので死んだら残念すぎるので今からワクチンを打ってきます!汗汗

教訓:可愛い猿にも牙はある

f:id:nishiohirokazu:20120504143500j:image

病院行って来ました。狂犬病という名前のせいで犬が持っているものと思われがちだけども、意外と猫やコウモリもキャリアの可能性があるとのこと。 http://nichiju.lin.gr.jp/ekigaku/kachiku99/refe0101.htm

アメリカ合衆国では毎年600〜800匹のコウモリが狂犬病の検査で陽性であると診断されています.

というわけで今日を含めて5回のワクチン接種が必要とのこと。今日の支払いは9000円…むむむ。領収書に書かれた分類を眺めてみたけども、少なく見積もっても2万円ちょいは支払うハメになるか…orz

10:22:56

TRIVIAL TECHNOLOGIES on CLOUD

みんなの名前辞典が月100万 -> 200万PVになるまでにやったこと

「みんなの名前辞典」が月100万PVを超えるようになるまでにやったこと」の続き。

その後も躓きながらアクセスを伸ばしているみんなの名前辞典。以前ほど頻繁に手を入れなくなったけど,継続的にサイトを改良していって月200万PVを超えるようになった。

このサイトは主に検索でアクセスが集まるサイトで,いろいろ試したり勉強しながら検索順位を上げていって,最近では「名前」というビッグワードでGoogle/Yahooの検索で10位以内に入り,お名前.comより上位に表示されるようになった。SEOの実践的なノウハウをかなり蓄積でき,かつ結果に結びつけられた。ソーシャルからの流入も徐々にではあるけど増えてきた。

ただ,道のりは順調ではなくて,3月の半ばごろ,検索からの流入がガタ落ちしたことがあった。ページのタイトルをシンプルにしたところ,検索順位とクリック率が落ちた。あわててタイトルを元に戻して,それからはほぼ順調にアクセス数が伸びて行った。

前回からの改善点を箇条書きに。

Twitterなどでサイトのリンクを検索で引っかけて定期的に見ているんだけど,「時任・三郎氏が時・任三郎と姓名判断で名前を比べて『どうでもいいわ』って思った瞬間」に出くわしたりして,Webって面白いな〜,と思ったりもした。

プレゼントキャンペーンとかもやってみたけど,サイト改良によるアクセス増加に比べると効果は微々たるものだった。振り返ってみると,小手先のテクニックには走らず,サイトのコンテンツ性とか利便性を高めた結果,アクセス数の増加に繋がっているという素敵なストーリーになっているような気がするのでした。

02:25:37

牌語備忘録 - pygo

[Memo] gdb -- set disassembly-flavor intel

set disassembly-flavor intel

[MacOSX] Mac と MacPorts で objdump

Install

sudo port install binutils

Command

objdump ではなく gobjdump になる。

(binutils で入れるとコマンドの頭にgがつくらしい)

test

$ gcc helloworld.c
$ ls -l a.out
$ gobjdump -M intel -D a.out | grep -A20 main.:
unable to read unknown load command 0x24
unable to read unknown load command 0x26
0000000100000ee0 <_main>:
   100000ee0:55                   push   rbp
   100000ee1:48 89 e5             mov    rbp,rsp
   100000ee4:48 83 ec 10          sub    rsp,0x10
   100000ee8:c7 45 f4 00 00 00 00 mov    DWORD PTR [rbp-0xc],0x0
   100000eef:eb 18                jmp    100000f09 <_main+0x29>
   100000ef1:48 8d 05 60 00 00 00 lea    rax,[rip+0x60]        # 100000f58 <_puts$stub+0x2a>
   100000ef8:48 89 c7             mov    rdi,rax
   100000efb:e8 2e 00 00 00       call   100000f2e <_puts$stub>
   100000f00:8b 45 f4             mov    eax,DWORD PTR [rbp-0xc]
   100000f03:83 c0 01             add    eax,0x1
   100000f06:89 45 f4             mov    DWORD PTR [rbp-0xc],eax
   100000f09:8b 45 f4             mov    eax,DWORD PTR [rbp-0xc]
   100000f0c:83 f8 09             cmp    eax,0x9
   100000f0f:7e e0                jle    100000ef1 <_main+0x11>
   100000f11:c7 45 f8 00 00 00 00 mov    DWORD PTR [rbp-0x8],0x0
   100000f18:8b 45 f8             mov    eax,DWORD PTR [rbp-0x8]
   100000f1b:89 45 fc             mov    DWORD PTR [rbp-0x4],eax
   100000f1e:8b 45 fc             mov    eax,DWORD PTR [rbp-0x4]
   100000f21:48 83 c4 10          add    rsp,0x10
   100000f25:5d                   pop    rbp

若干書籍と異なる。

Link

参考サイト

[Ubuntu] apt自動更新 -- corn-apt

デフォルトだとパッケージのアップデートとダウンロードのみ、毎日午前4時に実行。

Install

sudo aptitude update
sudo aptitude install cron-apt

Config

コメント-イン?

APTCOMMAND=/usr/bin/aptitude
ACTIONDIR="/etc/cron-apt/action.d"
ACTIONCONFDIR="/etc/cron-apt/config.d"
SYSLOGMSGDIR="/etc/cron-apt/syslogmsg.d"
ERRORMSGDIR="/etc/cron-apt/errormsg.d"
LOGMSGDIR="/etc/cron-apt/logmsg.d"
SYSLOGONMSGSDIR="/etc/cron-apt/syslogonmsgs"
ERROR="/var/log/cron-apt/error"
TEMP="/var/log/cron-apt/temp"
LOG="/var/log/cron-apt/log"

Run

sudo /usr/sbin/cron-apt

Link

参考サイト