趣味のプログラム工房

プログラム

サーバでPDF出力 仮想プリンタ

利用者が印刷をしたらサーバ側でPDFで保存されるような仕組みを作りたい!
多分、複合機とかなら複合機に対して印刷かけたら、複合機内でPDFを保存するような仕組みがあると思うんですが、同じような感じで、
サーバをプリンタサーバにして、印刷かけるとサーバ内にPDF保存できないかなぁと。

で、できました。一応個人利用は無償。
CubeVP+Cube.Pdf.Ghostsciptを使った自作プログラムで実現しました。
サンプルとして公開されている、CubePDFLiteでも近いことはできますが、こちらは、出力先がユーザフォルダ固定になっておりサーバとしては使いにくいので、自作プログラムを準備。

Cube.Pdf.Ghostscipt
https://clown.cube-soft.jp/entry/cubevp/sdk/ghostscript
自作プログラムはほぼ、このソースを丸パクリ。
引数(PSファイルのパスやドキュメント名)をsrc、destにマッピングしているだけ。(トータル20行未満のプログラム)


CubeVPは仮想プリンタを作成するプログラムです。
各種アプリからこの仮想プリンタを指定して印刷すると、PostScriptの印刷データを作成してくれます。
これを、「Cube.Pdf.Ghostsciptを使った自作プログラム」に喰わせて、PDFへ変換しています。
自作プログラムといてっても、PSからPDFへの変換はライブラリがやってくれるので、CubeVPからPSファイルのパスを引数でもらって、出力先のパスやら各種パラメータを設定して、変換ライブラリへ渡すだけ。

なお、PostScriptからPDFへの返還には、GhostsciptというAGPLライセンスのライブラリが使われているのでちょっと気を付ける必要があります。

あとは、この仮想プリンタを共有して、クライアントでこのプリンタで印刷してあげれば、サーバ内に自動的にPDFが作成される仕組みです。

意外と使えそう!

2024年09月07日


eRemoteをpython3から操作してみよう!

eRemoteという赤外線リモコンのガジェットがあるのですが、
pythonのツールを使うとLinuxから操作できるようになるのですが、
いま(2022年!)、これを使おうとしてハマった話。

eRemoteを操作するためには、主に、
「BlackBeanControl」、「python-broadlink」というのを使います。
(これのセットアップ方法はほかのサイトで見て!)

ただ、Linux Mint 20を使っているのですが、最近のOSってデフォルトのpythonってバージョン3なのですが、上記ツールはver2のpythonを対象にしているようで、ver3では動きません。
ただ、普通にツール動かそうとすると、ver3で動いちゃってめんどくさい。
(それに、python2でインストールとかもしなくてはいけなくてめんどい)

■対応方法、
まず、リモコンの登録をしようと下のコマンドを実行するとエラーが出ます
python3 BlackBeanControl.py -c xxx


File "BlackBeanControl.py", line 197
if (len(SentCommand) <> 8) or (not all(c in string.hexdigits for c in SentCommand)):
SyntaxError: invalid syntax

単純にノットイコールとして「<>」が使えないみたい。
「!=」に置き換えます。


Traceback (most recent call last):
File "BlackBeanControl.py", line 167, in
RM3Device = broadlink.rm((RealIPAddress, RealPort), RealMACAddress)
TypeError: __init__() missing 1 required positional argument: 'devtype'

関数の仕様変更により、引数が足りていないようです。
RM3Device = broadlink.rm((RealIPAddress, RealPort), RealMACAddress)
⇒RM3Device = broadlink.rm((RealIPAddress, RealPort), RealMACAddress , RealTimeout)

③登録時
File "BlackBeanControl.py", line 242, in
EncodedCommand = LearnedCommand.encode('hex')
AttributeError: 'bytes' object has no attribute 'encode'


実行時
File "BlackBeanControl.py", line 231, in
DecodedCommand = CommandFromSettings.decode('hex')
AttributeError: 'str' object has no attribute 'decode'


