mapと内包表記

リストの全要素へ同じ処理を適用する時に,lambda関数化してmapで適用するのと,内包表記で適用後の値を要素とするリストを生成するのはどっちが早いんだろう?

こんなタイマーを作って,試してみた.

# -*- coding: utf-8 -*-

import timeit
import sys 

'''実行速度を計測する'''

def time_measurement(script, preprocessing, number, recursion):
    '''script is main process, preprocessing includes import statements,
    number means the number of a single trial,
    recursion means the number of trials'''

    timer  = timeit.Timer(script, preprocessing) 
    result = timer.repeat(recursion, number)
    return result

試してみる.

# -*- coding: utf-8 -*-
import tm

# 内包表記
script = '''
o=[' '.join(d) for d in data]
'''
preproc = '''
import numpy;data = [('%d'%(100*numpy.random.uniform()),'%d'%(100*numpy.random.uniform())) for i in range(1000000)]
'''
result=tm.time_measurement(script,preproc,10,2)
print 'make list:',min(result)

# for文
script = '''
o=[]
for d in data:
    o.append(' '.join(d))
'''
result=tm.time_measurement(script,preproc,10,2)
print 'for:',min(result)

# map関数
script = '''
o=map(joint,data)
'''
preproc = '''
import numpy;data = [('%d'%(100*numpy.random.uniform()),'%d'%(100*numpy.random.uniform())) for i in range(1000000)];joint=lambda x:' '.join(x)
'''
result=tm.time_measurement(script,preproc,10,2)
print 'use map:',min(result)

結果

$ python test.py
make list: 1.00997805595
for: 1.52903008461
use map: 1.53125476837

内包表記の勝ち

for文とmap関数は,ほぼ同じ時間だった.同じように実装されているのかなぁ.

ログを日付別に行数カウントする

monthlyでlogrotateしているログが,ある月だけ突出してサイズが大きかったので,いつのログが問題なのかを見るためにちょっと書いたスクリプト.
ちょっと月を入力するところをサボった.
数字の0フィルは-wオプションらしい.

#!/bin/bash

for d in $(seq -w 1 31)
do
echo -n $d
echo -n ' '
echo `zcat $1 | grep $d/Nov/2015 | wc -l`
done

numpyを使った複数要素の一括比較演算

まとめて複数要素の比較をし,andを取る

import numpy as np
a=np.array([1,2,3])
b=np.array([1,2,3])
c=np.array([1,2,4])
print a==b,' is ',(a==b).all()
print b==c,' is ',(b==c).all()

出力

[ True  True  True]  is  True
[ True  True False]  is  False

まとめて複数要素の比較をし,その配列でDataFrameをフィルタ

import numpy as np
import pandas
df = pandas.read_csv(open(...))
under50 = df[df['axis1']<50]
between50_100 = df[np.logical_and(df['axis1']>=50,df['axis1']<100)]

xmonadでダイアログへのフォーカスがループする現象の対策

追記

keepass2のフォーカス問題については,原因はよく分からないものの
xmonad - ArchWikiのJava GUIの問題対策を実施し
最新のxdotoolを入れたら,keepass2のウィンドウは相変わらずフォーカスループするのだが,keepass2 --auto-typeで問題なく自動フィルされるようになった.

export _JAVA_AWT_WM_NONREPARENTING=1

xmonadからkeepass2をWinと同じく左ALT+Ctrl+aで呼び出すのは,こんな感じ.
ただしmodMaskはmod1Mask以外にしている.

-- 省略
    `additionalKeys`
        [ -- 省略
        , ((mod1Mask .|. controlMask, xK_a), spawn "keepass2 --auto-type")
        ]

でも,CPUファンが唸るので,keepass2を常駐させるのは無理ぽ


xmonad で libreoffice をはじめとするダイアログを生成し,自動的にフォーカスをダイアログへうつし,かつ元ウィンドウへのフォーカスはさせない系の動作をするアプリにおいて,ダイアログへフォーカスをうつす処理っぽいものが無限ループみたいな状態に陥って,CPU使用率はぐいぐい向上し,ほとんど操作を受け付けなくなる現象への対策.
sylpheedのダイアログとかでも直ったから,ちょー助かる.
Linux - xmonadでLibreofficeを起動するとフォーカスがループする問題 - Qiita
リンク先の方法で解決.神すぎ.

