Hatena::ブログ(Diary)

yattの日記 このページをアンテナに追加 RSSフィード

2015-06-01

windowsでxargs -Pがしたい

windowsでxargs -P 10 -n 2みたいなことをしたかったのですが、

  • powershellとかではそういうことができなさそう
  • cygwinは入れたくない

ということで自分で実装することにしました。

最低限必要な-P(--max-procs) -n(--max-args) {}(プレースホルダ)は実装されてます。

これで並列実行させることで7分掛かってた処理が3分になりました。

multiprocessingは本当に便利。

続きを読む

2015-05-23

python pipでインストール用ファイルをローカルに保存しておく

アプリケーションを別のサーバーに載せ替えたい等の理由で、インストールされているpythonパッケージを、別のマシンへ展開したいことがあります。

こういう時pipなら、pip freezeでパッケージ名とバージョンの一覧を出力して、他マシンでその一覧を元にinstallすると簡単です。

[HOST A]$ pip freeze > /nas/pip/requirements.txt
[HOST A]$ cat /nas/pip/requirements.txt
BeautifulSoup==3.2.1
Flask==0.10.1
Jinja2==2.7.3
...
terminado==0.5
toolz==0.7.1
tornado==4.1
wheel==0.24.0
[HOST B]$ pip install -r /nas/pip/requirements.txt

しかし、これだとfreezeで一覧にした後に、ライブラリの特定のバージョンが公開停止されたり、あるいはライブラリ自体が

公開停止されると、うまく展開できなくなるか、一部の機能が動かない(とか、変に動いたりする)はず。

それだと困るので、今の状態で、予め依存するライブラリも含め、全てローカルに保存しておきたい。

しかしPyPIから一つ一つ落としてくるのも手間です。



こういうときに便利なコマンドは無いのか…



installコマンドに--downloadというオプションがありました。

指定すると、インストール用の.tar.gzや.whlファイルをフォルダに放り込んでくれます。

ダウンロードまでで、インストールはされません。これで今あるpython環境をローカルに落としておけます。

[HOST A]$ pip freeze > /nas/pip/requirements.txt
[HOST A]$ pip install --download /nas/pip/archive -r /nas/pip/requirements.txt

あとは展開される側でそのフォルダを参照してpip installすればOKです。

[HOST B]$ pip install --no-index --find-links=file:///nas/pip/archive -r /nas/pip/requirements.txt
...()
Collecting wheel==0.24.0 (from -r ..\requirements.txt (line 34))
Installing collected packages: pyquery, pytz, pyzmq, redis, requests, selenium,
tornado, terminado, toolz, wheel
  Running setup.py install for pyquery
  Running setup.py install for redis
  Running setup.py install for selenium
  Running setup.py install for tornado
  Running setup.py install for terminado
  Running setup.py install for toolz
Successfully installed pyquery-1.2.9 pytz-2014.10 pyzmq-14.6.0 redis-2.10.3 requests-2.5.1 selenium-2.44.0 terminado-0.5 toolz-0.7.1 tornado-4.1 wheel-0.24.0

なお、cx_OracleとかscipyとかpylzmaとかのC拡張が含まれる場合は、関連するコンパイラなども持っておく必要がある気がします。

あと、pip以外からパッケージをインストールしている場合(aptとかyumで入れてる場合)、当然これでは展開できないので要注意です。

※pip 1.5.6(python2.7)で動作確認してます。

参考:

User Guide − pip 6.1.1 documentation

How to use Python's pip to download and keep the zipped files for a package? - Stack Overflow

2015-04-30

Project Eulerの日本語訳へのリンクを張るuser script(2015/4/30時点)

Project Eulerの日本語訳へのリンクを張るuser scriptを更新しました。

Chrome 42.0.2311.90 m

Tampermonkey 3.10.84

で動作確認してます。

f:id:yatt:20121105215448p:image

// ==UserScript==
// @name         ScriptEuler
// @namespace    http://d.hatena.ne.jp/yatt/
// @description  link euler project problem to http://odz.sakura.ne.jp/
// @include      https://projecteuler.net/archives*
// ==/UserScript==

(function(){
  var lst = document.getElementsByClassName('id_column')
  var prefix = 'http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20'
  
  for (var i = 1 ; i < lst.length; i++)
  {
      var no = lst[i].innerHTML
      var a = document.createElement('a')
      a.href = prefix + no
      a.innerText = no
      
      lst[i].innerText = ''
      lst[i].appendChild(a)
  }
})()

関連

2015-04-23

Google Chromeの「新しいタブ」から、ロゴと検索ボックスを消す

f:id:yatt:20150423210704p:image

f:id:yatt:20150423210702p:image

Chromeで新しいタブを開くと、

  • 大きなGoogleロゴ
  • 検索ボックス
  • 最近見たページ

が表示されます。1.と2.が目障りなので、削除するユーザースクリプトを書きました。

続きを読む

2015-04-18

pythonのrequestsライブラリの更新に追従

http://d.hatena.ne.jp/yatt/20121017/1350480131

requestsについて書いた記事ですが、既にAPIが変わってしまっていたので、

同じ動作をするコードを書きました。

対象はrequests 2.6.0です。

はてなダイアリーログイン

変わりません。

#! /usr/bin/python2.7

import requests

s = requests.session()

params = {
    'name': 'your account name',
    'password': 'your password',
}
r =  s.post('https://www.hatena.ne.jp/login', params=params)

print r.text

OAuth認証

OAuthの処理が、requests_oauthlibという別ライブラリに切り出されました。

requestsとは別途、インストールしておきましょう。

$ pip install requests_oauthlib

また、レスポンス文字列jsonにデシリアライズする処理が

プロパティ.jsonからメソッド.json()に変わりました。

http://docs.python-requests.org/en/latest/api/?highlight=response#requests.Response.json

#! /usr/bin/python2.7

import requests
from requests_oauthlib import OAuth1

auth = OAuth1(
'consumer key',
'consumer secret',
'access token',
'access secret',
)

url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'
r = requests.get(url, auth=auth)
print r.json()

OAuth認証してストリーム処理

UserStreamなどのストリームを扱う場合の引数の渡し方が変わりました。prefech=Falseからstream=Trueになっています。

http://docs.python-requests.org/en/latest/user/advanced/?highlight=stream#body-content-workflow

#! /usr/bin/python2.7

import requests
from requests_oauthlib import OAuth1

auth = OAuth1(
'consumer key',
'consumer secret',
'access token',
'access secret',
)

import json
url = 'https://userstream.twitter.com/2/user.json'
r = requests.get(url, auth=auth, stream=True)
for line in r.iter_lines():
    if line == '':
        continue
    print json.loads(line)

grequestsも変わらず使えるようです。なんかちょっと遅い気はしますけど。