Windows環境でツールを入れずにMySQLのUTF-8の日本語項目を操作する

Windows環境でMySQLを使う場合、UTF-8の日本語項目の操作が難しいです。
というのも、コマンドプロンプトでMySQLを操作する場合、chcpコマンドでコードをUTF-8(65001)に設定してしまうと日本語が扱えなくなってしまうためです。
(コマンドプロンプトでUTF-8に設定した場合、レジストリで設定変更しない限り日本語のフォントを使えなくなってしまう。日本語を入力することができず、出力時も文字化けする。)

ツールを入れればこの問題は解消するのですが、ツールを入れるのが面倒な場合は、UTF-8で書かれたテキストファイル(.sql)とバッチファイル(.bat)を組み合わせることで日本語項目を操作することができます。
以下、日本語項目をinsert・selectする例です。mysql.exeへのパスは通っているものとします。

【前提】

・データベースのユーザとパスワード

ユーザ  :root
パスワード:root

・データベース名(スキーマ名)

sample

・対象テーブル(DDL)

【insertする例】

・Insert.sql

・Insert.bat

・バッチファイルをダブルクリックした結果

userテーブルにデータが挿入される。日本語項目も正しく挿入される。
(後のselect結果で確認する)

【selectする例】

・Select.sql

・Select.bat

・バッチファイルをダブルクリックした結果

C:\tmp\hoge.txt に下記のように出力される。
(出力ファイルはtab区切り・改行コード\n)


いかがでしたでしょうか。

自宅PCで立てた環境での話を記事化したものですが、まさかコマンドプロンプトでUTF-8の日本語のフォントが扱えないとは思いませんでした。
Windows環境なのであれば、初めからShift-JISで実装した方が楽かもしれません。

C#:セマフォを用いた排他制御

排他制御の仕組みとして先日Mutexを取り上げました
今回は、同じく排他制御で使われるセマフォについて取り上げます。

セマフォがMutexと異なる点は、複数のプロセス・スレッドが資源を取得することができることです。
セマフォのコンストラクタで初期で解放する資源数や、解放できる資源の最大数を指定します。
WaitOne関数で資源取得待ちを行い、Release関数で資源解放を行います。Release関数の引数で資源解放数を指定することもできます。
(ただし、最大数を超える資源を開放するとSemaphoreFullExceptionとなるので注意が必要です)

セマフォは、同時に動くスレッド数を制限したいような重い処理がある時によく使われます。

以下は、セマフォを用いて同時に動くスレッド数を制限するサンプルです。

【サンプルコード】

・Controller.cs

・Processor.cs

【実行用バッチ】

・test.bat

【実行結果】

・test.bat

・Controller.exe

・Processor.exe


いかがでしたでしょうか?

排他制御の仕組みとしてMutexを説明したので、ついでに代表的な方法の一つであるセマフォについても説明しました。
Mutexよりも使用頻度は少ないと思いますが、同時に動くスレッド数を制限するための書き方があるというのは覚えておいて損はないと思います。

趣味としてのプログラミングの楽しさ

こんにちは!
技術ブログで記事を書かせていただいている伊東です。

今回は一休みということで、趣味としてのプログラミングの楽しさについて語っていきたいと思います。


プログラミングが趣味と言うと、一握りのギーク(卓越した技術を持つコンピュータ好き)だけが楽しめる趣味なのではと思われるかもしれません(私もそう思ってました)が、そうではありません。初心者からでも楽しむことができる趣味です。
初心者でもブログ等で記事を発信することができますし、身の回りのことでちょっとしたプログラムを作ると便利になったりもします。

私の例ですが、以下のように休日もプログラミングを楽しんでいます。

1.ブログを通した情報発信

私は、このブログと、もう少し軽めの記事を扱う個人ブログの2つのブログを持っています。

個人ブログの方では、開発していてつまづいたエラーとその対処法を書くだけの簡単な記事も備忘録代わりに載せていますが、そのような記事にも他の記事と変わらないくらいのアクセス数が来ています。
エラーとその対処法を載せるだけなら初心者でもできます(むしろ初心者の方がそういった記事は書きやすいかもしれません)。
自分がつまづいた箇所は他の人もつまづく箇所なので需要はあります。
自分が書いた記事が他の人のためになると思うと、ブログを書くのが楽しくなります。

また、ある程度スキルを積むと、そのスキルをどう後進に伝えるのかが課題になりますし、自然に後進に伝えたくなる人も少なくないと思います。
スキルを伝える手段としては研修や現場での指導がありますが、研修では期間が決められていますし、現場では同じ現場に居る人にしかスキルを伝えられません。
しかし、ブログであれば、研修期間外でも、同じ現場に居なくても、それこそ社外の人にもスキルを伝えることができます。
これも他の人のためになることですし、ブログを書くモチベーションになると思います。
仮に誰も読まなかったとしても、誰かに読んでもらうことを前提に記事を書こうと思うと適当なことは書けないので、自ずと理解を深めるために勉強することになります。
これが、自分のスキルを更に伸ばす上で大事なことになります。

