とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

yum install onedrive

パッケージを検索するサイト(https://pkgs.org)でonedriveのパッケージを見付けたのでCentOS7にyumでインストールしてみました。

パッケージの詳細

https://centos.pkgs.org/7/harbottle-main-x86_64/onedrive-1.0.1.20180106gitc7e0930-1.el7.harbottle.x86_64.rpm.html

どうやら https://github.com/skilion/onedrive のパッケージをDコンパイラコンパイルして実行ファイルにしたもののようです。

リポジトリ(harbottle-main)を追加する

$ yum install https://harbottle.gitlab.io/harbottle-main/7/x86_64/00703701-harbottle-main-release/harbottle-main-release-7-5.el7.noarch.rpm
読み込んだプラグイン:fastestmirror
harbottle-main-release-7-5.el7.noarch.rpm | 10 kB 00:00:00
/var/tmp/yum-root-WjeDc7/harbottle-main-release-7-5.el7.noarch.rpm を調べています: harbottle-main-release-7-5.el7.noarch
/var/tmp/yum-root-WjeDc7/harbottle-main-release-7-5.el7.noarch.rpm をインストール済みとして設定しています
依存性の解決をしています

    • > トランザクションの確認を実行しています。
      • > パッケージ harbottle-main-release.noarch 0:7-5.el7 を インストール
    • > 依存性解決を終了しました。

依存性を解決しました

=============================================================================================================
Package アーキテクチャ
バージョン リポジトリー 容量
=============================================================================================================
インストール中:
harbottle-main-release noarch 7-5.el7 /harbottle-main-release-7-5.el7.noarch 18 k

トランザクションの要約
=============================================================================================================
インストール 1 パッケージ

合計容量: 18 k
インストール容量: 18 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : harbottle-main-release-7-5.el7.noarch 1/1
検証中 : harbottle-main-release-7-5.el7.noarch 1/1

インストール:
harbottle-main-release.noarch 0:7-5.el7

完了しました!

yum searchでonedriveを探してみる。

$ yum search onedrive

読み込んだプラグイン:fastestmirror
base | 3.6 kB 00:00:00
epel/x86_64/metalink | 7.0 kB 00:00:00
extras | 3.4 kB 00:00:00
harbottle-main | 3.5 kB 00:00:00
ius | 2.3 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/2): harbottle-main/x86_64/primary_db | 54 kB 00:00:01
(2/2): ius/x86_64/primary_db | 243 kB 00:00:01
Loading mirror speeds from cached hostfile
* base: ftp.jaist.ac.jp
* epel: ftp.riken.jp
* extras: ftp.jaist.ac.jp
* ius: hkg.mirror.rackspace.com
* updates: ftp.jaist.ac.jp
=========================================== N/S matched: onedrive ===========================================
onedrive.x86_64 : OneDrive Free Client written in D
onedrive-debuginfo.x86_64 : Debug information for package onedrive

Name and summary matches only, use "search all" for everything.

インストールしてみる

$ yum install onedrive
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: mirror.dmmlabs.jp
* extras: ftp.iij.ad.jp
* ius: dfw.mirror.rackspace.com
* updates: ftp.iij.ad.jp
依存性の解決をしています

    • > トランザクションの確認を実行しています。
      • > パッケージ onedrive.x86_64 0:1.0.1.20180106gitc7e0930-1.el7.harbottle を インストール
    • > 依存性の処理をしています: libdruntime-ldc.so.77()(64bit) のパッケージ: onedrive-1.0.1.20180106gitc7e0930-1.el7.harbottle.x86_64
    • > 依存性の処理をしています: libphobos2-ldc.so.77()(64bit) のパッケージ: onedrive-1.0.1.20180106gitc7e0930-1.el7.harbottle.x86_64
    • > トランザクションの確認を実行しています。
      • > パッケージ ldc-druntime.x86_64 1:1.7.0-2.el7.harbottle を インストール
      • > パッケージ ldc-phobos.x86_64 1:1.7.0-2.el7.harbottle を インストール
    • > 依存性解決を終了しました。

