その他、諸々

このページには色々なツールを使ってみての感想や、 このサイトの運営上の色々な独り言を書きます。 使われる用語の細かな説明はしませんので悪しからず。

Python + SQLAlchemy + ORACLE + 日本語 [2018/08/12]

PythonからSQLAlchemy経由でCP932の文字コードを使っているORACLにアクセスすると 梯子高のような拡張文字コード部分でユニコードに変換できずエラーと成ります。 PythonやSQLAlchemyのコードで対処できないかと色々と悩みましたが結局は 下記のORACLEの環境変数設定で解決できました。
忘備禄としてメモしておきます。

import os
os.environ["NLS_LANG"]="JAPANESE_JAPAN.AL32UTF8

つまりはPythonに入る前のORACLEの層とUTF-8で繋ぐということ。

OOo_CalcをTrail_Calcと言う名前でgem化しました [2016/08/02]

LibreOffice用のruby拡張モジュールをgem化しました。
gem install Trail_Calc
で利用可能になります。

Trail_Calc ドキュメント

Ruby gem の作成 [2016/07/26]

手を出していなかったgemでの公開をやり始めてみました。

GitHubとrubygemsにアカウントを作っておく。 rubygemsだけでも良いかもしれないけれどどうせソースも公開するのでGitHubも。

やり方は各方面に色々書いてあるので流れと迷ったところをメモして置きます。
(1) gem install bundler

(2) bundle gem Gem名 (以後 生成されたフォルダに移動して実行)

(3) .gemspecを編集

(4) README.mdを編集

(5) ./libの下にgemにするものを作成

(6) gem build xxx.gemspec (rake buildではエラーになった,windowsだから? )

(7) gem install ./xxx-.gem (生成されたgemファイルを読み込んでみてデバッグ)

(8) gem push xxx-.gem (rakeでは上手く行かないので直接 push )

(9) GitHubにpushしておく

Calc操作用のruby拡張モジュール [2015/11/29]

ドキュメントをExcel形式等で保存できるようにしました。 しかし、変換時に非互換な部分が有り内容が変化してしまう事があります。 単純な表形式の部分は変換されますが、グラフ等は崩れてしまいます。

グラフ(チャート)の範囲変更機能のBugfix
複数の要素を表示させたチャートだと内容が変化してしまうというbugが有りました。 これはOpenOfficeのchangeDiagramDataという手続きを呼び出しているのですが、 これが曲者で現在データ列の配列として持っているデータを変更して全て渡すと余計なデータ列を 追加してしまってくれるのです。具体的にはデータ列にはroleとしてcategories,values-x,values-y等が 有るのですがvalues-xの取扱いが特殊で変更データとして渡されたデータ列のroleは無視して categoriesが有る時はvalues-xはないものとし、その他の時でも最初のひとつしかvalues-xとして扱ってくれず 他は無条件にvalues-yとして扱い、自分でvalues-xを追加してしまう為、values-xのデータが values-y(追加のグラフ要素)として追加されてしまうのです。 ソースを見るとグラフの種類ごとに多少違うのですが基本は同じ動きをしているようです。 OpenOffice.orgはこの辺はとっても面倒です。 Excelだと対応するプロパティの変更だけで済むようなことも、 オブジェクトを作り直して登録しなおさないといけないのです。

Ver.1.02

Calc用拡張モジュール

テストプログラム

テストデータ

ドキュメント

Calc操作用のruby拡張モジュール [2015/11/03]

Ver. 1.01

幾つかの機能を実装。目玉はチャートを画像出力できるようなったこと。

Calc操作用のruby拡張モジュール [2015/10/25]

Ver. 1.00

南岳の気象情報を今はLibreOfficeで管理していますが グラフの変更等を手作業でやっていたためちょっと面倒でした。 探しても上手く見つけきれなかったのでruby用を作りました。 まだExcel用からポーティングしていない機能もありますが セル操作とチャートの範囲変更くらいは出来るようになったので公開します。

C++でJpegを集めたPDFを作る→そのPDFからJpegを取出す [2013/07/07]

一旦作ったPDFのJpeg画像をもう一度処理したいことがあったのでJpegを 抜き出す機能を追加。ただし、手抜きして、PDFの形式をこのプログラムで作成されたものと 仮定しているので、一般的なPDFでは上手くいかない可能性があります。

汎用的なものが必要な方は改造してください。

