ノーパソの電池, emacs小ネタ, たくさんの区間 (2013/09/12)


でんち

どうもパソコンの電池がダメみたいだ. 買ったときは1時間ぐらい使えた. その後, ssd にしたら90分ぐらい使えた事もあった. だが, 最近は20分が限界だ.

どうもいろいろ電池をリセットしたりできるユーティリティーがあるらしい. それ関連のキーワードを調べてみる. smart battery というそうだ. なんというべたな名前. まぁいい. そういうのが Linux でもできないか調べてみた.

apt-get install tp-smapi-dkms

modprobe tp_smapi すると,

/sys/devices/platform/smapi

というフォルダができて, そこにいろんな情報が溜まったり, echo 0 > hoge みたいなコマンドで電池を操作できたりする. たとえば, force_discharge っていうファイルがあって, その中身はふだんは 0 なんだけど, そこに echo 1 すれば強制全放電できる. 電池を充電しすぎると性能がダメになるらしいが, そういう問題への解決として途中で充電はやめて, 40% まで減ったらまた充電するみたいな設定もできる.

あと, 4cell の電池がもう count が 600 ぐらいいってたので, 終わりだろう, ということで(膨らんだりはしてないけど) かわりに 6 cell のやつを買ってきた. アメリカだと全然値段が安いんだけど, どうもリチウムイオン電池は国際発送できないみたいだった. 船便だといいのかねぇ.

電池がでかくなったからといって重くなったりクソでかくなるのは困るんで, 全体の形は変更しない 6 cell にしてみた. 厚さと重さはちょと増える.

稼働時間は5時間ぐらいになった. 打ち合わせぐらいだと電源が要らんようになったので電池は少し重くなったけれど合計すると荷物は少し減った.

最終的に, /etc/init.d になんかそれっぽいスクリプトを置いて, 起動時にモジュールをロードして適当な設定をし, refresh とか fullcharge とかありがちな引数で, そういう動作するようにしてみた. 久々にシェルスクリプト書いたわ.

debian

久々のメジャーリリースで, 入り口ディストリもいろいろ出入りがあり, うっかり update をかけて業務に支障をきたしております. 笑

いずれも stable に downgrade して対応. dpkg --add-architecture して :ia32 なパケジをインストールした.

goto-address-mode

emacs のマイナーモードで, アドレスっぽい文字列をつつけるようになるやつ. これを on にすると README とかに uri が書いてあったら, つつけるようになるわけだ.

emacs の info にこのモードの説明が載ってる. 変数 browse-url-browser-function という変数をカスタマイズすると呼び出すブラウザが変更できるのだが, 若干いろいろ古くて微妙な感じだった. 以下この変数の初期値 browse-url-default-browser のヘルプからの引用

The order attempted is gnome-moz-remote, Mozilla, Firefox, Galeon, Konqueror, Netscape, Mosaic, Lynx in an xterm, and then W3.

gnome-moz-remote ってもう10年ぐらいまえちゃうの?

apache

update したら apache が新しくなって, localhost が見れなくなった.

localhost の document root を ~/public_html にしたのだが, / が

 	Require all denied

な設定なのでこれが適用されてエラーになる. 本当はこういうのはダメなわけですが, もうめんどくさいのでここを granted にして見れるようにしときました.

mouse-wheel

thinkpad ではいつのころからかまんなかボタンでスクロールできるようになっているわけですが, (俺が昔使ってたやつにはまんなかボタンがそもそも無かった) 例によってXではこれがボタン4と5に割り当てられています. gpointing-device-settings というツールを使うと, そうなります. これで emacs でもホイールでスクロールするようになるわけですが, スクロール量が多すぎて若干使いにくいので, 変更するための変数を設定した.

mouse-wheel-scroll-amount

という変数です. ただし, 正しい値はさっぱり意味が解らないので, そこを手でいじるのはやめて, カスタマイズのインタフェースを使ったほうがいいと思う. 変数のヘルプ(describe-variable)を見れば下の方にカスタマイズのリンクがあるので, それを突つけば設定インタフェースが開く.

