2018年07月01日

PHP で HTML をスクレイピング

●PHP SimpleXMLElement:読み出しやすい、追加のみ
●PHP DOMDocument:追加・削除できる
●PHP DOMXPath:domを柔軟にアクセス

というわけで 最終的に任意のノードを変更する為、PHP DOMDocument で HTML を DOM としてパース(スクレイピング)。
<?php
$html=<<<EOT
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <div class="chapter" name="1章 ようこそ">
      <h1>1-1節 remix.asia</h1>
      <div class="paragraph">
        文章
      </div><!-- paragraph -->
    </div><!-- chapter -->
    <div class="chapter" name="2章 言語"><!-- 章の数だけ繰り返し -->
      <h1>2-1節 HTML</h1>
      <div class="paragraph">
        HyperText Markup Language...
      </div><!-- paragraph -->
      <h1>2-2節 PHP</h1>
      <div class="paragraph"><!-- 節の数だけ繰り返し -->
        Hypertext Preprocessor
      </div><!-- paragraph -->
    </div><!-- chapter -->
  </body>
</html>
EOT;
$dom = new DOMDocument( '1.0', 'UTF-8' );
if( false == $dom->loadHTML( $html ) ){
  return;//error
}
の前提で...▼

続きを読む "PHP で HTML をスクレイピング" »

2018年06月30日

フックでプル&バックアップを自動化

 前回の構成「サーバー上のGitでWEBコンテンツリリース」で、(A/4)へのリリースや(B/3)へのバックアップを手動から自動にするには。
(A)で
$ sudo vi /opt/git/◆◆◆.git/hooks/post-receive
(B)からの push で、自動で(A)の★★★へリリース(pull)する場合
#!/bin/sh
git --git-dir=★★★/.git pull origin master
ただし、push 出来る人には制限が必要。
(A)のベアリポジトリ(1)/opt/git/◆◆◆.git への更新タイミングで(B/3)を自動更新(バックアップ)にする場合
#!/bin/sh
git --git-dir=/opt/git/◆◆◆.git push --mirror USER@HOST:/opt/git/◆◆◆.git
のように post-receive を作成し、実行権限をつけて完成。
$ sudo chown admin:wheel /opt/git/◆◆◆.git/hooks/post-receive
$ sudo chmod +x /opt/git/◆◆◆.git/hooks/post-receive

続きを読む "フックでプル&バックアップを自動化" »

サーバー上のGitでWEBコンテンツリリース

(A)WEBサーバ   (B)開発/検証/バックアップ機
(1) /opt/git/◆◆◆.git      
(2) ★★★
  <<-----ssh
ssh----->>
 
(3) △△△◆◆◆.git
(4) ★★★
   

続きを読む "サーバー上のGitでWEBコンテンツリリース" »

2018年06月24日