PDF.cpp
PDF.h
テスト環境はMicrosoft Windows 7 (64bit)上の Microsoft Visual C++ 2010 Expressです。

このプログラムで作成したPDFから画像を抜き出す

std::string pdf_name = "xxx.pdf";
std::string new_pdf_name = "xxx_new.pdf";
std::list tmp_list;
std::string jpg_tmp_base = pdf_name;
jpg_tmp_base.replace(jpg_tmp_base.length()-4,4,"_1.jpg");
std::string jpg_tmp = jpg_tmp_base;

PDF pdf;              // PDFインスタンスを作成
pdf.Load(pdf_name);   // PDFを読み込む
int n_jpg = 1;        // 何番目のjpegかのindex
int x_dots = 1024;    // 

while(pdf.output_jpg_file(jpg_tmp)) //ファイル名を指定して先頭のjpegを取り出す
{
   // jpeg画像を何か処理する、例えば
   // OpenCVで画像サイズを変更する
   // cv::Mat src_img = cv::imread(jpg_tmp);
   // cv::Mat dst_img(src_img.rows*x_dots/src_img.cols, x_dots, src_img.type());
   // cv::resize(src_img, dst_img, dst_img.size(), cv::INTER_CUBIC);
   // cv::imwrite(jpg_tmp,dst_img);

   tmp_list.push_back(jpg_tmp);  // ファイル名をリストにpush
   n_jpg++;                      // index + 1
   stringstream n_ss;
   n_ss << n_jpg;                // 文字列に変換

   jpg_tmp = jpg_tmp_base;       // 次の一時ファイル名作成
   jpg_tmp.replace(jpg_tmp.length()-5,1,n_ss.str()); // _1 の部分を _nに
}

PDF s;
if(s.Create(new_pdf_name))      // 処理済の画像で新しいPDFを作る
{
   std::list::iterator it = tmp_list.begin();    // 先頭から
   while( it != tmp_list.end() )                              // 最後まで
   {
       s.AddJpeg(*it);
       std::remove((*it).c_str());  // 一時ファイルの消去
       ++it;
   }
   s.Close();
}

HTML版 Toppers仕様書 ngki_spec-140 [2012/12/21]

リンンク無しで公開していたHTML版の「Toppers新世代カーネル統合仕様書」にリンクを張っておきます。 ngki_spec-140

C++でJpegを集めたPDFを作る [2012/12/15]

Rubyではprawn等々で簡単に出来る事ですが、高速に大量の変換が必要な場合、 C++とかで作った方が良いかなと思いPDFのドキュメントや他の方の例題を 参考にして書いてみました。

とにかく動く、レベルに成ったのでひとまず公開してしまいます。 誰かもっと改善したらフィードバックしてください。

jpg2pdf.cpp
PDF.cpp
PDF.h
テスト環境はMicrosoft Windows 7 (64bit)上の Microsoft Visual C++ 2010 Expressです。
「マルチバイト文字セットを使用する」に設定して下さい。

書いてみて思ったのですが、PDFってやることを絞れば意外と簡単な構造なんですね。 1ページ1jpegで入れて行くなら、単にobjでstreamを追加して ベタにjpegファイルの内容を書いて行けばOKでした。

ファイルの最後に有るstartxrefでクロスリファレンスの場所をバイト位置で指定し、 xrefから各オブジェクトのバイト位置が分かるという構成になっています。

objとしてpagesその下にpageがあり、 pageオブジェクトの中にjpegのデータobjを入れればそのpageに表示されます。

objの番号として最初の方を空きにして23から始まっている例が有りましたが、 特に空きを作る必要は無いようです。

今回作ったpdfファイルの最後の所を見るとこんな感じでテキストで読めます。

11 0 obj
31
endobj
2 0 obj
<<
/Type /Catalog
/Pages 3 0 R
>>
endobj
3 0 obj
<<
/Type /Pages
/Kids [ 4 0 R 8 0 R ]
/Count 2
>>
endobj
xref
0 12
0000000000 65535 f 
0000000009 00000 n 
0000274060 00000 n 
0000274109 00000 n 
0000000146 00000 n 
0000000313 00000 n 
0000123720 00000 n 
0000123802 00000 n 
0000123820 00000 n 
0000123988 00000 n 
0000273957 00000 n 
0000274041 00000 n 
trailer
<<
/Size 12
/Root 2 0 R
/Info 1 0 R
>>
startxref
274174
\%\%EOF

