K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[1234] Re:VM間排他制御について
投稿者:(ぱ)こと管理人
2009/04/22 02:53:50

>私の目的は、最も簡単な方法だけを提供しそれ以上のことは出来ない、 >知らなくていい、とても初期の段階のプログラミングを想定しています。 これなんですが、「誰にとって」簡単であることを目指しているのでしょうか。 VMを作る山さんの立場からすれば、ネイティブスレッドを相手に共有変数の整合性を 保持しようと思ったら、結局、セマフォというかミューッテクスによるロックが 必要であるように思います。 それにより、個々の変数が任意の時点で正しい値を持つことが保証されるなら、 アプリケーションを作成するユーザの立場からすれば、困らないように思います。 あるいはもし、複数の変数の整合性まで保証しなければならないのであれば (たとえば点の座標をx, yのふたつの共有変数で持つとき、点を(10, 10)から (20, 20)に移動させる際、(10, 20)のようなハンパな状態を見せてはいけないとか)、 これはトランザクションになりますから、トランザクションの終了を宣言する 方法が必要になると思うのですが…… >それは「Diksam言語仕様自体が複雑ではないのか?」と、実は利用者に説明するのは、 >関数と計算式とif,thin,elseif,else,while,continue,break。以外は使わないようにと >説明します。 そうそう、この程度の機能でも、組み込み言語が使えれば便利な局面は多々ありますよね。 Diksamやcrowbarは少なからずこういう用途を想定しているので、使っていただけることは 作者としては嬉しいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1233] Re:VM間排他制御について
投稿者:(ぱ)こと管理人
2009/04/22 02:25:43

>新プログラミング言語「BF-BASIC(ここの上カンマ)n」 >上の(ここの上カンマ)の半角記号があると書き込めませんでした。 えっ? ……これはつまりSQLインジェクションが可能なわけで、重大なセキュリティー ホールです。修正しました。ご指摘ありがとうございました。 以下、経緯です。 この掲示板は、↓の注記とか、 http://kmaebashi.com/programmer/bbs_dev/index.html こことかにも書いたとおり、 http://kmaebashi.com/programmer/bbs_dev/newbbs.html PHPのmagic quotesの機能を使用しています。 そして、私が借りているレンタルサーバでは、magic quotesはずっとonに なっていました。 少なくとも今年の1月の時点でシングルクオートを含む投稿に成功しています。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1195&range=1 これがいつの間にかoffにされていたようです。 http://kmaebashi.com/test.php サーバ業者からのお知らせはなかったと思います。以前、PHPを5に上げるという 連絡はありましたがそれもなんだかうやむやになったような(現に今、4で動いてますし)。 # もちろんそれ自体、私を含めてちょっとどうかという話ではありますが。 magic quotesについては、私自身やり方として間違ってるよなあと思いつつ、 郷に入れば郷に従え精神で利用「してしまった」わけですが、当時の私が無知で バカでアホで軽率であったことは認めるとしても、それを前提としたスクリプトは たくさんあるはずで、告知なしにoffにされてはたまったものではないです。 ここはJoe'sウェブホスティングから借りていて、今までさほど大きな問題は なかったと思うのですが、今回の件で過去最大の不信感を持ちました。 ご指摘ありがとうございました。重ねて御礼いたします > 山さん
[この投稿を含むスレッドを表示] [この投稿を削除]
[1232] Re:VM間排他制御について
投稿者:
2009/04/21 10:39:48

SQL障害のため書き込めませんでした、どの部分が問題か調べるために2度のテスト書き込みと削除をしています。お騒がせして申し訳ありません。障害点は下記の部分。 新プログラミング言語「BF-BASIC(ここの上カンマ)n」 上の(ここの上カンマ)の半角記号があると書き込めませんでした。 お騒がせしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1231] Re:VM間排他制御について
投稿者:
2009/04/21 10:34:28

