R筋

プログラミング、金融、育児

ツクレ!!

1)

自分が興味を持っていることは当然印象深く記憶付けられるものだと思うが、最近示唆めいたエピソードがいろいろとあったので、自分が再認識するためにもまとめることにした。

2)

「半分、青い」という朝ドラを毎日録画している。中盤は酷い展開もあったりしてネットでも話題になっていたけれど、それも収まり終盤に入った最近は「そよ風の扇風機」を作るという目標に試行錯誤するという話がメインだ。その中では、大企業の安定を捨ててものづくりで独立する幼馴染や、一発逆転を企む怪しい起業家などなんか見入っちゃうキャラがたくさん出ていて面白い。中でも最も素晴らしいかったのは、緑の商品を作る会社を作った主婦。詳細はこちら。
news.walkerplus.com
主人公に「私は緑が好きなので。好きなものだから、素敵に作る自信があります」というシーンがあるんだけど、とてもいい言葉だと感じた。僕も緑は好きな色だけど、緑で素敵なものを作れるかって行ったら無理だ。好きなものだから素敵に作れるというのは、それを自分のモノにするくらい好きである必要があるのだろう。

3)

会社の先輩で副業でそこそこ儲けている人がいる。話を聞くとすごくビジネスマインドに溢れていて、いろいろなことに挑戦しているそうだ。その中には当然失敗したビジネスもあるそうだが、いくつかは安定的な収入源になっているそうだ。詳細は省くが、成功しているビジネスの一つは、シンプルに言えばモノを作って売るというものだ。どうやって成功したのか、いろいろと情報を教えて貰うなかで、印象に残ったのは、こんな言葉だ。
「端的にいえばいいものを作るということだと思いますよ」
売り物としていいものとは、商品自体もそうだが、その梱包やPRまたアフターサービス等全部含めて「いいモノ」であるということが必要なのであろう。
世の中には、いろいろなお金儲けの方法が溢れているが、買った人が喜んでくれるモノを作って売るというのは、最も基本的かつ最重要なビジネスだと感じている。

4)

僕の妻もどちらかというとクリエイティビティ溢れる性格である。今までにも、旅行に行くときは事前に「旅のしおり」事後に「旅行記」を作っていたし、仕事でオリジナルムービーを制作したり、最近では息子のおもちゃも作っていた。発想力もすごいと思うが、思いついたらすぐに自分が作れる範囲で実際に形にするという点が素晴らしい。
adijo.hatenablog.com

5)

僕が上記の会社の先輩のエピソードで触発されて図書館から借りてきた「副業ガイド」を息子が真剣に眺めていた。我が家の稼ぎが心配なのだろうか。とーちゃんにおすすめの副業があったら教えてくれよ(切実)
f:id:anpontan382:20180913144514p:plain

6)

そんな最近の出来事たちを踏まえ、自分も何かを作らないと(そしてそれで儲けないと)という気持ちが強くなってきた。過去の記事でもなんやかんや作ってはいたけれど、だいたいが他の人のパクリであまりオリジナリティもこだわりもないものが多い。改めて自分の好きなことをベースに、いいものを作りたいという強い思いにあふれてきた。
僕も好きなものはすくなからずある。プログラミング・電子工作・お金、この3つは特に好きだ。そんなわけで、まずはこんなものをこしらえた。


今までの僕はこれで満足して、興味を失っていた。だが今回は違う。これは第1号試作品という位置づけだ。これを日々改良して、様々な機能を付け足し、見た目もめっちゃスタイリッシュにして、平成最後の大発明として製品化するつもりだ。新元号が始まるころには、一家に一台の必需品となっているに違いない。皆のもの続報をまて。

【raspberry pi】Google Home を Google Keepと連携させる

メモアプリGoogle Keepはめちゃんこ便利だが、他のgoogleサービスとの連携という意味では、全く機能がなく、Google Calenderとの連携や他のユーザと共有ができるといいのになぁと常々感じる。

