import re
import logging
logger = logging.getLogger("logger") #logger名loggerを取得
logger.setLevel(logging.DEBUG) #loggerとしてはDEBUGで
logging.basicConfig(level=logging.DEBUG,
filename=re.sub("\..*$","",__file__)+".log",
format="%(asctime)s %(levelname)-7s %(message)s")
logging.debug("debug log")
neologdをローカルにインストール
よく忘れるのでメモ
Neologdは最新の単語が入っていてすごく便利なのですが,あまりにも変更があるので,研究に使うにはちょっと困ってしまいます。
Versionの固定されたちょっと古いものを使用します。
wget https://github.com/neologd/mecab-ipadic-neologd/archive/v0.0.5.tar.gz tar zmvfp v0.0.5.tar.gz cd mecab-ipadic-neologd-0.0.5
インストール
./bin/install-mecab-ipadic-neologd --prefix /path/to/install/dir -u
ここでuオプションをつけるとローカル領域にインストールできます。
正規表現でURLを削除
pythonで正規表現でURLを削除する方法のメモ
ここを参考に作成したのですが,どうもバグっているのか,Pythonと相性が悪いようなので修正した。
import re
str="。少し前ですがhttp://lite-ra.com/2014/11/post-605_2.htmlってどういうことなのでしょうか?"
ret = re.sub(r"(https?|ftp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)", "" ,str)
print ret # 少し前ですがってどういうことなのでしょうか?
gcc6でRMecabのインストールはエラー
大学のサーバのGCCが6.2だったのでメモ。
RMeCabのインストール
> install.packages("RMeCab", repos = "http://rmecab.jp/R")
エラーになる。
RMeCab.cpp:89:11: error: narrowing conversion of '229' from 'int' to 'char' inside { } [-Wnarrowing] 0}; //形容詞
GCC6だとエラーになるので、GCC5台にしないと駄目です。
因みにソースコードはinstall.packageのときにオプションを付けると消されないでローカルファイルに残ります。
> install.packages("RMeCab", repos = "http://rmecab.jp/R",keep_outputs=T)
ubuntu16.04で画面のlock解除
Ubuntu16.04のGnomeデスクトップではデフォルトで画面のLockがOnになっています。
そのため、画面を操作しないとロックされてしまい、毎回パスワードを入力する必要があります。
この画面のlockをさせない方法は以下の通り
- Application-SystemTools-Settingsを選択
- Privacyを選択
- ScreenLockを選択しAutomatic Screen LockをOff
cygwin+python+mecab+PyCharmで開発環境を作る
概要
MacからWindwosに乗り換えて一番困るのが開発環境。Pycharmを使ってのpythonの開発はMac以上に面倒です。
WindowsはWindows用のコンパイルされたpythonやmecabを使うのが一般的ですが、モジュールの追加など結構面倒なので、Cygwinを使っている人も多いと思います。
今回、Cygwin上にPythonとMecabをインストールし、それをPycharmから使う環境を作成したのでメモを残します。
環境
* windows 10
* cygwin x86_64
* pycharm 2017.1
cygwinのインストール
ここからsetup-x86_64.exeをダウンロードしインストールします。特別なことは何もしません。通常にインストールします。
余裕があればapt-cygを入れておくと便利です。
pythonのインストール
cygwin上にpythonを入れておきます。自分の場合には2.7系を入れます。
teratermのインストール
cygwinのターミナルは使いにくいのでteratermを入れておきます。teratermにはcygwin用のTerminalもついているのでそちらを起動してCygwinにログインします。
mecabのインストール
Mecabのインストールはソースコードからインストールします。Mecabのバージョンは0.996を使いますがそのままではコンパイルできないので、こちらのパッチを用いてインストールします。
$ tar zxvf mecab-0.996.tar.gz $ patch -p1 -d ./mecab-0.996/ < ./mecab-0.996.patch $ cd ./mecab-0.996 $ ./configure --with-charset=utf-8; make; make install
nkfのインストール
nkfをソースからインストールします。
こちらからダウンロードしインストールします
$ ./configure $ make $ make install
ipadic
こちらからipadicをダウンロードします。ソースコードになります。これをコンパイルするのですがそのままだとどうも文字化けしてしまいます。ので、UTF-8に変換しておきます
$ tar zxvfp mecab-ipadic-2.7.0-20070801.tar.gz $ cd mecab-ipadic-2.7.0-20070801 $ for f in *;do nkf --overwrite -w $f ;done $ ./configure --with-charset=utf-8
環境変数
windowsの環境変数を設定します。システムの詳細設定から、システムのプロパティを開き、詳細設定タブの環境変数からpathに以下を追加しておきます。これでWindows側からもCygwinのコマンドが呼び出せます。
c:\cygwin64\bin c:\cygwin64\usr\bin c:\cygwin64\usr\local\bin
python-mecab
pipでインストールするとエラーになります。ソースコードからインストールします。ここからmecab-python-0.996.tar.gzをダウンロードしコンパイルします
$ tar zxvfp mecab-python-0.996.tar.gz $ cd mecab-python-0.996 $ python setup.py build $ python setup.py install
pycharm
ここからダウンロードしインストールします。
インストールしたのちにfileメニューのdefault settingsからproject interpreterを選択し、c:\cygwin64\bin\python2.7.exeを設定します
これでPycharmからCygwinのPythonを利用できます。
Pythonのマルチプロセスとマルチスレッド
マルチスレッドとマルチプロセス
マルチスレッドとマルチプロセスは似ているようで違います。マルチプロセス間の実行中の値は、各プロセス間で別になっていますが、マルチスレッドの場合には変数を共用するのでちょっと注意が必要です。
実行環境
- cray xc40
- python 2.7.13
マルチプロセス
ここを参考に
03_multi.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# http://qiita.com/yubais/items/5a9d91fe03fe715b21d0
import multiprocessing as mp
import sys
L = 40000
proc=int(sys.argv[1])
# 各プロセスが実行する計算
def subcalc(queue, p):
subtotal = 0
# iの範囲を設定
ini = L * p / proc
fin = L * (p+1) / proc
for i in range(ini, fin):
for j in range(L):
subtotal += i * j
# キューにデータを送る
queue.put(subtotal)
# キューを作成
queue = mp.Queue()
# 8個のプロセスを用意
ps=[]
for i in range(proc):
ps.append(mp.Process(target=subcalc, args=(queue, i)))
# すべてを開始
for p in ps:
p.start()
# キューから結果を回収
total = 0
for i in range(proc):
total += queue.get() # キューに値が無い場合は、値が入るまで待機になる
print(total)
36プロセス
03_multi_36.sh
実行スクリプト
#!/bin/sh
#PBS -N 03_multi_36
#PBS -j oe
#PBS -l select=1:ncpus=36
#PBS -l place=scatter
#PBS -q SINGLE
if [ "${PBS_O_WORKDIR}" != "" ];then
cd ${PBS_O_WORKDIR}
fi
export OMP_NUM_THREADS=36
. ~/.bashrc
APRUN="aprun -n 1 -d $OMP_NUM_THREADS"
date
$APRUN python 03_multi.py 36
date
結果
2017年 6月 6日 火曜日 09:33:12 JST 639968000400000000 2017年 6月 6日 火曜日 09:33:17 JST
1プロセス
03_multi_1.sh
#!/bin/sh #PBS -N 03_multi_1 #PBS -j oe #PBS -l select=1:ncpus=1 #PBS -l place=scatter #PBS -q SINGLE if [ "${PBS_O_WORKDIR}" != "" ];then cd ${PBS_O_WORKDIR} fi export OMP_NUM_THREADS=1 . ~/.bashrc APRUN="aprun -n 1 -d $OMP_NUM_THREADS" date $APRUN python 03_multi.py 1 date
結果
2017年 5月 31日 水曜日 10:44:19 JST 639968000400000000 2017年 5月 31日 水曜日 10:45:35 JST
かなり速度が違います
マルチスレッド
ここを参考
03_multi.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# http://qiita.com/yubais/items/5a9d91fe03fe715b21d0
# http://kaworu.jpn.org/python/Pythonのマルチスレッドプログラミング
import threading
import sys
#http://ja.pymotw.com/2/Queue/
import Queue
L = 40000
proc=int(sys.argv[1])
# 各プロセスが実行する計算
def subcalc(queue, p):
subtotal = 0
# iの範囲を設定
ini = L * p / proc
fin = L * (p+1) / proc
for i in range(ini, fin):
for j in range(L):
subtotal += i * j
# キューにデータを送る
queue.put(subtotal)
# キューを作成
queue = Queue.Queue()
# 8個のプロセスを用意
ps=[]
for i in range(proc):
ps.append(threading.Thread(target=subcalc, args=(queue, i)))
# すべてを開始
for p in ps:
p.start()
p.join()
# キューから結果を回収
total = 0
for i in range(proc):
total += queue.get() # キューに値が無い場合は、値が入るまで待機になる
print(total)
36プロセス
04_thread_36.sh
実行スクリプト
#!/bin/sh
#PBS -N 04_thread_36
#PBS -j oe
#PBS -l select=1:ncpus=36
#PBS -l place=scatter
#PBS -q SINGLE
if [ "${PBS_O_WORKDIR}" != "" ];then
cd ${PBS_O_WORKDIR}
fi
export OMP_NUM_THREADS=36
. ~/.bashrc
APRUN="aprun -n 1 -d $OMP_NUM_THREADS"
date
$APRUN python 04_thread.py 36
date
結果
2017年 6月 6日 火曜日 09:39:57 JST 639968000400000000 2017年 6月 6日 火曜日 09:41:13 JST
1プロセス
04_thread_1.sh
実行スクリプト
#!/bin/sh
#PBS -N 04_thread_1
#PBS -j oe
#PBS -l select=1:ncpus=1
#PBS -l place=scatter
#PBS -q SINGLE
if [ "${PBS_O_WORKDIR}" != "" ];then
cd ${PBS_O_WORKDIR}
fi
export OMP_NUM_THREADS=1
. ~/.bashrc
APRUN="aprun -n 1 -d $OMP_NUM_THREADS"
date
$APRUN python 04_thread.py 1
date
結果
017年 6月 6日 火曜日 09:39:57 JST 639968000400000000 2017年 6月 6日 火曜日 09:41:13 JST
python+SQLiteでlike文
ここを参考に、
Asciiの場合
cursor.execute("SELECT * FROM posts WHERE tags LIKE ?", ('%{}%'.format(tag),))
Unicodeの場合
tagはunicode string
cursor.execute("SELECT * FROM posts WHERE tags LIKE ?", (u"%{}%".format(tag),))
ValueError: unsupported format character ‘Y’ (0x59) at index 51
MySQL+Pythonのエラー
ValueError: unsupported format character 'Y' (0x59) at index 51
このようなエラーが出るときの対応。
import MySQLdb
ymd="2017-05-19"
con=MySQLdb.connect(user="root",password="",host="localhost",db="test")
cur=con.cursor()
cur.execute("set names utf8") # 文字化け対応
cur.execute("select * from test_table where date_format(ymd,'%%Y-%%m-%%d')=%s",(ymd,))
for row in cur.fetchall():
print(row[0])
これだと上記エラーが発生します。
ここに解決策が載っていました。
ポイントはsql文の文字列をformat()するだけ
import MySQLdb
ymd="2017-05-19"
con=MySQLdb.connect(user="root",password="",host="localhost",db="test")
cur=con.cursor()
cur.execute("set names utf8") # 文字化け対応
cur.execute("select * from test_table where date_format(ymd,'%%Y-%%m-%%d')=%s".format(),(ymd,))
for row in cur.fetchall():
print(row[0])
lambdaのAPIにキーを付与する
AWSの仕様がすぐ変わるのでメモ。
こちらの記事を参考にAPIGatewayにAPIキーをつけようとしたのですが、2017.5.16現在、仕様が変わってしまっているようでそのままでは設定できませんでした。
記事の中頃「API Keyの追加」の部分ですが、API Stage AssociationはAPI Keyのページには存在しません。
以下の手順となります
- 左メニューのUsagePlansというメニューをクリック
- createでNameに何か適当な名前を入れる。
- リクエスト数にリミットをつけないのならば、Enable throttlingとEnable Quotaはチェックを外す
- Add API Stageでデプロイ済みのAPIとStageを選択しチェックマークをクリック。Nextをクリック
- Add API Key to Usage Planをクリックし、作成済みのAPI Keyの名前を入力。チェックマークをクリックしDone
これでAPIキーが付加されます。