04 Feb 2018, 14:20

Google Homeから Linux上のパソコンをコマンド操作を自由にする

はじめに

GoogleHome/ IFTTT/ Beebotte、そして Pyhtonを使えば声をトリガーに任意の作業ができる。前回、ダーゲットPCに対して、別のサーバを用意していたけれどもど、今回の場合は実行したいPCを用意すれば良い。

まずは結果を。

[https://www.youtube.com/embed/ue_UKf3HSZE]

システム構築

基本的には前回の記事と同じだ。

マシンが違うので、異なるチャンネル beebotteで作成した。

出来るようになったこと

こである声をトリガにして、処理を実施するということができるようになった。

具体的には、

  • モニター OFF
  • モニターON
  • パソコン シャットダウン
  • パソコン Sleep
  • パソコン再起動

しかし、これだけではない。Linux上で実施するあらゆる操作がpythonコードを介して実現可能となった。これは大きな一歩だ。

#!/home/tsu-nera/anaconda3/envs/py3/bin/python
import paho.mqtt.client as mqtt
import json
import os

HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = '/home/tsu-nera/repo/python-scripts/mqtt.beebotte.com.pem'
TOKEN = '[チャンネルのトークン]'
TOPIC = 'Galleria/voice'

MONITOR_ON_CMD = "xset dpms force on"
MONITOR_OFF_CMD = "xset dpms force off"
PC_SLEEP_CMD = "systemctl suspend"
PC_OFF_CMD = "shutdown now"
PC_REBOOT_CMD = "shutdown -r now"

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))

def on_message(client, userdata, msg):
    data = json.loads(msg.payload)["data"][0]
    print(data)
    if data["device"]=="monitor" and data["action"]=="on":
        os.system(MONITOR_ON_CMD)
    elif data["device"]=="monitor" and data["action"]=="off":
        os.system(MONITOR_OFF_CMD)
    elif data["device"]=="pc" and data["action"]=="スリープ":
        os.system(PC_SLEEP_CMD)
    elif data["device"]=="pc" and data["action"]=="シャットダウン":
        os.system(PC_OFF_CMD)
    elif data["device"]=="pc" and data["action"]=="再起動":
        os.system(PC_REBOOT_CMD)
    else:
        print("Ivalid requset")
    
if __name__ == '__main__':
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.username_pw_set('token:%s' % TOKEN)
    client.tls_set(CA_CERTS)
    client.connect(HOST, PORT)
    client.subscribe(TOPIC)
    client.loop_forever()

04 Feb 2018, 06:37

Google Homeから Wake on Lanで パソコン起動

はじめに

Google Homeに 「パソコンつけて」といって、パソコンを起動してみました。