デベロッパーの掲示板を見ると5年前からいろんな人がAPI作れ作れ言っているものの一向に作られる様子もないことから、今後もGoogle Keepの外部機能が充実することはないだろう。
https://issuetracker.google.com/issues/36760910

だが、非公式APIならあるらしい!ヤッター!
f:id:anpontan382:20180820235554p:plain

こちらが、非公式APIのgkeepapi。pythonで使えるライブラリになっている。
github.com

こちらに詳しい使い方が載っている。
Welcome to gkeepapi’s documentation! — gkeepapi 0.1.0 documentation

これを参考に、Google Homeに話して、Google Keepにメモを取る機能を作ってみた。
とはいえ基本的なデータ連携は、過去になんどもやっている特定のワードに対して、IFTTTからWebHockを飛ばして、Firebaseに通知するというもの。それをRaspberry pi で読んで、gkeepapiがGoogle Keepを更新する。
anpontan382.hatenablog.com
f:id:anpontan382:20180821083500p:plain

googlekeep.pyをこんなカンジで作る。
コマンドライン引数にメモしたいことを指定して実行すると、Google keepに投稿できる。

# coding: utf-8
import gkeepapi
import sys

args = sys.argv
comment = "".join(args[1:])
#第2引数以降を結合してコメントとする

keep = gkeepapi.Keep()
success =keep.login('userID','Password')
#ログイン
note = keep.createNote('google home', comment)
#新しいメモを作成
keep.sync()
#同期

slackで育児ログをとる

一ヶ月前に作ったやつなんですけど我が家では全く活用されませんでしたので、すごく簡単にメモ。

何なの?

こんなウェブページを作りました。
f:id:anpontan382:20180726232311p:plain

ローカルからアクセスして、💩(うんち)を押すと、botがslackにうんち時刻を投稿してくれます。
f:id:anpontan382:20180726232833p:plain


どうやったの?

○クライアントサイド
CSSはこちらを参考にした。
saruwakakun.com

ボタンが押されたら、jqueryでpostする。

$(function(){
    $(document).on('click','#1',function(){
                   $.post('/lifelog',{"type":"うんち"})
                   });
}

○サーバサイド(raspberry pi
httpのボディを解析するためにはbodyParserが必要

const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended:false}));

expressのpostメソッドで受け取った上で、slackのincoming webhockへrequestを飛ばす。

app.post('/lifelog',function(req,res){
    var options={
        url:'https://hooks.slack.com/services/*****************:',
        method:'POST',
        headers:{'Content-Type':'application/json'},
        json:true,
        body:{"text":JSON.stringify(req.body.type)}
    };
    request(options, function (error, response, body) {
    });
    console.log(JSON.stringify(req.body.type)); 
});

slackの設定はこれとかを参照。
qiita.com

使い勝手

○メリット
スマホのお気に入りに入れておけば、寝起きやうんちのタイミングでこのページを開いて、ボタンを押すだけで簡単に育児ログが取れる。
僕からも妻からも投稿でき、外にいてもslackにアクセスすることで確認できる。
○デメリット
めんどい!!!
寝起きやうんちの直後っていうのは、結構慌てふためいていることが多いため、ボタンを押してる余裕がない。

【R】ログ解析するときの工夫

久々にRのTIPSを。僕がRでログデータを処理したときにかんがえたことを書いとく。

#ログデータが複数ファイルにある時、リスト化する。
files <- list.files(getwd(),full.names=TRUE)
#full.names=TRUEによりフルパスのリストができる。

#あとで使う系
access <- list()
library(readr)

#リストを順番に読み込む
for(i in 1:length(files)){
  tmp <- read.csv(files[i],sep="\n",colClasses = "character",encoding="UTF-8",header=FALSE)
  #sep="\n"により改行コードを区切り文字として読み込む
  #→ログデータは1行1ログであることが多いため、1行単位で読み込むと良い。
  #colClasses = "character"
  #→デフォではfactor型など、扱いづらい型になっているので文字列として取得する。
  
  tmp <-as.list(tmp$V1)
  #データフレームの第1列をリストに変換
       
  x  <- grepl("error-AAA",tmp)
    #”error-AAA”に該当する行番号を取得する。
      
    access <- c(access,subset(tmp,x))
  #tmpの中で抽出条件xに該当する行だけを取り出した上で、
  #accessというリストに追記する。
}