説明不足で申し訳ありません。 >だとすると、配列やオブジェクトのような参照型ではどうなるのでしょう。 配列やオブジェクトのような参照渡しはしないです。と言うかその点をまったく説明していませんでした。非同期の単一のデーターのみを対象にしていす。複数のデータを渡したい場合は、string変数に、","区切りでと考えていました。申し訳ありません。もちろん、パラメータを簡単に構築分解する関数を用意します。非同期渡しなので、送るほうが3回変数を書き換えても、受けは1回か2回しか読めない場合もあります。もし間違いなく渡したい場合は、スレッドセーフなキューシステムを、完全な同期をしたい場合は、それ様のシステムがいりますが。私の目的は、最も簡単な方法だけを提供しそれ以上のことは出来ない、知らなくていい、とても初期の段階のプログラミングを想定しています。 C++熟練者にとっては、最小高速なセマフォーがあればほぼ何でも出来ます。しかしプログラム間で正しく通信するための必要知識は膨大なものが必要です。(それを補間するために、いろいろなライブラリーが作られているが、それがまた複雑さを・・・) まさに「新プログラミング言語「BF-BASIC n」を作ろう」的な構想のアプリケーションです。だから、スレッドセーフな最小限の一方通行情報伝達だけを意識せずに提供できればいいのではないだろうか?との発想で書いています。これで本当に足りるのかは、アプリがある程度出来てこない事には想像がつきません。 決まり事を極力最小にして、複雑さはシステムで吸収できるよう設計したい。そんな目標が有ります。ここで1つ疑問が沸くと思います。それは「Diksam言語仕様自体が複雑ではないのか?」と、実は利用者に説明するのは、関数と計算式とif,thin,elseif,else,while,continue,break。以外は使わないようにと説明します。それ以外は、トラブルがあっても自分で対処回避できる人のみ「Diksam言語仕様」を見てくださいと言う予定です。  当初は独自で言語を作りはじめましたが、「俺が作りたいのは言語じゃない!!!」との思いが強くなり。いろいろなコンパイラーやインタープリタを調査した結果、Diksamに当たりました。特にしっかりとした言語仕様とVM部分がいいです。この上で複雑さをどれだけ吸収出来るものが作れるのか、がんばってみたいです。  まだまだ説明不足な点が多々あると思いますが、懲りずによろしくお願いいたします。 >>もっと簡単にしてグローバルは1VM内でのみ有効であるとして、 >>VM間変数と言う特殊な変数を作って、セマフォー処理をしてもいいと思う。 >山さんの投稿を見て私が最初にイメージしたのはこれだったのですが… はい、これがあれば一般的なプログラミングが可能です。しかし複雑な制御知識が必要になってしまいます。なのであえて上記のようなシステムを考えています。 >「変数の値取得用の関数」 変数の形をした、まさにこれなんです。説明不足申し訳ありません。ただ、関数にしてしまうと何度も読んでしまうミスを防げないので、あえて1回のみとしてシステム側で制限を加えたわけです。なぜこうしたかは、出来るだけ問題点をシステム側で見つけ出せるか?(目標)です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1228] Re:VM間排他制御について
投稿者:(ぱ)こと管理人
2009/04/21 02:07:14

>4.2回目を読みたい時は、変数更新の関数を呼びまた1回のみ読める。 あ、この「変数更新の関数」を呼んでから、変数を読み出すまでの間、 配布元VMでは変数の変更を禁止する(待つ)、ということでしょうか? だとすれば、余計な処理を間に挟めないように、「変数の値取得用の関数」を 用意したほうがよさそうにも思いますが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1227] Re:VM間排他制御について
投稿者:(ぱ)こと管理人
2009/04/21 01:50:42

>以下が私の考える見えない排他制御です すみません、いまいちよくわかりません。 まず前提として、山さんの案では、複数のVMが、別々のネイティブスレッドで 動作するんですよね? だとしたら、いずれにせよ共有の変数を読み書きする際は きっちりスレッド間でロックの取り合いをしなければならないわけで、この案で どこが簡素化できるのかがどうもよくわからないです。 >1.システム変数は1つのVMのみ読み書きが出来る、配布元VMとする。 また、この「システム変数」は、ユーザプログラムがこれを利用して同期を取るための ものではなく、まさにユーザプログラムがデータとして共有したいものなんですよね? だとすると、配列やオブジェクトのような参照型ではどうなるのでしょう。 int[] a = {1, 2, 3, 4}; という配列を共有したかったとして、 int[] tmp = a; // aを1回だけ読み出し 以後、tmp経由で配列aの中身は触り放題なわけですが、これでよいのでしょうか? >もっと簡単にしてグローバルは1VM内でのみ有効であるとして、 >VM間変数と言う特殊な変数を作って、セマフォー処理をしてもいいと思う。 山さんの投稿を見て私が最初にイメージしたのはこれだったのですが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1226] VM間排他制御について
投稿者:
2009/04/20 20:09:57

