漫ろで行こう

自由気まま過ぎる、ギークになりたい男の子の話

Posts tagged ‘C#’

[動画]Augmented Shadow

6月 13th, 2010

卓上のオブジェクトが光源と構造部を示し、移動させることにより影などが連動するアートでも言いますか、百聞は一見にしかずです。
ビョークが使っている reactable を思い出しました。

via.Augmented Shadow_document on Vimeo

© 1995-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.

© 1995-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.

所用で C# から MySQL :: Connector/Net 6.0 を利用して MySQL からデータを抜く必要があったため、コーディングしていたのですが
Fatal error encountered during command execution
といったエラーが。

原因は直ぐに特定できたのですが、どうにも腑に落ちない。
というのも、原因は条件式の検索文字列の先頭に「@」が付いているため、変数として誤認されるのが原因で回避策は後回しとして、通常の SELECT 文とプロシージャコールで挙動が異なること。
プロシージャは以下のような感じ。これで同様のエラーが発生することはなく、問題なく動作してしまう。

string hoge = "@abc";
string fuga = "asdf1234";
string query = string.Format("call proc_Test('{0}', '{1}');", hoge, fuga);

一方、通常の SELECT 文だと先述したプロシージャのようなコーディングを行うと Fatal error encountered during command execution と怒られてしまう。
対処方法としては以下のような感じにする必要がある。

string cns = "MySQL接続文字列";
string hoge = "@abc";
string fuga = "asdf1234";
string query = string.Format(
  "select * from atTest where testName=@TEST and testPass='{0}';", fuga);
using (MySqlConnection conn = new MySqlConnection(cns))
{
  MySqlCommand cmd = new MySqlCommand(query, conn);
  cmd.Parameters.Add(new MySqlParameter(
    "@TEST", MySqlDbType.VarChar, 40));
  cmd.Parameters["@TEST"].Value = hoge;
  cmd.CommandTimeout = 300;
  conn.Open();
  // 処理
  conn.Close();
}

後者も完璧ではないけども(fuga 変数の内容も本来であれば、Parameters に Add するべきなんだけど)プロシージャの場合は問題無いのはどういうことだろう?
Conncector/Net のバグなのか仕様なのか……。

official.MySQL Query Analyzer – Improving SQL Query Performance

仕事柄多岐にわたり色々な言語に触れることがあるのですが、「得意な言語は?」と聞かれた場合「○○です!」と自信をもっていえる言語がない。
最近多用している言語は?ということであれば、もっぱら C# ではあるのだけども。
PHP 特化の人や、Perl 特化の人達なんかと比較したら下の下の下くらいの実力しかないと思う。

何かしら得意な言語を習得すべきなのだろうとは思うのだけども、いったい何を習得するべきなのだろうか?と思ったので、何社かオープン WEB 系の求人を出している会社で記載されている言語をまとめてみました。
※以下順不同

言語

サンプル数が少ないのでアレですが、集計前は「Perl か PHP じゃなかろうか?」と思っていたところ、意外にも JAVA が11票。同率1位で PHP。次いで C と Perl でした。
他にも Amazon やサイバーエージェント、リクルートなんかも調べてみたかったのですが、生憎求人が終了したようで掲載がなくなっていました。残念。
ついでに SQL に関しても集計してみました。SQL もプログラム言語同様に、特化していないので一通り触れるけど……というような状況なんですよね。

SQL

こちらに関しては予想通りの結果でした。Oracle が2位なのは基幹系との連携処理が絡んでくるからなのでしょうか?
以外にも PostgreSQL が0票というのには驚きました。一昔前であれば MySQL より PostgreSQL だろ常考!という感じでしたが、MySQL もバージョンアップを重ねて、RDBMS としての地位を確立してきたと考えるべきなのでしょう。

ということでプログラム言語としては PHP、JAVA、Perl、C あたりを。
SQL としては MySQL、Oracle あたりを習得すると良いのかもしれません。

自分は……もう少し検討してみようと思います。

サクッと終わらせるつもりが、結構時間を食われたので忘れないようにメモ?。

事の発端は MySQL レプリケーションのスレーブ側が、上手くデータを更新できなかった場合に直ぐメールを携帯に飛ばして対応できるようにしたかった。毎日スレーブ側で show slave status\G を叩くのも面倒なんで。
で、show slave status を叩いた結果で欲しい情報が以下。

  • Slave_IO_State
  • Slave_IO_Running
  • Slave_SQL_Running
  • Last_Errno
  • Last_Error

まぁ、普通に外部から MySQL へアクセスして必要なデータを抜いて、指定メールアドレスへメールを送信するだけの簡単なお仕事のプログラムを作って、ローカルでもデバッグ&テスト完了。いざサーバーへ実装&動作テストをしてみたら変な現象が。

◆カテゴリ
◇ホスト1
Slave_IO_State: System.Byte[]
Slave_IO_Running: System.Byte[]
Slave_SQL_Running: System.Byte[]
Last_Errno: 0
Last_Error: System.Byte[]

◇ホスト2
Slave_IO_State: System.Byte[]
Slave_IO_Running: System.Byte[]
Slave_SQL_Running: System.Byte[]
Last_Errno: 1064
Last_Error: System.Byte[]

System.Byte[] ってあんた……。
バイト配列が帰ってくるなら仕方ない。バイト配列をキャラクター配列に変換してーって、ローカルじゃ正常動作するからデバッグが出来ない?!いや、出来るけど肝心の部分がブラックボックスっぽくなっているのでイマイチ。
肝心の部分はというと、こんなカンジ。
(一部抜粋でもソース貼り付けって恥ずかしいのね)

string slaveIOStatus = reader["Slave_IO_State"].ToString();
string slaveIORunning = reader["Slave_IO_Running"].ToString();
string slaveSQLRunning = reader["Slave_SQL_Running"].ToString();
string lastErrNo = reader["Last_Errno"].ToString();
string lastError = reader["Last_Error"].ToString();

対象のサーバー

  • RedHat EL 5
  • MySQL 5.0.45

に対して、MySQL ODBC Driver 3.51 を使用して接続。

四苦八苦しても直らない。他プログラムではどうってことないのだけども。
あえて違うというと、DB User の権限?SUPER, REPLICATION CLIENT しか権限を与えていない。あとは、接続時の Database を指定していない。
で、結局のところ以下のようにソースを修正したら直った。

string slaveIOStatus = reader.GetString(0);
string slaveIORunning = reader.GetString(10);
string slaveSQLRunning = reader.GetString(11);
string lastErrNo = reader.GetString(18);
string lastError = reader.GetString(19);

期待値のメール内容はこんなカンジ。

◆カテゴリ
◇ホスト1
Slave_IO_State:
Slave_IO_Running: No
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:

◇ホスト2
Slave_IO_State:
Slave_IO_Running: No
Slave_SQL_Running: No
Last_Errno: 1064
Last_Error: Error ‘You have an error in your SQL syntax; ‘ (略

DNS じゃないけど、名前解決的なことができていなかったっぽい。
取り急ぎソース修正で対応できたけども……。危険な気がする。

Get Adobe Flash playerPlugin by wpburn.com wordpress themes
Proudly powered by WordPress. Theme developed with WordPress Theme Generator.
Copyright © 漫ろで行こう. All rights reserved.