依存性を解決しました

=============================================================================================================
Package アーキテクチャ
バージョン リポジトリー 容量
=============================================================================================================
インストール中:
onedrive x86_64 1.0.1.20180106gitc7e0930-1.el7.harbottle harbottle-main 213 k
依存性関連でのインストールをします:
ldc-druntime x86_64 1:1.7.0-2.el7.harbottle harbottle-main 526 k
ldc-phobos x86_64 1:1.7.0-2.el7.harbottle harbottle-main 2.0 M

トランザクションの要約
=============================================================================================================
インストール 1 パッケージ (+2 個の依存関係のパッケージ)

総ダウンロード容量: 2.7 M
インストール容量: 13 M
Is this ok [y/d/N]: y
Downloading packages:
警告: /var/cache/yum/x86_64/7/harbottle-main/packages/ldc-druntime-1.7.0-2.el7.harbottle.x86_64.rpm: ヘッダー V3 RSA/SHA1 Signature、鍵 ID e148e740: NOKEY
ldc-druntime-1.7.0-2.el7.harbottle.x86_64.rpm の公開鍵がインストールされていません
(1/3): ldc-druntime-1.7.0-2.el7.harbottle.x86_64.rpm | 526 kB 00:00:02
(2/3): onedrive-1.0.1.20180106gitc7e0930-1.el7.harbottle.x86_64.rpm | 213 kB 00:00:00
(3/3): ldc-phobos-1.7.0-2.el7.harbottle.x86_64.rpm | 2.0 MB 00:00:05

                                                                                                                                                                                                                        • -

合計 493 kB/s | 2.7 MB 00:00:05
https://copr-be.cloud.fedoraproject.org/results/harbottle/main/pubkey.gpg から鍵を取得中です。
Importing GPG key 0xE148E740:
Userid : "harbottle_main (None) "
Fingerprint: f1df c563 31a9 d77e a8cc ae17 df9b 4194 e148 e740
From : https://copr-be.cloud.fedoraproject.org/results/harbottle/main/pubkey.gpg
上記の処理を行います。よろしいでしょうか? [y/N]y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : 1:ldc-druntime-1.7.0-2.el7.harbottle.x86_64 1/3
インストール中 : 1:ldc-phobos-1.7.0-2.el7.harbottle.x86_64 2/3
インストール中 : onedrive-1.0.1.20180106gitc7e0930-1.el7.harbottle.x86_64 3/3
検証中 : 1:ldc-druntime-1.7.0-2.el7.harbottle.x86_64 1/3
検証中 : 1:ldc-phobos-1.7.0-2.el7.harbottle.x86_64 2/3
検証中 : onedrive-1.0.1.20180106gitc7e0930-1.el7.harbottle.x86_64 3/3

インストール:
onedrive.x86_64 0:1.0.1.20180106gitc7e0930-1.el7.harbottle

依存性関連をインストールしました:
ldc-druntime.x86_64 1:1.7.0-2.el7.harbottle ldc-phobos.x86_64 1:1.7.0-2.el7.harbottle

完了しました!

onedriveの認証と起動

下記ページの手順通りにします。
https://github.com/skilion/onedrive

onedriveのバージョンについて

$ onedrive --version
onedrive 1.0.1.20180106gitc7e0930

2018年2月11日現在の最新は v1.1.1 なので少し古いです。

CentOS7でOneDriveを利用する

CentOS7でOneDriveを利用するために、ぐぐって初めに見付けた
Free Client for OneDrive on LinuxをCentOS7にインストールしてみました。
https://github.com/skilion/onedrive


コマンドラインから明示的にクラウド側と同期することは出来ますが、
デーモンとして動きませんでした。
CentOSだとcronで定期的に同期コマンド(onedrive --resync)を実行するしかないのかな??


そもそも、readme.mdにデーモンとして起動するのはUbuntuのみと書かれてましたが見落としてました。

Note: systemd is supported on Ubuntu only starting from version 15.04

Dコンパイラーをインストールしてソースコードからビルドまでしたのに・・・ううっ