以下が私の考える見えない排他制御です 1.システム変数は1つのVMのみ読み書きが出来る、配布元VMとする。 2.他の受信VMは1回のみ変数を読むことが出来る。  (ローカル変数に代入し各種処理をする) 3.2回目を読もうとすると実行時エラーとなる。 4.2回目を読みたい時は、変数更新の関数を呼びまた1回のみ読める。  これで意識しない排他制御が可能になると考えています。 (変数更新を毎回呼んだら意味はありませんが・・・) これが私が実装しようとするスレッド間セーフなシステム変数です。 もしよろしければ、ご意見をお聞かせください。 diksamでスレッドセーフのVMが出来ても、グローバル変数が可能な方法があります。それは、セマフォーグローバル変数を宣言するとともに、ロックとフリーの関数を提供します。C++などでは、変数の排他管理は自分でしろと最小高速なセマフォーがあります。これと同じものを提供すれば、スレッドセーフなVM間の通信制御も可能になります。もちろん、もっと簡単にしてグローバルは1VM内でのみ有効であるとして、VM間変数と言う特殊な変数を作って、セマフォー処理をしてもいいと思う。もしお暇でありましたら、スレッドセーフなVMもご検討ください。 (なにぶんVMもほとんど知らないのに適当なことを言っているのかもしれません、その時は申し訳ありません)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1225] Re:ライセンスというか使用許諾というかについて
投稿者:
2009/04/20 18:09:44

>ここですが、現状のVMでも、DVM_VirtualMachine構造体は複数生成できると >思いますので(試してませんが)、yieldのような予約語を入れて中断できるように >すれば「複数起動され個々がいつでも中断再開できる」という用途は達成できそうに >思います。 はい、まだVM部分はざくっとしか見ていないので、内容のアドバイス大変にうれしいです。イメージ的には複数スレッドでVMが動くを目指しています。なおかつ中断状態をディスクに書き込み、読み出し再開を目指しています。(ちょっと無茶な仕様ですが^^;) Diksam上でのグローバル変数は禁止します。システムが固有に持っているグローバル変数を用いてVM間のコミュニケーションをする予定です。この変数へのアクセスは、理想的にはDiksamの変数と同等に扱えればいいのですが、当面はアクセス関数からのアクセスかな。このシステム変数を使うことでスレッド間排他制御を自動でやりたいと思っています。利用者は排他制御を意識できない、しないレベルにしたい。(目標) >そうではなくて、VMはあくまでひとつで、グローバル変数やヒープを共有し、 >複数のスレッドというかコルーチンというかファイバーというかを立ち上げられる >ようにしようと思ったら、DVM_VirtualMachineのpcやらcurrent_executableやら >current_pcやらをもうすこし整理する必要がありそうです。 今一番簡単にVMを考えるなら、総ての変数領域を、クラスの中にパックしてしまえばグローバル変数がないという条件で、完全なスレッドセーフのVMになるのではないかと思います。その場合、ヒープ領域も指定して持つと言う富豪プログラミングです。 私はまだVMもちらりとしか見ていないので、上記構想がどんなものかの評価が出来ていません。こうしたほうがよりよい等アドバイスが有りましたらよろしくお願いします。 ここ数日、Diksam0.4.01をVC++2005上で動作させることをトライしていましたが、多くのエラーとトラブルに遭遇し、まだ内容もわからずに修正するのは早計であった為、今現在はDiksam0.1を、VC++上に移植して作業をはじめています。0.1は少しの修正で移植できました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1224] Re:ライセンスというか使用許諾というかについて
投稿者:(ぱ)こと管理人
2009/04/20 01:30:57

