真面目系クズのじんせい

真面目系クズ(自称)です。趣味とか、勉強とかを書いていきます。

カテゴリ: プログラミング

C++のコードで、ソケット通信のkeepalive設定方法が、雑魚の私には全然わからぬ状態だった。
どうやら、tcp_keepalive構造体とWSAIoctlで設定できるらしい、ということまでは分かった。
そうだ!とりあえず、Microsoftさんの見解を!!!

WSAIoctl function(Windows)
https://msdn.microsoft.com/en-us/library/windows/desktop/ms741621(v=vs.85).aspx

(´;ω;`)英語わからん。
いやおちつけ、まだなんかあるぞ。

SIO_KEEPALIVE_VALS control code
https://msdn.microsoft.com/en-us/library/windows/desktop/dd877220(v=vs.85).aspx

(´;ω;`)

何はともあれ、値は適当だけど、必要最低限以下でいけるっぽい。

****************************************************************************************************
#include <Mstcpip.h>        //struct tcp_keepalive を使用するため

SOCKET mySock;
tcp_keepalive tcpKeepalive;
DWORD dReturn;

 tcpKeepalive.onoff = 1;                            // 0 以外ならオンになるみたい
 tcpKeepalive.keepalivetime = 20000;      // 最初にkeepaliveを送るまでの時間(ms)
 tcpKeepalive.keepaliveinterval = 1000;   // keepaliveを送る間隔(ms)
 WSAIoctl(*mySock , SIO_KEEPALIVE_VALS, &tcpKeepalive, sizeof(tcpKeepalive), NULL, 0, &dReturn, NULL, NULL);

***************************************************************************************************

なんでタグを埋め込まなかって?めんどくさいからさ!!!
(はてなブログのほうがHTML編集する気が起きたな・・・)


 

 さて、今回はASP、ラジオボタンでサーバサイドに値渡しを(したつもり)します。まずは、適当にラジオボタンでも作成してみます。
 
ラジオボタンをつくるだけ.asp ※action属性でsubSample.aspを指定していますが、このままでは特に何もありません

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>テストページ01</title>
</head>
<body>
 <form action="subSample.asp" method="get">
  <input type="radio" name="button1" value="1" checked />送信test01
  <input type="radio" name="button1" value="2" />送信test02
  <input type="submit" value="送信" />
 </form>
</body>
 

f:id:atwgwu:20170510201831p:plain

 
 あれ、文字化けしましたね。文章でUTF-8を指定しているのに、aspファイルの保存形式がUTF-8でなかったためから(たぶん)なので、保存形式をUTF-8に変更します。
 

f:id:atwgwu:20170510201853p:plain

 
 とりあえず治りました。このファイル保存形式のミス、結構あると思うんですよね。
 
 次に、サーバサイドのaspを記述します。クライアントサイドで押したラジオボタンの結果を表示するだけの簡単なものです。
 
サーバサイド.asp(subSample.asp)
<%
@Language = "VBScript"
If request.QueryString.Item(1) = 1 Then
 response.write("test01")
Else
 response.write("test02")
End If
%>
 
 クライアンサイドでsubmitした"button1"の値を受け取って、条件分岐しています。しかし、サーバサイド処理をどれだけ独立して記述するべきなのかがよくわからない。

 例えば、上記のプログラムにタグを埋め込んで、下記のようにしても動く。
 
タグを埋め込んでみたサーバサイド.asp
<%@Language = "VBScript"%>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>テスト02</title>
</head>
<body>
 <h1>勉強中</h1>
 <%
  If request.QueryString.Item(1) = 1 Then
   response.write("test01")
 Else
   response.write("test02")
 End If
 %>
</body>
</html>
 
 結局 "<% %>" で囲っている部分はサーバサイド処理なのだから、問題はなさそう。
 
 
 
 
~~以下、参考にしてはいけない補足~~
 以上の結果から、以下のようなASPを書いてみた。
 
<%@Language = "VBScript"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>テストページ01</title>
 <script type = "text/javascript">
  function testFuncJa(valueJa){
   if(valueJa == 1){
     testView.innerHTML = "<% testFuncVb(1) %>";
   }else if(valueJa == 2){
    testView.innerHTML = "<% testFuncVb(2) %>"; 
   }else{
     testView.innerHTML = "<% testFuncVb(0) %>";
   }
  }
  </script>
 <%
 function testFuncVb(valueVb)
  If valueVb = "1" Then
   Response.Write "test01"
  ElseIf valueVb = "2" Then
   Response.Write "test02"
  Else
   Response.Write "UnKnown"
  End If
 end function
 %>
</head>
<body onload = "testFuncJa(0)">
 <form>
  <input type="radio" name="button1" onClick= "testFuncJa(1)" />test01
  <input type="radio" name="button1" onClick= "testFuncJa(2)" />test02
 </form>
 <div id="testView"></div>
