Arakawa のすべての投稿

Windows 8 Pro.のエクスプローラーが頻繁に応答しなくなる・・。

3月に入って、Windows Updateをしてから頻繁にエクスプローラーが止まるな・・・と
思っていたところ、Windows Updateで配布された修正パッチが原因があったようです。

自己責任となりますが、同現象が起きた場合、一度お試しください。
私の場合は、今のところ、下記のパッチを当ててから問題は再発していません。

https://support.microsoft.com/ja-jp/kb/3048778?wa=wsignin1.0

エクスプローラーの不調を招いていた更新プログラム「KB3033889」の修正版が公開

秀丸で便利だと思ったところ。

こんにちは。秀丸で一番あってよかったなぁ~と
思う機能は、正規表現を使った置換です。一番よく使うものを書きたいと思います。
(と言っても二つありますが・・・)

先頭の文字に@という文字を挿入する編

1.初めはこのような状況
20150220-01ara

2.検索に “^” を入れます。先頭という意味です。
20150220-02ara

3.ごらんのとおり、先頭に@が入りました。
20150220-03ara

行末の空白を削除する編
1.初めはこのような状況
20150220-04ara

2.検索に ” +$” を入れます。行末のスペースを指します。置換は何も入れないようにします。
20150220-05ara

3.ごらんのとおり、行末がきれいになりました。
20150220-06ara

ほんの一部ですが、皆さんも利用してみてください。

Web APIをShellで使おう!(メールで情報を送る)2

こんにちは。Arakawaです。
さて、二回目ですが、取得したデータを定期的にメールで送ることをしたいと思います。
とはいえ、昨今のスマートフォンは、指先一つで天気予報を見ることができ、わざわざ
メールで送信する意味ってどこにあるのか・・・。いや、きっとどこかで役に立つような・・。

small_232678770
photo credit: chrn via photopin cc

1.先ずは復習。データが取得できるか、試してみましょう。

# wget -q -O - http://weather.livedoor.com/forecast/webservice/json/v1?city=260010 | jq '.forecasts[]|.date,.telop,"最高気温->",.temperature.max.celsius,"最低気温->",.temperature.min.celsius'
"2014-12-12"
"曇時々晴"
"最高気温->"
"12"
"最低気温->"
null
"2014-12-13"
"晴時々曇"
"最高気温->"
"8"
"最低気温->"
"2"
"2014-12-14"
"曇時々晴"
"最高気温->"
null
"最低気温->"
null

2.取得できましたね。では、これをメールにしてみましょうか?。

shellのソース(tenki.shとしました。)

#!/bin/bash
export LANG=ja_JP.UTF-8

echo "MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
X-Priority: 3
Subject:天気予報
From: 送り元@
To: 送り先@

`wget -q -O - http://weather.livedoor.com/forecast/webservice/json/v1?city=260010 | jq '.forecasts[]|.date,.telop,"最高気温->",.temperature.max.celsius,"最低気温->",.temperature.min.celsius'`
" | /usr/bin/nkf -j | /usr/sbin/sendmail -t

exit 0

メールの抜粋

件名:天気予報

本文:
"2014-12-12"
"曇時々晴"
"最高気温->"
"12"
"最低気温->"
null
"2014-12-13"
"晴時々曇"
"最高気温->"
"8"
"最低気温->"
"2"
"2014-12-14"
"曇時々晴"
"最高気温->"
null
"最低気温->"
null

3.あと、定期的に送るため、クーロンに以下のように設定しました。

0 7 * * * /お好きなパス/tenki.sh

としておきましょう。毎朝7時メールが来ます。