次は、Python3で書かれているonedrived-devを試してみる予定。
https://github.com/xybu/onedrived-dev

DNSでWEB広告を削除する

Raspberry Pi 3 Model B にdnsmasq(軽量なDNS)を導入して、ウェブページの広告削除を行いました。
その時に調査した情報を簡単にまとめました。

ネットワークは詳しくないため間違いや勘違いあると思います。
ご注意ください。

2018/12/25更新

関連記事です。
ohtorii.hatenadiary.jp

困っていること

家庭内のデバイス(Windows/MAC/Android/iPhone/WindowsPhone...)からウェブを閲覧すると、
不愉快(微エロ、微グロテスク、、、)な広告が表示されて困っていました。

ブラウザの広告削除(Adblock plusなど)プラグインを導入して一時しのぎを行っていましたが、
ブラウザ毎(IE,Chrome,safari,Firefox...)に設定する必要があり手間でした。

更に、家族が利用している「デバイス x ブラウザ x アカウント」の組み合わせで、
設定の手間が増えるため、家庭内ネットワークの根元で広告削除の対策を行うことにしました。



以下は、調査メモです。

広告削除ができるSynologyの無線LANルーター「RT2600ac」

https://internet.watch.impress.co.jp/docs/column/shimizu/1070396.html
約27,000円 (2018年1月現在)

広告を配信している業者のドメインを追加できるか不明。
そもそもお値段が結構するので家庭内稟議が通らないです。

yamahaルーター

FWX120
https://network.yamaha.com/products/firewalls/fwx120/index
47,800円(2018年1月現在)


ファイヤウォール設定で広告削除を配信しているサイトをブロックできそうな雰囲気ですが、
にわか家庭内サーバ管理者向けの製品じゃないな・・・

ファイヤーウォールルーターを自作

Intel NUCなどの小型PCを利用して広告を削除できるファイヤーウォールルーターを自作する。
https://www.sophos.com/ja-jp/products/free-tools.aspx


なんかもっとこう簡単にできないものか・・・
Unix系OSはSambaサーバを立てたことがある程度の初心者です。(メインはWindowsとハードウェアメーカーの独自OS)
階段を三段跳びして派手にこけそうなのでもっと小さく始めたい。

広告を派除するProxyサーバを立てる(Squid)

Squidというproxyサーバを立てて広告を削除する方法。


(情報源:Proxyサーバの立て方)
https://mizukama.sakura.ne.jp/blog/archives/3063
http://toshtone.hatenablog.jp/entry/2016/09/26/193942


(情報源)
Adblock Plus形式のブロックリストをsquidの設定ファイルに変換するスクリプト
https://github.com/jamesmacwhite/squidguard-adblock


(情報源:Proxyの自動設定を行うpacファイル)
http://nofx2.txt-nifty.com/it/2012/08/proxypac-1e5d.html


(情報源:各ブラウザのプロキシ設定を自動で行う方法)
http://www.atmarkit.co.jp/ait/articles/0001/16/news001.html

WPAD(Web Proxy Auto-Discovery)プロトコルを利用して、DHCPDNSのようにクライアント側での設定の手間を無くす。
DHCPサーバが「DHCPINFORM」プロトコルをサポートしている必要があり、そうでなければ「wpad」という名前を持つホストからproxyの設定ファイルを取得します。

CentOSルーターを自作してSquidを透過型プロクシにすると、WPADプロトコルProxyサーバのアドレスを配布する手間が無くなりそう。
https://futuremix.org/2007/06/squid-transparent-proxy


Adblock Plusの設定ファイルを扱えるので最強っぽいが、
私が利用している市販ルーターProxyサーバのアドレスを配布する設定がないのが残念。
今回は見送ることにした。

広告を派除するProxyサーバを立てる(privoxy)

privoxyというproxyサーバを立てて広告を削除する方法。


(情報源:設定方法など)
http://benzaiten.dyndns.org/roller/ugya/entry/adblock_filter_for_privoxy_cygwin
https://hayabusa6.5ch.net/test/read.cgi/linux/1065176466/