ver3ではencode関数とdecode関数が使えません。
なので、それぞれ、
DecodedCommand = CommandFromSettings.decode('hex')
→ DecodedCommand = bytes.fromhex(CommandFromSettings)

EncodedCommand = LearnedCommand.encode('hex')
→EncodedCommand = str(binascii.hexlify(LearnedCommand), 'utf-8')

に置き換えます。

多分これだけのはず。

2022年05月07日


Visual Studioで帳票作成【Crystal Reports】

Visual Studioで利用できる帳票のアドオンがないかと、、、
やっぱ、Crystal Reportsですかね。

あのSAPのソフトでありながら、無料で使えるところがいいですね。
この、Crystal Reports
以前は、Visual Studioにバンドルもされていたんですけど、
最近は、バンドルされなくなってますね。
まあ、無料で使えるのでほぼ変わりはないのですが。。。。


ただ、難点として、
Express Editionでは使えないという問題があります。

これは痛い。
最新の、コミュニティエディションだと、商用では使えないんですよね。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

【中古】Visual Studio 2008 Standard Edition
価格:47686円(税込、送料別) (2021/4/14時点)



2021年04月13日


Microsoft Javaがサポート開始!!

おーーー!!
これは、IT業界にとって朗報です。

OracleがJava8以降、サポートが有料となり非常に使いにくくなりました。

Microsoftといえば、、実は昔はJavaを提供しており、Windowsにも標準搭載されていたんですよね。
ただし、(当時)SunのJavaを使った方がトラブルが少ないため、MS版は無効にして使っていた記憶があります。



2021年04月11日


Oracle 19cのインストール ソフトウェアの場所(software location)

初めてのOracle 19cのインストール

オンプレ版のソフトをダウンロードして、「適当なフォルダ」に解凍してインストールを進めたところ、、、
ソフトウェアの場所software location)に違和感が、、、
インストーラーを解凍したフォルダがソフトウェアの場所として表示されているわけですが、まさかと思いつつもそのままインストールを完了させたところ、
そのまさかが、、、

どうも、18c以降、インストーラーの場所がそのまま、Oracle_home、
ソフトのインストール先になるようです。。。
マジか。

Oracle 12cまでしか使ってなかった私としてはカルチャーショック



2020年01月25日


ColdFusion cfgridによる更新でエラー

Coldfusion 2018にてcfgridのhtmlもしくは、xmlを使ったときの更新がエラーになる現象を確認。

完全にバグだと思われます。

coldfusion2016でも同じようなバグあり、パッチで解消した、、、という情報もありましたが少なくても2018では更新できません。(最新のパッチを当てても)


原因はハッキリしており、
何故か、POSTに同じパラメータが2つ入るためです。

cfgridのnameをhogehogeとした場合、
更新ボタンを押したとき、次画面に送られる変数は、
hogehoge=null
hogehoge=cfgridの中身
の2つが送られます。

でエラー。


対処方法は一つ。
onsubmitのjavascriptで1つ目の空の変数(hogehoge)を削除して、
同名の変数を1つだけ(hogehoge=cfgridの中身)を次画面へ送るようにします。


2020年01月11日


ODBC経由 Excelの編集でエラー

ODBCでちょっと特殊なExcelの編集をしようとしたところ、以下のエラーが発生
「このフィールドはリンクされたExcelワークシートにあるため、編集できません。リンクされたExcelワークシートのデータを編集する機能は、Access の今回のリリースでは無効になっています。」

まず、最新のWindowsOSにはExcelODBCドライバが付属していないんですよね。。。
そのため、個別にインストールする必要があるのですが、そのドライバでは上記機能が使えないようになっています。

どうも、やろうとしていた機能が使えたのは、
windows server 2008の世代に付属していたドライバ(32bit版で確認)のようです。
それより新しいものだと、たぶん利用不可。

上記エラーに遭遇したら諦めてください、、、が回答になります。