2.身の回りのプログラミング

身の回りのことで、ちょっとしたプログラムを作ると便利になることが少なくありません。
例えば、買い物(欲しい物や持っている物のリスト)やイベントの運営(抽選や集計)等でプログラムを作ると便利です。

私の場合は、趣味でオンラインのゲームのイベントの運営をすることがあり、そこで一緒に組む人の抽選や結果の集計をプログラム化しています。
プログラム化しているおかげで、早くてスムーズな運営ができておりますし、参加者の方々からも感謝されています。
抽選や集計をするだけなら初心者でも手が出せるのでお勧めです。

また、少しハードルは上がりますが、他の人も使うような機能であれば、ツールとして提供することもできます。
ツールとして提供すれば、自分と関わりのないゲームをしている方々に使ってもらえることもあり、広く貢献することができます。


ここまで趣味としてのプログラミングの楽しさについて語ってきましたが、一番大事なのは自分のPCに開発環境を入れることだと思います。
自宅のPCに開発環境が入ると色々試したくなると思います。
少なくとも私は、自宅に開発環境を入れてから、趣味でもプログラミングをしたいと自然に思うようになりました。

開発環境と言われると、開発業務用のすごいPCにすごい人が入れてくれるもの、という印象を持つかもしれませんが、そうではありません。
普通に量販店で売られているPCにも開発環境を入れることはできますし、開発環境を入れるための手順もWeb上に上がっています。
(初めて開発環境を入れるのであれば、Pleiades All in One の JDK(Java) の環境を入れるのがお勧めです)
プログラミングの経験や興味があるけど開発環境をまだ入れていないという方、是非とも入れてみて下さい!

C#:共有メモリで可変長データを繰り返し送受信する

共有メモリは、同一メモリ上で実行されるプロセス間でデータをやりとりする場合に使用する仕組みです。
通常、プロセスで確保しているメモリは他のプロセスから参照することができないのですが、プロセス間で予め共有メモリとして使用するメモリのアドレスを共有することで、そのメモリは他のプロセスから参照可能となります。
ファイル等を介したやりとりよりも高速なため、高速化が求められる時に使用することが多いです。

目的の一つが高速化のため、データが作成され次第次々と共有する、という使い方になることが多いと思います。
今回は、そのような使い方を想定して、可変長データを繰り返し送受信するサンプルプログラムを作成しました。
書き込んだデータのサイズを伝えること、共有メモリの読み取り位置をずらしていくことがポイントとなります。

なお、今回は省略していますが、本来であれば書き込み中の読み取りを防ぐため、Mutex等の排他制御の仕組みを併用するべきです。
(参考までに、Mutexについては前回の記事で取り上げています)

【サンプルコード】

・Sender.cs

・Receiver.cs

【実行バッチ】

・test.bat

【実行結果】

・Receiverのコンソール


いかがでしたでしょうか。

今回は、共有メモリを用いたデータの受け渡しを紹介してみました。
記事ではjavaに書き方が近く理解しやすいC#で書きましたが、本当に性能が求められる場合はCやC++で書く場合が多いです。
しかし、その場合もロジックは同じなので、参考になるのではないかと思います。

C#:Mutexでの排他制御

排他制御の方法の一つとして、C#にはMutexと呼ばれる機能が用意されています。
何れか一つのスレッドがMutexによるロックを取得することができます。
他のスレッドによりロックが取得されている場合の処理を別途記述すれば、この機能を使用して排他制御が可能となります。

以下、サンプルコードです。

【サンプルコード】

【実行結果】


また、Mutexには、名前を付けることができます。
名前を付けることで、プロセス間でも排他制御が可能となります。
ただし、意図せずMutex名が被ると意図しないロックがかかってしまうため、扱いには注意が必要です。

【サンプルコード】

【実行結果】

※exeファイルを3回起動した結果。
 1つ目のプロセス…掴んで解放
 2つ目のプロセス…解放を待って掴んで解放
 3つ目のプロセス…解放を待って掴めず諦める


いかがでしたでしょうか?

C#には排他制御のための機能が色々と用意されています。
その内の一つが今回紹介したMutexであり、名前を付けることでプロセス間の排他制御も可能になります。
名前付きMutexは、プロセスをまたいだスレッドの制御だけでなく、同じ画面が複数立ち上がらないようにする、といった使われ方もします。
仕組みが単純なので使用しやすく、排他制御の機能の中では使用頻度は高いと思います。

排他制御の機能は他にも色々と用意されているので、今後も紹介していきたいと思います!