NIKE+のデータのGARMIN Connectへの移行

今まで貯めたNIKE+のデータを、GARMIN Connectに引っ越すのに
うまくいった手順を書きます。
1)NikePlus Exporter – Chrome Web Store – Googleというサイトから、
  Chrome拡張機能をブラウザにインストールします。
  https://chrome.google.com/…/efkemfpncfijoebnohkjcbapljidekmp
2)ブラウザのアドレスバーの右に出来た「丸の中に+」のアイコンを
  クリックし、NIKE+のサイトにログインします。
3)表示されたアクティビティ一覧表の各行の「GPX」をクリックして、
  ダウンロードします。
4)ダウンロードした「~.gpx」のファイルを、GARMIN Connectの
  アクティビティ画面の「手動アップロード」をクリックして、
  「ファイルを選択」で指定します。
5)「ファイルからアクティビティをアップロードする」をクリックして、
  1件移行完了です。
6)予定件数移行したところで、「クィック編集」にてタイトルなどを変えます。

カテゴリー: つれづれ | コメントする

番組「風の電話」放送のお知らせ

同期生の奥様が、ナレーションを担当します。
良い番組だそうです。
ご覧いただければ幸いです。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
番組放送のお知らせ
 2月8日 日曜日 朝10時~11時 NHK総合
明日へ
 大切なあなたへ~心で話す「風の電話」

みなさんは被災地岩手県大槌町の「風の電話」をご存知ですか?

震災後ここに置かれた白い電話ボックスの中には電話線のつながっていない電話が一つ置かれています。
伝えたくても伝えることのできなかった思いを、いま伝えるためにたくさんの人がその電話ボックスを訪れます。

震災後の人々の心の様子がよく描かれた良い番組になりました。
私、中井貴恵がナレーション担当します。
どうぞご覧ください。

カテゴリー: つれづれ | コメントする

岩手県人連合会で地区ふるさと会と友好

1月24日に連合会の懇親会がありました。
ふるさとやはば会の山崎副会長から会報をいただきましたので、
ここで共有します。
ふるさとやはば2015(会報)

カテゴリー: つれづれ | コメントする

IE11でも、まだ継子・・・補正手段の記録

IEの時だけ有効なCSSは、次のハックを使った。

<STYLE TYPE="text/css">
DIV .IEcheck {
  margin-top:0px;     /* ハックなし */
}
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
 DIV:not(:target) .IEcheck {
   margin-top:-300px; /* IE */
 }
}
</STYLE>
カテゴリー: テスト | コメントする

本年もよろしくお願いします

カテゴリー: つれづれ | コメントする

ホノルルマラソンの写真です

AllSportsが撮ってくれた写真集です。

全体報告は、ココ
記録集はココです。
藤井のBib#は、18644 でした。
因みに、大田区で3位です。

カテゴリー: つれづれ, マラソン | コメントする

Web画面とExcelでの罫線情報の変換

ExcelとWeb画面のスタイルで、罫線指定のレベルが異なるため、次の変換を実施した。
<罫線の太さ>  <Excel>  <HTML(CSS)>
太線        1px                      2px
細線                       thin                    1px

例えば、PHPでは、次のようにExcelに向けて変換記述する。

$html['html'] = str_replace(
    array('width: 1px;','width: 2px;','width: 2px 1px 2px 2px;','width: 1px 1px 1px 2px;','width: 1px 1px 2px 2px;'),
    array('width: thin;','width: 1px;','width: 1px thin 1px 1px;','width: thin thin thin 1px;','width: thin thin 1px 1px;'),
    $html['html']);
カテゴリー: テスト | コメントする

PHPでSSLサイトやLocation:飛ばしのサイトを読む