しかし、マークアップ言語的な構成をとりつつ、データはバイナリを 直接埋め込むという構造にはチト驚きました。

詳しく知りたい方は原本を参照してください。 PDF仕様書類


aptana(Eclipse) + ruby 1.9.3でデバッグが出来ない [2012/6/26]

rvmを入れて試していたら ruby 1.9.3だとデバッグが出来ない という現象に捕まったので覚書。

1.8.7と1.9.2では ruby_debug_ide を gem インストールすればOK。

対策は以下の通り。

  • gem install ruby_core_source
  • gem install debugger
  • 1.9.3ではis_binary_data?が無くなっているので、以下のコードをrvmでインストールしたgemのコードに追加する。 この変更はStringクラスを書き換えているのでサイドエフェクトに注意が必要。
    /home/user01/.rvm/gems/ruby-1.9.3-p194/gems/ruby-debug-ide-0.4.16/bin/rdebug-ide
    if RUBY_VERSION == '1.9.3'
      class String
        def is_binary_data?
          ( self.count( "^ -~", "^\r\n" ).fdiv(self.size) > 0.3 || self.index( "\x00" ) ) unless empty?
        end
      end
    end

これで一応、ブレークポイントが使えるようになった。

ただし、gemのコードを書き換えているのでバージョンアップに要注意。


国土地理院の電子国土の地図機能を自分のWebに使う [2012/6/25]

廃止されています

こちらを使ってください。

国土地理院の電子国土Web の機能を簡単なJavascriptで組み込めるので使ってみた。

電子国土のページに詳細なマニュアルはあるので必要な人は参照してください。

電子国土の「地図を見る」ページで「作図」して、 必要な「重ね書きデータXML」を作成して保存(ここではhotaka_dakesawa_route.xml) し、以下のようなスクリプトを組み込んでiframeに表示します。 作成した「重ね書きデータXML」はサーバー上に転送して置きます。

openJSGIXMLで指定した「重ね書きデータXML」が上書きされた地図が表示されます。

openJSGIXMLとsetMapCenterの行以外はそのまま使えます。

openJSGIXML(url,,,)はURL部分を自分用のXMLのURLに変更してください。 他にも引数は有りますが省略可能です。(詳細はマニュアル参照)

setMapCenter(経度,緯度,スケール)は表示する地図の中心の経度、緯度とスケールです。 スケールは1/25000の地図なら25000の様に指定します。

電子国土の地図で緯度経度スケールは確認できます。

[ 表示用HTMLへの追加スクリプト ]

| <script>
|   function app_main() {
|     top.map.createScaleBar();
|     top.map.openMap("https://cyberjapan.jp/japan0.htm");
|     top.map.openJSGIXML("https://www.trail4you.com/hotaka_dakesawa_route.xml"); ←重ね書きデータXMLのURL
|     top.map.setMapCenter(137.660222,36.281541,75000);              ←経度、緯度、スケール
|     top.map.openMap();
|     top.map.enablePopup();
|     top.map.setMouseMode('pan');
|     top.map.enableWheelZoom(true);
|   }
| </script>

iframeのnameは'map'にします。 srcはwebtis_map_obj.htmと言う名前で下記の様に作って同じフォルダーにおいておきます。 表示サイズはお好みで。

[ 表示用HTMLへの地図の埋め込み行]

| <iframe class="maparea" align="center" name="map" src="./webtis_map_obj.htm" marginwidth="0" norisize width="800" height="600">

[ iframeのsrcに指定するファイル(webtis_map_obj.htm)]

| <html>
|   <script language="javascript" src="https://cyberjapan.jp/webtis.js" charset="Shift-JIS">
|   <script language="Javascript">createWebtisObject();
| </html>

電子国土の「地図を見る」ページで「作図」する時に注意する点

  • 各オブジェクトを作る時はまず名前を付けて保存してから、地図上に配置していく。 配置してから名前を付けて保存しても、それは配置したオブジェクトではなく次のオブジェクトに付く。
  • NO-Script等のガードソフトが入っているとXMLデータがカットされる事がある。 その場合には、XSSのサニダイズを禁止するとデータが受け取れる。
  • 作図中に消したオブジェクトが保存データに残っている事がある。 XMLを一応確認した方が良いかも。XMLなので不要な部分はエディタで消したり修正したり出来る。