time <- str_extract(access,pattern="[0-9]{4}.[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}"
#時間を取り出す
#stringrの関数str_extractは該当した正規表現を取り出してくれる。
url <- str_extract(access,pattern="(http)[^,]*")
#URLを取り出す(てきとう)

log <- cbind(time,url)
#時間とURLをセットにしたデータフレームを作成

write.csv(log,"log.csv")
#書き出す

Google Home でよく使う機能

Google Homeはなんだかんだ毎日使うようになっていて、買ってよかった家電である。
0歳の息子も、僕が「ok,google」と言うと、google homeの方向を向いて「何か言うのかな?」って顔をしているので、音が出るヤツっていう認識は持っているようだ。
またGoogleも最近継続して会話できるような機能の提供を始めたらしい。
Chatting up your Google Assistant just got easier
だから今はまだ家電というカテゴリだが、どんどんできることが増えていくと、息子からしたら自分と一緒に成長してく家族の一人みたいな感覚で、IOTであったり、人工知能であったりという技術にふれることができる機会になればいいなあと思ったり。
そこまでいかなくても、いずれコンピュータとのI/Oというのはキーボードを使う機会が減り、声だったり、もっと進化したら脳から直接通信したりとなっていくであろうから、音声入力で通信をするという体験は何らか役に立つこともあるのではないだろうか。
そんなわけで今回はGoogle Homeでよく使うor面白い機能を紹介したい。

・天気を聞く

ベタだが一番つかっているのはこれ。今まで、テレビの番組を変えたり、ネットで検索したりしていたのでが、「ok,google 今日の天気は?」で結果がわかるのはすごく便利。

スマホを鳴らしてもらう

これも地味にすごく便利。家のなかでよくスマホをなくすわけだが「ok,google スマホ鳴らして」というとマナーモード中であっても音量を最大にして鳴らしてくれる。
しかも声を登録しているので、僕が言うと僕のスマホ、妻が言うと妻のスマホが鳴るという天才っぷりである。

・指定時刻に読み上げを行う

以下を参考にさせていただき、ほぼそのまま実装した。
qiita.com
若干工夫した点としては、話す内容を書いたスプレッドシートのファイルはこんなカンジした。
f:id:anpontan382:20180630220754p:plain
command列に「en」「ja」など言語を設定できるようにした。
また、今日はなんの日かであったり、今日の英語ニュースであったりを決めた時間に話してくれるようになっている。
この辺はスプレッドシートスクレイピング関数「IMPORTXML」でできる。詳細は以下を参照。
qiita.com
朝バタバタしながらも妻と「今日はトランジスタの日か~」とか「今の英語なんて言ってた?」みたいな会話が生まれ、Google Homeが「いってらっしゃい」と言うと「あ、そろそろ行かな」という感じで、音で知らせてくれると言うのは忙しいときにはなかなか便利である。

・動物の鳴き声を聞く

「ok,google 〇〇(動物)の鳴き声は?」というと、犬とかライオンみたいなメジャーな動物から、恐竜、スカンクみたいなほんとにそうなの?みたいな
ものまで幅広く対応してくれる。息子に絵本を読んでいるときに、おじさんが「いぬワンワン~U^ェ^U」とかやった後、リアル犬の声でワンワンすることで、息子が犬を様々な角度から理解できるのはないだろうか。

・外国語でなんというか聞く

バナナは英語で、ドイツ語で、ロシア語で、ベトナム語で・・・と聞くと各国のバナナをリアルな発音で教えてくれる。バナナに関してはかなりいろいろな言語をカバーしているようだ。多分ほかもそうだけど。ちなみに、banana、、Banane、банановый、chuốiということがわかったので、赤ちゃん語おしゃべり絵本というヤツに書いておいた。f:id:anpontan382:20180630222223j:plain
当初バナナしか説明がなかったのに「チョリー」もバナナのことであるとGoogle Homeのおかげで一緒に学べるようになり、息子の多言語学習がはかどっているかもしれない。

・LINEと連携する

過去の記事で書いたヤツ。
anpontan382.hatenablog.com
LINE↔Google Homeで双方向にメッセージをやり取りできるようになっているが、手が空いてない時や、息子にもメッセージを伝えたい時など使いみちは結構あって便利である。

raspberry pi でローカルDNSサーバを作る

最近仕事で社内向けDNSサーバの設定を変えることがあり、実用性はあまりないんだけど、勉強を兼ねて、家でも内部DNSサーバを作ってみることにした。

毎度お馴染み、持っててよかったraspberry piにBINDを入れて運用することにする。
すでに報告してくれている方々がおり、参考にさせていただきました。
wordpress.zenmai.org
www.kotemaru.org

そもそも、家に内部DNSを置くメリットはなにかというと、こんなところだろう。
・前記事で作ったウェブページにIPアドレスではなく、自分で設定した名前「http://~」でアクセスできる。
NASの共有フォルダへもIPアドレスではなく「\\~」でアクセスできる。
・外部DNSを自分で設定できるので、プロバイダのDNSサーバでブロッキングが行われても回避できる。
DNSの仕組みについて詳しくなり、インターネットの根幹を支えるDNSという技術に感謝する心が生まれる。

思うに一番最後はすごく重要だろう。
「www.yahoo.co.jp」と「183.79.250.251」はどっちをアドレスバーに入れても、ヤフーのトップページにつながるにもかかわらず、それぞれgoogleで検索してみると、検索結果は、約 672,000,000 件と3,420 件 という差が生まれる。
この差、196,491倍!これはもはやDNSサーバが我々の生活を196,491倍便利にしたと言える(謎理論)
従来比約20万倍の恩恵をもたらしたにもかかわらず、DNSサーバは世間一般にはほとんどその存在が知られておらず、誰からも感謝されることはない。
家庭内に内部DNSサーバを作ること、それはその道程においてDNSサーバに感謝するという行為である。

とはいえここから先は自分用のメモなので、全然参考にならないと思う。
やりたい人は上のページを参考にしたほうがいいだよ。

→etc/bind/named.confの設定

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";

named.confはBINDの基本設定ファイルである。
includeにより詳細設定のファイル、named.conf.optionsとnamed.conf.localを読み込む。

→etc/bind/named.conf.optionsの設定
これはconfの各種オプションを設定するファイル。

options {
        directory "/var/cache/bind";

         forwarders {
              1.1.1.1;
        };
	//このゾーンで名前解決出来ないときは、1.1.1.1に問い合わせ
	listen-on-v6 { none; };
	//IP6は無効
};

→/etc/bind/named.conf.localの設定
実際にゾーンをここで定義する。

//ホスト名myhome.jpの設定
zone "myhome.jp" {
    // Master DNS Serverであることを明示
    type master;
    // 設定ファイル名を記載
    file "/etc/bind/myhome.db";
};

// 192.168.100.* の逆引きの設定
zone "100.168.192.in-addr.arpa" {
    // Master DNS Serverであることを明示
    type master;
    // 設定ファイル名
    file "/etc/bind/100.168.192.db";
};

→myhome.dbの設定
正引きの設定を記載

$TTL 86400

@      IN SOA ns.myhome.jp.    root.myhome.jp. (          //最後に「.」を忘れない
                                      2018010204 ; Serial //更新時に値を増やす
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400      ; Minimum TTL
)

@       IN NS ns.myhome.jp. ; 
ns      IN A 192.168.100.130  ;
raspi2  IN A 192.168.100.125  ;
NAS     IN A 192.168.100.101 ;

→100.168.192.dbの設定
逆引きの定義を記載

$TTL 86400    ;

@   IN SOA ns.myhome.jp.    root.myhome.jp. (
                        2011102301 ; Serial
                        3H         ; Refresh
                        1H         ; Retry
                        1W         ; Expire
                        1D )       ; Minimum

    IN NS  ns.myhome.jp.     ; //Name Server を指定
    IN PTR myhome.jp.        ; //解決するドメインを指定
    IN A 255.255.255.0 ; //サブネットマスクを指定

130     IN PTR ns.myhome.jp.
125     IN PTR raspi2.myhome.jp.
101     IN PTR NAS.myhome.jp.

設定後は、

sudo named-checkconf

で、設定ファイルが正しいか確認できる。問題なければ再起動

/etc/init.d/bind9 restart

確認は、linuxの場合は、named.confに書いてあるDNSサーバを変更。
windowsはコンパネで使用するDNSサーバを指定。
もしくはDHCPサーバで配信するDNSサーバを変更。
等の方法で、raspberry pi上のDNSサーバが正しく動いているかを調べるとよい。

raspberry piでWEBサーバを立ててブラウザから部屋の気温・湿度・気圧を確認する。

朝からダルくて一切のやる気が出ない日が周期的にやってくるわけだが、この「周期的に」というのが重要で、僕がダメ人間だったら常にやる気がないはずで、何らかの外部要因が影響していて、僕のやる気を奪っている可能性が高い。つまりこの外部要因を特定できれば、僕は悪くないということが証明されるわけだ。

実際、外部要因として、低気圧だと頭痛になったり、湿度が高いと「水毒」でダルくなるということはあるそうだ。
www.alsok.co.jp

この辺を知っていると、役立つことは多いだろう。例えば、会社を早退したいときも
「なんかダリーんで帰りますチョッチョチョリーッス」
「私梅雨の時期は、湿度・気圧の変化によって全身疲労・倦怠感を覚え、業務へ支障をきたす可能性があるため、本日は大事をとって、お休みさせていただきます」
という感じで、知っている人と知らない人ではここまで印象が違う。

そういうわけで、気温・湿度・気圧と体調の相関を常日頃から意識しておくといいことがあるんじゃないかと考え、ブラウザから取得できるボタンを作成した。
だるいなと思ったら、このボタンを押して、原因が外気にないかチェックすることにしよう!


上下にあるボタンは別途記事にするので気にしないでね。

仕組みは前の記事と同じで、ブラウザからPOSTされたら、センサーを実行させる。
anpontan382.hatenablog.com

結果はajaxによってブラウザに返させるようにして、結果が来るまでは「通信中」と表示する。
ajax部分はこんな感じ。

$(function(){
        $(document).on('click', '#env', function(){
            $('#env p').html("Last valid date:通信中<br>Temperature:通信中<br>Humidity:通信中<br>Pressure:通信中")
            $.ajax({
                url:"/env",
                type:"POST",
                success:function(res){
                            $('#env p').html(res);
                        },
                error:function(){
                            window.alert('error')
                        }
            })
    });
});

id=envのボタンがクリックされると、pタグ内を「通信中」に変更する。
ajax通信では「/env」をPOSTし、通信が成功したら、受信した内容でpタグないを書き換える。
通信失敗時はエラーのアラートを表示させる。

サーバではポストを受け取り、センサーを実行させる。
実行するセンサーは2つあり、湿度を取得するDHT11と、気温、気圧を取得するBMP180だ。この辺を参考にそれぞれを取得できるスクリプトを作成した。

qiita.com
qiita.com

取得した値は次のように改行でつないで出力する。

Last valid date:2018/06/15 22:36:11<br>
Temperature: 23.60 C<br>
Humidity: 79%<br>
Pressure:1010.75 hPa

これを、サーバから返せば、ウェブページ上で表示される。

app.post('/env',function(req,res){
    console.log('env');
    const result2 =  execSync('sudo python env.py').toString();
    res.send(result2);   
});

ちなみに今日はこんな感じ。
f:id:anpontan382:20180615225623p:plain
不快指数は71。湿度は高いけど、気温が低いからそこまででもないですね。
いわれてみると確かに今日は気分もぼちぼちだな。