2015年11月30日月曜日

C# ref修飾子とout修飾子とは

こんにちは山田です。
メソッドに引数を参照渡しで渡す方法です。


メソッドの戻り値で完結することが多いのですが、
それ以外に、戻り値とは別に引数を返したい場合があります。

自分が使うシーンとしては、メソッドの戻り値でDBから取得したデータリストを取得して、
そのデータの個数の値を別個に取得したいときなどがあります。

開発環境:ASP.NET2.0
開発言語:C#

値渡しの場合と、参照渡し場合の違いをまとめてみました。

■元々(値渡しの場合)
    public static void A(int arg1)
    {
        arg1 = 50;
    }
    public static void Main()
    {
        int x = 10;
        A(x);
        Console.WriteLine(x);
    } 
出力は10のままで、呼び出しもとには影響がありません。


■ref修飾子(参照渡し)
    public static void A(ref int arg1)
    {
        arg1 = 50;
    }
    public static void Main()
    {
        int x = 10;
        A(ref x);
        Console.WriteLine(x);
    } 
出力は50になる
呼び出しもとの数値が変わりました。

■out修飾子(参照渡し)
outを使う場合はrefとは違い
あらかじめ値を代入しておく必要がなくなります。
    public static void A(out int arg1)
    {
         arg1 = 50;
    }

    public static void Main()
    {
        int x; //←ここで代入しても参照が渡ることはないです。
        A(out x);
        Console.WriteLine(x);
    } 
出力が50になる。

その代わりAメソッド内でoutパラメータのarg1の値を使用することができず、
必ず、新しい値が代入されてしまいます。

2015年11月27日金曜日

ASP.NETでのURLリライトの流れ


こんにちは山田です。
長年の疑問のURLリライトについてわかってきたので
その覚書です。 

開発環境:ASP.NET2.0
開発言語:C#
IIS:6.1

■URLリライトの別名
URLリライト=URL書き換え
日本語だとURL書き換えとなります。

■そもそもURLリライトは必要なの?
個人的な疑問としてページリライトの技術はURLから判断して、
IISのサーバーのファイルディレクトリ(どの階層にいるのか)がわかりにくくなるし、
今見ているページの関連する記事を探したい場合、URLの法則性がわからないのでなんと打ち込めばよいのかわからない等の感想を持っていました。(こんな使われ方は想定されていいないと思いますが、、、)

一般的にどういう目的で使われているかと
  • URLが短い。
  • URL入力が簡単になる。
  • URL を見ると、サイトの構造がわかる。
  • "短縮可能 (hackable)" である。つまり、ユーザーが URL の一部分を入力すれば、そのサイトを表示して目的のページに移動できる。
というメリットがあるので、やはり必要な技術のようです。
特にURLが短い場合、気軽にそのwebページにアクセスしやすくなりますね。

ASP.NET での URL 書き換え

↑ここをざっと読んでみたのですが。
Umm...よくわからない。

■自分なりに実装したページリライトの流れをまとめてみました。

・実態のURL:/contentDetail.aspx
・必要な引数: userID=yamada&contentID=101
・リライト後のURL: http://blog.jp/yamada0101/

URLで
http://blog.jp/yamada0101/ → とアクセスさせたかった場合
   ↓
web.configにリライトルールを記述する(事前に)
   ↓
IISがリライトルールにそって、そのURLから実態のURLに直す
(/yamada0101/→/contentDetail.aspx?userID=yamada&contentID=101)
    ↓
IISが実態のファイルのページを判定する
(/contentDetail.aspx)
   ↓
クエリスストリングの必要なIDをRequestで取得する
   ↓
取得したuserIDとcontentIDから目的のブログ記事を
DBから取り出してページをレンダリングする
   ↓
  終わり

この流れがわからなくて、もやもやしていました。
他の言語や、開発環境だとまた違うのかな?
またふと疑問に思ってしまいました。

2015年11月26日木曜日

DISTINCTを使って重複を除外して表示

DISTINCTを使って重複を除外して表示

こんにちは山田です。
DB環境:MSSQL

登録したデータから、このカラムってどんな種類があったっけ?
と思った時に役立つ方法です。
つまり
取り出したレコードから重複する行を除外することができます。


■元のテーブル

category    color    size
----------------------------
adult         red       small
adult    blue     big
adult    blue     medium
kid       red       big  

■クエリの文法
 一意にしたいカラムの前にdistinctをつけたあげればよいです。

SELECT DISTINCT category

FROM mst_test


■結果
category
----------------------------
adult
kid

そもそもdistinctとは、「まったく異なるもの」という意味になるみたいです。

2015年11月25日水曜日

viewstateの中身を見ようと思ったがうまくできない

ブログネタ

こんにちは山田です。

postとgetの違いについて以前お話したのですが
postで送信されるviewstateについて掘り下げたいと思います。

■ViewStateとは
ビューステートは、ページとコントロールの値をラウンド トリップ間で保持する方法です。
現在のページの状態と値をBase64でエンコードして隠しフィールドに出力されます。

【~viewstateの中身を見よう~】

開発環境:ASP.NET 2.0
開発言語:C#

■元データをつくる
こんな感じで簡単なASPXの元データをつくります

[aspx]



 
  <%=textBox1.Text%>と入力されました


■ViewStateの中身を見る
ページのソースを開くを実行して
以下のviewstateの値をコピーしてその下のデコードツールにいれて実行してみる
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA0NzQxNTcxOWRky33WseENfFC3H1lsNdv99j+ZHmA=" />
</div>

http://www.ahref.org/app/base64/base64.cgi

■結果

1047415719dd�}ֱ�
|P� Yl5���?� `

文字化けしてしまった。
うまくいかない、、、。
文字コードがあっていないのか、よくわからない。
もうちょっと調べてみようと思います。

2015年11月24日火曜日

Google Mapにマーカー(目印)を表示する

こんにちわ、開発者のⅠです。

さて、前回は便利機能の表示の切替についてお話しましたが、今回はマーカーを表示させる方法についてお話したいと思います。

マーカーは皆さんご存知でしょうか?
Google Map上で建物などのスポットをクリックしたり、キーワード検索を行うと現れる"赤い目印"のことです。
なんとなく愛嬌がありますね。


それでは早速、実践してみましょう。

マーカーを表示させるには、経度と緯度が必須です。
以下のコードを、 関数 initializeに追加してみてください。
var map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);

var markers = [
    ['東京タワー',35.658589, 139.745615],
    ['浅草 雷門',35.711020, 139.796336],
    ['中央本線 笹子駅',35.603862, 138.825087],
    ];
for (var i = 0; i < markers.length; i++) {
var name = markers[i][0];
var latlng = new google.maps.LatLng(markers[i][1],markers[i][2]);
createMarker(latlng,name,map)
}
さらに、以下の関数を新規に追加します。
function createMarker(latlng,name,map)
{
var infoWindow = new google.maps.InfoWindow();
var marker = new google.maps.Marker({position: latlng,map: map});
google.maps.event.addListener(marker, 'click', function() {
infoWindow.setContent(name);
infoWindow.open(map,marker);   
});
}

これで、三箇所にマーカーが表示されていると思います。 しかし、この方法ではマーカーを表示させたい箇所が増減した場合にその都度、ソースの編集が必要になります。 次回は、マーカーの座標を外部ファイルから読み出す方法についてお話したいと思います。 それでは、また!