[https://www.youtube.com/embed/B1FW42dwSWs]

仕組み

必要なものは以下です。

  • Google Home(Google Assistants) ・・・ 音声インタフェース。トリガを与える口。
  • IFTTT(https://ifttt.com/) ・・・ Google Assistantsからの通知をトリガにして GET リクエストを Beeboteに投げる。
  • Beebotte(https://beebotte.com/) ・・・ MQTTメッセージBroker。 IFTTTからのRestを受け取る。Mindstormsからの mqttのポーリングに応答する。
  • Linuxサーバ(Raspberry Piをつかう人が大半だけれども、自分は持っていないので LEGO Mindstormsに ev3devいれている)
  • python + paho-mqtt ・・・ Pythonで mqtt通信を実施するためのライブラリ。
  • wakeonlan ・・・ wakeonlan発行ツール
  • 起動対象のパソコン

処理の流れは以下のような感じ。

  • GoogleHome -(音声)→ IFTTT -(REST)→ Beebotte ←(監視)- Mindstorms -(wol)-> PC

システム構築

基本的には、以下の記事に従って構築しました。

IFTTTや Beebotteの設定は上記記事に詳しく書いてあるので、参照してください。ここでは省略し、差分のみを書きます。

Mindstormsでの設定

Beebotteに通知されたGETリクエストを監視するために、paho-mqttを入れます。

$ sudo apt install pip
$ sudo pip install paho-mqtt

以下のようなスクリプトをpythonで書きました。

mqtt_client.py:

#!/usr/bin/python
import paho.mqtt.client as mqtt
import json
import os

HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = 'mqtt.beebotte.com.pem'
TOKEN = '[channelのトークン]'
TOPIC = 'MySmartHome/voice'
CMD = 'wakeonlan 70:85:c2:67:7a:66'

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))

def on_message(client, userdata, msg):
    data = json.loads(msg.payload)["data"][0]
    if data["action"] == "on":
        os.system(CMD)

if __name__ == '__main__':
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.username_pw_set('token:%s' % TOKEN)
    client.tls_set(CA_CERTS)
    client.connect(HOST, PORT)
    client.subscribe(TOPIC)
    client.loop_forever()

UbuntuでWake on Lanするための設定メモ | Futurismo

このスクリプトをシステム起動時に起動するようにサービス化します。

シェルスクリプトを作成。 /usr/local/bin/hal.sh

 #!/bin/bash
 /home/robot/scripts/mqtt_client.py 

サービスファイルを以下のように、作成 /lib/systemd/system/hal.service

シンボリックリンク作成。

ln -s /lib/systemd/system/hal.service /etc/systemd/system/hal.service

サービス起動。

sudo systemctl daemon-reload
sudo systemctl enable hal
sudo systemctl start hal

rebootして、サービス起動していればOK.

19 Jan 2016, 07:14

認知を変えてうつな自分を変える!Three Good Things について

Three Good Things とは、一言でいうと、

寝る前にその日にあったよいことを3つ書き残す習慣

です。

Three Good Things

Three Good Things とは、ポジティブ心理学の父、セリグマン博士が唱える習慣です。

Three Good Things のエクササイズは、 一週間の間、寝る前にその日にあったよいことを書き出し、 なぜそれがよかったのかをふりかえるものです。

なぜこれが効果的かというと、 心のフォーカスを悪くなることからそれを許せるように変え、 良くなることに注意を向けることで、心の圧力をこわし、幸福度をあげるからです。

Three Good Things は普段注意を払っていないことに注意をむけます。 人はよくいったことに注意を払わず、悪くいったことに注意を向けがちです。 なので、よくいったことに集中し、注意を向けることが重要なのです。

たったこれだけで、うつの改善に驚異的な効果を発揮するそうなのです。 以下記事も参考にしてください.

Three Good Things の効果

なぜ、このような単純な方法が効果的なのでしょうか?

それは 人々の関心事を悪いものからよいものへと変えることができるからです。 私たちはよいことを忘れがちでうまくいかなかったことをよく覚えている傾向があります。

なので、この傾向を逆転させるために、このエクササイズが必要なのです。 そして、よりよいものへと注意を向けることで、私たちの人生はよりポジティブになります。

また、一日の終わりに書くためのネタを日中つねに探すようになるので、 注意を普段ならば気にもとめないよかったことへと注意が自然と向かって行きます。

Three Good Things のやりかた

Three Good Thins のやり方は、

  • 就寝前に一日の間でよくいったことを3つ書き出す
  • なぜそれがよかったのかを振り返る

これだけです。

悪いことも無理やりよいことととらえてみる

<div class="outline-text-3" id="text-orgheadline4">
  <p>
    うつ病の有名な治療方法として認知療法があります。
  </p>

  <blockquote>
    <p>
      人が成長するにつれ固定的なスキーマが形成され、 それに基づいて歪んだ思考方法や考えが自然に浮かぶ自動思考が起こっており、 そうした認知の歪みに焦点を当てて、 認知を修正することで症状が改善されるとされる心理療法
    </p>
  </blockquote>

  <p>
    うつになりがちな人は考え方のクセがあり、 そのクセにしたがって物事をとらえると普通のことも悪くとらえてしまう傾向があります。
  </p>

  <p>
    よいことと悪いことは表裏一体だったりします。 そこで、無理やりにでも悪いことを良かったことに考え直すというのはどうでしょうか?
  </p>

  <p>
    悪く考えるクセを認知して、物事をポジティブに考える訓練としても Three Good Things は効果的です。
  </p>
</div>

Twitter でつぶやこう

<div class="outline-text-3" id="text-orgheadline5">
  <p>
    ツィッターで毎日つぶやいてもいいです(ハッシュタグ #3good)
  </p>

  <p>
    フォーマットをいい感じに整形してツイートできたらいいな。。と思ったそこのあなた。
  </p>

  <p>
    Web から簡単にツイートできる WEB アプリを開発しました(ここが本題!)
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://secure-ocean-2865.herokuapp.com/">https://secure-ocean-2865.herokuapp.com/</a>
    </li>
  </ul>

  <p>
    ツイッターでログインしてつぶやくだけのアプリですが是非利用してみてください.
  </p>

  <p>
    記事の反応がよければ SNS 機能を実装して いいね!とかできるようにしたいと思います
  </p>
</div>

11 Jul 2014, 01:14

pecoで実行コマンドを絞り込んで実行するpeco-M-x

今朝、Archlinuxのdmenuがうまく動かなくなった。

結果的には直ったのだけれども、 dmenuでやっているようなことをpecoでやってみたい。

やりたいこと

実行可能なコマンドを対話的コマンドで検索して、実行する.

Emacsのhelm-M-xのようなことをしたい。

実現方法

  1. 環境変数PATH配下にある実行可能コマンドを表示
  2. 表示結果をpecoで絞り込む。
  3. 検索結果を実行

Implement

シェルですべてかければよかったのだけれども、シェルが苦手なので途中でRubyに逃げた。

だれか、シェルで書き直してくれないかな。(他力本願)

08 Jun 2014, 10:31

実行可能なドキュメント生成!AnsibleとOrg-modeで実現するRun Book Automation(RBA)

はじめに

org-babel-tangleをEmacsの外のコマンドラインから実行する方法を調べました。

そして、生成したyamlファイルをansibleにわたして実行することで、 実行可能なドキュメントを生成してみました。

関連する過去記事は以下。

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      ArchLinux
    </li>
    <li>
      Emacs 24.3
    </li>
  </ul>
</div>

Emacs の関数をコマンドラインから実行する

org-modeでかかれたドキュメントを コマンドラインから変換するためのスクリプトを調べた。

以下のサイトから直接スクリプトを引用する。

#!/bin/sh
# -*- mode: shell-script -*-
#
# tangle files with org-mode
#
DIR=`pwd`
FILES=""

# wrap each argument in the code required to call tangle on it
for i in $@; do
    FILES="$FILES \"$i\""
done

emacs -Q --batch \
    --eval "(progn
     (add-to-list 'load-path (expand-file-name \"~/src/org/lisp/\"))
     (add-to-list 'load-path (expand-file-name \"~/src/org/contrib/lisp/\" t))
     (require 'org)(require 'org-exp)(require 'ob)(require 'ob-tangle)
     (mapc (lambda (file)
            (find-file (expand-file-name file \"$DIR\"))
            (org-babel-tangle)
            (kill-buffer)) '($FILES)))" 2>&1 |grep tangled
<p>
  このスクリプトを実行すると、コマンドラインからorg-babel-tangleが実行できる。
</p>

org-banel-tangleとansible-playbookを同時実行

枯れた自分のシェルスクリプトの知識を呼び覚まして、シェルスクリプトを書いた。

Indentをたもつために、以下のおまじないも加えた。

(setq org-src-preserve-indentation t)
<ul class="org-ul">
  <li>
    <a href="http://orgmode.org/worg/org-contrib/babel/languages/ob-doc-makefile.html">Makefile Source Code Blocks in Org Mode</a>
  </li>
</ul>

<p>
  </div> </div> 

  <div id="outline-container-sec-4" class="outline-2">
    <h2 id="sec-4">
      virtualboxのインストールスクリプト
    </h2>

    <div class="outline-text-2" id="text-4">
      <p>
        以下のようなorgファイルを用意した。
      </p>

      <blockquote>
        <p>
          * VirtualBox
        </p>

        <p>
          &#8211; [[https://wiki.archlinux.org/index.php/VirtualBox_(%E6%97%A5%E6%9C%AC%E8%AA%9E)][VirtualBox (日本語) &#8211; ArchWiki]]
        </p>

        <p>
          以下のモジュールが必要。
        </p>

        <p>
          &#8211; virtualbox<br /> &#8211; virtualbox-host-modules<br /> &#8211; qt4
        </p>

        <p>
          #+begin_src yaml :tangle yes<br /> &#8212;<br /> &#8211; hosts: localhost<br /> sudo: yes<br /> tasks:<br /> &#8211; name: Install VirtualBox<br /> pacman: name=virtualbox,virtualbox-host-modules,qt4<br /> #+end_src
        </p>

        <p>
          ArchLinuxでゲストOSを動かすためにはKernelモジュールをロードする必要がある。
        </p>

        <p>
          #+begin_src yaml :tangle yes<br /> &#8211; name: Load Kernel Module<br /> command: modprobe vboxdrv<br /> #+end_src
        </p>
      </blockquote>

      <p>
        コマンドラインから実行して、virtualboxをインストール成功!カッコいい。
      </p>

      <div class="org-src-container">
        <pre class="src src-sh">[tsu-nera]% ./ansible-org-tangled.sh archlinux/virtualbox.org

PLAY [localhost] **************************************************************

GATHERING FACTS *************************************************************** ok: [localhost]

TASK: [Install VirtualBox] **************************************************** ok: [localhost]

TASK: [Load Kernel Module] **************************************************** changed: [localhost]

PLAY RECAP ******************************************************************** localhost : ok=3 changed=1 unreachable=0 failed=0

      <p>
        もちろん、org-modeなので、HTMLへの出力とかもできる。
      </p>

      <p>
        githubにアップするだげで、orgファイルはいい感じに表示されるところがよい。
      </p>

      <ul class="org-ul">
        <li>
          <a href="https://gist.github.com/tsu-nera/83084289c9c6660812de">https://gist.github.com/tsu-nera/83084289c9c6660812de</a>
        </li>
      </ul>
    </div>
  </div>

24 May 2014, 06:18

Sikuli, Selenium, WSH, 3つの自動化ツールでGoogle検索自動化に挑め!

はじめに

前回、Sikuliの使い方を調べてみました。

今回は、Sikuliと別のツールを組み合わせてみます。前回記事の続編です。

やること

以下の手順を自動化します。

  1. firefoxを立ち上げる
  2. 検索窓にSikuliと入力する
  3. 検索ボタンをおす

以下のツールを利用します。

  • Sikuli … 画像認識による自動化ツール
  • Selenium … HTML解析による自動化ツール
  • WSH … キー操作の自動化ツール

なんだか、ヨットに対して戦車と軍艦と戦闘機で総攻撃をかけるような感じになってきた。

使う手段

JRubyです。以下を利用。

  • win32ole
  • sikulixapi
  • selenium-webdriver

win32oleはデフォルトで入っている。sikuliは前回記事を参照。

selenium-webdriverは、jgem install selenium-webdriverで問題なくインストール。

結果

自動化がキマるとけっこうきもちいい。

15 May 2014, 14:47

Web操作手順書を自動生成!Emacs org-babelで実現するRun Book Automation(RBA)

はじめに

RunBookAutomationや Code As Infrastructureという単語をよく耳にする今日この頃。 仕事でなにかと手順書を作成することがだれにでもあるはず。

今日は、文芸的プログラミングと、RunBookAutomationの概念を合体させて、 Web操作の作業手順書を自動作成してみます。

これは、以下の記事の続編です。つまり、selenium-webdriverを Web操作自動化のためのエンジンとして利用します。

以下の過去記事と関係があります。

[toc]

出力のためのツール org-babel

org-babelを利用する。

org-babelとは、文芸的プログラミングを実現するためのemacsの機能。

Babel: active code in Org-mode

Ruby Codeに出力

org-babelを利用して出力するには、rubyのcodeを以下のように囲む。

  #+begin_src ruby :tangle ./hello_rba.rb :exports none

<ul class="org-ul">
  <li>
    begin_src ruby &#x2026; rubyのコード
  </li>
  <li>
    :tangle ./hello_rba.rb &#x2026; rubyの出力ファイル指定
  </li>
  <li>
    exports none &#x2026; org-modeのexport機能ではcodeをexportしない。
  </li>
</ul>

<p>
  Rubyコードに書き出すには、以下を実施。
</p>

<div class="org-src-container">
  <pre class="src src-language">M-x org-babel-tangle

<p>
  これで、動作する手順書(RBA)が自動生成される。
</p></p>

HTMLに出力

org-export-dispatchから htmlを選択することで、htmlに変換可能。

このとき:exports noneのオブションのおかげで、rubyのコードは出力されない。

github風にオシャレな出力

<div class="outline-text-3" id="text-4-1">
  <p>
    pandocを利用して md から htmlに変換することで、cssがつかえる。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://shuzo-kino.hateblo.jp/entry/2014/02/16/220708">Pandocでドキュメント変換で楽する &#8211; Bye Bye Moore</a>
    </li>
  </ul>

  <p>
    このデザインがとても気に入った!Special Thanks
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">wget https://gist.github.com/andyferra/2554919/raw/2e66cabdafe1c9a7f354aa2ebf5bc38265e638e5/github.css

pandoc hello_rba.md -c github.css -s -o hello_rba.html

PDFに出力

pandocを利用してpdfに変換したかったけど、深刻な容量不足のため断念。

代替手段として、firefoxのプラグインでHTMLをpdfに変換した。

スクリーンショットを撮影

selenium-webdriverには、スクリーンショット撮影機能がある。

これを手順ごとに実施して、画像ファイルもorg-modeに含める。

wd.save_screenshot('screenshot.png')

<p>
  org-modeにはこんな感じで書く
</p>

<div class="org-src-container">
  <pre class="src src-language">[[./screenshot.png]]

<p>
  これで、画像がついてよりわかりやすくなった。
</p></p>

Code

RunBook

<div class="outline-text-3" id="text-7-1">
  <p>
    表示のために、冒頭に#を入れています。
  </p>

  <div class="org-src-container">
    <pre class="src src-language">#   * Hello RBA

** はじめに

Selenium Webdriverをつかって、Google検索します。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

require ‘pp’

require ‘selenium-webdriver’

#+end_src

** 手順

まずは、firefoxを立ち上げます。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd = Selenium::WebDriver.for :firefox

#+end_src

次に、https://www.google.co.jp/ にアクセスします。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.get “https://www.google.co.jp/"

wd.save_screenshot(‘screenshot.png’)

#+end_src

[[./screenshot.png]]

次に、検索窓に以下を入力します。

- “Selenium Builder”

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.find_element(:id, “lst-ib”).click

wd.find_element(:id, “lst-ib”).clear

wd.find_element(:id, “lst-ib”).send_keys “Selenium Builder”

wd.save_screenshot(‘screenshot2.png’)

#+end_src

[[./screenshot2.png]]

最後に、検索ボタンを押します。

#+begin_src ruby :tangle ./hello_rba.rb :exports none

wd.find_element(:name, “btnK”).click

#+end_src

#+begin_src ruby :tangle ./hello_rba.rb :exports none

sleep 3

wd.save_screenshot(‘screenshot3.png’)

wd.quit

#+end_src

[[./screenshot3.png]]

生成したCode

<div class="outline-text-3" id="text-7-2">
  <div class="org-src-container">
    <pre class="src src-language">require 'pp'

require ‘selenium-webdriver’

wd = Selenium::WebDriver.for :firefox

wd.get “https://www.google.co.jp/" wd.save_screenshot(‘screenshot.png’)

wd.find_element(:id, “lst-ib”).click wd.find_element(:id, “lst-ib”).clear wd.find_element(:id, “lst-ib”).send_keys “Selenium Builder” wd.save_screenshot(‘screenshot2.png’)

wd.find_element(:name, “btnK”).click

sleep 3 wd.save_screenshot(‘screenshot3.png’) wd.quit

Sample

22 Mar 2014, 09:40

RSpecのテスト結果をCSVで出力する

テスト項目表をExcelで作成する必要がある。

RSpecの実行結果をExcelにコピペするための楽な方法を考えてみたメモです。

RSpecのカスタムフォーマット

RSpecには、カスタムフォーマットという機能がある。

出力のフォーマットを自分でカスタマイズするための拡張ボイント。

この機能を利用して、CSVフォーマットでテスト結果を出力してみる。

前提条件

テスト項目表には、最低限以下のような項目を書く必要があると仮定する。

  • テスト番号
  • 大項目
  • 中項目
  • 小項目
  • 期待結果
  • 実施日

これらをRSpecのテストコードに埋め込む。

実装

メタデータをspecに埋め込む

<div class="outline-text-3" id="text-3-1">
  <p>
    RSpecのメタデータに、項目の情報を残す。デフォルトのメタデータは以下で見ることができる。
  </p>

  <pre><code>

it “テストです” do # すべての要素をみる example.metadata

# 特定の項目を見る
example.metadata[:description_args]

end

  <p>
    自分でメタデータを定義するには、 it &#8221; &#8220;, のあとに ハッシュ形式で書く。
  </p>

  <pre><code>

it “ほげほげであること” , :no => “1”, :date => “2014/03/22” do end

フォーマットスクリプトを作成する

<div class="outline-text-3" id="text-3-2">
  <p>
    フォーマットスクリプトは、デフォルトのフォーマッタを継承して作成する。
  </p>

  <p>
    必要なメソッドのみをカスタマイズする。
  </p>

  <ul class="org-ul">
    <li>
      initialise(output) はじめに呼ばれる
    </li>
    <li>
      example_started(example) サンプル開始時に呼ばれる
    </li>
    <li>
      example_passed(example) テスト成功時に呼ばれる
    </li>
    <li>
      example_passed(example) テスト失敗時に呼ばれる
    </li>
    <li>
      close() 最後に呼ばれる
    </li>
  </ul>

  <p>
    ほかにも、いろいろとメソッドがあるので、公式のドキュメント参照。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://rubydoc.info/gems/rspec-core/2.6.4/RSpec/Core/Formatters/DocumentationFormatter">Class: RSpec::Core::Formatters::DocumentationFormatter — Documentation for rspec-core (2.6.4)</a>
    </li>
  </ul>

  <p>
    今回は、Documentationフォーマットを継承する。
  </p>

  <pre><code>

def initialize(output) super(output) @results = Array.new end

def example_passed(example) super(example) result = createResult(example) result[:result] = “OK” @results << result end

def example_failed(example) super(example) result = createResult(example) result[:result] = “NG” @results << result end

def close output_csv() end

コマンド実行

<div class="outline-text-3" id="text-3-3">
  <p>
    コンソールから以下を叩く。
  </p>

  <pre><code>

rspec -I ../ -I . -r csv_formatter.rb csv_format_spec.rb -f CsvFormatter

  <p>
    -f のあとに自分がつくったフォーマッタのクラス名を渡す。
  </p>

  <p>
    -r のあとに自分がつくったスクリプトを渡す。
  </p></p>
</div></p>

コード

15 Jan 2014, 12:58

GTDの規律に従い生産性Up!!3分後にデスクトップ通知と音を鳴らすワンラインスクリプト(Linux)

GTDの規律には、3分以内に片付くタスクはその場で処理して、3分以上かかるものはとりあえずInboxにつっこむというものがある。

コマンドラインからストップウォッチを3分だけ起動したいと思い、そのような方法を考えました。

environment

sleep を利用

あまり考えない方法だと、sleepコマンドで時間を止めて、指定時間たつとコマンドを実行するというもの。

$ sleep 3 && echo test

echoだと気づかないので、できれば音やデスクトップ通知が欲しいところだ

cvlcを利用して音を出す

VLCプレーヤーのコマンドラインを利用して音を鳴らす。–play-and-exitで一回だけ再生。

$ cvlc --play-and-exit /usr/share/sounds/LinuxMint/stereo/desktop-login.ogg

notify-sendでデスクトップ通知

Linuxでは、send-notifyでデスクトップ通知ができる。

インストール

notify-sendは libnotify-binに含まれている。

$ sudo apt-get install libnotify-bin

以下で実行して、通知か表示されるか確認

$ notify-send test

notification-daemonのインストール

Gnome terminalからコマンドを実行すると動作するが、Guakeターミナルから実行すると、動作しない。

原因は欲分からないが、notification-daemonというものをインストールすると、Guakeからも動作するようになった。

$ sudo apt-get install notification-daemon

デーモンを起動する。

$ /usr/lib/notification-daemon/notification-daemon &

これで通知がでるようになった。時間指定のオプション -t が動作しないのが気になるが。。。

起動時にデーモン起動

notify-osdからnotification-daemonに切り替える | smokycat.infoを参考に、起動時にデーモンを起動するようにしてみる。

$ sudo emacs /usr/share/dbus-1/services/org.freedesktop.Notifications.service

3行目をコメントアウトして、4行目を追加。どうも、デフォルトでは notify-osdが起動していたようだ。notify-osdだと動かなかったと推測

[D-BUS Service] 
Name=org.freedesktop.Notifications
#Exec=/usr/lib/x86_64-linux-gnu/notify-osd
Exec=/usr/lib/notification-daemon/notification-daemon

タイマを改良

コマンドラインから利用できるカウントダウンタイマを探してみた。。結構時間をかけて探したけれども、結論としては、このツールがよい。

コマンドラインからカウントダウンやストップウォッチが起動できる。こんなツールを探していた!ダウンロードしてインストール。

$ ./configure
$ make && make install

たとえば、こんな感じ。

# 3sec countdowwn
% utimer -c 3
Time Remaining: 0 days 00:00:00.000 (0.000 seconds)

結論

このワンラインスクリプトに決定

/bin/sh -c 'sleep 180;notify-send "time over";cvlc --play-and-exit /usr/share/sounds/LinuxMint/stereo/desktop-login.ogg' &

11 Jan 2014, 05:34

namebenchでDNSサーバへの通信速度をベンチマーク!モバイルWifi環境を高速化する方法

namebenchでDNSサーバへの通信速度をベンチマーク!Wifi環境を高速化する方法

普段、家の外でノートPCを利用することが多いのだが、wifiが遅い気がしたので高速化の方法を調べた。

DNSサーバを変更する

DNSサーバを変更すると、名前解決が早くなり、その結果通信速度が上がるらしい。

以下のIPがおすすめらしい。

参考:「8.8.8.8,8.8.4.4」より速い「129.250.35.250」: 小粋空間

参考 [N] iPhoneのWiFi接続を高速化する魔法の数字「8.8.8.8,8.8.4.4」

namebench でベンチマーク

しかし、この結果を鵜呑みにしてはいけない!環境によって最適なDNSサーバは異なるはず!

オープンソースのnamebenchを利用すると、自分に最適なDNSサーバを調査することができる。これで最も早いサーバを調べて設定するのがよい。マルチプラットフォームのため、Windows,Mac,LinuxどれでもOK.

ベンチマーク結果

Linux Mintでは、パッケージマネージャからインストールできる。端末を開き、namebenchと入力すると検索が開始する。解析が終了すると、HTMLファイルが生成される。それを開くと…

127.0.1.1が一番早いとのこと。これは、自動で取得できるDNSサーバらしい。ということで、とくに設定の変更は必要なかった。。。

Screenshot_from_2014-01-11 14:28:39