学校の課題で作ったwebappを公開してみる

最近Webの技術に興味が出てきて、Webアプリかなんかを作りたいなーと思うようになりました

そういえば学校の課題でservlet+jspなwebアプリをローカル環境に作ったなぁと思って

とりあえず自鯖にtomcatサーバとpostgresqlを導入して移植してみました → これ

元々DBにはapache derbyを使っていたのですが、driverをDLしてきてURIスキームをちょちょいと書き換えるくらいで乗り換えられたのは凄いと思いました

サーバの環境の方も、tomcatなんか解凍して起動スクリプト実行しただけだし、postgresも比較的親切な設計だったおかげでさくさく導入完了!

かなり手こずるかと思っていただけに拍子抜けです

ただ、ポート指定してアクセスさせるのはなんかかっこ悪いのでサブドメインをtomcatサーバに割り当てたいと思ったのですが

バーチャルホストとプロキシの設定が全然わからなくてそれを調べるのに膨大な時間を要してしまいました……

ちぃ、おぼえた!

今度はnode.jsとかやってみたいですね

javascript食わず嫌いしてたのでそこから覚えなきゃなんですが

Shift-jisの罠

画像ビューアに次の画像へ移動する機能を付けたかったので

FindFirstFile()、FindNextFile()でディレクトリ内のファイル名をvectorコンテナにpush_backしておき、

画像を変更する際に現在のファイルパスのファイル名の部分を削ってコンテナから取り出したファイル名にすげ替えるという

こんなかんじの処理を書きました

テストディレクトリで無事、成功したので適当にマイドキュメント(死語?)あたりで試した所挙動がおかしい……

 

VS2015のデバッガで原因を探した所どうも「給料計算表.xlsx」というファイルあたりからディレクトリパス抽出処理が上手くいってない様子

(ロードに失敗していた場合はスルーして再帰的に同じ処理をするようにしていたのでスレッドが完全にいかれていました)

 

数時間調べた結果「ダメ文字」なるものがある事を知りました

C/C++言語では文字コードの扱いにマルチバイトセットという物があるのですが、これは英数字などの「1バイト文字」とイデオグラム(漢字)やひらがななどの「2バイト文字」を混在させるという物です

これらはその名の通りそれぞれ文字を表現する為に1byteと2byteの2パターンが混在する形になります

Shift-jisの「表」という文字はデータ上では「0x95 0x5C」という数値として表現されていますが、この2byteめの「0x5C」という数値が「\」(バックスラッシュ・円マーク)と重複しているのです

上記のコードでは一番最後にマッチした「\」の次の文字から最後までを削除するというコードを書いていますから、「表」の次の文字から最後までが削除されて、ディレクトリ名にされていたというわけです

これにファイル名を挿入したとしても

「c:\Users\username\Documents\給料計算表image.png」

のような意味の分からないファイルパスになってしまいますね

 

しかたないので標準関数の_splitpath_s()を使うことに

セキュリティ強化版って引数が増えてめんどくさいですね(小並感)

しかし書き換えたのは良いものの結果は変わらないなぜだ

 

VS2015/_MBCSで_splitpath()で文字列「表」が処理中の_ISMBBLEAD()がコメントで\マーク扱いになる

引用~

以前VS2010で_MBCSにて、_splitpath()→_tsplitpath_helper()→_FUNC_NAME()の流れのなか で文字列「表」が文字化けせずにいたのですが、VS2015では_splitpath()→common_splitpath_internal()内で 下記のようにコメントされてしまっています。

仕様変更でしょうか?_MBCSにて実現するに、何か方法がございますでしょうか?

 

MSはTODOコメントを残したまま正式リリースすることを決めた。動かないのは意図通りかと。VS2013までは動作していたので、degrade、regressionである旨を伝えたら修正に応じるかもしれません。

~引用ここまで

 

ということらしいのでこちらのフォーラムの通り

  • stringで保持していたパスをwchar_tに変換
  • _wsplitpath_s()を使って分割
  • 出てきたwchar_tをcharに変換
  • string型の変数に変換&結合

 

という回りくどいコードを書いてやっと、ちゃんと動くようになりました

 

結局、これだけの為に昨日4時間くらい悩んでいたのでした

最近の言語ではこんな事はないと思うのですが……

C/C++の闇は深いですね