(略)
import XMonad.Hooks.EwmhDesktops -- フォーカスがループする問題対策
(略)
main = do
  myStatusBar <- spawnPipe "xmobar /home/hoge/.xmonad/.xmobarrc"
  xmonad $ ewmh defaultConfig
    { borderWidth           = 3
    , focusedBorderColor    = colorGreen
    , layoutHook            = toggleLayouts (Full) $ myLayoutHook
    , logHook               = myLogHook myStatusBar
    , modMask               = modm
    , manageHook            = myManageHook
    , normalBorderColor     = colorGray
    , startupHook           = myStartupHook
    , terminal              = "urxvt"
    }   

ubuntuでタッチパッドでミドルクリックする

synapticsのドライバを入れる.
実は,gpointing-device-settingsを入れると,自分の環境に適切なものが入るはず.

$ sudo apt-get install xserver-xorg-input-synaptics

ホントは,/etc/X11/xorg.conf.d/50-synaptics.confとかが自動で入るはずなんだけど,なぜかhadacchiの環境では入らなかったので,手で書く.

Section "InputClass"
    Identifier "touchpad"
    Driver "synaptics"
    MatchIsTouchpad "on"
        Option "TapButton1" "1"
        Option "TapButton2" "3" # 2本指で右クリック
        Option "TapButton3" "2" # 3本指で中クリック
        Option "VertEdgeScroll" "off" # タッチパッドの右の方でスクロールするやつ
        Option "VertTwoFingerScroll" "on" # 2本指スクロール
        Option "HorizEdgeScroll" "off"
        Option "HorizTwoFingerScroll" "on"
        Option "HorizScrollDelta" "-100" # マイナスは逆方向,数値は精度(大きいほどスクロール速度は遅くなる)
        Option "CircularScrolling" "off" # 多分,let's noteとかのくるくる回すスクロールだと思う
        #Option "CircScrollTrigger" "2"
        Option "EmulateTwoFingerMinZ" "40" # ここから下はよーわからん
        Option "EmulateTwoFingerMinW" "8"
        Option "CoastingSpeed" "0"
        Option "FingerLow" "35"
        Option "FingerHigh" "40"
EndSection

ubuntuでデュアルディスプレイ

ノートPCで,HDMIに出力する例を書くよん.
IFはノートPCの画面がeDP1,HDMIの出力がHDMI1とする.
まーあと,そうはいってもちゃんと事前に映るか確認すべきだよねっ☆(テヘペロ

$ xrandr --output HDMI1 --auto

いやいや,ディスプレイには他のワークスペースを出したいのよ.

$ xrandr --output HDMI1 --auto --right-of eDP1

未だd-subが要求されることがあるが,うっかり事前準備してなくで出せなくて焦った.
こーしたら出た.

$ xrandr --output HDMI1 --mode 1024x768 --rate 60.0 --right-of eDP1

よし,プレゼン終わったぜ!
ケーブル抜いても右にディスプレイが残りつづけるから,切断しないとね

$ xrandr --output HDMI --off

ノートPCに入れたUbuntuでACアダプタが抜けたら画面輝度を下げたりする

ubuntu 14.04+xmonad環境で,ACアダプタのON/OFFに合わせて画面の輝度を変更する設定.
ここのDock and Undock Scriptsを参考にやったらできた.
LaptopLidAndDockScripts - Community Help Wiki

ubuntuではacpidは,なんかあんまり使われてないらしく (PowerManagement/Overview - Community Help Wiki)
実際,event=ac_adapter\ ACPI~(以下略) は動作しなかった.

しばらく/etc/acpid/eventsで悪戦苦闘してみたものの,結局はpm-utilsに設定することで解決した.

#!/bin/sh
case $1 in
    false)
        if [ -e /usr/bin/xbacklight ]; then
            DISPLAY=:0 su USERNAME -c "/usr/bin/xbacklight -set 20"
        fi
    ;;
    true)
        if [ -e /usr/bin/xbacklight ]; then
            DISPLAY=:0 su USERNAME -c "/usr/bin/xbacklight -set 5"
        fi
    ;;
esac