無料SSL証明書(Let's Encrypt)でVirtualHost

 CentOSは
$ cat /etc/redhat-release
CentOS release 6.9 (Final)
 カーネルは
$ uname -r
2.6.32-696.10.1.el6.i686
 Webサーバは
$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Jun 19 2018 15:47:03
 例としてWebのドメイン名は
example.com
 Webのドキュメントルートは
/home/taro/web/example.com/document
https://letsencrypt.jp/usage/
に目を通し
https://letsencrypt.jp/usage/install-certbot.html
の通りに...▼

続きを読む "無料SSL証明書(Let's Encrypt)でVirtualHost" »

2018年06月23日

Microsoft Edge で仮想サーバ(VirtualBoxゲストOS)にアクセスできない

 Microsoft Edge ブラウザは、ループバックアドレスにアクセスできない仕様。回避方法は
1.コンパネ インターネットオプション ローカルイントラネット サイト 「他のゾーンに指定されていないローカルのサイトをすべて含める」チェックを外す
2.about:flags 「ローカルホスト ループバックを許可する」にチェック Edge再起動
3.仮想サーバのNAT側にポートフォワーディングを設定(例:8888)し、Edge ブラウザからは http://127.0.0.1:8888/ でアクセス。

2018年06月17日

cuiなCentOS6ホストでVirtualBox仮想サーバーインポート

 前回『cuiなCentOS7ホストでVirtualBox仮想サーバーインポート』のCentOS6版。
 マシン等は前回と全く同じ。  CentOSは
# cat /etc/redhat-release
CentOS release 6.9 (Final)
 カーネルは
# uname -r
2.6.32-696.30.1.el6.x86_64
 手順は...▼

続きを読む "cuiなCentOS6ホストでVirtualBox仮想サーバーインポート" »

2018年06月16日

cuiなCentOS7ホストでVirtualBox仮想サーバーインポート

 リソースの少ないマシンを活用するため、cuiのみのCentOS7をホストOSとしたVirtualBoxで 他からエクスポートした仮想イメージをインポート・稼動させる。

 マシンは2010年発売の Intel Celeron CPU E3400 2.6GHz 2コア、メモリ4GB、300GBSATA HDDの64-bitパソコン。
 CentOSは
# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
 カーネルは
# uname -r
3.10.0-862.3.3.el7.x86_64
手順は...▼

続きを読む "cuiなCentOS7ホストでVirtualBox仮想サーバーインポート" »

2018年06月10日

linuxにうっかり貯めてしまったメールをgmailへ

 linux(centos6.9)サーバ構築後、後回しにしていたメール設定。
 デフォルトでは
/var/spool/mail/taro
にメールの実体が蓄積。ちなみにroot宛もtaroに転送設定済み。
$ mail
で確認できる大量のメール(おおかたLogwatch)をgmailへ移動する...▼

続きを読む "linuxにうっかり貯めてしまったメールをgmailへ" »

2018年06月09日

Androidアプリをlinuxコマンドラインでビルド(CentOS7.3 32bit)

 今回のOSは
CentOS-7-i386-Minimal-1611.iso
で構築した32ビット版のミニマムインストール
CentOS release 7.3.1611 (AltArch)
javac 1.8.0_171
openjdk version "1.8.0_171"
ldd (GNU libc) 2.17
CentOS7 64bitの時と同様の手順でビルドすると
:app:mergeDebugResources
AAPT err(Facade for 25944244): /opt/android-sdk/build-tools/25.0.2/aapt: /opt/android-sdk/build-tools/25.0.2/aapt: バイナリファイルを実行できません
このエラーメッセージからは様々な情報見つかるが、そもそも32ビットOSには対応していないことが原因。エミュレータの為なのか???
 どうしても32ビットOSでビルドしたければ、32ビット版の build-toolsを指定する...▼

続きを読む "Androidアプリをlinuxコマンドラインでビルド(CentOS7.3 32bit)" »

2018年06月03日

Androidアプリをlinuxコマンドラインでビルド(CentOS6.9 64bit)

前回、CentOS7 64bit + openjdk1.8 + Android Studio Command line tools(sdk-tools-linux-4333796.zip) OK。 しかしミニマムインストールの CentOS6.9 64bitに同様のインストールするとビルドに失敗する。
:app:mergeDebugResources
AAPT err(Facade for 464201322): /opt/android-sdk/build-tools/25.0.2/aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/android-sdk/build-tools/25.0.2/aapt)
GNU Cライブラリ(glibc) が古いことが原因。
yum info glibc
2.12
https://developer.android.com/studio/ によれば動作要件は
GNU C Library (glibc) 2.19 or later
前回 CentOS7 64bitでは 2.17 で一応ビルド成功している。 様々なlibc関連の情報が見つかり ソースからのメークも試したものの、最終的には...▼

続きを読む "Androidアプリをlinuxコマンドラインでビルド(CentOS6.9 64bit)" »

2018年06月02日

Androidアプリをlinuxのコマンドラインでビルドする(CentOS7 64bit)

 32ビット版CentOS6.9でダメだったので いろいろ調べてみることに。
OSは
CentOS-7-x86_64-Minimal-1611.iso
で構築した64ビット版のミニマムインストール
CentOS Linux release 7.3.1611 (Core)
ビルド環境は
https://developer.android.com/studio/
で、現時点の Command line tools only の Linux版
sdk-tools-linux-4333796.zip
をダウンロード。ルートではなく
# useradd -g wheel taro
で作成したユーザーで操作。java は
$ sudo yum -y install java-1.8.0-openjdk-devel
$ javac -version
javac 1.8.0_171
$ java -version
openjdk version "1.8.0_171"
アンドロイド コマンドライン ビルド ツールは...▼

続きを読む "Androidアプリをlinuxのコマンドラインでビルドする(CentOS7 64bit)" »

2018年04月15日

スクリーンセーバーの参考となる古いサンプル

https://android.googlesource.com/platform/packages/screensavers/WebView/+/master/
の WebView-master.tar.gz を展開・コンパイルすると、「&~; がない」、「head がない」、「body がない」など不思議なエラー。
C:\Users\taro\AndroidStudioProjects\ScreensaverWeb\app\src\main\res\assets\default.html
Error:(20, 22) Error: エンティティ"ldquo"が参照されていますが、宣言されていません。
Error:Execution failed for task ':app:mergeDebugResources'.
> C:\Users\toshi\AndroidStudioProjects\ScreensaverWeb\app\src\main\res\assets\default.html:20:22: Error: エンティティ"ldquo"が参照されていますが、宣言されていません。
原因は・・・▼

