haya14busa

haya14busa’s memo

Stylus,nibのインストールとVimで自動コンパイル

Install

まずはnode.js

$ brew install node

Stylusとnibのインストール

$ npm install -g stylus nib

これでOK

Vimで自動コンパイル

.vimrc

autocmd BufWritePost,FileWritePost *.styl silent !stylus <afile> -u nib >/dev/null

Node.jsで自動でコンパイルさせるとか,Stylus -wさせるとか色々方法はあると思うけど、Vimで設定しておくと手軽に使える.

本当はちゃんと条件分岐したほうがいいんだろうな…

Example

example.styl

@import 'nib'

.nib
    border-radius:10px

これを保存(:w)すると自動でexample.cssが生成されます.

example.css

.nib {
  -webkit-border-radius: 10px;
  border-radius: 10px;
}

これだけだとnibの必要性薄そうに見えるけどglobal-reset()とかその他機能が目白押しで便利

for Emmet (zen-coding)

mattn/emmet-vim

.vimrc

autocmd BufRead,BufNewFile *.styl set filetype=sass

" let g:user_emmet_settings = {
" \  'styl' : {
" \    'filters' : 'fc',
" \  },
" \}

コメントアウトしてあるように、設定したりして見たのだけど、うまく*.stylファイルでちゃんとcssの設定に変わらないのでfiletype=sassにしてお茶を濁してます.というかfl:l|fc自体効かないので他がおかしいのかも…

Link

Vimでvimrcを編集しやすくする記述とvimrcのリロードでモードラインの設定が無視される問題

Edit & Automatically Reload .vimrc

.vimrc

"------------------------------------
" Open & Reload .vimrc
"------------------------------------
set foldmethod=expr
set modeline
command! Evimrc  e $MYVIMRC

augroup source-vimrc
  autocmd!
  autocmd BufWritePost *vimrc source $MYVIMRC | set foldmethod=marker
  autocmd BufWritePost *gvimrc if has('gui_running') source $MYGVIMRC
augroup END

"------------------------------------
" Lokaltog/vim-easymotion
"------------------------------------
hi link EasyMotionTarget ErrorMsg
hi link EasyMotionShade  Comment

"------------------------------------
"vim: foldmethod=marker

.vimrcを編集するときは:Evimrc(:evで補完させる).
.vimrcを編集後のリロードは最初はコマンドを使おうと思ったけど保存時の自動実行のほうが手軽で良さげ.ただ,関数とか途中まで記述してる状態で保存しちゃうと困りそうでもあるかも?

問題点

なるべく最小構成の環境で試したから自分だけではないとおもうのだけど,

  1. vimrcのset foldmethod=exprとvimのモードラインの"vim: foldmethod=markerの記述で違うものを設定してる場合,リロード時にvimrcの方の記述の設定に変わってしまう.
    • しかも最小構成では発生しなかったけど,使ってるvimrcでは一度閉じてから読み込み直してもそのままモードライン記述が無視された.
    • 最小構成の方でも試したからloadviewの問題ではないっぽい.
  2. なぜかEasymotionのターゲットのハイライトが消えて,超絶読みにくくなる問題も発生

解決策

上記vimrcに記述したとおり

  1. 普通はautocmd BufWritePost *vimrc source $MYVIMRCと記述するところをautocmd BufWritePost *vimrc source $MYVIMRC | set foldmethod=markerとして無理やり変える.
  2. 今まで設定してなかったけど上記vimrcのようにEasymotionのハイライト設定してしまう.

というか

vimrcの編集とリロードをしやすくする設定を未だしてなかったあたりVimmerを名乗れるない感じですね…今までわざわざ:source ~/.vimrcするかvim再起動させてた.

出来るのは知ってたけど後回しにしてた結果がこれだよ.でも自動で再読み込みさせることも出来るのは収穫だった.有名どころの記述はコマンドかキーマッピングで実装してる気がする.オートロードさせるとかなり捗りますね.ただfoldの状態がリセットされるので,折りたたみを閉じてる状態でやるとちょっとびっくりする.

Easymotionのハイライトに関しては原因が全くわからなかった…検索とかのハイライトは機能していたのでハイライト機能自体がおかしくなったわけじゃないっぽい