ブログパーツのPHP化で、ソケット対応をしたので、記録しておく。

  • PHPがインストールされているかチェックする
        <script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
        <script>
        $(document).ready(function()
        {
                //POSTメソッドで送るデータを定義します var data = {パラメータ名 : 値};
                var data = {request : $('#request').val()};
                $.ajax({
                    type: "POST",
                    url: "send.php",
                    data: data,
                    success: function(data, dataType)
                    {
                        if (data.slice(0,2)=="OK") {
    			document.getElementsByName('jsphp')[0].value = "PHP";
    			document.getElementById('ifrm').outerHTML = '<iframe id="WPifrm" frameborder=0 height=8 src="" ></iframe>';
    		    }
    		    else document.getElementByName('jsphp')[0].value = "legacy";
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown)
                    {
                        // レガシーモードのまま
                        document.getElementByName('jsphp')[0].value = "legacy";
                    }
                });
                return false;
        });
        </script>
    
  • send.php
    <?php
    header("Content-type: text/plain; charset=UTF-8");
    if (isset($_POST['request']))
    {
        echo "OK";
    }
    else
    {
        echo 'The parameter of "request" is not found.';
    }
    ?>
    
  • HTMLページのソケット読み
    //ソケットでデータを取得 by 村田佑介、 SSL追加 by Fujii
    function data_get($url,$authuser="",$authpass=""){
    	global $base;
    	unset($basic);
    	$tmp = parse_url($url);
    	if($tmp['query']){
    	    $tmp['path'] .=  "?".$tmp['query'];
    	}
    	if($tmp['fragment']){
    //            $tmp['path'] .= "#".$tmp['fragment'];
    	}
    	if ($tmp['scheme']=="http")
    	 $fp = fsockopen($tmp['host'], 80, $errno, $errstr, 4); // 80番ポートに接続
    	elseif ($tmp['scheme']=="https")
    	 $fp = fsockopen("ssl://".$tmp['host'], 443, $errno, $errstr, 4); // 443番ポートに接続
    	else print "Scheme invalid. {$tmp['scheme']}";
    	if(!$fp){
    	    print $errno.":".$errstr; 
    	    return array("status" => "connect_fail","msg" => $errstr);
    	}
    	$base = $tmp['scheme']."://".$tmp['host']."/";
    	$out = "GET {$tmp['path']} HTTP/1.1\r\n"."Accept: */*\r\n"."Content-Type: application/x-www-form-urlencoded\r\n";
    	$out .= "Host: {$tmp['host']}\r\n";
    	$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36\r\n";
    	if($authuser){
    	    $out .= "Authorization: Basic ".base64_encode($authuser.":".$authpass)."\r\n"; 
    	}
    	$out .= "Connection: Close\r\n\r\n";
    	fwrite($fp, $out);
    	stream_set_timeout($fp, 4);
    	//コンテンツ部分の受信
    	$in = '';
    	while (!feof($fp)) {
    	    $in .= fgets($fp, 4096);
    	}
    	fclose($fp);
    	//ヘッダーとコンテンツ部分に分割
    	$in = explode("\r\n\r\n",$in);
    	//ヘッダーを配列に格納
    	$info = decode_header($in[0]);
    	if ($info['status']=="301" || $info['status']=="302") {
    		// Moved Parmanentry or Temporary
     print $info['location']."<br>";
    		if (substr($info['location'],0,6)=="/leaf/") // goo,OCNの深い層
    		  return(put_dict("http://".$tmp['host'].$info['location'],
    			'<!--wordTitle-->','<!--/wordTitle-->','+'));
    		else {
    		  return(data_get(((substr($info['location'],0,4)=='http')?
    		   "":$tmp['scheme']."://".$tmp['host']).$info['location'],
    		 	$authuser,$authpass));
    		}
    	}
    	//デコード
    	unset($in[0]);//ヘッダー削除
    	$in = join("\r\n\r\n",$in);
    	$body = decode_body($info, $in);
    	return mb_convert_encoding($body, "UTF-8","auto");
    }
    	
    function decode_header($str){
    	//<CRLF>ごとに分割
    	$part = preg_split("/\n/", $str, -1, PREG_SPLIT_NO_EMPTY);
    	$out = array ();
    	for ($h = 0; $h < sizeof($part); $h++) {
    	    if ($h != 0) {
    		// :で区切ってkeyとvalueを作成
    		$pos = strpos($part[$h], ':');
    		$k = strtolower(str_replace(' ', '', substr($part[$h], 0, $pos)));
    		$v = trim(str_replace("\r", '',substr($part[$h], ($pos + 1))));
    	    } 
    	    else{
    		//1行目ステータスコード
    		$k = 'status';
    		$v = explode (' ', $part[$h]);
    		$v = $v[1];
    	    }
    	    //keyとvalueを配列に格納
    	    if ($k == 'set-cookie') $out['cookies'][] = $v;
    	    else		    $out[$k] = $v;
    	}
    	return $out;
    }
         
    function decode_body ($info, $str, $eol = "\n"){
    	$tmp = str_replace("\r", '',$str);
    	$add = strlen($eol);
    	//チャンク形式の判定
    	if (isset($info['transfer-encoding']) &&
    		 ($info['transfer-encoding'] == 'chunked')) {
    	    do {
    		//チャンクサイズを取得して10進数に変換
    		$tmp = ltrim($tmp);
    		$pos = strpos($tmp, $eol);
    		$len = hexdec(substr($tmp, 0, $pos));
    		if (!is_int($len)) break;               
    		//圧縮転送されている場合解凍する
    		if (isset($info['content-encoding'])) {
    		    $str2 .= gzinflate(substr($tmp, ($pos + $add + 10), $len));
    		} 
    		else{
    		    $str2 .= substr($tmp, ($pos + $add), $len);
    		}
    		$tmp = substr($tmp, ($len + $pos + $add));
    		$check = trim($tmp);
    	    } while (!empty($check));
    	}
    	elseif(isset($info['content-encoding'])) {
    	//圧縮転送されている場合解凍する
    	    $str2 = gzinflate(substr ($tmp, 10));
    	}
    	else    $str2 = $str;
    	return $str2;
    }
    ?>
    
