2015年3月26日木曜日

google sites liberation

Google Sites間でお引越しするツール Google Sites Liberation、とても便利なのだが、 久々に使ってみたらうまく動かない。credentialが不正とか言われる。

何度も試していたらGoogleからメイルが来た。。このツールはless secure な認証なので それをオンにしてやらないと使えなくなったということらしい。。

たしかにユーザ名とパスワードだけだからなあ。。とりあえず出来てよかった。

2015年3月16日月曜日

Google Drive からファイルをダウンロード

Google Spreadsheetに論文リストを作っておいて、gdata apiでダウンロードして整形するというワークフローにしているのだけど、気がついたらダウンロードできなくなっていた。。。ログインそのものに失敗する。ユーザ名とパスワードというログインは今どきちょっとどうかと思っていたところなので、しょうがないのかもしれない。
で、Drive APIに移行。
    • developer console でプロジェクトを選ぶ。もしくは作る。
    • 左のAPIs & authから APIsを選んで、 Drive API を on にする。
    • 左でcredentials を選択。oauth と public api access の2択になるのでoauthのほうを選ぶ。そのなかで installed applicationを選択。
    • するとClient_ID と Client_secret という情報が出てくるのでこれをメモっておく。
  • ダウンロードするプログラムはこんな感じ。
    • FILE_ID はdrive でファイルを表示したURLのkey= の後ろの文字列
    • download_url は本来fileオブジェクトからcsvを指定して取れるはずなのだが、なぜかとれない。多分バグなのでURLを自分で組み立てている。ここ、そのうち動かなくなる可能性大。
    • open XXX を使ってブラウザにOAuth用のページを表示している。ここでacceptすると出てくる文字列を端末から入力するという面倒臭さ。
#!/usr/bin/python

import os
import sys
import httplib2
import pprint

from apiclient.discovery import build
from apiclient.http import MediaFileUpload
from oauth2client.client import OAuth2WebServerFlow

from apiclient import errors

def download_file(service, drive_file):
  """Download a file's content.

  Args:
    service: Drive API service instance.
    drive_file: Drive File instance.

  Returns:
    File's content if successful, None otherwise.
  """
#  download_url = drive_file['exportLinks']['text/csv']

  download_url = 'https://docs.google.com/feeds/download/spreadsheets/Export?key=' + drive_file['id'] + '&exportFormat=csv'

  if download_url:
    resp, content = service._http.request(download_url)
    if resp.status == 200:
 #     print 'Status: %s' % resp
      return content
    else:
      print 'An error occurred: %s' % resp
      return None
  else:
    # The file doesn't have any content stored on Drive.
    return None

# Copy your credentials from the console
CLIENT_ID = 'XXXX'
CLIENT_SECRET = 'XXXXXXX'

#FILE_ID
FILE_ID = 'XXXXXXXX'

# Check https://developers.google.com/drive/scopes for all available scopes
OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive'

# Redirect URI for installed apps
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'

# Path to the file to upload
FILENAME = 'document.txt'

# Run through the OAuth flow and retrieve credentials
flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE,
                           redirect_uri=REDIRECT_URI)
authorize_url = flow.step1_get_authorize_url()
print 'Go to the following link in your browser: ' + authorize_url
os.system("open '" + authorize_url + "'")
code = raw_input('Enter verification code: ').strip()
credentials = flow.step2_exchange(code)

# Create an httplib2.Http object and authorize it with our credentials
http = httplib2.Http()
http = credentials.authorize(http)

drive_service = build('drive', 'v2', http=http)

drive_file = drive_service.files().get(fileId=FILE_ID).execute()

c = download_file(drive_service, drive_file)

f = open(sys.argv[1], 'w')
f.write(c)
f.close()
しかし定期的に動かなくなるな。。これがクラウドというものか。面倒だ。

brew で入ったpythonがssl対応でなかった

なんかhttplib2 が HTTPSを知らないというようなエラーが出たら、それはきっとPythonをコンパイルするときにSSLがONになっていなかったから。ということでbrewで入れなおすには、このようにすれば良いらしい。

デフォルトでONにしてくれ。。。

brew install python --with-brewed-openssl --build-from-source

2015年3月2日月曜日

jCUDAの注意点

JCUDA とても楽しいのだけどいくつか落とし穴が。

- 関数の引数型に関するチェックが全く効かない。関数の名前しか見てくれないので、float の配列と intを間違えて呼び出しても何も注意してくれない。
大昔のプロトタイプ宣言を書かない時代のCみたい。懐かしい。
この場合たいていはCUDAの中で変なメモリを触って落ちる。

- コンテクストがスレッドにバインドされているらしいので、初期化は
 実行するスレッドで行わないといけない。JavaだとGUIがらみで呼び出される
 スレッドは別スレッドになるので注意が必要。
 CONTEXT がどうこうというわかりにくいエラーが出る。