リロード時にモードラインの記述が無視されるのは,最初はバグ的な何かだと思ったけど,source ~/.vimrcの場合,そもそもコメントであるモードラインの記述は読み込まない仕様かも.

Link

JBiOSでも自前ビルド/コンパイルがしたい!

Attention

お決まりですが自己責任でお願いします.割とコアの部分触るので特に.そもそも脱獄自体グレーゾーンだし.

JBiOSだとターミナルでプログラミングできたりするけど…

Appleの署名かなんかの関係でgccが一発で通らないので今まで、自前でビルド/コンパイルができてませんでした.

iOS4あたりまでは簡単に?回避できてたらしいけど、iOS5からはできなくなってて諦めるしかなかった.

この記事通りにやると,vimとかgitとかをcydiaのリポジトリにかかわらず最新版使えるようになったりする(はず).

Setup gcc on iOS 5 and maybe iOS6

  1. リポジトリをcydiaに追加
  2. 追加したリポジトリからlibgccをインストール
    • fakegccとかiosgccとかでググってリポジトリ以外から持ってくる手もある
  3. デフォのBigbossなどから基本のコマンドなどなどをインストール
    • Link Identity Editor (ldid)
      • 署名回避に必要
    • GNU C Compiler(gcc)
      • Cコンパイラ
    • Make
    • APT 0.7系
    • 足りなければBigBoss Recommentded Toolsとか基本系を
  4. MobileTerminalかOpenSSHをインストール
    • OpenSSHでiSSHとかAppstoreのアプリから操作もできるし、勿論母艦からでもOK

ここまでの状態だと

on iOS

$ echo 'void main() { printf("Hello, world!\n"); }' > helloworld.c
$ gcc helloworld.c -o helloworld
$ ./helloworld
# ここで署名エラー
$ ldid -S helloworld
$ ./helloworld
Hello, world!

このように一度ldid -Sを噛ませる必要があるせいで、./configureとかが通らなくなってます.

なのでldid -Sを自動化して擬似的に署名を回避する必要があります.

Bypassing Apple Code signature using ldid -S

$ git clone git@github.com:haya14busa/ios-build
$ sudo mv /usr/bin/gcc /usr/bin/realgcc
$ sudo mv /usr/bin/arch /usr/bin/realarch
$ cd ios-build
$ chmod +x gcc arch
$ sudo cp gcc /usr/bin/
$ sudo cp arch /usr/bin/
$ sudo ln -s /usr/bin/gcc /usr/bin/cc
$ sudo ldid -S /usr/bin/gcc
$ sudo ldid -S /usr/bin/arch

(コマンド自体がkillされた場合はsudo ldid -S {killされたコマンドのpath}で回避できる)

archは確かgitを自前ビルドしたときにエラー吐いただけなので今のところはgccの記述だけでもOK.またgit cloneしなくても普通に持ってきてvimで書くとか、iFileで直接置いてもいい.

gccの中身

#!/bin/bash

output='a.out'
next=false
for arg in "$@" ; do
    if [ "$next" == "true" ]; then
        output=$arg
        break
    elif [ "$arg" == "-o" ]; then
        next="true"
    fi
done

realgcc $*

if [ -f "$output" ]; then
    ldid -S "$output"
    echo "Signed with ldid"
fi

シェルスクリプトで、realgccでコンパイルしてできた実行ファイルに自動でldid -Sするようにしてます.

これで./configureが通ってmakeもできるのでiOSで自前でビルドできるようになります.

成果

Git

  • 2013/08/07現在最新バージョンである1.8.3.4をコンパイル->正常動作
  • Cydiaリポのgitは1.5とかのレベルで,radareにある1.7.8.2はうまく動かないのでこれだけでもやったかいがあった

Vim

  • 999までpatchを当てた7.3.999をコンパイル可能.あとから1000以上のpatchがあることに気づいてやり直したけど、うまく当てれなかった.
  • Cydiaリポのvimよりは新しいバージョンを使うことに成功
  • しかし、やりたかった+pythonオプションがどうしてもつかなかった
  • PYTHON DISABLED <

Mercurial

  • vimの最新バージョンを楽に取ってくるためにインストールを試みるも失敗
  • radareリポジトリにmercurialがあるがインストール出来ない模様