カテゴリー: テスト | コメントする

WordPressウィジェットへのブログパーツの導入

WordPressにおいて、一般に出回っているブログパーツを簡単に設置できれば
便利なので、ノウハウをまとめた。

  1. ウィジェットエリアにテキスト・ウィジェットを貼り付ける。
  2. タイトル設定後、本体に例えば次のようなiframeを記述する。
    <iframe src=”/gadget/SpotRuby.php” height=nn></iframe>
    srcには、パーツのhtmlやphp,cgiファイルなどのリンクを記述する。
  3. ウィジェットではなく投稿本体に置きたい場合は、Inline frame-Iframe
    などのプラグインを使用し、ショートコードでフレームを記述する。
  4. ブログパーツの操作結果でWP関数を含むPHPを起動する必要がある場合は、
    やはりiframeを用意しておき、srcにid指定でPHPへのパーマリンクを書き込む。
    このPHPファイルは、WordPressで固定ページとして定義しておき、そのパーマリンクで呼び出す。
    iframeの高さ(height)は最初0にしておいて、パーツ操作時にjavascript等で変更してもよい。
    投稿部への結果表示なら、ショートコードを使う。
    例:[enbedsite src=”” id=”WPifrm” frameborder=0 width=”100%” height=0]
  5. ブログパーツでは、「iframe-IDが見つかったらそこへページ出力する、
    見つからなかったら、新Windowをオープンする。」というロジックを
    組み込んでおけば便利である。e在京白堊会では、header.phpの中に隠しiframeを
    置いてある。

以上

カテゴリー: テスト | コメントする

WordPressテーマカストマイズで工夫したこと

WordPressテーマカストマイズで工夫したことを忘れないように記録しておきます。

