真面目系クズのじんせい

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

2017年05月

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>タグ内に動的表示させる」で、表示させる内容はサーバサイドで決定するという感じ。回りくどいコードですが、これはメモ書きとして。
 

 前回に続いて、tesseract-ocrを使ってみました。正直、こういうのの導入ってくっっっっっっっっそめんどいイメージだったのですが、インストールは爆速で終わりました。(OpenCV導入するだけで、死にかけた系のかわいそうな人)

 

 それでは本題。特に環境変数とか変わってる感じがなかったのでコマンドライン上でカレントディレクトリを変更します。

(内心:あれ、インストール設定間違えた!?ほかのHPではインストール後、コマンドライン上で「tesseract」と入力するだけでいいってあったのに!)

 

 本HPは敢えて無駄な記述や表現を多数することを目的としているので、最初から行きます。

 

tesseract-ocrの実行方法
 1, 「Windows」key → 検索ウインドウ「cmd」と入力して「Enter」key(コマンドプロンプト)

 2, tesseract-ocrのインストールフォルダにカレントディレクトリを変更。
 「dir(フォルダ内表示)」とか「cd(階層移動)」とかしまくると到達できます。

 3, 「tesseract.exe」と入力し「Enter」key

tesseract-7

  ※ 上記みたいに、ヘルプやらなんやらが表示されればOKみたいです。

 

 4, ペイントで適当な画像を作って、tesseract-ocrのインストールフォルダにぶち込む
 (pngでもtiffでも結果は変わりませんでした)

tesseract-yomitori-1-2
tesseract-yomitori-2

 5, 「tesseract.exe XXX.png(tiff) YYY -l jpn」(XXX, YYYは任意)で実行する。

 6, YYY.txtとして、tesseract-ocrインストールフォルダに結果が出てくる。

tesseract-10
tesseract-result-2



 

 上記の識字率が驚異的だったため、「理想的環境じゃなくてもいける!!」と、スキャン文章にOCRをかけてみたけど、もう見れたもんじゃなかった。その後、スキャン文章から学習データを作成してOCRしてみたけど、BOXファイルの編集が概念すぎてやってられなかった上に、識字率も悪かった。

 

 BOXファイルの生成をなんとかできればうまく学習できると思うので、 次回は学習データの作成というタイトルで記事を作ってみようかな。

 

 BOXファイルの生成で使う予定のソフトウェアはこれです。文字位置を確認しながらの手編集は、つらいのでやめたほうがよいです。

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

 時代の波には乗れていないのかもしれないが、いまさらtesseract-ocrを使ってみました。本当はいろいろなものを試してみたい感はあるのですが、google先生以上のものはないと信じて、tesseract-ocrでいってみます。

 

 とりあえず、tesseract-ocrをダウンロード。

github.com

 

 Makeとかそういうのは、ちょっとぼくにははやすぎるんで、以下の方法でWindows環境の実行ファイルを取得しました。

tessera-ocrのダウンロード
  1. 上記リンク先から、Installing Tesseract項 「Install Tesseract via pre-built binary package」 をクリック
  2. Windows項 「Tesseract at UB Mannheim」 をクリック
  3. Tesseract at UB Mannheim項 「tesseract-ocr-setup-4.00.00dev.exe」をクリック
 
 その他ホームページを参考にしたら、日本語学習データを取得しよう!と記述されていたのですが、インストーラなら学習データも一緒に取得できるみたいです。一応、日本語の学習データは下記にありました。
 
日本語学習データのダウンロード
  1. (上記手順2から)Windows項 「download the appropriate training data」をクリック
  2. Data Files for Version 4.00項 「jpn.traineddata」をダウンロード

 日本語版ならjpn, 英語版ならeng,はっきりわかんだね。engはオプション設定しなくてもプリインストールされていました。

 

 折角、ブログというものに書いているので、ブログの練習がてら、手順を画像で添付してみます!

 

Ver.4.00のインストール方法

1, NEXT!

f:id:atwgwu:20170509201225p:plain

 

2, 「I accept the terms of the License Agreement」をチェックして、やはりNEXT!

f:id:atwgwu:20170509201314p:plain

 

3, NEXT!!!

f:id:atwgwu:20170509201412p:plain

 

4, 「Additional language data」チェックボックスで「japanese」を選びNEXT!

f:id:atwgwu:20170509201503p:plain

 

5, インストールしたい場所を選ぶとよいよ。NEXT!

f:id:atwgwu:20170509201627p:plain

 

6, Install!

f:id:atwgwu:20170509201755p:plain

 

 長くなりすぎるのもあれなんで、次の記事で簡単に認識してみます。

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

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

 

 今回取り掛かった問題は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

↑このページのトップヘ