以上のようにすれば、(まだ編集の余地は大いにあるのですが。X-( ) メールで定期的に天気予報を受け取ることができます。

簡単ですが、今日はこの辺で・・。

Web APIをShellで使おう!(jqをCentOS6.5にインストール編)1

みなさん、こんにちは。
Arakawaです。最近CUIがシンプルで心地よく感じる時があり、できるならば
CUIで過ごせないかと時々画策しています。
small__5450429373
photo credit: blakespot via photopin cc

さて、CUIで過ごしていると、どうしてもいろんな情報をCUIで取得したくなります。
天気予報であったり、ニュースであったり、技術情報であったり・・。
そーいうのをLynxでみるのも悪くはないですが、もっとシンプルに
取得したい・・・。思いついたのがWeb APIでした。

Web APIは、XMLやJSONで提供されていることが多いと思います。そこでそれらを
簡単に処理できるアプリがないかなぁ~と思いいろいろググっていますと、
jqというアプリが便利だということがわかってきました。

jqを一度インストールしてみて、いろいろ画策(笑)していきたいと思います。

——————–
インストール実施した内容ログ

1.http://stedolan.github.io/jq/download/からバイナリを適当なところにダウンロードします。

#cd /tmp
#wget http://stedolan.github.io/jq/download/linux64/jq

2.実行権限を与えました。755にします。

#chmod 755 jq

3.では、動くかどうか、試してみたいと思います。Web APIでまずテストといえば
天気予報が簡単でよさそうな気がしています。Livedoorさんのサービスをお借りしたいと思います。
http://weather.livedoor.com/weather_hacks/webservice
から京都のデータをゲットしたいともいます。2014/11現在このアドレスでデータが取得できるようです。
http://weather.livedoor.com/forecast/webservice/json/v1?city=260010

では、実際に試してみます。

#wget -q -O - http://weather.livedoor.com/forecast/webservice/json/v1?city=260010 | ./jq '.'

こんな感じで表示されました。

{
  "pinpointLocations": [
    {
      "link": "http://weather.livedoor.com/area/forecast/2610000",
      "name": "京都市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2620400",
      "name": "宇治市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2620600",
      "name": "亀岡市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2620700",
      "name": "城陽市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2620800",
      "name": "向日市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2620900",
      "name": "長岡京市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2621000",
      "name": "八幡市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2621100",
      "name": "京田辺市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2621300",
      "name": "南丹市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2621400",
      "name": "木津川市"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2630300",
      "name": "大山崎町"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2632200",
      "name": "久御山町"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2634300",
      "name": "井手町"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2634400",
      "name": "宇治田原町"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2636400",
      "name": "笠置町"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2636500",
      "name": "和束町"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2636600",
      "name": "精華町"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2636700",
      "name": "南山城村"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/2640700",
      "name": "京丹波町"
    }
  ],
  "link": "http://weather.livedoor.com/area/forecast/260010",
  "forecasts": [
    {
      "dateLabel": "今日",
      "telop": "晴のち曇",
      "date": "2014-11-12",
      "temperature": {
        "min": null,
        "max": {
          "celsius": "21",
          "fahrenheit": "69.8"
        }
      },
      "image": {
        "width": 50,
        "url": "http://weather.livedoor.com/img/icon/5.gif",
        "title": "晴のち曇",
        "height": 31
      }
    },
    {
      "dateLabel": "明日",
      "telop": "曇時々晴",
      "date": "2014-11-13",
      "temperature": {
        "min": {
          "celsius": "9",
          "fahrenheit": "48.2"
        },
        "max": {
          "celsius": "13",
          "fahrenheit": "55.4"
        }
      },
      "image": {
        "width": 50,
        "url": "http://weather.livedoor.com/img/icon/9.gif",
        "title": "曇時々晴",
        "height": 31
      }
    },
    {
      "dateLabel": "明後日",
      "telop": "曇時々晴",
      "date": "2014-11-14",
      "temperature": {
        "min": null,
        "max": null
      },
      "image": {
        "width": 50,
        "url": "http://weather.livedoor.com/img/icon/9.gif",
        "title": "曇時々晴",
        "height": 31
      }
    }
  ],
  "location": {
    "city": "京都",
    "area": "近畿",
    "prefecture": "京都府"
  },
  "publicTime": "2014-11-12T11:00:00+0900",
  "copyright": {
    "provider": [
      {
        "link": "http://tenki.jp/",
        "name": "日本気象協会"
      }
    ],
    "link": "http://weather.livedoor.com/",
    "title": "(C) LINE Corporation",
    "image": {
      "width": 118,
      "link": "http://weather.livedoor.com/",
      "url": "http://weather.livedoor.com/img/cmn/livedoor.gif",
      "title": "livedoor 天気情報",
      "height": 26
    }
  },
  "title": "京都府 京都 の天気",
  "description": {
    "text": " 近畿地方は、湿った空気の影響で雲が広がり、弱い雨の降っているところ\nがあります。\n\n 今日の京都府は、湿った空気の影響で雲が広がりやすく、午後は日本海か\nら気圧の谷が南下するため、北部では夕方から雨の降るところがあるでしょ\nう。\n\n 明日の京都府は、気圧の谷や寒気の影響で北部を中心に雲が広がり、雨や\n雷雨となるところがある見込みです。",
    "publicTime": "2014-11-12T10:36:00+0900"
  }
}

ちゃんと整形されていますね。めでたしめでたし。
では、せっかくなので、どこからでもアクセスできるようにしておきましょうかね。
4. 設定

#mv jq /usr/local/bin/
#wget -q -O - http://weather.livedoor.com/forecast/webservice/json/v1?city=260010 | jq '.'

皆さん動きましたか?./ がついていないことを確認してくださいね。
動かない人は、どこにパスが通っているか確認してください。

#echo $PATH

では、次は、これらを使ってもう少し、面白そうなことをしていこうと思います。
では。($・・)/~~~

ORACLE 11gR2 SQLの再帰(再帰With句)について 1

いつも一瞬戸惑ってしまう再帰。皆さんはいかがでしょうか。

私の場合、あまり使うことはないので、よく忘れてしまうのですが、
使うことが発生し使いだすと、いつも「便利だな〜」と思います。
メモがてら、再帰についていくつかサンプルを記載したいと思います。

— 部品管理で再帰を利用する。
たとえば、車で考えてみます。
細かく言えば、複雑になるので次のように考えました。

車
    エンジン
      エンジン用ねじ
        アルミニウム
        鉄
      エンジン用鉄
    ハンドル
     ハンドル用ねじ
     ハンドル用鉄
    ブレーキペダル
     ブレーキペダル用ねじ
     ブレーキペダル用鉄
    アクセルペダル
     アクセルペダル用ねじ
     アクセルペダル用鉄
    車体組み立て用ねじ

正直こんな単純な構成はほぼないのですが、あくまで再帰の
抽出方法を確認するだけなので、ご了承いただければと思います・・。

上記は、次のようにイメージしてください。
車は、エンジン、ハンドル、ブレーキペダル、アクセルペダル
から成り立っています。
エンジンは、エンジン用ねじと、エンジン用鉄から作られます。

というような読み方で、それぞれの部材の親子関係を示しています。

その次に、上記の関係をDBに登録してみます。
日本語で分かりやすくテーブルを作るとこんな感じでしょうか。

CREATE TABLE 構成表 (
 親 VARCHAR2(100)
,子 VARCHAR2(100)
);

-- データも次のように登録します。

INSERT INTO 構成表 (親 , 子)
  VALUES('車','エンジン');

INSERT INTO 構成表 (親 , 子)
  VALUES('車','ハンドル');

INSERT INTO 構成表 (親 , 子)
  VALUES('車','ブレーキペダル');

INSERT INTO 構成表 (親 , 子)
  VALUES('車','アクセルペダル');

INSERT INTO 構成表 (親 , 子)
  VALUES('車','車体組み立て用ねじ');

INSERT INTO 構成表 (親 , 子)
  VALUES('エンジン','エンジン用ねじ');

INSERT INTO 構成表 (親 , 子)
  VALUES('エンジン','エンジン用鉄');

INSERT INTO 構成表 (親 , 子)
  VALUES('エンジン用ねじ','鉄');

INSERT INTO 構成表 (親 , 子)
  VALUES('エンジン用ねじ','アルミニウム');

INSERT INTO 構成表 (親 , 子)
  VALUES('ハンドル','ハンドル用ねじ');

INSERT INTO 構成表 (親 , 子)
  VALUES('ハンドル','ハンドル用鉄');

INSERT INTO 構成表 (親 , 子)
  VALUES('ブレーキべダル','ブレーキペダル用ねじ');

INSERT INTO 構成表 (親 , 子)
  VALUES('ブレーキペダル','ブレーキペダル用鉄');

INSERT INTO 構成表 (親 , 子)
  VALUES('アクセルペダル','アクセルペダル用ねじ');

INSERT INTO 構成表 (親 , 子)
  VALUES('アクセルペダル','アクセルペダル用鉄');

では、階層ごとに出してみましょう。
車がどのような構成で、作られているか
見ることにしましょう。
見やすいように、 親 -> 子 という表現にすることを考えたいと思います。
親が車の構成はどのような感じでしょうか。

まず考え方としては、
http://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_10002.htm#BCEJGIBG
参照にしています。

今回は、再帰With句という ORACLE 11gR2から導入された機能を使います。

WITH VREC (構成 , 親  , 子) AS
(
   SELECT 親 || ' -> '|| 子 , 親, 子 FROM 構成表
   WHERE 親 = '車' AND 子 = 'エンジン'
UNION ALL
   SELECT V.構成 || ' -> '|| K.子 , K.親, K.子 FROM 構成表 K , VREC V
   WHERE V.子 = K.親
)
SELECT 構成 FROM VREC

 

構成
---------------------------------------------------
車 -> エンジン
車 -> エンジン -> エンジン用ねじ
車 -> エンジン -> エンジン用鉄
車 -> エンジン -> エンジン用ねじ -> 鉄
車 -> エンジン -> エンジン用ねじ -> アルミニウム

どうでしょうか、下位の構成まですべて出たと思います。
仕組みを簡単に書きたいと思います。
再帰With 句の中で UNION ALL で分かれます。
上の方を、非再帰項といい、下を再帰項といいます。

動きを見ていきましょう。
次の順番で動いていきます。

1.非再帰項を実行します。ここでは、車とエンジンのデータを取得します。
2.再帰項を1.のデータをもとに実行します。エンジンが親となり、そのデータを表示します。
3.再帰項を2.のデータをもとに実行します。エンジン用ねじが親となり、そのデータを表示します。

いかがでしょうか。
再帰は、まだまだ面白いことができます。
今日はこの辺にしてまた、次回追加で説明したいと思います。