ubuntuでの 日本語 Eclipse(pleiades)はパッケージ化済み [2012/6/24]

知らずに個別に入れようとしたので忘備禄として書いて置きます。

Pleiadesがパッケージ化済みの為、apt-get で入れるだけで完了する。

sudo apt-get install pleiades

/etc/eclipse.ini の最後に下記の行を追加する。

|
| -javaagent:/usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
|

エラー等が出るような場合には初期化してみる。

eclipse -clean

別の方法

日本語化に Babel プロジェクトの言語パックを使うなら Help → Install New Software から 下記ロケーションの中から対応するものを追加して'Babel Language Packs in Japanese'を入れる。

"https://download.eclipse.org/technology/babel/update-site/R0.9.1/indigo"

"https://download.eclipse.org/technology/babel/update-site/R0.9.1/helios"

"https://download.eclipse.org/technology/babel/update-site/R0.9.1/galileo"



OSSな教育用のLinuxシステム関係・覚書 [2012/6/24]

あまり上手く拾い出せませんでしたが、一応記録しておきます。

日本語化された、又は、日本で作られた Linuxを使ったOSSな教育用システムはソフト開発以外ではあまり無いのでしょうか? 先生自体がLinuxに馴染んでいない、あるいはWindows以外は いまだに一般では使われていないと言うことでしょうか?

教育システムもLinuxと言うよりはWebアプリやWebページとして実装されるのが 主なトレンドなのかも知れません。

単純に検索キーワードが悪いだけかも、 ソフト開発以外のOSSな教育システムをご存知の方は教えて下さい。


HAML + SASS +rake [2012/1/22]

退職を機に、このサイトを大改造しています。 HTML5+CSS3の実験も兼ねて色々と試してみたいと思ってます。

サイトの各コーナー毎にスタイルの統一をしながら、 記事部分だけ差込で簡単に変更できるようにしたいと思ったのですが HTMLだけだとインクルードは出来ないですね。

Javascripを使えば可能ですが、 Javascript無しでもそれなりに見る事が出来るページにしたいので テンプレートに記事部分を組み込んだHTMLを事前にビルドして作ることにしました。

一般的なブログソフトを使えば何も考えなくて良い訳ですが、 そこはプログラマのサガってやつで 自前でやってみたいのですよね。

そこでHAML+SASSって奴を使って、rubyと組み合わせて生成しちゃおうと、トライしてます。

テンプレートのhamlの中に次の様な行を入れて、そこに別に書いた記事hamlをインクルードします。

= Haml::Engine.new(open($article_file).read).render

HAMLの中のrubyコードとして別のHAMLを読み込んでやるというわけです。

ここで使っている $article_file という変数はHAMLの起動時に -r オプションで設定用の rubyスクリプトを読ませて定義させてやります。

で、全体の管理をrakeを使って管理して、追加・変更した時に 必要なものだけビルドし直す様にします。 rakeとはruby版のmakeです。ルールに従って必要な処理だけやってくれます。

古いデータは一度には変える時間が無いので適当に手抜きをして、 新しく追加するものから ビルドの対象にして行く方針です。


HAMLの罠

さて、調子良く組み込んでビルドできたぞっと、喜んでいたら pre で :preserve フィルターを 使う所が上手く展開されません。 後ろの部分まで飲み込んでひとまとまりの pre に成ってしまいます。

これは試しに書き換えてみると、:preserve の次の行に 空白行を書くと問題が発生する 事が分りましたので、 空行無しで書くようにして、詰まって見えるところは CSSで paddingで 空けてやる事にしました。

|%pre.src
|  :preserve
|            <--ここが空行だと誤動作し、後ろの p を飲み込んでしまう
|    #-
|    #-
|%p
|  なんたら

一難さってまた一難、rubyのコードを例示する場所でエラーが出ます。

良く見てみるとインライン展開の#{...}がエラーに成っています。 HAMLの中でも インライン展開が出来るので、混乱してしまうのですね。 と言う事でこれは \#{...}と エスケープすることでOKと成りました。

メタ構成の状態なので、色々とかぶると面倒な副作用が出てくるのは 仕方が無いですが、 まあ、rubyが使えて、かつ、簡単な記述方法のメリットと、 記法の罠のデメリットの兼ね合いということで 今のところメリットが大きそうなのでしばらくはHAML+SASS+rakeの 環境を使ってみる事にします。