(情報源:コンバータ)
Adblock Plusの設定ファイルをprivoxyの設定ファイルに変換するツール。
https://projects.zubr.me/wiki/adblock2privoxy


Squid同様に使えそうな感じがします。

DNS(dnsmasq)を利用する

広告を配信している業者のドメイン名に対して0.0.0.0を返答するDNSを立てる。


(情報源)
http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_wifi_wireless_access_point_dnsmasq/
広告を配信している業者のドメイン名を収集しているサイトの記事もあり大変参考になりました。


家庭内で利用している市販ルーターDNSサーバのアドレスを指定することができるので、運用できそうな気がする!!

方法

CentOSDNS(Dnsmasq)を立てて広告を配信している業者のドメイン名に0.0.0.0を返答するようにしました。
サーバの構築は終わっていて運用のフェーズに入っています。
WEB広告以外にもスマートフォンアプリ内の広告も表示されなくなったので快適です。

DNSの設定方法や広告業者のドアドレス一覧を取得する方法などは後日別の日記に纏めます。

最後に

家庭内ネットワークの広告削除をネットワークの基幹で対応したので、初めてのことだらけで構築は大変でした。
ただ、その甲斐あって運用は大分楽になりました。
10年以上も前からWEB広告を削除するためのDNSやProxyを立てている方々が国内外におられるので、
情報は多く困ることはありませんでした。


一旦はDNSで運用していますが、最終的にはAdblockPlusの設定ファイルを利用したProxyで運用したいです。

イオンモバイルの利用料金をスクレイピングした。(Python+selenium)

経緯

私が契約しているイオンモバイルでは、請求金額を通知するサービスを行っていません。(※)
なので、今まで個人ページで毎月確認していました。

さすがに繰り返しの手作業が面倒になったので、自分の個人ページをスクレイピングして毎月の請求金額をメール通知するようにしました。

(※)イオンモバイルでは請求金額を通知するサービスはありますか? | よくあるご質問|業界最安級 イオンの格安スマホ・格安SIM【イオンモバイル】

以下は、請求金額のページをスクレイピングする最小のソースコードと使い方です。

スクリプトの実行方法

コマンドプロンプトで以下のように実行。
>python.exe aeon_mobile.py お客様ID パスワード

実行結果

コマンドプロンプトに明細をダンプ表示します。
数値が揃っていなくて見にくいですが、細かなことは気にしない!!!
料金は個人情報なので適当に書き換えてます。

**2017年 11月分**
金額(税込)1,234円


**料金明細**
4GBプラン                             123円
追加音声シェア料金                              456円
通話料                          78円
SMS通信料                               9円
イオンでんわ割引通話(国内)                            10円
ユニバーサル料                          11円
イオンでんわ 10分かけ放題                               123円

ソースコード(python+selenium)

aeon_mobile.py というファイル名で保存してください。

"""utf8-bom
イオンモバイルの利用料金をスクレイピングするサンプル。

usage:
python.exe aeon_mobile_pay.py お客様ID パスワード

"""
import sys
from selenium import webdriver
import selenium



#ご利用明細
class Detail(object):
    __slots__ = ("title","money")
    def __init__(self,title="",money=""):
        #プラン名、通話料、通信料・・・
        self.title=title
        #金額
        self.money=money

#月の明細
class InvoiceDetail(object):
    __slots__ = ("month","money","details")
    def __init__(self,month="",money=""):
        #年月
        self.month=month
        #金額(税込)
        self.money=money
        #料金明細
        self.details=[]

    def to_plane_text(self):
        pool=[]
        pool.append("**%s**"%self.month)
        pool.append("金額(税込)%s" % self.money)
        pool.append("\n")
        if not self.details:
            return "\n".join(pool)

        pool.append("**料金明細**")
        for item in self.details:
            pool.append(item.title + "\t\t\t\t" + item.money)

        return "\n".join(pool)