・myFunction.phpの設置
・Teacup掲示板投稿の取り込み・再構成・HTML保存
・掲示板投稿日の最新チェックとNew!マーク
・Newカウント値のメニューへの表示(myFunctionに記述)
・メニューだけ再表示
・掲示板巡回データの保存・再利用

0)myFunction.phpの設置
functions.phpに次の1行を追加し、関数追加編集を容易にする。
Include_my_php(array(‘file’=>’myFunction’));

1)Teacup掲示板投稿の取り込み・再構成・HTML保存
一般掲示板の投稿データの取り込みと整形
投稿タイトル部と本体を分け、本体は「続きを読む」で表示
//
$url…掲示板のURL
$unq…ID=生成用のユニーク接頭子
$filter..単独掲示板か複数集約モードか
$mno…メニューIDの基準値
dispNewS()…投稿日からNew!判定の関数
echo_save()..echoでHTML出力するとともに、$buffに貯める

//
function put_Teacup($url,$unq ,$filter, $mno)
{
    $response = wp_remote_get($url, array( 'timeout' => 5));
    if(is_wp_error($response)) {
    // wp_dieは、エラーメッセージを表示し、WordPressの処理を中断する関数
	    wp_die(esc_html($response->get_error_message()));
    }
    $html_header = 'text/html; charset=UTF-8';
    if(!isset($response['headers']['content-type']) ||
	 $response['headers']['content-type'] != $html_header) {
	echo($response['headers']['content-type']);
	wp_die('ヘッダー情報がHTMLではありません。');
    }
    $table = "";
    $pos = 8192;
    $stop = 6; if ($filter!="") $stop = 11;
    $body = $response['body'];
    for ($i=1;$i<$stop;$i++) {
	$pos = mb_strpos($body,"<H2>",$pos);
	 if ($pos === false) break;
	$pos2 = mb_strpos($body,"<TABLE ",$pos);
	 if ($pos2 === false) print "<br>mb_strpos2がfalseを返しました。<br>";
	$pos3 = mb_strpos($body,'<TD VALIGN="top" WIDTH="30">',$pos2+8);
	 if ($pos3 === false) print "<br>mb_strpos3がfalseを返しました。<br>";
	$pos4 = mb_strpos($body,"<TABLE ",$pos-230);
	$table .= mb_substr($body,$pos4,$pos-$pos4);
	$table1 = "<H4>".mb_substr($body,$pos+4,mb_strpos($body,"</TD>",$pos2-80)-($pos+4));
	$pos  = mb_strpos($table1,"投稿日")+4;
	$pos4 = mb_strpos($table1,"日",$pos);
	$table1 = mb_substr($table1,0,$pos).dispNewS(mb_substr($table1,$pos,$pos4-$pos), $mno).mb_substr($table1,$pos);
	$table .= str_replace("編集済","",str_replace("返信・引用","",str_replace("</H2>","</H4></TD><TD align=right nowrap><A href=\"JavaScript:hiraku('tuzuki".$unq.$i."');\"><font size=2>▼続きを読む</A></TD></TR>\n<TR><TD>",$table1)));
	$table .= "</TR></TABLE>\n<DIV CLASS='tuzukiwak' ID='tuzuki".$unq.$i."'>";
	$pos2 = mb_strpos($body,"<TT>",$pos2);
	$table .= '<TABLE WIDTH="100%" CELLPADDING="1" CELLSPACING="2" BORDER="0"><TR><TD VALIGN="top" ALIGN="left">'.outofteacup(mb_substr($body,$pos2,$pos3-$pos2));
	$table .= "</TR><TR><TD align=right nowrap><A href=\"JavaScript:tatamu('tuzuki".$unq.$i."');\"><font size=2>▲たたむ</A>&nbsp;&nbsp;<a href='#header'>▲TOP</a></TD></tr></table></td></tr></table>\n\n";
	$pos = $pos3 + 10;
    }
    echo_save($table."</DIV>\n");
}

2)掲示板投稿日の最新チェックとNew!マーク