そちらのソースを見たわけでもなく、私が趣旨を誤解している可能性もありますので あくまでご参考としてですが、 >また、VM部分はひとつのclassに入るように修正しようと思っています。 >使用上複数起動され個々がいつでも中断再開できる用途を考えているので、 >1つのまとまりとしてクラス化をして1パッケージで扱えるためにと。 ここですが、現状のVMでも、DVM_VirtualMachine構造体は複数生成できると 思いますので(試してませんが)、yieldのような予約語を入れて中断できるように すれば「複数起動され個々がいつでも中断再開できる」という用途は達成できそうに 思います。 そうではなくて、VMはあくまでひとつで、グローバル変数やヒープを共有し、 複数のスレッドというかコルーチンというかファイバーというかを立ち上げられる ようにしようと思ったら、DVM_VirtualMachineのpcやらcurrent_executableやら current_pcやらをもうすこし整理する必要がありそうです。 また、スレッドを分けるなら、MEMがstaticであるのはそれなりに問題になりそうに 思います。 >いつ完成するかはわかりませんが、何かありましたら必ずここでご報告いたします。 >ある程度めどが出来ましたら、フリーで公開するプログラムになります。 楽しみにしています。 >最後に1つ、「Diksam言語仕様 ver.0.4.01 」のページをパッケージに添付す >ことになると思いますが、その時はよろしくお願いいたします。 これについてもまったく問題ありません(明記しておくべきですね…)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1223] Re:ライセンスというか使用許諾というかについて
投稿者:
2009/04/19 18:09:47

>Diksamについてですが、mycalc, crowbarと同じで結構です。 とてもありがとうございます。 簡素に現状をご報告いたします。字句解析については日本語関数や日本語の定義や変数を使いたいために、独自で書いています。スピードもそれほど要らない部分ですから。また、VM部分はひとつのclassに入るように修正しようと思っています。使用上複数起動され個々がいつでも中断再開できる用途を考えているので、1つのまとまりとしてクラス化をして1パッケージで扱えるためにと。(私がクラス好きなんでつ)ヒープとGCはまったく別の形でなくすかもしれません。なにぶん趣味で作っているものなので、いつ完成するかはわかりませんが、何かありましたら必ずここでご報告いたします。ある程度めどが出来ましたら、フリーで公開するプログラムになります。 最後に1つ、「Diksam言語仕様 ver.0.4.01 」のページをパッケージに添付すことになると思いますが、その時はよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1222] Re:ライセンスというか使用許諾というかについて
投稿者:(ぱ)こと管理人
2009/04/19 13:56:13

>はじめまして、山と言うもので。 はじめまして。 >このページでは、mycalc, crowbar共に、商用、非商用を問わず、自由に複製、改変、 >とプログラム名を指定して記入してあります。私どもは、Diksamを改変し、プログラムの中に組み込もうと思っていますが。ライセンス条項がどこにも見当たりません。 光栄です。 Diksamについてですが、mycalc, crowbarと同じで結構です。このライセンス条件を 書いた時点でDiksamは公開前だったのですが、追加を忘れていました。 さっそくDiksamを追記しておきました。ご指摘ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1221] ライセンスというか使用許諾というかについて
投稿者:
2009/04/18 22:54:38

はじめまして、山と言うもので。 ライセンスというか使用許諾というかについてお聞き致します。 このページでは、mycalc, crowbar共に、商用、非商用を問わず、自由に複製、改変、 とプログラム名を指定して記入してあります。私どもは、Diksamを改変し、プログラムの中に組み込もうと思っていますが。ライセンス条項がどこにも見当たりません。 よろしければどの様なライセンス条項であるかお聞かせ願えませんでしょうか? 当初は、同一であると思って作業を進めていましたが、よくよく見るとDiksamの名前がありませんでした。まことに不注意ではあったのですが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1220] Re:リンク変更
投稿者:(ぱ)こと管理人
2009/04/04 10:11:46

こんにちは。 >C言語 FAQ 日本語訳 >http://www.kouno.jp/home/c_faq/ 情報ありがとうございます。修正しておきました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1219] リンク変更
投稿者:時々訪れる人
2009/04/01 19:18:16

