fc2ブログ

SyntaxHighlighterをつかってwebページにのせるソースコードに色を付ける

まず、下のコードを</body>の直前に書く。


    
    
    
        

            
これで、上にある言語には色を付けられるが、他の言語にも色を付けたいなら、SyntaxHighlighterでググればもっと詳しく調べると良いでしょう。

FC2ブログならテンプレートの編集でできるだろう
次にpreタグのなかにソースコードを書き込む

<pre class="brush:cpp">

class Base { 
public:
     int func(){
         return 0;
     }
};
</pre>
            
fc2ブログの場合はブログを書くごとに自動改行をhtmlタグのみにしないとうまく行きません。

注意

これを書いている2014/10/31現在、preタグのなかにpreタグを書くとバグる。
また、コード領域をダブルクリックするとコードを全部選択できるが、スペースが変な文字になるバグが有る。
スポンサーサイト



ブログに載せるソースコードに色を付けてみる

今までここに載せるソースコードは、"自分で書いたコードの引用"ということにして誤魔化して、quoteで囲ってきたが、さすがにまずい気がしたのでソースコードに色を付けるツールを導入してみる。 ついでに溜まったネタをなんとかこのブログにflushしたい所だ。
class Base { 
public:
     int func(){
         return 1;
     }
};
うん、いい感じだ。
やり方は次の記事で。

qtscript generator をビルドしてみた

メモ書きなのでわかりにくくても勘弁して下さい

下準備


環境 ubuntu 13.10
apt でqt4のモジュールが上手く入らなかったので、qt4をソースからビルドした
qt-users.jp/download.html に行ってqt4.8.5 のlinux-x11のやつをダウンロードして展開して移動
/local/Qt-4.8.5に入れることにした

./configure -prefix=/local/Qt-4.8.5 && make
sudo make install

なぜかphononとwebkitがビルドされなかったので、あとで少し修正が必要になる

本題

READMEに書いてある通りだと上手くいかない

適当な場所に移動して
git clone git://gitorious.org/qt-labs/qtscriptgenerator.git

よくわかんないけど一応環境変数を設定しておく
export QTDIR=/local/Qt-4.8.5
export PATH=$QTDIR/bin:$PATH


あとは基本的にはREABMEに書いてあると通りだけどgeneratorを実行するときに --include-paths=/local/Qt-4.8.5/include という感じでオプションでヘッダのある場所をしていしないといけない。
classesが7だと失敗している。

無事generated_cppが生成されたあともphononとwebkitがないのでエラーになるので、qtbindings/qtbindings.pro の該当する行を削除して qmake && make する

めでたしめでたし

動機とか

QtとかKDEを触ってみたかったけど、C++使いたくなかったので(別にC++が嫌いってわけじゃなくて、いちいちコンパイルするのが好きじゃないから)、node.jsで慣れ親しんだ(?)javascriptで書いてみたかったのでやった。
なので、Qtのことは何も知らない。
あと、javascriptでメイン部分を書いて、rubyやpythonで関数をフックするみたいな事をやってみたかった(でもRubyもPythonも全く知らない)。
これをビルドする前はKDEのkrossとか触って、javaのRhinoやJRubyを触っていた。javaはjsで作ったオブジェクトをRubyからもアクセスできるけど、jsObj.mみたいな感じでメンバにはアクセス出来なかった。krossは途中で放棄したので分かんない。

バインディング生成器にはSWIGがあるが、Qtのバインディングを作るにはSignalだのSlotだのQt特有のmeta-object-systemを理解できるパーサーが必要になる(はず)。で、それらのパーサーをもった生成器がSMOKEやsipやjambi generator。
qtscript generatorはjambi generatorを元にして作られている。Qt5はよく知らない。

KDEのクラスはQtのクラスを継承してるみたいなので、いじくればKDEのバインディングも生成できるかもしれない。

参考資料:
shibu.jp/techmemo/qtscript_ja.html
www.linuxfromscratch.org/blfs/view/svn/x/qt4.html


続きを読む

cygwinでsudo解決編

結局あの後いろいろと遠回りするはめになった。
しかし、今思い返せば最初から遠回りしていた。

まずゲイツソフトMicrosoft謹製の特権昇格スクリプトでは特権で実行するか尋ねるダイアログが表示されそれに答えた後、はいが押されたかいいえが押されたかがわからなかった。これは問題だ。はいが押されたときのみ、特権で実行されたプロセスの終了を数秒おきに確認するとか、シグナルを待たなくてはいけないからだ。
もちろんこのスクリプトは管理者権限で実行されたプロセスの終了を待ったりしない。

