Mathjaxの式に色を付ける
色を付けるというか、CSSのスタイルをつける。
\class
というコマンドがあり、これがCSSのclassに対応しているらしい。
あとは普通にCSSを書けばよいと思う。
例
- mathjax:
$$ \begin{array}{ll} f(g)=g^2, & \class{mathbg-r}{\frac{df}{dg}(g)=2g} \\ \class{mathbg-y}{g(x)=x+3}, & \class{mathbg-g}{\frac{dg}{dx}(x)=1} \\ \end{array} \\ \begin{align} \textstyle \frac{df}{dx}(x) & = \textstyle \class{mathbg-r}{\frac{df}{dg}(\class{mathbg-y}{g(x)})} \cdot \class{mathbg-g}{\frac{dg}{dx}(x)} \\ & = \class{mathbg-r}{(2 \class{mathbg-y}{(x+3)})} \cdot \class{mathbg-g}{(1)} \\ & = 2x + 6 \\ \end{align} $$
- css:
span.mathbg-r { background-color: #f8d8d0; } span.mathbg-g { background-color: #d8f8d0; } span.mathbg-y { background-color: #f8f0d0; }
- 結果:
感想
入れ子でも一応表示してくれるのでうれしいと思う。
wxHaskellのインストールをした。
- ローカルはwxHaskell
- webはHaste
という構成をやってみたい。
とりあえずwxHaskellのインストールをした。
環境
- OS: OS X 10.9.5
- CPU: 2.4 GHz Intel Core 2 Duo
- Mem: 8 GB
- GHC: 7.10.2
- MacPorts
使用バージョン
- wxHaskell 0.92.2.0
- wxWidgets 3.0.2_4+universal
コマンド
port install wxWidgets-3.0 wxWidgets_select port select --set wxWidgets wxWidgets-3.0 cabal install wx
けっこうかかる。
cabal直打ちはどうなのかというのはまあ。(
動作確認
公式サイトからコピペで。
-- hello.hs module Main where import Graphics.UI.WX main :: IO () main = start gui gui :: IO () gui = do frame [text := "Hello World!"] return ()
ghc -package wx hello.hs && ./hello
ヾ(๑╹◡╹)ノなんか動いた。
蛇足
- wx-configが見つからないと言われた。
port selectされてないのでport selectする。
- バージョンが合わないと言われた。
wxHaskell 0.9系はwxWidgets 3.0系のみ対応らしい。(より新しいバージョンではだめっぽい)
Bezier曲線の算術演算
Bezier曲線の和と積を求める。
Bernstein多項式
Bernstein多項式はBernstein基底関数の線形結合で表現される多項式の形式である。
Bernstein基底関数は を2項定理で展開したものである。
n次Bernstein基底関数
ここで、 は2項係数である。
n次Bernstein多項式
Bernstein多項式はでを、でを通過する。
Bezier曲線
Bezier曲線はBernstein多項式の係数をベクトルとしたものである。
n次のBezier曲線
をBezier曲線の制御点という。
ここではBernstein多項式とBezier曲線を同じ物とみなす。
次数上げ
n次多項式では の係数を0にして n+1次多項式だと言い張ることができる。
しかし、Bernstein多項式では係数操作が必要となる。
n次の係数を、n+1次の係数をとして、n次からn+1次にするときの係数操作を示す。
Bezier曲線の和と差
をそれぞれBezier曲線とする。
係数をそれぞれとする。
となるようなの係数を示す。
AとBの次数が等しい場合
そのまま。複号は同順である。
AとBの次数が異なる場合
次数の低いBezier曲線を次数上げにより係数操作する。
あとは次数が等しい場合と同様。
C言語のライブラリをC++からテストするようにしてみた
C言語で書かれているライブラリがあって、バグがポコポコ出てくるのでなんとかしてテストを仕込みたいと思った。その顛末を書く。
このCのライブラリはそのままC++でも通るコードなのであるが、バージョン管理がVSSであるためファイル名を変えたりすると履歴が吹っ飛ぶ。*1わりと仕方なくCで運用されている。
手動で後片付けとか書きたくないしマクロの嵐とかこわいしgoogletestとか便利なのでC++からこれを呼び出すことは決めていた。
非static関数をテストできるようにした
ライブラリは非static関数とstatic関数からなる。翻訳単位内でしか使わない関数はだいたいstaticにしてある。
外部からアクセスされる非static関数のテストはまあ簡単にできた。C++側ではマングリングを回避するためにextern "C"をつける必要がある。
// hoge.c int fuga( int x ); static int static_hoge( int x ) { return fuga( x ); } int hoge( int x ) { return static_hoge( x ); }
// fuga.c int fuga( int x ) { return x; }
// hoge_test.cpp #include <gtest/gtest.hpp> extern "C" int hoge( int x ); // マングリングを回避するためのextern "C" TEST( hoge, hoge ) { EXPECT_EQ( hoge(1), 1 ); }
libhogeをリンクする必要がある。*2
十分に小さい規模の関数群なら非static関数だけテストしておけば事足りるかもしれない。
しかしあんまりテストされていないstatic関数がたくさんある場合は心許ない。
static関数をテストできるようにした
通常はあんまりやらない方法をテストの時だけ行うということはよくある。
includeは通常はヘッダファイルを貼付けるために使うが、Cファイルを直接貼付けることも普通にできる。
// hoge_test.cpp extern "C" { #include "hoge.c" } #include <gtest/gtest.hpp> TEST( static_hoge, hoge ) { EXPECT_EQ( static_hoge(1), 1 ); }
だいたいコンパイルは通ると思う。必要に応じて調整を行う。*3
さて、コンパイルは通るけれどもリンクが通らない。
libhogeをリンクしてしまうとhogeが多重定義でエラーとなる。一方、リンクしなければfugaが未定義でエラーとなる。
そこでライブラリ側のすべてのCファイルを、対応するC++ファイルに上記の要領でincludeし、libhogeなしでリンクする。
// fuga_test.cpp extern "C" { #include "fuga.c" }
// another_test.cpp extern "C" { #include "another.c" }
...
ファイルが10個を超えると脳みそ腐るのでスクリプトか何かで自動化したほうがよい。*4
そんなこんなでだいぶテストが書きやすくなった気がする。
C#の動的ロードメモ
クライアント(AppDomainTest)
class Program { static void call() { AppDomain ad = null; try { ad = AppDomain.CreateDomain("TEST"); var handle = ad.CreateInstance("ClassLibrary1", "ClassLibrary1.Class1"); int res = ((IClass1)handle.Unwrap()).test(); System.Console.WriteLine(res); } finally { AppDomain.Unload(ad); } } static void Main(string[] args) { while (true) { call(); System.Threading.Thread.Sleep(1000); } } } public interface IClass1 { int test(); }
サーバ(ClassLibrary1)
public class Class1 : MarshalByRefObject, AppDomainTest.IClass1
{
public int test()
{
return 10;
}
}
こんなかんじでクライアントを動かしたままサーバを書き換えたりできるんじゃないかな。