C言語 FAQ 日本語訳 http://www.kouno.jp/home/c_faq/ リンクが変わっているかも?? 上が正しい?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1218] Re:読みました
投稿者:(ぱ)こと管理人
2009/03/29 12:53:07

はじめまして。書き込みありがとうございます。 最近かなり忙しく返信が遅くなりましてすみません。 >PHP掲示板の勉強をしてみようとぐぐり、(ぱ)さんのページを見つけました。 今にして思うと、言い訳しながらmagic_quote使うくらいなら使うな、とか、 テーブルのレコードには作成日時のフィールドぐらいデフォルトで入れとけ、 とか、ツッコミどころはあるのですが、役に立てたようなら何よりです。 >BF Basic笑いました。 ありがとうございます。 もうじきエイプリルフールですが、今年はネタを仕込むヒマもないなあ…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1217] 読みました
投稿者:bourbon
2009/03/26 08:57:42

PHP掲示板の勉強をしてみようとぐぐり、(ぱ)さんのページを見つけました。 テクニカルでかつ気ままな仕様書は読み物としても秀逸。 知りたいこともちゃんと読みとれました。 ありがとうございました。 BF Basic笑いました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1215] Re:windowsでpthread
投稿者:tos
2009/02/24 09:30:36

返信、ありがとうございます。 Boostとかいうライブラリに関しても調べてみたのですが、 こちらも優先順位の設定が出来なそうに見えました。 (間違っていたら、すみません)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1214] Re:windowsでpthread
投稿者:(ぱ)こと管理人
2009/02/24 02:23:36

> pthreadを使用し、Windows上でスレッド優先順位を指定するには、 >どのようにすれば良いのでしょうか? または、そんなことは出来ないのでしょうか? 長々と放置しましてすみません。 私はpthreadは使ったことがないので、有効な助言はできないかと思います。 # ざっとぐぐってみた範囲では、やはり管理者権限がないと優先順位の設定は # できないように思えるのですが。 詳しい方からの情報をお待ちしております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1213] windowsでpthread
投稿者:tos
2009/02/19 18:46:36

皆さんこんにちは、tosです。 現在、Windows XPにてpthread-win32 libraryを使用した プログラムの変更を行なっています。 あるスレッドの優先順位を変更する必要があるため調べたところ、 「優先度は、スケジューリングポリシーが SCHED_OTHER の時には意味を持たず、 リアルタイムポリシー SCHED_RR と SCHED_FIFO に対してのみ有効である。」 とのことでした。 スケジューリングポリシーは「SCHED_OTHER」であったため、「SCHED_FIFO」 に変更しようとしたところ、 「リアルタイムスケジューリングポリシーである SCHED_RR と SCHED_FIFO は、 スーパーユーザ権限のプロセスに限って使用できる。」 とのことで、「SCHED_FIFO」を指定することが出来ません。 pthreadを使用し、Windows上でスレッド優先順位を指定するには、 どのようにすれば良いのでしょうか? または、そんなことは出来ないのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1210] Win << Mac::GUI (継承)
投稿者:つよし
2009/01/25 21:00:18

>「WindowsのGUIの悪いところは全部Macが起源だ」的な記事を > はてなの日記にでも書こうと思ってました。 楽しみに待っています。 前橋さんは、プログラミングの基礎の構築はバリバリlinuxを使ってるのですね!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1208] Re:os
投稿者:(ぱ)こと管理人
2009/01/25 03:19:20