なので、自分でwin32apiのshellExecuteEx()とかを勉強したりして、管理者権限で実行されたかどうかをexitコードを返すコマンドを自分で作ったりした(本当は管理者権限プロセスの終了を待たせられる事もできるが、そのときは気付かなかった)。
その他もろもろ遠回りもいろいろした。
もうよく覚えていないが、とにかく色々なところをかけ回って汚らしいハックを試みた。

しかし、結局こんなことしなくてもcygwinでsudo相当の事をするのは簡単にできた。

cygstart -a runas コマンド 引数

ハッ!車輪の再開発とかバカバカしいにもホドがあるぜッ!


続きを読む

sudoっぽいのをcygwinでもやろうとした

前回言った通り、sudo for windows的なpythonの実装を導入しようと思ったが、どうやらこれは管理者権限で動くローカルなサーバを127.0.0.1:7070に立てて、そいつとツーしんすることでプログラムを管理者権限で実行させるらしい。面白い方法だとし、実際こういうプロセス間通信の方法はよくあるものだと思う。思うがなんでそんな回りくどいことをしなきゃならないんだ!ということで、runas.exeを使って自分でバッチやらで実装しようとしてみた。

が、runas.exeは管理者に昇格するためのものではなかった!ひどい勘違いである。相当時間を消費してしまった。だかその過程でminttyの欠点(というかwin32apiの構造上の欠陥?)を発見したのだが、それはまた別の話。

要求
  • 新しいコンソールを開いて実行し終わったらすぐにコンソールウィンドウが閉じるとか言うのはやめてほしい。
  • 管理者権限で実行するプログラムは、入出力にsudoを呼び出したコンソールを使用するようにしたい。
  • 環境変数は継承されて欲しい。少なくともカレントディレクトリは継承されてないと困る。

まず、コマンドプロンプト等から管理者権限に昇格してコマンドを実行するためのスクリプトを ここ からダウンロードして、どっか、たとえばC直下とかに展開する。

次に、sudoというシェル関数を以下のように定義する(パスは適宜読み替え)。
sudo(){
    touch /tmp/sudo.$$
    /cygdrive/c/Elevation/elevate.cmd sh -c "exec >$TTY 2>$TTY <$TTY;$*;rm /tmp/sudo.$$"
    for ((;;)){
            sleep 0.5
            test -e /tmp/sudo.$$ || break
        }
}

解説

このelevate.cmdが管理者権限でコマンドを実行する時、新しいコンソールウィンドウが開かれ出力されるが、普通にやると一瞬でウィンドウが閉じてしまう。単純にこれを回避するなら
/cygdrive/c/Elevation/elevate.cmd sh -c "$*;read"
とか小賢しいことすればいい。こうすると、コマンドの実態がcygwinのシンボリックリンクになってる実行ファイルでもちゃんと実行される(たとえば、awkはgawkへのシンボリックリンクだが、ちゃんと動く)という利点がある。

しかし、どうせなら本物のsudoみたいにしたい。なので、execとリダイレクトを使ってもっと小賢しいことをしている。ただし、そういうことをすると入力するときにどっちのプロセスに文字が送信されるかわからないので、sudoを実行する側を待機させる。

中身をみればわかるが、elevate.cmdはelevate.vbsを呼び出し、そこでShellExecuteを呼び出し昇格して実行するが、この関数はコマンドの終了を待たせられないので、forとsleepで何とかして待たせる

でもどうせ待機させるならこんな情けない方法ではなく、posixのシグナルを使うという手があった。次の記事はそっちを解説する。

あともう少しこのブログのデザイン何とかしたい。


リダイレクトについての参考資料
リダイレクションの説明が難しい… | okkyの日記 | スラッシュドット・ジャパン


追記
$TTYはzshにしかないみたい。気付かなかった。
なのでzsh以外ならこんな感じでいいんじゃないかな。

sudo(){
    TTY=`tty`
    touch /tmp/sudo.$$
    /cygdrive/c/Elevation/elevate.cmd sh -c "exec >$TTY 2>$TTY <$TTY;$*;rm /tmp/sudo.$$"
    for ((;;)){
            sleep 0.5
            test -e /tmp/sudo.$$ || break
        }
}

続きを読む

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR