天気予報アラートを作りたい(0)

はじめ

PythonとLineDeveloperで天気予報アラートを作りたい。
目標は4月末までに完成させること。

「天気予報アラートを作りたい」記事が何個になるのかは分からないが、完成したら全部まとめて書き直そうと思います。

天気予報アラートなのか

ツーリングの日が近づくにつれて、毎日毎時間気づけばYahoo!天気を開いているのに面倒臭みを感じたため。

Pythonで作る理由

1.Pythonに興味があったから。
2.APIやモジュール等の通信に必要な機能が豊富だったから。

LINEDeveloperを使う理由

1.通知が分かりやすい。
2.マルチプラットフォーム(ドヤ)を目指したかった。

機能

1.天気予報が知りたい”日付”と"場所"をクライアントからサーバに投げる。
 例:「4/25の大阪の天気予報が欲しい。」
2.サーバ内で指定の”日付”が取得出来るまでプログラムをまわす。
3.”日付”が取得出来たらクライアントに予報を通知する。
4.“日付”当日になるまで、通知した予報に変更があれば変更後の予報をクライアントに通知する。

目標

1.APIを使用した天気予報の取得。
2.コンソールから値を指定して機能通りの反応を返す。
3.LINEbotから値を投げて機能通りの反応を返す。

現時点での課題、疑問

1.自分以外のユーザが値を投げる場合、誰がどの値を欲しているのかを記録する必要がある。

programming challenge Nickel 2018

作成日:2018/4/4

Nickel 2018 challenge - Codility

初アワード頂きました~嬉しい~(˘ω˘)
しかし相変わらずperformanceが0%なのは進歩0!
素直に何処が無駄なんだろう。

【Codility Silver Award for the Nickel 2018 Challenge】
https://app.codility.com/cert/view/cert32Z7M4-QVRPZWTWE4MM63HF/

// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {

    int ans = 0;

    public void make(boolean[] p) {
        if (p.length > 0) {
            boolean[] node = new boolean[p.length -1];
            for(int i = 0; i < p.length; i++) {
                if(p[i] == true) {
                    ans++;

                    if(i < node.length) {
                        node[i] = true;    
                    }
                    if(i > 0) {
                        node[i - 1] = true;
                    }
                }
            }

            if (p.length - 1 > 0) {
                make(node);   
            }
        }

    }

    public int solution(boolean[] P) {
        // write your code in Java SE 8

        make(P);
        return ans;
    }
}

Lesson4 - PermCheck

作成日:2018/4/4
Task Score: 58%
Correctness: 100%
Performance: 16%
PermCheck coding task - Learn to Code - Codility

// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

import java.util.*;

class Solution {
    public int solution(int[] A) {
        // write your code in Java SE 8

        ArrayList<Integer> list = new ArrayList<Integer>();

        for(int num : A){
            if (!list.contains(num)) {
                list.add(num);
            } else {
                return 0;
            }
            if (num > A.length) {
                return 0;
            }
        }

        return 1;
    }
}

Lesson4 - MaxCounters

score:66%
※The submission is being evaluated.で評価画面表れず。

作成日:2018/3/28
MaxCounters coding task - Learn to Code - Codility

// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {

    public static int[] solution(int N, int[] A) {
        // write your code in Java SE 8
        int maxnum = 0;
        int[] inc = new int[N];

        for(int i = 0; i < A.length; i++) {
            if(A[i] <= 0) {
                // none
            } else if(A[i] < N) {
                if ( ++inc[A[i]-1] > maxnum) {
                  maxnum = inc[A[i]-1];
                };
            } else if(A[i] == (N+1)) {
                for(int num = 0; num < inc.length; num++) {
                    inc[num] = maxnum;
                }
            } else {
                // none
            }
        }
        return inc;
    }
}

Lesson3 - FrogJmp

作成日:2018/3/23
FrogJmp coding task - Learn to Code - Codility

// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int solution(int X, int Y, int D) {
        // write your code in Java SE 8
        if ( X >= Y ) { 
            return 0;
        } else if ( (Y - X) % D != 0 ) {
            return ( (Y - X) / D) + 1;
        } else {
            return (Y - X) / D;
        }
    }
}