補足
上記エラーは、ODBCで定義されたExcelブックAを経由してExcelブックBを編集する場合に発生します。
ちょっと何言ってるかわからないかもですが、そういうことができたのです。

2019年11月13日


Windowsでフォルダの監視・同期 inotifyのような、、、

Linuxではinotifyという仕組みで通知を受け取り、
ファイルの更新をチェックすることで、フォルダ・ファイルの監視ができるのですが、Windowsでは無いようなんですよね。

なので、リアルタイムファイル同期ファイル同期をするためにはと調べたのですが、ちょうどいい感じのソフトは転がっておらず、、、

一応、.NETにて「System.IO.FileSystemWatcherクラス」を使えばいいらしいことがわかりました。
実装自体はわりと簡単みたいなので、作ってみました。

FileSystemWatcher


引数に、監視フォルダと、コピー先を渡してあげると、
監視フォルダに新しいフォルダやファイルが作られるとコピー先にコピーされるという動きをします。
2つのフォルダで同期をとるときに使います。

2019/08/17 一部の起動方法にてCPU使用率が1コア占有となる不具合を対策(4コアの場合はCPU使用率25%となる不具合)

また、Windowsサービス版を作成
FileSystemWatcher サービス化版

2019年08月07日


Oracle 異なるインスタンスのテーブルのデータを比較

同じデータベース インスタンス内であれば、MINUS演算子を使うだけで、簡単に差異のあるレコードを抽出可能です。
しかし、異なるインスタンス、異なるデータベースのテーブルを比較しようとするとちょっと悩みます。

手っ取り早くであれば、、、データを抽出してExcelに張り付けて比較するという力業(スマートではない)もありますが、データが多いと時間がかかるし、めんどくさいです。


というわけで、私のおすすめとしては、Database Link機能の利用です。
データベース・リンクとは、他のデータベース上のオブジェクトにアクセスできる、データベース上のスキーマ・オブジェクトです。
このオブジェクトを経由することで、MINUS演算子を使って比較ができるようになります。

systemなどアクセス権限の高いユーザ(スキーマ)に対してリンク張れば、xxx.table@dblink_systemなどと全部のテーブルにアクセスできるので結構楽です。


2560 * 1600液晶、10コアのハイスペックタブレット!
値段はチョットしますが、このスペックはあまりない珍しいタブレットですね。
2019年02月06日


Oracle 監査ログ Aud$のSQLTEXT切れてる問題

Oracleの監査ログですがAUD$を直接ではなく、DBA_AUDIT_TRAILのViewを使って監査ログを参照すると、SQLTEXTが切れて、すべて見えない問題が発生します。

というのも、AUD$のSQLTEXTはCLOBですが、DBA_AUDIT_TRAILはVARCHAR2 2000桁で表示されるため、2000文字以上は切れてしまう。
なので、2000文字以上のSQLTEXTを見る場合は、AUD$を直接見る必要がありますが、その場合も、CLOBではなく、VARCHAR2に変換してみるため、SELECT時に工夫が必要。

https://stackoverrun.com/ja/q/1875751

を参考に、2000文字ずつとか、4000文字ずつ表示する必要があります。

SELECT SUBSTR (t1.clob_col, 1, 4000) AS pt1,
CASE WHEN LENGTH (t1.clob_col) > 4000 THEN SUBSTR (t1.clob_col, 4001, 4000) END AS pt2,
CASE WHEN LENGTH (t1.clob_col) > 8000 THEN SUBSTR (t1.clob_col, 8001, 4000) END AS pt3,
CASE WHEN LENGTH (t1.clob_col) > 12000 THEN SUBSTR (t1.clob_col, 1201, 4000) END AS pt4
FROM t1


まあ、分岐する必要があるかは微妙。
別に、0文字~4000文字、4001文字~8000文字、、、を表示するsubstrをそのまま連結でもよさそう。


スマートテレビの新基準
4Kテレビ
2019年02月03日


次へ