</body>
 
 
 えっ、入り乱れとるし何がしたいん・・・。
 私の希望は、「ラジオボタンでクリックした内容を<div>タグ内に動的表示させる」で、表示させる内容はサーバサイドで決定するという感じ。回りくどいコードですが、これはメモ書きとして。
 

 初めまして。へいです。思うところがあり、はてなブログから移転してきました。よろしくお願いいたします。

 玄人プログラマーからしたら当たり前のことなのかもしれないが、私のような駆け出しプログラマーのために残すという意味合いと、自分自身のメモのために残します。

 

 今回取り掛かった問題はXMLとXSLについてです。問題としても単純明快で、「XSLを使ってXMLを表示させる」というものです。

 例えば、以下の単純なXML文章があったとする。
 
XML
<全体>
 <題名>テスト01</題名>
 <情報>
  <品名>うどん</品名>
  <単価>100</単価>
  <備考>おいしいうどん</備考>
 </情報>
 <情報>
  <品名>にくうどん</品名>
  <単価>150</単価>
  <備考>肉の分だけ高い</備考>
 </情報>
</全体>
 
 ただ、「うどん」という商品と「にくうどん」という商品の単価と備考が記述されているだけの単純明快なものである。これをXSLを使って表示させようとしたとき、ほかのWEBサイトを参考にしながらコーディングを行うと、私のような駆け出しは下記のように記述する(と思う)。
 
XSL:for-eachを使用 <?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="4.01" encoding="Shift_JIS" standalone="yes" indent="yes" />
<xsl:template match="/">
<html lang="ja">
<head><title><xsl:value-of select="全体/題名" /></title></head> <!--タイトル表示-->
<body>
 <div>
  <h1><xsl:value-of select="全体/題名" /></h1>  <!--意味も無くタイトルを再度表示する-->    
  <xsl:apply-templates select="全体" />  <!--"全体"テンプレートを適用する-->
 </div>
</body>
</html>
</xsl:template>
<xsl:template match="全体">   <!--"全体"テンプレート-->
 <table border="1">    <!--"表を作成-->
  <tr>
   <th>品名</th>
   <th>単価</th>
   <th>備考</th>
  </tr>
  <xsl:for-each select="情報">   <!--for-eachを使用したループ-->
  <tr>
   <th><xsl:value-of select="品名" /></th> <!--表示したい項目-->
   <td><xsl:value-of select="単価" /></td>
   <td><xsl:value-of select="備考" /></td>
  </tr>
  </xsl:for-each>
 </table>
</xsl:template>
</xsl:stylesheet>
 
 意味も無くタイトルを再度表示しようとするところが、駆け出しっぽいところである。コーディング中のイメージとしては、「一つの<情報>タグを一行として、ループさせて、表示する」というものである。上記のようなXMLとXSLを作成すると、下記のような結果が得られる。(IE実行)
 

f:id:atwgwu:20170508213719p:plain

 
 私のようなあんぽんたんには理解し難いことなのだが、上記のような書き方はXSLを正しく使えていないのかもしれないのだ。上述のXSL文章を以下の等価な文章に置き換えることができる。
 
XSL:for-eachを使わない
<!--省略-->
<body>
<div>
 <h1><xsl:value-of select="全体/題名" /></h1>
 <table border="1">
  <tr>
   <th>品名</th>
   <th>単価</th>
   <th>備考</th>
  </tr>
  <xsl:apply-templates select="全体/情報" />
 </table>
</div>
</body>
</html>
</xsl:template>
<xsl:template match="情報">
  <tr>
   <td><xsl:value-of select="品名" /></td>
   <td><xsl:value-of select="単価" /></td>
   <td><xsl:value-of select="備考" /></td>
  </tr>
</xsl:template>
</xsl:stylesheet>
 
 最初、上述のXSLを見たとき、「は?」と思った。「だって、ループ文ないじゃん!いみぷ~」というのが率直な感想である。私のような元C言語プログラマーからすると、理解し難いのではないだろうか。
 
 <xsl:apply-templates select="全体/情報" />の部分で、<body>タグ内は役目を終えたと思ってよい(いやだめかも)。そして、<xsl:templete match="情報">という文章はなんとなく、「XML文章の<情報>というタグをすべて抜き出せ」と見えなくもない。なんたって、"テンプレートマッチ"って書いてあるんだから。(画像処理プログラマーだった私はなんとなくそう思えた)つまり、<xsl:templete match="情報">という一行は、「<情報>というキーワードを用いてXML文章内でマッチングを行い、マッチングしたものはすべて抽出しろ」という意味なのではないか。
 
まだよくわからないけど、やばいなXML

↑このページのトップヘ