def jump_usage_details_page(driver):
    """ご利用明細のページに切り替える。
    """
    try:
        driver.find_element_by_link_text('ご利用明細').click()
        return
    except(selenium.common.exceptions.NoSuchElementException):
        pass

    #ウインドウ幅が狭くナビゲーションの文字が表示されていない状況なので、
    #左上のボタンをクリックしてメニューを開く。
    driver.find_element_by_xpath('/html/body/div[1]/nav/div/a[2]/i').click()

    #see. https://teratail.com/questions/64684
    elem=driver.find_element_by_xpath('//*[@id="nav-mobile"]/li[2]/a')
    driver.execute_script("arguments[0].click();", elem)


def scraping(driver):
    #
    #ご利用明細のページをスクレイピングする。
    #
    invoice = InvoiceDetail()
    jump_usage_details_page(driver)
    if True:
        #
        #最新の月を処理する。
        #
        invoice.month = driver.find_elements_by_class_name("strong")[0].text
        invoice.money = driver.find_elements_by_class_name("zeikomi")[0].text
        driver.find_elements_by_class_name("link_button")[0].click()
    elif False:
        #
        #1つ前の月
        #
        invoice.month = driver.find_elements_by_class_name("strong")[1].text
        invoice.money = driver.find_elements_by_class_name("zeikomi")[1].text
        driver.find_elements_by_class_name("link_button")[1].click()
    else:
        #
        #2つ前の月
        #
        invoice.month = driver.find_elements_by_class_name("strong")[2].text
        invoice.money = driver.find_elements_by_class_name("zeikomi")[2].text
        driver.find_elements_by_class_name("link_button")[2].click()

    #
    #ご利用明細を取り出す
    #

    #memo
    #[0]    ご利用金額合計(税込)・・・のテーブル
    #[1]    サービス名・・・のテーブル
    details=driver.find_elements_by_tag_name("tbody")[1]
    for tr in details.find_elements_by_tag_name("tr"):
        td = tr.find_elements_by_tag_name("td")
        #サービス名
        service_name = td[0].text
        #金額
        mony = td[1].text
        invoice.details.append(Detail(service_name,mony))

    return invoice


def main(id,pw):
    driver = webdriver.Chrome('C:\selenium\chromedriver')
    driver.get('https://mypage.aeondigitalworld.com/mypage/')

    #ウインドウサイズを小さくする(debug)
    #driver.set_window_size(640,480)

    #ログイン処理
    driver.find_element_by_name('userId').send_keys(id)
    driver.find_element_by_name('password').send_keys(pw)
    o=driver.find_element_by_xpath('//button').click()
    invoice = scraping(driver)
    driver.quit()

    print(invoice.to_plane_text())


if __name__ == '__main__':
    id=sys.argv[1]
    pw=sys.argv[2]
    main(id,pw)

注意

スクレイピングを推奨する意図はありません。
ソースコードなどのご利用は自己責任でお願いします。

【解決】「SONY Xperia J1 Compact +MacBookAir+USBテザリング」でインターネットに接続できない。

現象

MAcBookAirでスマホとUSBテザリングを行うと、スマホWIFI経由だとインターネットに接続出来るがLTE回線だと接続出来ない。

接続方法

MacBookAir -> USB -> スマホ(SONY Xperia J1 Compact)

解決方法

Androidファイヤーウォールとして動作する、NoRootファイアウォールをアンインストールしたらインターネットに接続出来ました。
このアプリはVPN接続を利用するので何か悪さしていたのかも・・・
[https://play.google.com/store/apps/details?id=app.greyshirts.firewall&hl=ja:title=
]

環境

スマホSONY Xperia J1 Compact
ノートPC:MacBookAir+USBテザリング

補足

MacBookAirはHoRNDISとXperia Companionをインストールして、
USBテザリングが出来るようにしています。
https://dryfeed.me/mac/mac-android-usb
Mac OS El Capitan で Android USB tethering (HoRNDIS) - Qiita

seleniumとpywinautoでChromeのWEBページを印刷する。


背景

我が家では嫁が家計簿を付けているので、毎月クレジットカードの利用明細を紙に印刷して提出しています。
嫁がアナログな人なので「紙で提出して!」と言って聞かないのです・・・