続きを読む "スクリーンセーバーの参考となる古いサンプル" »

2018年04月14日

オリジナルスクリーンセーバー

 Androidのスクリーンセーバーに動画を使いたい。
 ところが、標準の「フォト」でmp4形式動画ファイルを指定しても再生できない。
 オリジナルスクリーンセーバーを追加できそうなので作ってしまう。
 決め打ちの Movies/sample.mp4 を繰り返し再生するだけのシンプルなアプリコードをGitHubに公開。
https://github.com/remixgrjp/DreamServiceMovie
Android studio 2.3.3 でビルド可能。Empty Activity からプロジェクトを作成し
app/src/main/AndroidManifest.xml
app/src/main/java/asia/remix/daydreammovie/DreamServiceMovie.java
app/src/main/res/layout/dream_service.xml
を編集したもの。
 Widgetと同じくRun → Edit Configuraions... → Run/Debug Configuraions → Launch Option → Nothing とすればインストール可能。

続きを読む "オリジナルスクリーンセーバー" »

2018年04月08日

au HTC J butterfly HTL23 バッテリー交換

HTL23 フルセグ受信・ワンセグタイマー録画可能で 画素数・音質良しのau HTC J butterfly HTL23。
 このバッテリーが寿命となって交換することに、もちろん自己責任で。必要最小限の分解交換手順・・・▼

続きを読む "au HTC J butterfly HTL23 バッテリー交換" »

2018年04月07日

VirtualBox 5.2.8 の Host Only Network

VirtualBox 5.2.8 ホストOS Windows7 home
VirtualBox Version 5.0.10
で構築したホストオンリーネットワーク構成CentOS 6.9仮想サーバイメージが配布先
 ホストOS Windows10 home
VirtualBox Version 5.2.8
で起動に失敗。この現象の情報は多くホストオンリーネットワークのMACアドレス更新で解消。
 ところが今度は DHCPクライアントアドレスが割り当たらない。ちなみに、
echo "#" > /etc/udev/rules.d/75-persistent-net-generator.rules
として、NICの自動設定は無効化済み。解決方法は・・・▼

続きを読む "VirtualBox 5.2.8 の Host Only Network" »

2018年04月01日

エンターでデフォルトアクションを指定する方法

 次のようなフォームのテキスト入力ボックス内でエンターすると formタグ内で最初の submitボタンが動作する。
<form method="post" action="{$script}">
<input type="submit" name="action_Change" value="変換" />
<input type="text" name="word" value="{$form.word}" />
<input type="submit" name="action_Search" value="検索" />
</form>
ethna の type="hidden" value="dummy" では IE で実現できない。  単純なものならフォームを分離すればよいが、どうしても分離できない場合の解決方法は...▼

続きを読む "エンターでデフォルトアクションを指定する方法" »

Android音声合成の基本形

android.speech.tts.TextToSpeech でテキストを読み上げる最小限サンプル。
Githubのソースは AndroidStudio2.3.3 Basic Activityテンプレートが元。
app/build.gradle

compile 'com.android.support:appcompat-v7:24.+'
compile 'com.android.support:design:24.+'

としてAndroid2.3 以上に対応。ポイントは...▼

続きを読む "Android音声合成の基本形" »

2018年02月24日

Android7 の x86版 を仮想環境にインストール

前提環境は次の組み合わせ。
android-x86_64-7.1-r1.iso / Windows 7 / Virtualbox 5.0.10
android-x86_64-7.1-r1.iso / Windows 10 / Virtualbox 5.1.30
文末でエクスポートイメージをプレゼント!
一通りの流れは...▼

続きを読む "Android7 の x86版 を仮想環境にインストール" »

2017年12月22日

仮想環境で動画キャプチャ

プリンストン PCA-DAV2 をオラクルVirtualBox仮想環境のLinuxから動画キャプチャする手順。
PCA-DAV2 は、ホストOS(Windows7)でドライバとともに正常にインストール済み。
前提環境は
DELL vostro 3550
Windows7 pro64ビット
VirtualBox 5.2.0 + Extension Pack拡張
CentOS 6.9(ミニマムインストール)

