SVN から mono を取り出して Linux-Windows Cross-platform アプリを作ってるんだけど、ソースコードのコンパイルではまったので、むかつきがてらメモ。
mono の C# のコンパイルは mcs だっていうのは知ってたんだけど、どうやっても 2.0 対象のクラスとかもろもろがうまくいかない。
で、小一時間悩んだ挙句、 2.0 向けのコンパイラはそもそも gmcs だということが判明。
$ gmcs EnjoiXXXX.cs Compilation succeeded - 0 warning(s)できた。。
このブログを作成している際に、特定の記事だけ簡単な認証を行いたかったので、 PHP で BASIC 認証 っぽいことをやってみた。
実装は簡単で、ユーザが BASIC 認証を行った場合 PHP_AUTH_USER と PHP_AUTH_PW 環境変数にその際のユーザ名とパスワードが復号化されて格納される。
これを PHP で認証して、違ったら 401 エラーを返せばいいだけ。
$signin = false; if (isset ($_SERVER['PHP_AUTH_USER']) && isset ($_SERVER['PHP_AUTH_PW'])) { if ($_SERVER['PHP_AUTH_USER'] == 'masaki' && $_SERVER['PHP_AUTH_PW'] == 'password') { $signin = true; } } if (! $signin) { header('WWW-Authenticate: Basic realm="Enjoi Blog"'); header('HTTP/1.0 401 Unauthorized'); print "Error 401"; exit; }
例えば www.enjoitech.jp と blog.enjoitech.jp でセッションを共有したい場合は、 php のコードの session_start () 関数の前に、 session_set_cookie_params() でクッキーの影響範囲を enjoitech.jp にしてやることができる。
session_set_cookie_params (0 , '/', 'enjoitech.jp');もしくは php.ini で
session.cookie_domain "enjoitech.jp"でも可能。
たまに Access で作成したマクロやフォームから特定の文字列を検索したいときなどがあり困るんですが、
実は Access のマクロやフォームはテキストファイルに変換できます。
しかも簡単な VB スクリプトを書くだけ。
そのやり方のメモ。
Visual Studio .Net/2003/2005 などがインストールされてるマシンで、 ASP .NET のプロジェクトを作成する際に、「ASP .NET Version 1.1 が実行されていません」みたいなメッセージが表示されて、作成できないことがある。
これは、 IIS を再インストールしたり、 .Net は 1.0 、 2003 は 1.1 、 2005 は 2.0 と、 Visual Studio のバージョン毎に動作する .NET のバージョンが違うことから起きたりする。
このエラーを解消するには、 IIS で動作させたい ASP .NET のバージョンにしてやればいい。実際には以下のコマンドを打つ。
1.1.4322 の場合。
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322>aspnet_regiis.exe /i ASP.NET (1.1.4322.0) のインストールを開始します。 ASP.NET (1.1.4322.0) のインストールが完了しました。
もしくは「管理ツール」の「インターネット インフォーメーション サービス」、「既定の Web サイト」のプロパティから、 ASP .NET タブを開いて変更することもできる。
.Net から MySQL に接続するには MySQL AB がリリースしている MySQL Connector/Net を使用します。
MySQL® Connector/Net
MySQL はフリーでかなり優れているので、 .Net からの使用用途もかなり増えました。
とりあえず Visual Studio 2003 で C# ASP .NET から MySQL に接続しました。
Coldfusion 7 の管理画面からデータソースへいって、データソースの設定をしようとしても、 MySQL 5 用のドライバは標準では用意されてない。
でも MySQL からしっかりと配布されているのでそれを入手して設定すれば普通に使えます。
そのときのメモ。
this.Response.AddHeader("Content-Disposition","attachment;filename=CSVData.csv"); this.Response.AddHeader("media-type","application/octet-stream"); this.Response.WriteFile(csvFilelPath); this.Response.End();
string strDir = "C:\\"; string strFile = "test.csv"; OleDbConnection myConn = new OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strDir + ";Extended Properties='TEXT;HDR=NO'"); myConn.Open (); OleDbDataAdapter sqlda = new OleDbDataAdapter ("SELECT * FROM " + strFile, myConn); DataTable dtbl = new DataTable (); sqlda.Fill (dtbl); dgrdCsv.DataSource = dtbl; myConn.Close ();ちなみに、読み込む CSV のフィールドタイプを指定した場合は、 schema.ini を用意して CSV と同じフォルダにおいておく。
[filename.csv] ColNameHeader=True Format=CSVDelimited Col1=user_id Integer Col2=user_name Char Width 32 Col3=notes LongChar
といった感じ。はじめの一行目が CSV ファイル名をセクションで指定して、二行目がヘッダの有無、三行目はデータファイルの書式(ここでは CSV )を指定してます。それ以降が実際のカラムの指定。
public void Page_Load(Object sender, EventArgs e) { RegisterOnSubmitStatement ("submit", "return window.confirm ('削除します。よろしいですか?');");もしくは、特定のボタンのみに登録したい場合は以下も有効。
public void Page_Load(Object sender, EventArgs e) { Button1.Attributes["onclick"] = "return window.confirm ('削除します。よろしいですか?');";
ASP .NET はコントロールデータが全て一つの BASE64 エンコードされた __VIEWSTATE っていうフォーム変数に格納されてるんだけど、それ用のソフト等を使えば内容が閲覧できるし、書き換えることもできる。
これを暗号化して、改ざんされた際にはエラー処理するようにするようにするには、 web.config で Page.EnableViewStateMac を有効にすればいい。
<configuration> <system.web> <machineKey validation="3DES" /> <pages enableViewStateMac="true" /> </system.web> </configuration>Mac stands for "message authentication check".
HTML で、限られたスペースに、可能な限りのドキュメントを入力してスクロールバーで制御したい場合があります。 iframe や textarea でも行えますが、スタイルシートで overflow を使用してスクロールバーを出すこともできます。
例えば幅 400x40 のスクロールバーつきエリアを作成するには以下のようにします。
<div style="overflow: auto; width: 400px; height: 40px"> ここに入力したいドキュメントを書く。 </div>
実際どのようになるかというと、このように入力したドキュメントの長さに応じて、必要なスクロールバーを自動的に表示してくれます。当然 textarea とは違いタグも書けまし、 iframe みたいに別の HTML を作成する必要もありません。
<div id = "tarishou">test</div>JavaScript は以下のようになります。
var ctl = document.getElementById ("taishou"); if (ctl.style.display == "none") ctl.style.display = "inline"; else ctl.style.display = "none";
<cfcontent type = "image/gif" file = "path/to/file" />
Coldfusion で Form 内に Dynamic variable name を使った場合、その入力内容の取得したい場合 Evaluate 関数を使う。
例えば abc_ という固定 name に通し番号の 1, 2, 3 などを付加した場合を考える。
for (i = 1; i LTE < 5; i = i + 1) { abc[i] = Evaluate ("form.abc_" & i); }
Coldfusion で、例えば form タグ内に同じ name 属性を持った要素を複数含んでいた場合、 Form 構造体にはその名前のリストが作成されます。
言葉で伝わりづらいので具体的に以下のコードを見てください。
<form action = "./" method = "post"> <input type = "checkbox" name = "sameopt" value = "1" /> <input type = "checkbox" name = "sameopt" value = "2" /> <input type = "submit"/> </form>name 属性が sameopt チェックボックスが二つあります。このフォームでチェックボックスの両方にチェックをし submit すると、 Form.sameopt は以下のようにセットされます。
1,2,区切りのリスト構造です。 PHP なら、
<form action = "./" method = "post"> <input type = "checkbox[]" name = "sameopt" value = "1" /> <input type = "checkbox[]" name = "sameopt" value = "2" /> <input type = "submit"/> </form>$_POST["sameopt"][0] と [1] とい感じで配列になる感じです。で、このリストを一つずつ処理するには、 list 関数を使ったり、 cfloop の list 指定で処理したりするといいでしょう。具体的には、
<cfloop index="i" list="#Form.sameopt#">という感じです。
cpan2rpm を使うと、 perl モジュールを RPM としてインストールできます。
以下からパッケージをダウンロードしてインストールします。
http://perl.arix.com/cpan2rpm/
↑がリンク切れてたら、↓から RedHat 4 用のも利用可。
http://atrpms.net/name/cpan2rpm/
rpm -ivh cpan2rpm-2.027-1.noarch.rpm
Smarty で年月日を表示するドロップダウンを作るには html_select_date というカスタム関数が便利。
これを使うといちいち select だ option だ、何日前を表示だ、とか考えなくてする。実際のコードはこんな感じ。
{html_select_date year_empty="-" month_empty="-" \ day_empty="-" prefix="start" start_year="-4" time=$start_time}
こうすると、ドロップダウンのトップ項目に - を含んだ 4 年前からのドロップダウンが生成され $start_time がデフォルト値になる。
prefix は name に start を付加させて startYear, startMonth とかなるような感じ。詳細は Smarty Documentation参照。