2013/06/04

http://multires.caltech.edu/software/libseq/

そのうち ffi でインタフェース書こうかな, と.

文字列から検索ヒット件数を取得する.

文字列から検索ヒット件数を取得する, というのは案外需要がある使い方なので, プログラミング言語の文字列クラスには, そういうことができても悪くないだろ, と思った.

  def searchlength
    qs=self.split(" ").join("+")
    repls=`wget -U \“Firefox\/3.0.15\″ \"https://www.google.com/search?q=#{qs}&ie=utf-8\" -O - | nkf -w`

    if ss=repls[/([0-9]+\,)*[0-9]+ results/]
      ss[/([0-9]+\,)*[0-9]+/].gsub(",", "").to_i
    else
      raise "search failed"
    end
  end

これだと検索結果が0件のときと, そもそもおかしいときが区別がつかないのでよくないね. スペースで区切った文字列は and 検索になる仕様. これができるとエディタでも同じ事がやりたくなる.

(mapcar (lambda (str) (websearch-hitnum str)) (split-string "ジグ 治具 冶具" " "))
(3040000 4400000 591000)

こんな感じ? わざわざエディタでやることでもない気もする. まぁいい.

web とってくるライブラリじゃなくて wget 直叩きなのと, そこからクソみたいな正規表現で要るところだけ取り出してる. wget はユーザエージェントのオプション使ってる. これつけないと動かない. このエージェント名は wget google search で調べたら, これ使うといい, という記事が出てきたので, そのままコピった.

これで20万回ぐらい検索した. 仕事で.

ispell

emacs には flyspell mode という便利なものがあって, 綴りの間違いとかが一瞬でわかるわけですが, lang の設定で辞書を見に行くようになっているので, 日本語の辞書を探して動かねぇ, という事になっていました.

これを直すのは, ispell-change-dictionary という関数をよべばよかったようです. バッファごとに辞書を変えて使えるみたいです.

実践確率論

合成の誤謬

シンプソンのパラドクス

あとで調べて記事書く用のメモ.

標高から気圧

(lambda (h) (truncate (expt 10.0 (- (log 1013 10.0) (/ h 18410.0)))))

おしえてぐーの式を参考にしました.

たくさんの区間

値が a-b, b-c, c-d どの間に入ってるかで挙動を変える, みたいな処理はありがち. ruby だと普通は range を case 文に並べとくのかな?

何個あるかわかんない時はどうしよう. case 文を生成して eval するのかな?

とりあえず思いつくのはこんな感じ. 区切りの値を array に詰めといて

segments=array.each_cons(2).map{|head,tail|Range.new(head, tail)}
segments.map{|s|s if s===x}.compact.first

常用するなら hit したのを block 変数して呼び出すメソッドにしてもいい. だが, ちょっとまて.

なんせ時代はビッグデータ(笑)ですよ. もしこの区間が, すげぇいっぱいあったらどうなるの?

上の処理だと, 区間の数が増えたらそれだけ手間が増える. 線形なら良い気もするが, こういうのは大概の場合, 区間の数だけ処理が発生するでしょう. そうすると \( n^2 \) だ. これでは, あっという間に動かなくなってしまう. 長さが決まってないものは伸びるに決まってるし.

毎回全部見ずに divide and conqure すればいい. 区切りのデータが整列されていれば, たとえば真ん中で調べて, 入力がそれより大きかったら, 前半は一切見ないで全部捨てられる. 残った後半も同じ手口で半分捨てる.

  def pickrange(x, piv=0)
    if self.length <= 2
      [self.first, piv]
    else
      np=self.length / 2
      if self[np] < x
        self[np..-1].pickrange(x, np+piv)
      else
        self[0..np].pickrange(x, piv)
      end
    end
  end

これなら \( i \) 度の試行に対して区間の数 \(n\) は \(n = 2^i \) になるので, 手間は \(i=\log_2 n\) になる.

対数は偉大だ.


記事リストへ