Python

  • radareリポジトリのpythonは2.7.3なので,自前で2.7.5のコンパイルを試みるも失敗
  • gccオプションが付いていないからかnumpyなどがインストール出来ないので出来れば自前でコンパイルしたかった
  • cのヘッダ関係で失敗してるっぽい

結論

JBiPadでプログラミングなんかしてないで,ノーパソが欲しい.

Link

Pythonで素数数え上げスクリプト

書きました

Github -> haya14busa/prime-sieve

素数を数える方法の記事読んだ時はそんなやる気なかったのについ手をだしてしまった。エラトステネスの篩って名前は知らなかったけど、そのアルゴリズムは読まなくても使おうと思いながら読んでたよ!って言っても記事読んでから書いたからアレ。

まったくもってブログにあげるレベルじゃないけど、意外とset使ったり、iterator意識したりとかのPython記事見つからなかったので一応書いてみた。適当に比較した感じでは速くなってるので満足です。素数ガチ勢じゃないから

確率的素数判定法 : 素数判定法の中には確率的アルゴリズムに基づいた、与えられた自然数 n を「合成数である」または「良く分からない」と判別する判定法がある。

素数判定 – Wikipedia

とか使って高速化とかまでは妥協。

Code

prime_sieve.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
''' Enumerate prime numbers upto 10000 '''

import time
import sys

argvs = sys.argv
if len(argvs) < 2:
    MAX = 10000
else:
    try:
        MAX = int(argvs[1])
    except:
        MAX = 10000

def sqrt(num):
    sq = num ** .5
    return sq

def main():
    prime_set = set(xrange(2,MAX+1))
    possible_set = set(xrange(2,int(sqrt(MAX+1))))
    temp_set = set() # append prime upto sqrt(MAX)
    while 1:
        try:
            prime = sorted(possible_set).pop(0)
            temp_set.add(prime)
        except:
            prime_set = sorted(prime_set | temp_set)
            print 'List: ', prime_set
            print 'Count: ', len(prime_set)
            return
        prime_set = set(ifilter(lambda x: x % prime, prime_set))
        possible_set = set(ifilter(lambda x: x % prime, possible_set))


if __name__ == '__main__':
    starttime = time.clock()
    from itertools import ifilter
    main()
    endtime = time.clock()
    time = endtime - starttime
    print 'Time: ', time

使用法

$ git clone git@github.com:haya14busa/prime-sieve.git
$ python prime_stieve.py [引数]

引数なしの場合、デフォルトで10000までの素数列挙します。

注意点

  • xrangeを使って既にソートされてる順番のリストをset変換しても、操作してたり(?)すると少しバラバラになるっぽい
  • ので、素数ポップアウトする際は、sorted(set).pop(0)とする必要があります。
  • もしやらなかった場合、だいたい15000くらいまでは正しく動くのですが、それ以降で失敗します。この辺の挙動が謎。

感想

アルゴリズムとコードの書き方の両者とも意識することで、想像してた以上に速くなったのでちょくちょくその辺も意識したい感じ。正しく使われてる気がしないtry、catchの使い方とか書き方がなってないので、Python クックブックとかちゃんとこなそう。

Alex Martelli,Anna Martelli Ravenscroft,David Ascher
オライリー・ジャパン 2007-06-26
¥ 4,410

Link

GitHub導入メモ

登録しました -> GitHub/haya14busa

導入

Permission denied (publickey)で若干困ったので忘備録

SSH用の公開鍵、秘密鍵

% ssh-keygen -t dsa -f ~/.ssh/id_dsa_github

~/.ssh/config

Host github.com
User git
Hostname github.com

IdentityFile ~/.ssh/id_dsa_github

~/.ssh/id_dsa_github.pubhttps://github.com/settings/sshに登録。

そして

% ssh -T git@github.com

dotfiles

GitHubでdotfilesのリポジトリを作っておく。

% cd
% mkdir dotfiles
% mv .vimrc dotfiles
% ln -s dotfiles/.vimrc .vimrc
% cd dotfiles
% git init
% git add .
% git commit -m'first commit'
% git remote add origin git@github.com:haya14busa/dotfiles.git
% git push -u origin master

iPad用のブランチ

% git branch ipad
% git checkout ipad
% # vimでごにょごにょ
% git add .
% git commit -m'ごにょごにょ'
% git push origin ipad

こりゃー便利

Link