2015年12月24日木曜日

apt-get upgrade でエラー

Ubuntu 14.04 で apt-upgradeしたら変なエラーが出た。
files list file for package `libqt5sql5:amd64' contains empty filename
よくわからないが、
/var/lib/dpkg/info/libqt5sql5\:amd64.list
がおかしいらしい。覗いてみると、本来ファイル名のリストのはずなのに、Cのヘッダファイルは入っていた。削除して
sudo apt-get install libqt5sql5 -reinstall
とやったら治った。しかし、検索してもあまり引っかからないし、なんでこんなことになったのか、ちょっと不思議だ。

2015年12月17日木曜日

El capitan で DYLD_LIBRARY_PATH が効かない

dyld: Library not loaded: @rpath/libcudart.7.5.dylib
のようなエラーが出るのでDYLD_LIBRARY_PATHで避けようとしてもなんかうまくいかない。調べてみると、System Integrity Protection の影響らしい。
ここによると、
Spawning children processes of processes restricted by System Integrity Protection, such as by launching a helper process in a bundle with NSTask or calling the exec(2) command, resets the Mach special ports of that child process. Any dynamic linker (dyld) environment variables, such as DYLD_LIBRARY_PATH, are purged when launching protected processes.
だそうで、起動時に引き渡されないらしい。これは参った。そもそもリンクの時におかしなことになっているのが悪いのだが。。

otool -L build/examples/cifar10/convert_cifar_data.bin
とやると、

    @rpath/libcudart.7.5.dylib (compatibility version 0.0.0, current version 7.5.18)
となっている。

install_name_tool -add_rpath /usr/local/cuda/lib build/examples/cifar10/convert_cifar_data.bin
とやるとちゃんと動くようになるのだが、これを全部やるのか??かんべんしてくれ。

2015年12月8日火曜日

mac el capitan の pip

pip で何かをインストールすると、/System/Library 以下に書きに行くらしくて失敗する。
下記のように—ignore-installed をつけるとうまくいくようだ。何をやってるのかはしらない。

sudo -H pip install --ignore-installed --process-dependency-links git+https://github.com/pymc-devs/pymc3

2015年7月2日木曜日

テキストからpngを生成する

メールアドレスをWebに載せるときにはpngにしてくれ、とかいうリクエストに応じるために必要に迫られて作ってみた。今どきメールアドレスなんてどこからでも漏れるし、SPAMフィルターは相当優秀だから、あんまり意味ないと思うのだけど。
  • pngのサイズを決めるのに、一度Graphics を作ってFontMetricsを取得している
  • 透明pngを生成するのに相当苦労したのだが、これはBufferedImageの型の問題で、TYPE_BRGにしていたのが問題だった。Alphaがないので透明にならないのだった。TYPE_ARGBが正解。
  • 気になるのは、相当遅いこと。2秒位かかる。AWTを使ってるので、ライブラリをごっそり読み込んでるのかな。。たくさん作るとボトルネックになるかも。バルクで変換するようにすればいいのだろうけど。
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;

public class TextImage {
  public static void main(String[] args) throws IOException {
    if (args.length < 1) 
      usage();
    OutputStream out =  System.out;
    if (args.length >= 2)
      out = new FileOutputStream(args[1]);
      render(args[0], out); 
  }

  private static void usage() {
    System.err.println("java TextImage INPUT_TEXT [output file]");
    System.exit(1);
  }

  private static void render(String txt, OutputStream os) 
    throws IOException {
    // サイズを決定するために一度Graphicsを作ってFontMetrics を取得する
    BufferedImage im = 
       new BufferedImage(1000, 1000,  BufferedImage.TYPE_INT_ARGB);
    Graphics g = im.getGraphics();
    g.setFont(new Font("Courie", Font.PLAIN, 30));
    FontMetrics fm = g.getFontMetrics();

    int width = fm.stringWidth(txt);
    int height = fm.getHeight();
    int ascent= fm.getAscent();
    im = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    g = im.getGraphics();
    g.setFont(new Font("Courie", Font.PLAIN, 30));
    paint(g, txt, ascent);
    ImageIO.write(im, "png", os);
  }

  public static void paint(Graphics g, String txt, int ascent){
    Graphics2D g2 = (Graphics2D)g;

    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0)); 
    g2.setPaint(Color.white);
    g2.fillRect(0, 0, 1000, 1000);

    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1));
    g2.setPaint(Color.black);
    g2.drawString(txt, 0, ascent); 
  }

}

2015年4月19日日曜日

Yosemite Bluetooth 問題

Macbook pro retina 15 mid 2012 をMarverics からYosemite 10.10.3 にしたら、Bluetoothが動かなくなった。正確には再起動すれば動くのだけど、スリープしてからresumeするとダメ。短時間だと大丈夫だという感じもするので、スリープからハイバーネーションに入るとだめ、ということなのかもしれない。
定番のPRAMリセットとかSLCリセットとかやってみたけど無駄。
iPhoneテザリングとか、キーボードとかでもBTを多用してたのでほとほと困っていた。色々検索してたら、workaroundを発見!
BTのカーネルモジュールを外して入れなおすらしい。。
sudo kextunload -b com.apple.iokit.BroadcomBluetoothHostControllerUSBTransport
sudo kextload -b com.apple.iokit.BroadcomBluetoothHostControllerUSBTransport
とりあえずこれでなんとかなるようになった模様。。はあ。
しかし、こんなの勘弁して下さいよ。。

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 がどうこうというわかりにくいエラーが出る。

2015年2月25日水曜日

ubuntu 設定

  • /etc/default/keyboard
    XKBOPTIONS=”ctrl:nocaps”
  • gsettings set org.gnome.desktop.interface gtk-key-theme Emacs
  • env LANGUAGE=C LC_MESSAGES=C xdg-user-dirs-gtk-update

Let's note RZ4にubuntu 14.10

RZ4にubuntu 14.10 を入れてみたので手順をまとめておく。

- パーティションを確保
 * コントロールパネルー>システムとセキュリティー>管理ツールー>コンピュータの管理
 * ディスクの管理で C:ドライブを右クリックー>縮小 で Cドライブを縮小

- UEFIをBIOSブートに切り替え
 * トラブルシューティングー>UEFIファームウェアの設定
 * BIOSの設定型角で 起動ー>UEFI起動 を 無効に -> F10 で save & exit

- USBキーからubuntuインストールディスクで起動

- パーティションを自動で切らせる事ができなさそうなので、空き領域に'/'とswap とbios ブート予約領域を作る。ブートサイズの領域がどのくらい必要なのかはよくわからないが100Mもあれば大丈夫そう。

これでとりあえずインストールできる。

- 液晶の明るさが変えられない。
  これは /sys/class/backlight/intel_backlight/brightness に値を入れると変わる。

- ubuntu的にサスペンドした場合にはresumeできるが、蓋をしめてサスペンドするとresume時にキーボードとマウスが効かなくなる

- 省電力制御がうまくいっていないのか、稼働時間が短い。。ubuntu予想時間で5時間ぐらい。


2015年2月23日月曜日

jcuda

jcuda というのは、JavaからCudaを直接(というかJNI?経由で)呼び出すライブラリ。なんかデータの転送が遅そうな気がしていたのだけど、バークレイのプロジェクトでScalaから呼び出すのに使われており、それなりである、ということなので試してみた。
Macだと普通のCのプログラムでもいろいろ面倒なので構えていたのだけど、試してみたらびっくりするほど簡単だった。
  • ダウンロードページ からダウンロード
  • zip なので適当な所に展開。jar と dynlib が入っている。
  • jar をclasspath にいれる
  • 実行時オプションで -Djava.library.path=展開した場所 を指定。LD_LIBRARY_PATHでもいいんだろう。
サンプルページにあるblas の sgemm を試してみる。2000x2000だとJava版で1分近くかかるのがcuda版だと400ms で終わる。ざっくり100倍以上。もとがJavaでタイリングもしていないということを勘定にいれてもすばらしい。
サポートされているのは、cublas, cufft, curand, cusparse。

2015年2月5日木曜日

Let's note RZ4 の環境設定

- virtualbox デフォルト設定でubuntu を入れたら、virtual boxドライバを入れてもアニメーションが重くてまともに動かない。理由は * メモリが512になっていた * ビデオメモリも少なかった * 3Dアクセラレーションがオンになっていなかった これらをいじったらなんとか動くようになった。が、それでもなんとなくおもいので xfce を入れたほうが多分いい。 - ubuntu xfce 設定マネージャからDPIが変更できる

2015年1月21日水曜日

crawl したfile をファイルシステム上で読めるようにする

地味に非常に面倒だ。。
何が問題かというと、リンク文字列とファイル名の関係。
ブラウザはリンク文字列の中にURLエンコードのパターン(%に数字2つ)を
発見すると、勝手にデコードして検索に行く。
さらに、リンク中の”?”の問題がある。
これはpukiwiki のようなCMSをクロールした場合に固有な話だが、
リンクには”?”がふくまれており、ダウンロードしたファイル名にも?が
そのまま入っている。この場合どうもアクセス出来ないようだ。
したがって、
  • ファイル名をすべてURLデコードし
  • さらに、ファイルの中のリンクの?を全部’%3F’ に置き換えていかなければならない。。
まじか。。

crawler

Pythonで書いた簡単なクローラ
import urllib2
import sys, os
import sets
import time
from bs4 import BeautifulSoup
import urlparse

SIZE=1000000
storageDir = 'storage/'
rootPath = None

pushed = sets.Set()
stack = []

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Chrome')]
urllib2.install_opener(opener)

# BASIC AUTH
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='Authentication required',
                          uri='http://example.com/',
                          user='example',
                          passwd='dotcom')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)

def trim_protocol(url):
    if url.startswith("http://"):
        return url[7:]
    if url.startswith("https://"):
        return url[8:]
    return url

def getFile(f):
    name = storageDir + trim_protocol(f.geturl())
    if name.endswith("/"):
        name = name + "__root__"
    index = name.rfind('/')   # creating directory if needed
    if index != -1:
        if not os.path.exists(name[:index]):
            os.makedirs(name[:index])
    return open(name, 'w')

def genUrl(urlhead, target):
    sindex = target.rfind("#")
    if sindex != -1:
        target = target[:sindex]
    if not target.startswith("javascript") :
        if not (target.startswith("http://") or target.startswith("https://") ):
            if target.startswith("/"):
                return urlroot(urlhead) + target
            elif target.startswith("../"):
                return genUrl(removeOne(urlhead), target[3:])
            elif target.startswith("./"):
                return urlhead, target[2:]
            else:
                return urlhead + target
        else:
            return target
    return None


def removeOne(url):
    if url.endswith("/"):
        url = url[:-1]
    i = url.rindex("/")
    return url[:(i+1)]

def links(soup):
    for atag in soup.find_all("a"):
        try:
#            print 'content = ',  atag.contents
            yield(atag['href'])
        except KeyError:
            pass # ignore
    for imgtag in soup.find_all("img"):
        try:
            yield(imgtag['src'])
        except KeyError:
            pass # ignore
    for ftag in soup.find_all("FRAME"):
        try:
            yield(ftag['src'])
        except KeyError:
            pass # ignore


def process(urlhead, doc):
    soup = BeautifulSoup(doc)
    for target0 in links(soup):
        target = genUrl(urlhead, target0)
        if target == None:
            continue
        if not target in pushed:
            if (not rootPath) or target.startswith(rootPath):
                print '   pushing ', target
                pushed.add(target)
                stack.append(target)

def urlhead(name):
    index = name.rfind('/')
    if name.endswith("/"):
        return name
    if index != -1:
        return name[:(index + 1)]
    return name + "/"

def urlroot(name):
    o = urlparse.urlparse(name)
    return o.scheme + "://" + o.netloc + "/"

def main(start):
    print 'starting with ', start
    print 'saving to ', storageDir
    stack.append(start)
    pushed.add(start)

    while len(stack) > 0:
        time.sleep(1)
        item = stack.pop()
        try:
            f = urllib2.urlopen(item)
            print 'accessing ', item, ' , url is ', f.geturl()
            if f.info()['Content-Type'].startswith('text/html'):
                doc = f.read();
                storage = getFile(f)
                storage.write(doc)
                process(urlhead(f.geturl()), doc)
                storage.close()
            else:  # dump the content 
                storage = getFile(f)
                while True:
                    buf = f.read(SIZE)
                    if buf == "":
                        break
                    storage.write(buf)
                storage.close()
            f.close()
        except urllib2.HTTPError as e:
            print 'failed to get ', item, " , ", e
        except AttributeError as e:
            print 'failed to handle ', item, " , ", e
        except urllib2.URLError as e:
            print 'failed to handle ', item, " , ", e

def usage():
    print "python crawl.py START_POINT [ROOT_PATH]"
    sys.exit()

if __name__ == '__main__' :
    if len(sys.argv) < 2:
        usage()

    if len(sys.argv) >= 3:
        rootPath = sys.argv[2]
    main(sys.argv[1])