Lesson3 - PermMissingElem

作成日:2018/3/15
PermMissingElem coding task - Learn to Code - Codility

// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

import java.util.HashMap;
class Solution {
    public static int solution(int[] A) {
        // write your code in Java SE 8

        HashMap<Integer,Boolean> hash = new HashMap<Integer,Boolean>();
        int i = 0;

        for(i = 0; i <= A.length + 1; i++) {  // 0 ~ 5
            try {
                hash.put(A[i], true);
            } catch(Exception ex) {
            }
        }

        while (i-- != 1) {
          if(!hash.containsKey(i)) {
                return i;
          }
        }

        return 0;
    }
}

Amazon Dash Buttonでgmailにメールが届くようにした

やりたい事

同居している婆様の体調が優れなかったので、婆様にやばいと感じたらボタン押下してもらい私のgmailに連絡がくるようにしたかった。エマージェンシーボタン。

なぜAmazon Dash Buttonなのか

丁度Amazon Dash Buttonで遊んでみたかったのと、視覚的にボタンを押すだけの機能しかなかったので機械に拒絶反応を示す婆様でも「取り敢えず押せば孫がかけつけてくる」と受け入れてもらえると思ったため。

実装

用意したもの


参考

blog.roy29fuku.com qiita.com github.com


手順

Amazon Dash ButtonのIP設定とMAC取得は割愛

1. centOS7にPythonライブラリをインストール

pip install amazon-dash

2. 任意の場所に作業ディレクトリを作成

mkdir amazon_hack.d

3. amazon-dashの設定ファイルを作成

vi amazon-dash.yml

# amazon-dash.yml
# -----------------
settings:
  delay: 1                      # next execution will do after delay
devices:
  00:fc:8b:fc:84:af:         # amazonDash's MAC add
   name: echo               # function name
   user: amazones         # user
   cmd: . send_mail.sh  # execute command
4. スクリプトの作成

vi send_mail.sh

# !/bin/bash

source send_mail_text.sh
echo $text | mail -s $title $add

vi send_mail_text.sh

# !/bin/bash

add="メール@gmail.com"
title="【通知】VOXボタンが押された!"
text="家に要電話"
5. 実行

amazon-dash run

結果

f:id:trece013:20180315113933j:plain
無事に届きました!
これで婆様の体調不良にすぐ駆けつけられます。

完成までに詰まった箇所

・pipってなんぞや
Pythonのライブラリをインストール・管理するためのシステム。
yum -y install python-pip ※要EPELリポジトリ
Amazon Dash Buttonの押下を検知した時にamazon-dashがエラーを吐く
user(今回だとamazones)に適切なsudo権限を与えていなかった。
・mailコマンドでgmailにメールが届かない
gmailの仕様だった
qiita.com

感想&改善点

最初はスクリプトじゃなくてプログラムでメール送信を実装しようと考えていたのですが、プログラム用意してる時間が勿体無いと思ってmailコマンドで送信する方法にしました。が、gmailの仕様で初期状態ではメール受け取らない問題を解決するのに時間がかかってしまい、実装が終わる頃には婆様の体調が回復してボタンは不要になりました。まあ、良かったです。現在は冷蔵庫にぶら下げて”もしもの時“用に待機しています。

今回の実装では"私一人にしか連絡が回らない"事と、サーバからメール送信→受信という点でNotificationsのように"連絡が来ても直ぐ気づく事が難しい"という事に気づきました。もしかしてポンコツなのでは。

調べてみると…

  1. Google Cloud Messagingを使用しAndoridアプリを自作、サーバからプッシュ通知を端末に送信
  2. LINEのMessaging APIを使用して、連絡したい家族を専用グループに追加してサーバからメッセージを送信

が候補で使えそうだなと思いました。APIって凄い!!

遠距離の家族の事も考えるとLINE案が一番手っ取り早いのかなと。しかしながら家族がLINEの通知を切っていたら、それはそれで当初のメール案と変わらないのではと思いましたがそれはまた別の時にでも(˘ω