>前橋さん >は、Winndowsな人ですね!? 私も以前はアンチWindows的なことを言ってたこともありますが、2000あたりからはまあ不満はないですね。 今まさにここに書き込んでいるのはWindows(Vista)です。Web閲覧やメールは基本的にWindowsです。このVistaの上に、VMWare playerでUbnutuが入っています。 crowbarやDiksamはもともとUbuntuで作りました。今でも言語本体はUbuntuで作っています。本の原稿やら何やらもLinux上でLaTeXで書いています。エディタはEmacs、かな漢字変換はSKKです。 会社に入ってほぼ最初の仕事がX Window上だったこともあり、私自身は、WindowsのAPIで画面にウインドウを出したり線を引いたりするより、Xlibの方が経験は多いです(WindowsのAPIはほとんど今回勉強しながらやっています。以前、ちょとだけMFCとかを使ったことはありますが)。 >オープンソースlinuxなUFOゲームは、作れないのかな!? Diksamのdiksam.windowパッケージのXlib版を作ることはできるでしょうし、それでUFOゲーム程度なら作れるでしょうが、あるレベル以上のものはクライアントサーバモデルのXでは辛いでしょうねえ。 >MacOSXのインターフェースは、Windouseの比では、ありません。 私はMacは10年以上前(Windows95以前)に仕事で使っていたきり、ほとんど触っていません。なので今のMacのUIについては、何を語る資格もないですが、最近、ちょうど「WindowsのGUIの悪いところは全部Macが起源だ」的な記事をはてなの日記にでも書こうと思ってました。 (1)フォルダの中身の閲覧が、デフォルトでアイコンであるとか、  →少なくとも私の周囲では、みんな一覧表示に切り替えています。このへん   VistaになってさらにクソになりましたがこれはさすがにMacの責任ではない。 (2)そのアイコンをドラッグすると、デフォルトで(コピーではなく)移動になるとか、  →移動よりコピーの方がずっと使用頻度高くないですかね。 (3)デスクトップにファイルが置けるとか。  →これは反論ありそうですが、これを認めることで、結果的にファイルシステムが   循環した複雑怪奇なものになってしまっています。Windows3.1時代の   ファイルマネージャではいかんのか。 上記のような特徴は確かに初心者にはとっつきやすいのかもしれませんが、とっつきやすいだけで実用には向かないんじゃないかと。 >前橋言語で金儲け考えていないのであれば、Linuxでどうぞ! 金儲けは考えてないですが、かけられる時間が限られているので、やっぱり一番ユーザ層が厚いところを、と思いWindowsを選んだわけですが。 いざそうしてみたら、掲示板に、つよしさんといいたろうさんといいMacな人ばかりが書き込んでいるという…… 私が思うよりずっと、最近はMacユーザが増えているのかもしれませんね。私もMacBook Airが出た時にはかなり心を動かされました。まあお金に困っているわけじゃなし1台Macを買ってもいいけど、使う時間が……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1207] Re:os
投稿者:つよし
2009/01/24 23:10:30

前橋さん は、Winndowsな人ですね!? オープンソースlinuxなUFOゲームは、作れないのかな!? ちなみに、web閲覧位にしか使いませんが 僕は、linux,macosxな人です。 オープンソースでは、ありませんが MacOSXのインターフェースは、Windouseの比では、ありません。 windows,osの2バージョン位 進んでいます。 対応アプリは、windowsが圧倒しています。 macのハード1社独占は、いかがなものか(麻生節) オープンソース Linux の UFO 期待します。 前橋言語で金儲け考えていないのであれば、Linuxでどうぞ! いま、酒飲んでます。自身:醒めたらこの文どうかんじるかなぁ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1206] Re:os
投稿者:(ぱ)こと管理人
2009/01/11 00:25:15

>ここが解せないんですよ。たとえば >int >dvm_mbstowcs_len(const char *src) >{ > return mbstowcs(NULL, src, 0); >} >で良い筈なので、繰り返しは必要ないと思うんですが... やったのがかなり昔のことなのでもはや覚えていないのですが、 考えられる原因としては、以下のようなものが考えられます。 (1)Windowsでは、mbsrtowcs()だけでなくてmbstowcs()も動かなかった。  →当時はXPだったのですが、今Vistaで試したらあっさり両方動いてしまったので   検証不能です… (2)mbstowcs()なら動いたが、rがついていないのでよろしくない関数だと  思い込んでいた。  →この使い方なら、mbstowcs()側に状態を覚えさせないので、問題ないと   思いますが。 (3)mbstowcs()の第1引数にNULLを渡すと変換を行わない、という仕様を知らなかった。  →実のところ現在は完璧に忘れていました。当時はちゃんとマニュアル読んだので、   知らなかったということはないと思うのですが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1205] Re:os
投稿者:kit
2009/01/09 12:50:45