毎月繰り返し手作業で利用明細を印刷するのが、さすがに面倒になってきたので自動化する事に決めました。

発生した問題

このような、繰り返しのジョブ実行はjenkinsさんにおまかせするとして・・・
今回の最大の問題点はseleniumchromeブラウザの組み合わせでは、そもそも印刷ダイアログが開かないことでした。
WEBを検索すると幾つかの解決策がありますが、私の環境ではどうやっても印刷ダイアログが開きませんでした。

(WEBの情報)
以下のどれを試しても印刷ダイアログは開きませんでした。

  • driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL,'p')
  • ActionChains(driver).send_keys(Keys.CONTROL, 'p').perform()

以下は、printメソッドを実行することで印刷ダイアログが開きますが、
印刷の詳細設定を行う方法が分からず、私の実力では手詰まりになりました。

  • driver.execute_script('window.print()')
  • driver.execute_async_script('window.print()')

問題の解決方法

そこで、Windowsの操作を自動化するpywinauto(pythonモジュール)を利用して印刷ダイアログの制御を行いました。
seleniumではブラウザの制御を担当させて、pywinautoには印刷ダイアログの制御を担当させました。

(処理の流れ)
[selenium]chromeブラウザを開く。
[selenium]クレジットカードの利用明細ページへのログイン。
[selenium]利用明細ページへ移動する。
[pywinauto]印刷ダイアログを開き、印刷設定を行ってから印刷を行う。
[pywinauto]印刷ダイアログを閉じる。
[selenium]chromeブラウザを閉じる。

サンプルコード

import time,pywinauto
from selenium import webdriver

def main():
    driver = webdriver.Chrome('C:\selenium\chromedriver')
    driver.get(クレジットのログインページ)

    #ログイン処理を行う。(省略)
    
    #利用明細のページへ移動する。(省略)

    #印刷処理
    print_dialog()

    #適当に待機しないと印刷が開始されない。
    #ブラウザのテキストや画像をプリンターに送信している最中にブラウザを閉じる(driver.quit)と印刷が開始されないようだ。
    time.sleep(5)

    driver.quit()


def print_dialog():
    #
    #印刷ダイアログを開いてページ指定してから印刷する。
    #

    pywinauto.keyboard.SendKeys("+^P")

    a_check = lambda:pywinauto.findwindows.find_windows(title=u'印刷', class_name='#32770')[0]
    dialog = pywinauto.timings.WaitUntilPasses(5, 1, a_check)

    pwa_app = pywinauto.Application()
    pwa_app.connect(handle=dialog)

    window = pwa_app[u'印刷']
    window.Wait('ready')

    button = window[u'ページ指定(&G):']
    if button.is_enabled():
        #印刷範囲を指定する。
        button.Click()
        edit = window.Edit4
        edit.SetFocus()
        edit.set_text("1-2")

    #印刷ボタンを押す(Alt+P)
    pywinauto.keyboard.SendKeys("%P")
    
    #印刷ボタンを押すと印刷ダイアログは自動的に閉じるのでここでは何もしない。


if __name__ == '__main__':
    main()    

まとめ

とりあえず目的は達成しましたが、もっと良い方法があるかもしれません。
Seleniumは初めてなので今回はこれで良しとしました。

環境

  • Windows10 64bit
  • Python 3.6.3 64bit
  • Selenium 3.6.0
  • ChromeDriver 2.33.506120
  • pywinauto 0.6.1
  • chrome バージョン: 61.0.3163.100(Official Build)(64 ビット)

参考書籍

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

macOS High SierraでAudirvanaのDirectModeを利用する

MacBookAirをmacOSSierraからmacOS High Sierraにアップデートしたところ、AudirvanaのDirectModelが利用できなくなりました。

前回(id:ohtorii:20170716)の手順でDirectModeを利用できるようになりました。

環境

Audirvana Plus 2.6.8
macOS High Sierra 10.13
Esoteric D-07

[rakuten:audiounion:10002033:detail]

MacBook Air 1600/13.3 MMGF2J/A

MacBook Air 1600/13.3 MMGF2J/A