漢字を含むソースのテスト
’90 年代前半の頃は JIS と シフトJIS のソースを扱っていた.
そのプロジェクトの最初の頃は,ターゲット環境のみでソースを管理していた.
0x1c 0x2d 漢字 0x1c 0x2e の形式.wiki 漢字シフトコード
途中からソース管理は PC-9801DA などに移行してシフトJIS になった.
ターゲット環境に移す時,ソースのコピーとシフトJIS から JIS への変換を行っていた.
Linux 環境を意識し始めてから新規に書いた共通のコードは 7 ビットの範囲にしている.
Windows AP であれば rc ファイルの STRINGTABLE が使用できるが,これにあたるものをどうするか?
まず一番簡単な方法の漢字を含むソースでの動作をテストしてみた.
この中の ccc(const char* s) の部分はまだ暫定的なコードで,登録されたテーブルから対応する JPN を求めるもの.
#include <clocale> #include <iostream> #include "i_define.hxx" #include "_tdefine.hxx" #include "ccc_mlg.hxx" bool test (void) { ccc_mlg* cm = ::get_ccc_mlg() ; { ccc_mlg_1 cm_1 ; cm_1.Name = _T("Name_1") ; cm_1.JPN = _T("名称 1") ; ccc_mlg_1 cm_2 ; cm_2.Name = _T("Name_2") ; cm_2.JPN = _T("名称 2") ; ccc_mlg_1 cm_3 ; cm_3.Name = _T("Name_3") ; cm_3.JPN = _T("名称 3") ; ccc_mlg_1 cm_4 ; cm_4.Name = _T("Name_4") ; cm_4.JPN = _T("名称 4") ; ccc_mlg_1 cm_5 ; cm_5.Name = _T("Name_5") ; cm_5.JPN = _T("名称 5") ; cm->push_back(cm_1) ; cm->push_back(cm_2) ; cm->push_back(cm_3) ; cm->push_back(cm_4) ; cm->push_back(cm_5) ; } std::tout << ccc("Name_3") << std::endl ; return true ; } int _tmain(int argc, TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("")) ; test() ; return 0 ; }
「gcc 漢字 shiftjis」で検索すると -finput-charset で文字コードを指定できるとある.
pi@raspberrypi:~/projects/cc_ml_1 $ g++ cc_ml_1.cpp pi@raspberrypi:~/projects/cc_ml_1 $ ./a.out ���� 3 pi@raspberrypi:~/projects/cc_ml_1 $ g++ -finput-charset=SJIS-WIN cc_ml_1.cpp pi@raspberrypi:~/projects/cc_ml_1 $ ./a.out 名称 3 pi@raspberrypi:~/projects/cc_ml_1 $
-finput-charset=SJIS ではよくわからないエラーになる.
cp932 でも良さそう.
Synology NAS DS116 は g++ の-finput-charset の指定では変換できないみたい.
Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ g++ cc_ml_1.cpp -Wall Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ ll total 72 drwxrwxrwx+ 3 Iwao users 4096 Jan 16 22:01 . drwxrwxrwx+ 10 Iwao users 4096 Jan 16 21:36 .. -rwxrwxrwx 1 Iwao users 50452 Jan 16 22:01 a.out drwxrwxrwx+ 2 Iwao users 4096 Jan 16 21:53 bak -rwxrwxrwx+ 1 Iwao users 2001 Jan 16 22:00 cc_ml_1.cpp Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ ./a.out 3 Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ uconv -f sjis cc_ml_1.cpp > dd.cpp Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ g++ dd.cpp Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ ./a.out 名称 3 Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ g++ -finput-charset=SJIS cc_ml_1.cpp cc1plus: error: conversion from SJIS to UTF-8 not supported by iconv Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ g++ -finput-charset=sjis cc_ml_1.cpp cc1plus: error: conversion from sjis to UTF-8 not supported by iconv Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ iconv -sh: iconv: command not found Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$
ショートカット作成
ショートカット作成の CreateLink のドキュメントの場所など
CreateLink
CSIDL
KNOWNFOLDERID
サンプルの ::CreateLink を利用したコード.
呼出している所は次の様なコード.lnk がなければ CreateLink .あれば削除.
UNICODE 版としてビルドする必要がある.
if (_taccess(lnk_path,0) != 0) { ::CoInitialize(NULL) ; char mb_lnk_path[MAX_PATH] ; ::WideCharToMultiByte(CP_ACP,0,lnk_path,-1,mb_lnk_path,MAX_PATH,NULL,NULL) ; ::CreateLink(exe_path,mb_lnk_path,descript) ; ::CoUninitialize() ; } else { _tremove(lnk_path) ; }
サンプル状態では使い勝手が良くないので,幾つか修正.
HRESULT CreateLink ( LPCTSTR lpszPathObj , // LPCWSTR LPCWSTR lpszPathLink , // LPCSTR LPCTSTR lpszDesc , // LPCWSTR LPCTSTR workingFolder , // 作業フォルダ WORD hotkey = 0 // )
_UNICODE を指定してビルドすると
--------------------構成: T_Lnk - Win32 Release-------------------- コンパイル中... T_Lnk.cpp \\DevS\Documents\Develop\_.SRC\__CPR_\xtot.hxx(83) : error C2679: 二項演算子 '=' : 型 'unsigned short [2]' の右オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照) \\DevS\Documents\Develop\_.SRC\__CPR_\xtot.hxx(103) : error C2679: 二項演算子 '=' : 型 'unsigned short [2]' の右オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照) \\DevS\Documents\Develop\_.SRC\__CPR_\ttox.hxx(34) : error C2664: 'wcstoul' : 1 番目の引数を 'const char *' から 'const unsigned short *' に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 \\DevS\Documents\Develop\_.SRC\__CPR_\ttox.hxx(34) : fatal error C1903: 直前のエラーを修復できません; コンパイルを中止します。 cl.exe の実行エラー T_Lnk.exe - エラー 4、警告 0
UNICODE などの定義が矛盾していることがあるのでそれを最初に指定する.
// (VS8)\VC\AtlMFC\Include\AfxV_W32.h
#ifdef _MSC_VER #ifdef _UNICODE #ifndef UNICODE #define UNICODE // UNICODE is used by Windows headers #endif #endif #ifdef UNICODE #ifndef _UNICODE #define _UNICODE // _UNICODE is used by C-runtime/MFC headers #endif #endif #endif
https://dev.mish.work/wordpress/2020/09/25/i_def_aw-hxx/
2020/10/14
作成した CreateLink の引数.
IID_IPersistFile の Save は LPCOLESTR になっている.
IID_IShellLink は _UNICODE かどうかでそれぞれが使用される.
Linux での cp コマンド
ssh 接続 した linux 環境で,ファイルをコピーしようとして cp コマンドを使用.
その時,更新日時が変更されることに気付いた.
[Iwao@fedora ~]$ cp --help 使用法: cp [OPTION]... [-T] SOURCE DEST または: cp [OPTION]... SOURCE... DIRECTORY または: cp [OPTION]... -t DIRECTORY SOURCE... Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY. Mandatory arguments to long options are mandatory for short options too. -a, --archive -dR --preserve=all と同様 --attributes-only ファイルのデータをコピーせず、ファイルの属性のみコピーする --backup[=CONTROL] コピー先ファイルが存在する時にバックアップを作成する -b --backup と同様だが引数を受け付けない --copy-contents 再帰時に特殊ファイルの内容をコピーする -d --no-dereference --preserve=links と同様 -f, --force if an existing destination file cannot be opened, remove it and try again (this option is ignored when the -n option is also used) -i, --interactive prompt before overwrite (overrides a previous -n option) -H follow command-line symbolic links in SOURCE -l, --link コピーの代わりにファイルのハードリンクを作成する -L, --dereference SOURCE にあるシンボリックリンクを常にたどる -n, --no-clobber 存在するファイルを上書きしない (前に指定した -i オプションを上書きする) -P, --no-dereference SOURCE にあるシンボリックリンクを決してたどらない -p --preserve=mode,ownership,timestamps と同様 --preserve[=ATTR_LIST] 指定した属性を保護する (デフォルト: mode,ownership,timestamps)。 追加可能な属性: context, links, xattr, all -c deprecated, same as --preserve=context --no-preserve=ATTR_LIST 指定した属性を保護しない --parents DIRECTORY 配下で SOURCE ファイルのフルパス名を使用する -R, -r, --recursive 再帰的にディレクトリをコピーする --reflink[=WHEN] clone/CoW コピーを制御する。下記を参照 --remove-destination コピー先にファイルが存在する場合、開く前に削除する (--force と対照的) --sparse=WHEN スパースファイル作成を制御する。下記を参照 --strip-trailing-slashes 各 SOURCE 引数から末尾のスラッシュを全て削除する -s, --symbolic-link コピーの代わりにシンボリックリンクを作成する -S, --suffix=SUFFIX 通常のバックアップ接尾辞を上書きする -t, --target-directory=DIRECTORY 全ての SOURCE 引数を DIRECTORY にコピーする -T, --no-target-directory DEST を通常ファイルとして扱う -u, --update SOURCE ファイルがコピー先ファイルより新しいか存在しない時だけコピーする -v, --verbose 実行していることを説明する -x, --one-file-system このファイルシステムだけで実行する -Z set SELinux security context of destination file to default type --context[=CTX] like -Z, or if CTX is specified then set the SELinux or SMACK security context to CTX --help この使い方を表示して終了する --version バージョン情報を表示して終了する
-p オプションで意図した動作となる.
また GUI 版の「ファイルマネージャ」などでは更新日時などは引き継がれる.
mv コマンドは更新日時は引き継がれる.
Linux 文字コード変換のコード
iconv を使用した方法
std::string SJIS_to_UTF8 (const std::string& sj_str) { tstring u8_str ; iconv_t icd = ::iconv_open("UTF8","Shift_JIS") ; if (icd == (iconv_t)-1) { u8_str = ::iconv_SJIS_UTF8(sj_str) ; } else { { size_t sj_size = sj_str.length() ; size_t u8_size = sj_str.length()*3 + 1024 ; u8_str.resize(u8_size) ; char* sj_ptr = (char*)(&sj_str[0]) ; char* u8_ptr = (char*)(&u8_str[0]) ; ::iconv(icd,&sj_ptr,&sj_size,&u8_ptr,&u8_size) ; } ::iconv_close(icd) ; } return u8_str.c_str() ; }
iconv,uconv の部分
#define cmd_iconv _T("iconv") // linux #define cmd_uconv _T("uconv") // DS116 bool exec_x_conv (const tstring& s_j_name,const tstring& u_8_name) { tstring sj_name = ::QuotM_Add_Auto(s_j_name) ; tstring u8_name = ::QuotM_Add_Auto(u_8_name) ; tstring param = _T(" -f sjis -t utf8 ") + sj_name + _T(" -o ") + u8_name ; if (::which( cmd_iconv)) { tstring exe_iconv = cmd_iconv _T(" ") + param ; _tsystem(exe_iconv.c_str()) ; return true ; } if (::which( cmd_uconv)) { tstring exe_uconv = cmd_uconv _T(" ") + param ; _tsystem(exe_uconv.c_str()) ; return true ; } return false ; } std::string iconv_SJIS_UTF8(const std::string& sj_str) { tstring tmp_path = ::Get_i_Tools_tmp_date() ; tstring now_str = ::Now_Format(_T("%M%S")) ; tstring s_j_name = ::Path_AddLastSP(tmp_path) + _T("sj_") + now_str + _T(".txt") ; tstring u_8_name = ::Path_AddLastSP(tmp_path) + _T("u8_") + now_str + _T(".txt") ; s_j_name = ::CreateUniqueEmpty(s_j_name.c_str()) ; u_8_name = ::CreateUniqueEmpty(u_8_name.c_str()) ; std::string u8_str ; { v_char v_c_u8 ; v_char v_c_sj = ::To_v_char(sj_str.c_str()) ; ::v_c_SaveText(s_j_name.c_str(),v_c_sj) ; { ::exec_x_conv(s_j_name,u_8_name) ; } v_c_u8 = ::v_c_Load (u_8_name.c_str()) ; u8_str = ::To_tstring( v_c_u8 ).c_str() ; } return u8_str.c_str() ; }
うまく置き換わっていない文字があった.
‘~'(0x7e) が ‘‾'(0x203e) になってしまっていた.
他にも ‘\'(0x5c) が ‘¥'(0xa5) .
http://ossforum.jp/jossfiles/Linux_SJIS_Support.pdf
幾つか違う文字があるようで,iconv の -f sjis を SJIS-WIN でうまくいった.
tstring i_param = _T(" -f SJIS-WIN -t utf8 ") + sj_name + _T(" -o ") + u8_name ; tstring u_param = _T(" -f sjis -t utf8 ") + sj_name + _T(" -o ") + u8_name ;
2020/04/30 ASUSTOR NAS に対応
text_gnc.hxx exec_ic.hxx
Linux で文字コードの変換
Windows での文字コードの変換部分は MultiByteToWideChar,WideCharToMultiByte でうまく機能している.
exe \ 入力 | シフトJIS | UTF-16 | UTF-8 |
_UNICODE | → WideChar | そのまま | → WideChar(CP_UTF8) |
_MBCS | そのまま | → MultiByte | → WideChar(CP_UTF8) → MultiByte |
MultiByteToWideChar,WideCharToMultiByte の使い方は C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\ などの mbstowcs.c,wcstombs.c を参照.
MSDN で見つけた記事
C++ – STL の文字列クラスと Win32 API による Unicode エンコーディングの変換
Linux 環境での動作は 2014/03 に一度調べていたみたいで ” gcc iconv ” とコメントになっている.
それで https://ja.wikipedia.org/wiki/Iconv にあるコードを Raspberry Pi 環境で実行するとうまく変換できる.
コンパイルエラーになったので string.h のインクルードが必要かも?
同じコードを Synology NAS の DS116 でコンパイルして実行するとうまく動作しない
(そのままのコードでは止まってしまう).
iconv_open で (iconv_t)-1 が返されていて errno は EINVAL になってしまう.
iconv コマンドを試すと Raspberry Pi では OK .
Synology NAS は iconv が存在しない.
検索すると uconv が使えると書かれている.
https://forum.synology.com/enu/viewtopic.php?t=82591
Iwao@DS116:~$ uconv -L
ASCII-Latin Accents-Any Amharic-Latin/BGN Any-Accents Any-Publishing Arabic-Latin Arabic-Latin/BGN Armenian-Latin Armenian-Latin/BGN Azerbaijani-Latin/BGN Belarusian-Latin/BGN Bengali-Devanagari Bengali-Gujarati Bengali-Gurmukhi Bengali-Kannada Bengali-Latin Bengali-Malayalam Bengali-Oriya Bengali-Tamil Bengali-Telugu Bopomofo-Latin Bulgarian-Latin/BGN Cyrillic-Latin Devanagari-Bengali Devanagari-Gujarati Devanagari-Gurmukhi Devanagari-Kannada Devanagari-Latin Devanagari-Malayalam Devanagari-Oriya Devanagari-Tamil Devanagari-Telugu Digit-Tone Fullwidth-Halfwidth Georgian-Latin Georgian-Latin/BGN Greek-Latin Greek-Latin/BGN Greek-Latin/UNGEGN Gujarati-Bengali Gujarati-Devanagari Gujarati-Gurmukhi Gujarati-Kannada Gujarati-Latin Gujarati-Malayalam Gujarati-Oriya Gujarati-Tamil Gujarati-Telugu Gurmukhi-Bengali Gurmukhi-Devanagari Gurmukhi-Gujarati Gurmukhi-Kannada Gurmukhi-Latin Gurmukhi-Malayalam Gurmukhi-Oriya Gurmukhi-Tamil Gurmukhi-Telugu Halfwidth-Fullwidth Han-Latin Han-Latin/Names Hangul-Latin Hans-Hant Hant-Hans Hebrew-Latin Hebrew-Latin/BGN Hiragana-Katakana Hiragana-Latin IPA-XSampa Jamo-Latin Kannada-Bengali Kannada-Devanagari Kannada-Gujarati Kannada-Gurmukhi Kannada-Latin Kannada-Malayalam Kannada-Oriya Kannada-Tamil Kannada-Telugu Katakana-Hiragana Katakana-Latin Katakana-Latin/BGN Kazakh-Latin/BGN Kirghiz-Latin/BGN Korean-Latin/BGN Latin-ASCII Latin-Arabic Latin-Armenian Latin-Bengali Latin-Bopomofo Latin-Cyrillic Latin-Devanagari Latin-Georgian Latin-Greek Latin-Greek/UNGEGN Latin-Gujarati Latin-Gurmukhi Latin-Hangul Latin-Hebrew Latin-Hiragana Latin-Jamo Latin-Kannada Latin-Katakana Latin-Malayalam Latin-NumericPinyin Latin-Oriya Latin-Syriac Latin-Tamil Latin-Telugu Latin-Thaana Latin-Thai Macedonian-Latin/BGN Malayalam-Bengali Malayalam-Devanagari Malayalam-Gujarati Malayalam-Gurmukhi Malayalam-Kannada Malayalam-Latin Malayalam-Oriya Malayalam-Tamil Malayalam-Telugu Maldivian-Latin/BGN Mongolian-Latin/BGN NumericPinyin-Latin NumericPinyin-Pinyin Oriya-Bengali Oriya-Devanagari Oriya-Gujarati Oriya-Gurmukhi Oriya-Kannada Oriya-Latin Oriya-Malayalam Oriya-Tamil Oriya-Telugu Pashto-Latin/BGN Persian-Latin/BGN Pinyin-NumericPinyin Publishing-Any Russian-Latin/BGN Serbian-Latin/BGN Simplified-Traditional Syriac-Latin Tamil-Bengali Tamil-Devanagari Tamil-Gujarati Tamil-Gurmukhi Tamil-Kannada Tamil-Latin Tamil-Malayalam Tamil-Oriya Tamil-Telugu Telugu-Bengali Telugu-Devanagari Telugu-Gujarati Telugu-Gurmukhi Telugu-Kannada Telugu-Latin Telugu-Malayalam Telugu-Oriya Telugu-Tamil Thaana-Latin Thai-Latin Tone-Digit Traditional-Simplified Turkmen-Latin/BGN Ukrainian-Latin/BGN Uzbek-Latin/BGN XSampa-IPA am-am_FONIPA az-Lower az-Title az-Upper ch-ch_FONIPA cs-cs_FONIPA cs-ja cs-ko cs_FONIPA-ja cs_FONIPA-ko dsb-dsb_FONIPA el-Lower el-Title el-Upper eo-eo_FONIPA es-am es-es_FONIPA es-ja es-zh es_419-ja es_419-zh es_FONIPA-am es_FONIPA-es_419_FONIPA es_FONIPA-ja es_FONIPA-zh ia-ia_FONIPA it-am it-ja ja_Latn-ko ja_Latn-ru ky-ky_FONIPA la-la_FONIPA lt-Lower lt-Title lt-Upper nl-Title pl-ja pl-pl_FONIPA pl_FONIPA-ja ro-ja ro-ro_FONIPA ro_FONIPA-ja ru-ja ru-zh sk-ja sk-sk_FONIPA sk_FONIPA-ja tlh-tlh_FONIPA tr-Lower tr-Title tr-Upper uz_Cyrl-uz_Latn uz_Latn-uz_Cyrl yo-yo_BJ zh_Latn_PINYIN-ru Any-Null Any-Lower Any-Upper Any-Title Any-Name Name-Any Any-Remove Any-Hex/Unicode Any-Hex/Java Any-Hex/C Any-Hex/XML Any-Hex/XML10 Any-Hex/Perl Any-Hex Hex-Any/Unicode Hex-Any/Java Hex-Any/C Hex-Any/XML Hex-Any/XML10 Hex-Any/Perl Hex-Any Any-NFC Any-NFKC Any-NFD Any-NFKD Any-FCD Any-FCC Any-ch_FONIPA Any-Latin Any-Telugu Any-Gurmukhi Any-Gujarati Any-Malayalam Any-Oriya Any-Devanagari Any-Kannada Any-Tamil Any-cs_FONIPA Any-ru Any-Bengali Any-uz_Latn Any-Katakana Any-ro_FONIPA Any-ky_FONIPA Any-zh Any-yo_BJ Any-am Any-es_419_FONIPA Any-eo_FONIPA Any-es_FONIPA Any-sk_FONIPA Any-Hant Any-Hans Any-Hiragana Any-la_FONIPA Any-Syriac Any-Greek Any-Greek/UNGEGN Any-Cyrillic Any-Hangul Any-Bopomofo Any-Arabic Any-Thai Any-Armenian Any-Thaana Any-Georgian Any-Hebrew Any-am_FONIPA Any-dsb_FONIPA Any-ia_FONIPA Any-uz_Cyrl Any-pl_FONIPA
Iwao@DS116:~$
iconv_open で失敗した場合,iconv コマンドまたは uconv コマンドとするか?
2022/07/15
SynoCli File Tools v2.6-16 で iconv が追加された.
SynoCli File Tools などのインストール方法は次の所に書いています.
https://dev.mish.work/wordpress/2022/06/15/ds116-entware/
Windows , Linux 共通の c++ コード
3 年位前から,少しずつ Windows や Linux に依存しない c++ のコードを書く様にしている.
ソースファイルの文字コードと改行コードは 7 ビットの範囲で crlf にしている.
.sh などは lf でないとうまくない.
html などの場合は UTF-8 .
扱うファイル名も 7 ビットの範囲に限定している.
これで UI を伴わない範囲ではほぼうまく機能している.
次のページからのリンク先で WebGL を使用したサーバのコードはソースレベルで互換性あり.
https://itl.mydns.jp/i_Tools/
他に Windows 専用のコードとの区別のため,ファイル名を小文字に.
これは Linux では大文字,小文字が区別されるため.
今回既存の AP ドキュメントを扱うことに.
Windows でいう「シフト JIS」と「UNICODE」のテキストファイル.
他に UTF-8 のファイルもあるが対応する必要性は未定.
UTF-8 ファイルは Windows のコードでは書いているが,テスト用に存在するのみ.
今までの Windows のコード(tstrmbwc.hxx)では _T や _UNICODE の有無でうまく機能している.
読み込んだ時に _UNICODE の有無でそれぞれの文字コードで保持すればほぼ OK .
「ほぼ」というのは「㎥」の様にシフト JIS にない文字は失われてしまうため.
他にもサロゲートペアにはうまく対応できていない.
Linux でも同様に考えると,読み込んだ時に UTF-8 にすれば良さそう.
wchar_t もあるみたいだが今の時点では考慮しないことにする.
と,思ってテスト用のコードを書いてみたがうまく動作しない.
恐らく変換関連の考え方が理解できていないため.
2020/02 「文字コードを変更してコピー」するツール
https://i–tools.blogspot.com/2020/02/copycc202001.html
Win10 に IIS と PHP – 6
Win10 に IIS と PHP – 5
DB の場所が変わって「ODBC データ ソース アドミニストレーター」で正しく指定.
動作を確認していると,
Provider エラー '80004005' エラーを特定できません /_LIB_/L_LogAcc.asp, 行 224
サイトの再起動を試したが変わらず.
OS を再起動することでうまく通るようになった.
他にもチェックしていると,
HTTP エラー 500.19 - Internal Server Error ページに関連する構成データが無効であるため、要求されたページにアクセスできません。 エラー情報の詳細: モジュール CustomErrorModule 通知 SendResponse ハンドラー ASPClassic エラー コード 0x800700b7 構成エラー 一意のキー属性 'fileExtension' が '.imo'に設定されている種類 'mimeMap' の重複コレクション エントリを追加できません 構成ファイル \\?\C:\Users\Public\Documents\web\Test\web.config 要求された URL http://localhost:80/Test/ASP/Default.asp 物理パス C:\Users\Public\Documents\web\Test\ASP\Default.asp ログオン方法 匿名 ログオン ユーザー 匿名 構成ソース: 5: <staticContent> 6: <mimeMap fileExtension=".imo" mimeType="text/imo" /> 7: </staticContent> 詳細情報: このエラーは、Web サーバーまたは Web アプリケーションの構成ファイルの読み取りに問題があるときに発生します。エラーの原因に関する情報が、イベント ログに記録されている場合があります。 詳細情報の表示 »
Microsoft VBScript 実行時エラー エラー '800a01ad' ActiveX コンポーネントはオブジェクトを作成できません。 /_LIB_/L_LstDir.asp, 行 14
コードの部分を見ると,
set oFSys = Server.CreateObject(“AsFile.FileSys”)
「アプリケーション プール」-「詳細設定」-「32 ビット アプリケーションの有効化」を「True」に.
他にも,
HTTP エラー 500.19 - Internal Server Error ページに関連する構成データが無効であるため、要求されたページにアクセスできません。 エラー情報の詳細: モジュール CustomErrorModule 通知 SendResponse ハンドラー StaticFile エラー コード 0x800700b7 構成エラー 一意のキー属性 'fileExtension' が '.imo'に設定されている種類 'mimeMap' の重複コレクション エントリを追加できません 構成ファイル \\?\C:\Users\Public\Documents\web\Test\web.config 要求された URL http://localhost:80/Test/iisstart.png 物理パス C:\Users\Public\Documents\web\Test\iisstart.png ログオン方法 匿名 ログオン ユーザー 匿名 構成ソース: 17: <staticContent> 18: <mimeMap fileExtension=".imo" mimeType="text/imo" /> 19: </staticContent> 詳細情報: このエラーは、Web サーバーまたは Web アプリケーションの構成ファイルの読み取りに問題があるときに発生します。エラーの原因に関する情報が、イベント ログに記録されている場合があります。 詳細情報の表示 »
MIME の設定がダブっているとうまくない様で,下位の方を削除しようとすると
--------------------------- MIME の種類 --------------------------- この操作の実行中にエラーが発生しました。 詳細: ファイル名: \\?\C:\Users\Public\Documents\web\Test\web.config 行番号: 18 エラー: 一意のキー属性 'fileExtension' が '.imo'に設定されている種類 'mimeMap' の重複コレクション エントリを追加できません --------------------------- OK ---------------------------
T90Chi Win10 1803 からの更新
Win10 1803 だった T90Chi が Windows Update 1903 ? の対象に.
そのまま受け入れて進めると 0x80070057 のエラーに.
どうしたものかと思ったが「やり直す」を選択.
1 時間程度経ったと思う.
今度は「次の作業が必要です」.
VirtualBox をアンインストール.
画面を撮り忘れたが,10 GB 以上の空きがある外部記憶装置が必要に.
追加している SD カードを指定して継続.
また 1 時間程度して再起動の画面.
その後なかなか進まない?
4 時間程度経って,
「コンピューターに対する変更を元に戻しています…」のループ.
更に 2 時間程再起動を繰り返していたが,「電源」+「音量-」でシャットダウンさせた.
ポートを指定してのアクセス
引き続き IIS 環境へのアクセスを調べているが…
幾つか調べたことのメモ
IIS 部分を PHP から呼び出せないかと思い見つけたのが file_get_contents .
<?php
$homepage = file_get_contents('http://www.example.com/');
echo $homepage;
?>
//www.example.com/ はちゃんと表示できるが,他のサイトなどではうまく表示されないことが多い?
auひかりのルータ Aterm BL190HW の設定を幾つか調べたが,特に影響しているものはなさそう.
ASUS RT-AC86U の設定でいろいろ見ていたら「ポートフォワーディング」が気になった.
試しに DS115j に接続する設定を追加したら,うまく動作する.
外部ポート 8000 内部ポート 80 内部 IP アドレスを 192.168.1.115 に.
http://iwao.synology.me:8000/ でアクセスできる.
同様に Win10 IIS も設定したがうまく接続できない.こうなると Win10 の設定か?
Win10 の設定を見直していたら IPv4 の設定の「デフォルトゲートウェイ」がブランクになっていた.
これを正しく設定したらうまく接続できるようになった.
http://iwao.synology.me:8080/
IPv6 でのアクセス
テスト用に IIS 環境へ接続できないかと…
LAN 内であれば次の様な指定で可能.
//192.168.1.80:8080/
//win10-ltsc:8080/
ASUS RT-AC86U を追加前は BL190HW のポートマッピング設定で設定していた.
LAN 側ホスト 192.168.0.80 プロトコル TCP ポート番号 8080
IPv6 ならそれぞれが指定できると思い試すことに…
指定方法は次のページにあった.
URLで IPv6 のIPアドレスを指定して接続する
DS115jhttp://[240f:33:c6c7:1:211:32ff:fe5f:e655]/Win10http://[240f:33:c6c7:1:241f:8b43:86b9:28de]:8080/Win 7http://[240f:33:c6c7:1:855d:191e:86aa:6fc3]/
LAN 内であれば意図した動作になりアクセスできる.
どこかの設定が足りないみたいで WAN からはアクセスできていない.
2020/04/22 追加
DevXhttp://[240f:33:c6c7:1:81c7:3574:8836:64f6]/
2022/02/20
この時やりたかったことの,仮想ホスト機能などを使った設定.
NAS の仮想ホストの設定
仮想ホストの設定 ポート
2022/04/07
リバースプロキシ
FBX SDK 2020.0.1
FBX SDK がまた新しくなっている.
とりあえずダウンロードしてインストール.
ビルドなどは次のタイミングを予定.
Lib を組み込む部分のコードは次の様にしている.
#include <FbxSdk.h> #ifdef FBXSDK_VERSION_STRING #if (FBXSDK_VERSION_MAJOR >= 2014) #define FS_VER_GT_2014_00 #endif #if (FBXSDK_VERSION_MAJOR >= 2019) #if (FBXSDK_VERSION_MINOR >= 1) #define FS_VER_GT_2019_01 #endif #endif #if (FBXSDK_VERSION_MAJOR >= 2020) #define FS_VER_GT_2019_01 #endif #if defined (FS_VER_GT_2019_01) #if defined (_DLL) #pragma comment (lib, "LibXml2-MD.lib") #pragma comment (lib, "Zlib-MD.lib") #else // !(_DLL) #pragma comment (lib, "LibXml2-MT.lib") #pragma comment (lib, "Zlib-MT.lib") #endif // (_DLL) #endif #if defined (FS_VER_GT_2014_00) #if defined (_DLL) #pragma comment (lib, "LibFbxSDK-MD.lib") #else // !(_DLL) #pragma comment (lib, "LibFbxSDK-MT.lib") #endif // (_DLL) #endif #endif // FBXSDK_VERSION_STRING
Win10 に IIS と PHP – 4
ここでは Windows 10 環境に Classic ASP をインストールする手順を記述しています.
Windows Server 2022 へのインストールは次の所にあります.
WS2022 Classic ASP インストール
WS2022 ASP ActiveX dll exe の設定
Classic ASP は IIS 7.0 と IIS 7.5 に既定ではインストールされない
「インターネットインフォメーションサービス」の以下の項目をチェックしてインストール.
1.「Web 管理ツール」-「IIS 6 管理互換」-「IIS メタベースおよび IIS 6 構成との互換性」
2.「World Wide Web サービス」-「アプリケーション開発機能」-「ASP」
そのままではスクリプトのエラーメッセージは表示されない.
An error occurred on the server when processing the URL. Please contact the system administrator.
If you are the system administrator please click here to find out more about this error.
Classic ASP スクリプトのエラー メッセージはもはや既定では Web ブラウザーに表示されない
これで localhost には表示されるようになる.
Microsoft VBScript 実行時エラー エラー ‘800a01ad’
ActiveX コンポーネントはオブジェクトを作成できません。
/_LIB_/L_Mainte.asp, 行 33
別の PC からアクセスすると,
サーバー エラー
500 – 内部サーバー エラーです。
検索中のリソースに問題があるため、リソースを表示できません。
localhost からのアクセスの様なエラーメッセージを表示する方法はわからなかった.
「ActiveX コンポーネントはオブジェクトを作成できません」エラーは 32 ビット ActiveX.dll が起動できないため.
「アプリケーション プール」-…-「32 ビット アプリケーションの有効化」を「True」に.
ActiveX.dll が登録されていないと,
Server オブジェクト エラー ‘ASP 0177 : 8007007e’
Server.CreateObject に失敗しました
/_LIB_/L_Mainte.asp, 行 33
登録するには「管理者として実行」した「コマンドプロンプト」などで
RegSvr32 ActiveX.dll
ActiveX.exe は IUSER で起動できるように設定する必要がある.
Win10 に IIS と PHP – 3
どこかに設定があるのかもしれないが,
PHP でのエラーなどのログファイル.
場所は c:\Windows\Temp\ .
今回テストした PHP のコード
<?php $tempfile = $_FILES['fname']['tmp_name']; $filename = './data/' . $_FILES['fname']['name'] ; $up_status = false ; if (is_uploaded_file($tempfile)) { $up_status = move_uploaded_file($tempfile , $filename) ; } $link = "" ; if ($up_status) { $p_info = pathinfo($filename) ; $pi_ext = $p_info['extension'] ; $bmp_name = $filename . ".bmp" ; $to_bmp = FALSE ; if ($pi_ext == "png") { $img = imagecreatefrompng ($filename) ; $to_bmp = imagebmp($img,$bmp_name) ; } else if ($pi_ext == "jpg") { $img = imagecreatefromjpeg($filename) ; $to_bmp = imagebmp($img,$bmp_name) ; } else if ($pi_ext == "bmp") { $bmp_name = $filename ; $to_bmp = TRUE ; } if ($to_bmp) { $cmd_to = ("rsz_bmp.exe") . " " . $bmp_name ; exec ($cmd_to,$out,$ret) ; } if ($ret == 0) { $rsz_file = $out[count($out)-1] ; $bak_file = $filename . ".bak." . $pi_ext ; rename($filename,$bak_file) ; $rsz_name = pathinfo($rsz_file)['basename'] ; $file_rsz = $p_info['dirname'] . "/" . $rsz_name ; rename($rsz_file,$file_rsz) ; if ($pi_ext == "png") { $img_bmp = imagecreatefrombmp($file_rsz) ; imagepng ($img_bmp,$filename) ; } else if ($pi_ext == "jpg") { $img_bmp = imagecreatefrombmp($file_rsz) ; imagejpeg($img_bmp,$filename) ; } else if ($pi_ext == "bmp") { copy($file_rsz,$filename) ; } if (!file_exists($filename)) { $filename = $file_rsz ; } } if (file_exists($filename)) { $link .= "<hr/>" ; $link .= "<a href='" ; $link .= $filename ; $link .= "'>" ; $link .= $filename ; $link .= "</a>" ; $link .= "<br/>" ; $link .= "<img src='" ; $link .= $filename ; $link .= "'>" ; } } ?>
rsz_bmp.exe で画像ファイルを 2^n にリサイズし,その結果のファイル名を標準出力に出力する.
画像を出力する imagebmp などはあまり速くない.
同様の PHP を Synology NAS 上で.
https://itl.mydns.jp/…/tex_pow2.php
PHP のコードが悪いのか? Synology NAS では DIB から元の画像に戻すのがうまくいかない.
Win10 に IIS と PHP – 2
「IIS マネージャー」の「サイト」-「右クリック」で「Web サイトの追加…」.
手順は Win7 の時と同様.
「ディレクトリの参照」を「有効」に.
PHP で BMP を作成するコードを検索すると,imagebmp というのがあった.
ここにあったサンプルを /Test/php_gd/make_bmp.php として保存.
呼び出されると php.bmp が生成される.
以下の動作は Synology NAS を使用しています.
コードを一部修正して現在時刻の画像を作成しています.
上のブラウザの画像をクリックすると現在時刻の画像ファイルを更新します.
Windows API で DIB のリサイズ
プログラミング Windows 第5版(上)
第14章 ビットマップと BitBlt
14.4 GDI ビットマップオブジェクト
HelloBit.c より
i_DIB DIB_resize (const i_DIB& dib,const SIZE& new_s) { i_DIB rsz_dib ; RECT rect = { 0,0, new_s.cx , new_s.cy } ; { HDC hdc = ::GetDC(NULL) ; HDC hmem = ::CreateCompatibleDC(hdc) ; HBITMAP hbmp = ::CreateCompatibleBitmap(hdc,rect.right,rect.bottom) ; ::SelectObject(hmem,hbmp) ; ::ReleaseDC(NULL,hdc) ; ::StretchDIBits(hmem,rect,::Get_DIB_RECT(dib),dib) ; i_DIB rsz = ::ToDIB(hbmp) ; ::DeleteDC(hmem) ; ::DeleteObject(hbmp) ; rsz_dib = rsz ; } return rsz_dib ; }
Raspberry Pi に ImageMagick
以前調べた時に入っていた ImageMagick .
先日追加した SD の Pi 環境には入っていないのでインストール.
検索すると sudo apt install ImageMagick とある.が,入力すると,
pi@raspberrypi:~ $ sudo apt install ImageMagick
パッケージリストを読み込んでいます… 完了
依存関係ツリーを作成しています
状態情報を読み取っています… 完了
E: パッケージ ImageMagick が見つかりません
正しくは,
sudo apt install imagemagick
パッケージ名は小文字で指定する. imagemagick
Win10 に IIS と PHP のインストール
Win10 環境で PHP を動作させるためのインストールなどの手順
今回使用したのは Win10 LTSC .
通常版に比べて不要なものが入らないのでこれを選択.
以前 Win7 環境に PHP を入れた時の手順
IIS での PHP Web サイトの構成
IIS の有効化.CGI が必要.
IIS の動作の確認.
Web PI のインストール.
Web PI を起動して PHP をインストール.
何故かエラー?
PHP Managet for IIS は複数バージョンの PHP を切替えるツールの様で今回は無くても良いか?
php -v や php -r “phpinfo();” で確認すると動作はしている.
次の内容を php として保存し,ブラウザで開く. <?php phpinfo(); ?>
Fedora 環境で bmp が読めない
先日 GLUT でテクスチャ表示 の動作を確認していた時のこと.
Raspberry Pi ではうまく表示できることまで確認.
Fedora ではうまく読めない.
コードでテクスチャを生成しての表示ではうまくいく.
32 ビット色 BMP のコードは Synology NAS Web サーバなどでもそれなりに動作している.
32 bit exe ではうまく読み書きできているみたい.
Raspberry Pi (ARM) と Fedora (x64) で BITMAPFILEHEADER などを見ると 64 bit 環境でうまくない.
例えば bmih.biSize が x64 では 0x50 になっている(ARM では 0x28).
def_bmp.hxx が間違っているみたい.
どうも long の定義が Windows と Linux などでは異なるため.wiki 整数型
DWORD と LONG の定義を u_32 と i_32 に変更(u_32 ,i_32 は i_define.hxx で定義している).
//typedef unsigned long DWORD; typedef u_32 DWORD; //typedef long LONG; typedef i_32 LONG;