仮想環境のUSBは2.0では失敗する為 USB 3.0 (xHCI) コントローラーを有効化しフィルターに "eMPIA Technology, Inc. USB 2861 Device" を追加して起動。
PCA-DAV2 VBOX USB
次は...

続きを読む "仮想環境で動画キャプチャ" »

2017年11月03日

ラジコの録音環境を再構築

サーバーのリプレースを機にラジコの録音環境を再構築。
2013年の「らじるらじる の 録音」と「ラジコ の 録音」から依存関係を精査してよりシンプルに。
環境は、CentOS6.9 。極力yumでインストール。
●rtmpdump と ffmpeg が含まれる リポジトリ rpmforge がクローズしているため riken.jp から拝借。
[admin@localhost ~]$ sudo yum -y install http://ftp.riken.jp/Linux/repoforge/redhat/el6/en/i386/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.i686.rpm

続きを読む "ラジコの録音環境を再構築" »

2017年10月26日

ApiDemos のビルド

 参考にする為 グーグルのサンプル ApiDemos をビルドした時の記録。
 環境は、Windows7, Android Studio 2.3.3 SDK23, Nexus 5(Android 6.0.1)。

https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/
から最新のソースを取得して Android Studioでインポート。
SDK26 のインストールを求められるので追加。
さらに SDK24, 25 のインストールを求められるので追加。

 なぜか
ApiDemos\app\src\main\res\xml\preference_switch.xml
の拡張子.xmlが無くなっている為ビルドエラーとなるのでファイル名を修正。

 次は
「パッケージandroid.support.annotationは存在しません」
「パッケージandroid.support.v4.printは存在しません」
と警告されたので
Project Structure > app > Dependencies > +
からライブラリを検索して追加。
ApiDemos\app\build.gradle
の dependencies ブロックに
compile 'com.android.support:support-annotations:26.0.0-alpha1'
compile 'com.android.support:support-v4:26.0.0-alpha1'
が追記される。

 最後まで残ったエラー
「パッケージcom.google.android.mmsは存在しません」
については これとは別にソースをビルド必要な模様。
 今回 通信関係のサンプルは不要なので依存しているソース
ApiDemos\app\src\main\java\com\example\android\apis\os
MmsWapPushReceiver.java
MmsMessagingDemo.java
を削除してビルド成功。野良アプリでよければ→ ApiDemos.apk

続きを読む "ApiDemos のビルド" »

2017年10月23日

勝手にパノラマ画像が!?

最大瞬間風速30から45メートルで関東を通過中の台風21号 ラン(LAN)。
Nexus 5、Android 6.0.1 で 多摩川の様子を続けて5枚撮影。1枚目と4枚目は誤フラッシュやベランダ写りこみの為削除。
なんとか会社に到着し、撮影から約3時間後にパノラマ写真が出来上がったという通知が。
▼IMG_20171023_054855.jpg 左方向

▼IMG_20171023_054906.jpg 正面

続きを読む "勝手にパノラマ画像が!?" »

2017年10月07日

消えた"VirtualBox Host-Only Network"を復元する

無線LANよりギガビット有線LANを利用したく DELL XPS13 に IO-DATA USB TYPE-C対応 マル
チアダプタ US3C-UERGB/H を追加。
すると VirtualBox の 仮想LinuxにSSHできない。
Windowsネットワークアダプタ "VirtualBox Host-Only Network" が不在。

ホストOS Windows10 home
VirtualBox Version 5.1.18

ホストオンリーネットワークを復活するコマンド...▼

続きを読む "消えた"VirtualBox Host-Only Network"を復元する" »

2017年10月06日

ラジコでNHKが

2017年9月上旬にNHKの「らじるらじる」の仕様が変わった模様。
2017年10月上旬から「radiko」の番組表にNHKが加わった模様、2018年3月までの試験らしい。
東京エリアの放送局リストのXMLにNHK第一、第二、FMが追加されている。
http://radiko.jp/v2/station/list/JP13.xml

公開中のエアーチェックデモ
http://www.remix.asia/blog/ac_demo/radiko/
も地域別に上記最新XMLを取得しているのでちゃんとNHKが選択可能に。

2017年08月07日

英語ニュース自動ダウンロード 仕様変更2

またしても 以前設置した「英語ニュース自動ダウンロード」のWEB構成が仕様変更。
RSSのパスまで変わってしまうので手動で変更。
https://www3.nhk.or.jp/nhkworld/en/radio/latest/
のページの右上のPodcast