>で、manの続きを読むと、 > > This representation is recommended over --all-locates one, > due being the system wide supported values. > >(超訳)この(SUPPORTEDファイルの)表現は、locale -a で出てくるヤツより推奨される。 >なぜならシステム全体でサポートされてるものだから。 > >なんて書かれていて、それなりのポリシーはあるようですが……。 >歴史的ないざこざがあったのでしょうなぁ。 まあ Linux の世界に限れば、 http://web.archive.org/web/20040114120121/http://www.openi18n.org/docs/text/LocNameGuide-V11.txt という標準が決まっているので、ja_JP.EUC-JP の方が正式と言えば正式です。 しかし、この標準を決めた時点で、既に Linux を含む全ての UNIX 系 OS で ja_JP.eucJP が使える状態にあり、互換性のためには当然 ja_JP.eucJP を 引き続きサポートする必要もあったわけで、実質的には混乱の種を増やした だけだったと私は思ってます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1204] Re:os
投稿者:kit
2009/01/09 12:10:51

>また、mbstowcs()とかは引数にlenを取りますが、実際の文字列長に上限を >置くわけにはいかないので、どうせ繰り返し呼ぶなら1文字ずつやるほうが >(効率を考えなければ)楽なこと、 ここが解せないんですよ。たとえば int dvm_mbstowcs_len(const char *src) { return mbstowcs(NULL, src, 0); } で良い筈なので、繰り返しは必要ないと思うんですが... (第一引数が NULL の場合、mbstowcs() は第三引数を無視します。) dvm_mbstowcs() の方は len 用に引数が一つ増えてしまいますが、呼び出し側では 当然 len は分かっている筈なので、それでも構わないというか、今時のコーディング スタイル的にもその方が良いんじゃないでしょうか? (len が分かってないのに dvm_mbstowcs() を呼ぶなんていうのは、設計上の誤りな わけですから)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1203] Re:os
投稿者:yuya
2009/01/09 10:03:05

>ただ、Ubuntuだとxdmで文字コードが選べるのですが、そこでEUCを選んだ >時のデフォルトのLANGはやっぱりja_JP.EUC-JPなんですよね… 私もUbuntu使っていますが、localeのmanページに FILES: /usr/share/i18n/SUPPORTED List of supported values とあり、ファイルを覗くと ja_JP.EUC-JP がエントリーされていますね。 で、manの続きを読むと、 This representation is recommended over --all-locates one, due being the system wide supported values. (超訳)この(SUPPORTEDファイルの)表現は、locale -a で出てくるヤツより推奨される。 なぜならシステム全体でサポートされてるものだから。 なんて書かれていて、それなりのポリシーはあるようですが……。 歴史的ないざこざがあったのでしょうなぁ。 あと、前回の投稿で、他人のマシンでsudoを試させるような書き方をしてしまい、すみませんでした。 (locale -a の結果は ja_JP.ccb となります。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1202] Re:os
投稿者:(ぱ)こと管理人
2009/01/09 01:53:16

>>標準の mbstowcs() や wcstombs() を使わずに、dvm_mbstowcs() や >>dvm_mbstowcs_len() を用意している理由も良く分かりませんでした。 > >これらは、現状ではmbstowcs()とかの単なるラッパ関数です。 訂正です。dvm_mbstowcs()等に関しては単なるラッパではないですね。 理由のひとつは、昔 http://kmaebashi.com/programmer/devlang/regexp.html にちょっと書いたのですが、少なくとも当時の私には、Windowsで mbsrtowcs()を動かすことができなかったため(rなしの方は動いたんだったかな)、 また、mbstowcs()とかは引数にlenを取りますが、実際の文字列長に上限を 置くわけにはいかないので、どうせ繰り返し呼ぶなら1文字ずつやるほうが (効率を考えなければ)楽なこと、 あたりが理由だったと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1201] Re:os
投稿者:(ぱ)こと管理人
2009/01/09 00:06:34