function dispNewS($str, $mno) {
  $dateYMD = str_replace(" ","0",str_replace(array('年','月'), '-', $str));
  return dispNew(strtotime($dateYMD), $mno);
}
function dispNew($date, $mno) {
  $days = 35;  // 最新の範囲日数(仏教徒)
  $today = date('U');
  $date1 = $date;
  if ($date==null) $date1 = get_the_time('U');
  $period = date('U', ($today - $date1)) / 86400;
  if ($days > $period) {
    array_push($GLOBALS['menew'], $mno);  // 別ページとの連携
    if ($date==null) echo '<font color=red>New!</font>';
    else return '<font color=red>New!</font>';
  }
  return "";
}
function echo_save($str) {
  global $buff;
  echo ($str);
  $buff .= $str;
}

3)Newカウント値のメニューへの表示(myFunctionに記述)

$num = 0;
function add_nav_menu_custom_class( $sorted_menu_items ) {
    global $num;
    if (is_page_template('sample-page.php') ||
        is_page_template('notation-page.php')) {
	$num = 1;
	foreach ( $sorted_menu_items as &$item ) {
		if (in_array($num,$GLOBALS['menew'])) {
		 $item->new = count(array_filter($GLOBALS['menew'], "find_v"));
		} else 	      $item->new = false;
		$num++;
	}
    }
    return $sorted_menu_items;
}
    function find_v($v) {
	global $num;
	return ($v == $num);
    }
add_filter( 'wp_nav_menu_objects', 'add_nav_menu_custom_class' );
function my_walker_nav_menu_start_el( $item_output, $item, $depth, $args ) {
    if ( isset($item->new) && ($item->new!=false)) {
		// New の表示
		$item_output = preg_replace( '@</a>@', " <font color=red>New!</font>({$item->new})</a>", $item_output );
	}
    return $item_output;
}
add_filter( 'walker_nav_menu_start_el', 'my_walker_nav_menu_start_el', 10, 4 );

4)メニューだけ再表示

// Javascriptを出力しておく。
<SCRIPT language="JavaScript"><!--
function menuCUT() {
 document.getElementById('access').outerHTML =
	"<div id='repmenu'><div class='menu-header'><ul class='menu'><li>メニュー</li></ul></div></div>";
}
function menuRDY() {
 a = document.getElementById('access').outerHTML;
 document.getElementById('access').outerHTML = "";
 document.getElementById('repmenu').outerHTML = a;
}
//--></SCRIPT>
// Newカウンターの更新
<?php
$GLOBALS['menew'] = explode(" ", get_option('menew',""));
get_header(); // メニューの初期表示
?>
<script type="text/Javascript">
 window.setTimeout("menuCUT()",100);
</script>
//
// PHPでの本体出力処理・・・・
//
// menuの再作成
<div id="access" role="navigation">
	<div class="skip-link screen-reader-text"><a href="#content" title="<?php esc_attr_e( 'Skip to content', 'twentyten' ); ?>"><?php _e( 'Skip to content', 'twentyten' ); ?></a></div>
	<?php wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'primary' ) ); ?>
</div><!-- #access -->
// 再表示
<script type="text/Javascript">
 window.setTimeout("menuRDY()",400);
</script>

5)掲示板巡回データの保存・再利用

<?php
  $buff = "";
  $nenji = get_option('nenjiBBS',array('stamp'=>0, 'html'=>""));
  $today = date('U');
  $date = $nenji['stamp'];
  $period = date('U', ($today - $date)) / 3600; // 1時間以内は、従前再利用
  if ($filter=="" && (1> $period)) :
	echo ($nenji['html']);
  else:
//
// PHPでの本体出力処理・・・・
//
     if ($filter=="") {
	$nenji['stamp'] = date('U');
	$nenji['html'] = $buff;
	update_option('nenjiBBS', $nenji);
     }
  endif;
  $buff = "";
// menuの再作成
// 再表示
?>

以上

 

カテゴリー: テスト | 3件のコメント