https://www3.nhk.or.jp/rj/podcast/rss/english.xml
によれば、ダウンロードファイルは
https://www3.nhk.or.jp/nhkworld/upld/medias/en/radio/news/20170806200000_english_1.mp3
のようなので、cron 設定(crontab -e)は
25 21 * * 0-5 cd ~/xx;wget -q https://www3.nhk.or.jp/nhkworld/upld/medias/en/radio/news/`date +\%Y\%m\%d`200000_english_1.mp3 1>/dev/null
オールSSLになった模様。

2017年08月06日

スマートフォンを内線電話のように使う

Windows7上のVirtualBox Version5.0.10 で RedHat 64ビット仮想環境を作成。
ネットワークはブリッジアダプターとし、その他はデフォルトの設定値。
http://www.asterisk.org/downloads/asterisknow
から
AsteriskNow-1013-current-64.iso
をダウンロードし、仮想環境のストレージ→光学ドライブへ指定後 起動。
Centos6系同様にインストールし、ネットワーク設定にLAN内の固定IPを指定。

続きを読む "スマートフォンを内線電話のように使う" »

2017年08月05日

仮想環境で動画のクロップ

linux上で動画の切り出しをするため久々に mplayer インストールを試みたところ、どうやらリポジトリ rpmforge がクローズになったようで、代わりに ftp.riken.jp から mplayer をインストール。
ll /etc/yum.repos.d
sudo rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
sudo rpm -ivh http://ftp.riken.jp/Linux/repoforge/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
ll /etc/yum.repos.d
sudo yum -y --enablerepo=rpmforge install mplayer* libdvdcss
これでインストール完了。動画(Nexus5で撮影)の詳細情報を確認して...

続きを読む "仮想環境で動画のクロップ" »

2017年04月30日

オリジナルandroid.view.View参考

Android ADK 組込みプログラミング完全ガイド (Smart Mobile Developer)
全サンプルコードは
https://www.shoeisha.co.jp/book/detail/9784798125930
からダウンロード可能。
『第8章 Android 対応の電子オルゴールを作る』
の簡易サンプルの画面・・・▼


続きを読む "オリジナルandroid.view.View参考" »

2016年08月12日

simple_list_item_1 + SimpleAdapter

android.widget.ListView を使う定番サンプル。
String[] strings = { "1列目", "2列目", "3列目" };
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
	getApplicationContext()
,	android.R.layout.simple_list_item_1
,	strings
);

実際には選択リストの表示名とは別にひもづいた値を利用することがほとんど。
そこで標準のレイアウト android.R.layout.simple_list_item_1 のまま android.widget.ArrayAdapter ではなく android.widget.SimpleAdapter に交換してみる。 あえて動的配列で...
ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map = new HashMap<String, Object>();
map.put( "display", "1列目" );
map.put( "offset", 1 );
arrayList.add( map );
map.put( "display", "2列目" );
map.put( "offset", 2 );
arrayList.add( map );
map.put( "display", "3列目" );
map.put( "offset", 3 );
arrayList.add( map );

SimpleAdapter simpleAdapter = new SimpleAdapter(
	getApplicationContext()
,	arrayList
,	android.R.layout.simple_list_item_1 ←★
,	new String[]{ "display"},
	new int[]{android.R.id.text1} ←★
);

2016年08月11日

地図に十字中心線を表示

Android Studio2.1.2 のテンプレートGoogleMapsActivityの地図上に十字中心線を表示する簡単な方法。
その前に、Google Maps APIキーをセットしコンパイルすると
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
メソッド数の上限を超えた(Building Apps with Over 65K Methods)
→ https://developer.android.com/studio/build/multidex.html?hl=ja
ということで
MyApplication\app\build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "asia.remix.map"
        minSdkVersion 10
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        multiDexEnabled true ★追加
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.google.android.gms:play-services:9.4.0'
}

MyApplication\app\src\main\AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest package="example.myapplication"
          xmlns:android="http://schemas.android.com/apk/res/android"
    >

    <!--
         The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but you must specify either coarse or fine
         location permissions for the 'MyLocation' functionality. 
    -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name="android.support.multidex.MultiDexApplication" ★追加
    >

        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key"
            />

        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
それぞれ ★印の行を追加。
ちなみに googleの巨大なライブラリを使う場合
MyApplication\gradle.properties

左ペインツリー Projectの Gradle Scripts/gradle.properties

VM起動オプション
org.gradle.jvmargs=-Xmx2048m
を指定するとメモリ不足解消とコンパイル時間を短縮(約1/10)。
本題の十字中心線は...▼

続きを読む "地図に十字中心線を表示" »

Powered by
Movable Type 3.34
***