こんにちは。いつもお世話になります。 >ja_JP.eucjp と設定しても動きます。 本当だ。今試したところ動きました。 前に試したときは動かなかったと思うのですが、なにかミスしていたようです。 >日本語EUC locale 名としては ja_JP.eucJP を使うのが最も一般性があり、 >Linux に限らず、多くの UNIX 系 OS で通用するので、そちらを勧めます。 ただ、Ubuntuだとxdmで文字コードが選べるのですが、そこでEUCを選んだ 時のデフォルトのLANGはやっぱりja_JP.EUC-JPなんですよね… >#include <limits.h> して MB_LEN_MAX を使わないのはなぜなんでしょう? これは単純に知りませんでした。毎度ながらご指摘ありがとうございます。 >標準の mbstowcs() や wcstombs() を使わずに、dvm_mbstowcs() や >dvm_mbstowcs_len() を用意している理由も良く分かりませんでした。 これらは、現状ではmbstowcs()とかの単なるラッパ関数です。 わざわざ1枚かぶせている理由ですが、たとえばどこかのタイミングで 独自の変換テーブルを持つようにする、といった改修を行う可能性はあると 思っています。実際、今回こうやっていくつかの環境で動かないのを 目の当たりにすると、内部コードなんかユニコード固定でいいし 日本語以外に対応しなくてもいいから、全部自前でやりたい、という気にも なりますです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1200] Re:os
投稿者:yuya
2009/01/07 15:49:13

ごぶさたしています。今年もよろしくお願いします。 >そもそも私の環境でも >ja_JP.eucjp >は出ても、 >ja_JP.EUC-JP >は出ないんですよね。 % sudo localedef -i ja_JP -f euc-JP ja_JP.C-C-B とでも入れてみて、懐かしのバンド名を使ったダミーのロケールを作り、すぐ消そうとしても % sudo localedef --delete-from-archive ja_JP.C-C-B locale "ja_JP.C-C-B" not in archive あれ?と思って % locale -a とすると……。kitさんのおっしゃるとおり、変態的であることを垣間見ることができますね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1199] Re:os
投稿者:kit
2009/01/07 13:57:56

>>Debian(etch) にて >>上の方にある同じ abort エラーがでました. この etch のエラーは、日本語EUC localeがインストールされてないため出ている エラーでしょう。Debian でのやり方は知りませんが、日本語 EUC locale をイン ストールすれば直るのでは? つまりdiksamではなく、利用環境の側の問題だと思います。 >>% printenv LANG >>ja_JP.EUC-JP >>% locale -a >>locale: Cannot set LC_CTYPE to default locale: No such file or directory >>locale: Cannot set LC_MESSAGES to default locale: No such file or directory >>locale: Cannot set LC_COLLATE to default locale: No such file or directory >>C >>POSIX >>ja_JP.utf8 > >locale -aで出てこないものをLANGにセットしても無駄だ、というのが >マニュアル的な解釈だと思うのですが、 そうです。したがって、locale -a で ja_JP.eucjp が表示されるような環境設定が必須です。 >そもそも私の環境でも > >ja_JP.eucjp > >は出ても、 > >ja_JP.EUC-JP > >は出ないんですよね。でも、LANGやsetlocaleで効くのはja_JP.EUC-JPのほうで、 >ja_JP.eucjpではないという。 ja_JP.eucjp と設定しても動きます。 Linux の locale 名解釈ルーチンは変態的で、ja_JP.EUC-JP, ja_JP.eucjp, ja_JP.eucJP を全て同一視します。こんな動作をするUNIX系OSは、知る限り Linuxだけです。 日本語EUC locale 名としては ja_JP.eucJP を使うのが最も一般性があり、 Linux に限らず、多くの UNIX 系 OS で通用するので、そちらを勧めます。 あと、 #define MULTIBYTE_CHAR_SIZE_MAX (6) というのは良くないコーディングスタイルだと思うんですが、 #include <limits.h> して MB_LEN_MAX を使わないのはなぜなんでしょう? (Linux の場合でも MB_LEN_MAX は 16、NetBSD あたりだと MB_LEN_MAX は 32 です。) 標準の mbstowcs() や wcstombs() を使わずに、dvm_mbstowcs() や dvm_mbstowcs_len() を用意している理由も良く分かりませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]