R筋

プログラミングと時々育児

赤ちゃん三種の神器(おもちゃ)

f:id:anpontan382:20180501213839j:plain
それぞれ遊び方のコンセプトが違っていてイイね!

Raspberry pi + google homeで最近やったこと

結局ハマっちゃうわけです。楽しいから仕方ないことですね。

・現在のマーケット情報を確認する。

f:id:anpontan382:20180424220732p:plain
コマンド実行時に日経新聞社の世界の市況ページをスクレイピングし、読み上げる仕組みだ。
www.nikkei.com
概要はこちら。
f:id:anpontan382:20180424221027p:plain
朝の時間に準備しながら、世界中の通貨や指数をたれ流したかったのだが、google-home-notifierで読み上げられる文字数は100文字程度が上限のようで、指数にして3~4つが限界だった。
また、「+」「ー」をカタカナに、「-」を「から」に置換する等、読み上げをする上で自然になるよう置換が必要である。
スクレイピング部分のコードを載せておく。

var client = require('cheerio-httpcli')
var URL = 'https://www.nikkei.com/markets/worldidx/'

var data = [];
var data2 = [];
var target =["日経平均(円)","ドル・円","NYダウ工業株30種(ドル)","米10年国債"];
var str =""
//抽出対象の銘柄
client.fetch(URL,function(err,$,res){
    if(err){console.log(err);return;}

var table = $('.cmn-table_style1 tr')
//tr内を取り出す

    for(var i=0,l=table.length;i<l;i++){
        var cells=table.eq(i).children();
        data[i]=[];
        for( var j=0,m=cells.length;j<m-1;j++ ){//m-1とすると最終列(時間帯)は含めない
            data[i][j] = cells.eq(j).text();//i行目j列の文字列を取得
           }
           data2[i]=data[i].join('。')//列を結合
           data2[i]=data2[i].replace("+","プラス")//置換
           data2[i]=data2[i].replace("-","マイナス")        
           data2[i]=data2[i].replace("-","マイナス")
           data2[i]=data2[i].replace("-","から")
           data2[i]=data2[i].replace("(","ポイント。")
           data2[i]=data2[i].replace(")","")
           data2[i]=data2[i].replace("※","")
           //console.log(data2[i])
           for(var k=0,n=target.length;k<n;k++){
                if(data2[i].indexOf(target[k])==0){//targetに該当する行を取り出す
                    str+=data2[i]+"\n"
                } 
           }   
    }

    str=str.replace("?","")
    console.log(str)
   
googlehome.notify(str, function(res) {
    console.log(res);
  })
})
}

出来上がったのはこちら。
日経新聞のページに表示されている値なのでマーケットがオープン中なら現在値、クローズ後なら終値が読まれる。


この声での数字の読み上げはなんか頭に入ってこない…
それと、元から「日経平均は?」「ドル円は?」等へは解答してくれるので、全指数をまとめて読み上げることが文字数の制限で無理な時点で実装する意味があんまない機能でした。

NASの音楽ファイルを再生する。

f:id:anpontan382:20180424225100p:plain
NASに置いた音楽ファイルをランダムに再生してくれる。
概要はマーケットとほぼ同じ。
f:id:anpontan382:20180424225303p:plain
NASのマウントはこちらを参考に実施。
www.mana-cat.com
NAS上に音楽フォルダを作成し、その中に音楽ファイルを格納する。
後はパスを指定してgoogle-home-notifierに送ればいいのかと思いきや、google-home-notifierのファイルパスではなくhttp:~のURLを指定しないといけない。
そのため、音楽フォルダでミュージックサーバを立てる。
参考にしたのは次のサイト。
scrapbox.io
プログラムの流れは以下の通りとなる、①と②はnohupで常に実行しておく。
①nodeでミュージックサーバを立てる。
②firebaseのDBの更新があったら③を実行する
③ミュージックサーバの各ファイルへのURLをランダムに取得しGoogle homeで再生する。
①は上記サイト、②は過去の記事を参照。
anpontan382.hatenablog.com
③のコードはこんな感じで出来た。全体を関数としてexportしている。

exports.playmusic=function(){

var fs = require('fs');
const googlehome = require('google-home-notifier');
const language = 'ja';
googlehome.device("Google-Home", language);
googlehome.ip("192.168.***.***");//googlehomeのIPアドレス

fs.readdir('/home/pi/nas/music', function(err, fileList){
    if (err) throw err;
   
    //console.log(fileList);
    randomfile = fileList[Math.floor(Math.random() * fileList.length)];
    url ='http://192.168.***.***:3000/music/' + randomfile;
    //ラズパイのIPアドレス+ポート+ミュージックサーバのパス+NASからランダム
 //に取得した音楽ファイル

    console.log(url);

googlehome.play(url, function(res) {
  console.log(res);
});

僕は現在300曲程をNASに保存しているが、「再生」というとランダムにgooglehomeが再生してくれる。
曲が多すぎて聞きたい曲が流れることはない。そのため、今後の改良としてはフォルダ毎にプレイリストを作り「〇〇(フォルダ名)を再生」と言うと、フォルダ内の曲だけが流れるようにできるとより音楽プレイヤーとしての利用が捗りそう。

Raspberry piでGoogle Homeに話をさせていたら気づいた大切なこと

目次

今回作ったのはこれだ


ずっとほしいなぁと思っていたんだけど、いよいよ禁断症状が出てきて会社帰りに秋葉原で買ってしまったraspberry pi zero!!このLINEに書いた内容を喋らせるヤツ、ブログでいくつか開発している記事を仕事中に見るにつけて、やりたくてやりたくて仕事が手につかなかったもんだから仕方がないことですね。

rassberry pi初期設定

初心者なので色々なものが入っているこちらのスターターキットを買いました。
Raspberry Pi Zero W スターターキット--在庫限り - スイッチサイエンス
まずはセッティング。スターターキットに色々と変換アダプタが入っているので簡単にはじめられる。電源アダプタを入れると自動的に起動してしまうので、他の接続を先に済ませて最後に電源をつなげよう。
f:id:anpontan382:20180302233900p:plain
また、本来はmicroSDの中に公式サイトからダウンロードしたOSを入れてから差さないといけないのだが、スタータキットにはすでにOSがmicroSDにコピー済みのため差し込むだけで準備完了だ。
f:id:anpontan382:20180302234515p:plain
電源を入れて少し待つとこんなかんじの起動画面になる。
OSが起動したら、いくつかの初期設定を行う。amazon ultimatedで無料で読めるので、この本を参考にした。

設定内容は次の通り。
wi-fi接続
SSH、I2Cを使用可
③ログインパスワードの変更
タイムゾーン
これだけで、ネットサーフィンもできる普通のPCとして使用できる状態になる。だが、512MBのメモリではネットサーフィンなどはめちゃくちゃ重たく、実用性はほぼないだろう。基本的に遠隔でログインして操作することになる。
そのために必要な
SSHの設定
FTPサーバの設定
IPアドレスの固定
の作業があるがこれも上記書籍を参考にした。
加えて、LAN外からもアクセスできるようネットワークの設定も変更した。
anpontan382.hatenablog.com
外部からのアクセスにするため、
①ポート番号をデフォルトから変更
②公開鍵認証
を設定している。
これによって、普段使っているwindowsPCから、teratermFFFTPでrasberry piを操作できるようになった。
f:id:anpontan382:20180303002812p:plain

google-home-notifierの設定

続いて、googleHomeに喋らせるために必要なパッケージをインストールする。
コマンドは、こちらを参考にした。
GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます - Qiita
必要なパッケージは次の通り
・node.js→javascriptを実行する環境
・npm→node.jsで使うパッケージを管理するツール
・nvm→node.jsのバージョンを管理するツール
google-home-notifier→javascriptgoogle homeを動かすためのパッケージ

ハマった場所をメモしておこう。
google-home-notifierのインストールで次のエラーが出た。

pi@raspberrypi:~/google-home-notifier $ npm install -g google-home-notifier
npm WARN package.json google-home-notifier@1.2.0 No repository field.
\
> mdns@2.3.4 install /home/pi/google-home-notifier/node_modules/mdns
> node-gyp rebuild

make: Entering directory '/home/pi/google-home-notifier/node_modules/mdns/build'
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_sd.o
In file included from ../src/mdns.hpp:12:0,
                 from ../src/dns_sd.cpp:1:
../node_modules/nan/nan.h:324:47: error: ‘REPLACE_INVALID_UTF8’ is not a member of ‘v8::String ’
   static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8;
…

この解決方法は、こちらあった。
Raspbianでのnpm install leveldownではまったメモ - Qiita
nodeのバージョンが問題とのことで、nvmでバージョンを変えようとしたが、nvmもエラーが出る。(
gitを使ったnvm(node version manager)のインストールから複数バージョンのnode.jsインストール及びその切替え手順のご紹介です。
これによると、nvmは最初無効化されているため、有効化するコマンド

source ~/.nvm/nvm.sh

が必要だそう。

そんなこんなで、必要なパッケージが揃った。先程の記事を参考にテストコードを記載。

const googlehome = require('google-home-notifier');
const language = 'ja';
googlehome.device("Google-Home", language);
googlehome.ip("192.168.100.112");
googlehome.notify('わっちゃん、おはよう', function(res) {
  console.log(res);
});

わっちゃんというのは息子の名前である。これを実行してみると、

$ node test.js
events.js:183
throw er; // Unhandled 'error' event
^
Error: getaddrinfo -3008
…

残念まだエラー。
npmで怒られたエラー集まとめ。WARN[deprecated,unmet dependency,peerDependencies,EPEERINVALID,engine]ERR![missing,invalid],throw er; // Unhandled 'error' eventの解決方法。(2018/1/24更新) - Qiita
どうやら複数プロセスが動いていると起こるみたい。

$ ps aux | grep node
pi 20091 2.6 7.2 124928 32236 pts/0 Tl 21:23 0:05 node
pi@raspberrypi:~/googlehome $ sudo kill -9 20091

としたら、喋りだした!

cronで実行

ついでに「おはよう」なので毎朝7時に喋るようにセットしておくことにした。cronという定時に自動実行する機能に登録をする。
決まった時間に処理する | Make.
ここを参考にcronをスタートさせ、

$ crontab -e

へ次のコマンドを登録。

*/2 * * * * /home/pi/.nvm/versions/node/v8.9.4/bin/node /home/pi/googlehome/ohayo.js

・ 「****」とすると1分毎に実行だが、タイミングによってはうまくいかないこともあるため、「*/2 * * * *」として2分毎の実行登録がいいそうだ。
・実行させるnodeはフルパスにしておく。
、、、しかしエラー、ログを見てみる。

$ cat /var/log/syslog
Feb 28 22:22:01 raspberrypi CRON[20756]: (CRON) info (No MTA installed, discarding output)

システムログのエラーでググると同じ事象が見つかった。
Raspberry Piでcronを使った時の話し - Qiita
cronは実行されるとメールが飛ぶ仕組みであるためpostfixを入れておかないと行けないようだ。デフォでは「var/mail」に届く。
これでcronは解決。「00 7 * * * 」とすれば毎日7時に「わっちゃんおはよー」とgoogleHomeが話しかけるようになったとさ。

LINE通知から実行

そして本来やりたかったLINE通知から喋らせるヤツはこのふたつを参考にした。
Google Homeで子供の朝支度を促してみる - Qiita
Google HomeにLINEのメッセージを読み上げさせる(LINE BOT+Webhook+Firebase+Node.js) - メガロドンblog
データの流れはこんな感じ。
f:id:anpontan382:20180303091057p:plain
①LINE messageAPI → ②firebase → ③rassberry pi → ④google home

まず②のfirebaseへの登録を行う。上記記事を参考に、googleアカウントでログインし、googlehome用のデータベースを作成した。
firebaseっていうのは、webアプリなどを作る際に役立つ便利な機能が色々とあるサービス。従来自分でサーバを構築しないと出来なかったことが、簡単にできるようになる。今回はこのリアルタイムデータベース機能で、LINEからの通知を受け取る。

続いて①のLINE messageAPIへ登録する。これはお店などでよくあるBOTを作れるサービスだが、相手から通知を受けた時に、それに対応できるようにもなっており、webhockにデータを送ることができる。これをfirebase宛に設定することで、LINEの通知をfirebaseに届けることができる。

最後に③のrassberry piでfirebaseの更新を受け取れるようにする。
firebaseのパッケージをインストール。

npm install firebase

firebaseの更新を監視し、更新があればgoogleHomeに送るスクリプトを作ります。

const googlehome = require('google-home-notifier');
const language = 'ja';
googlehome.device("Google-Home", language);
googlehome.ip("192.168.100.112");

var firebase = require("firebase");
var config = {
  apiKey: "********",
  authDomain: "***********.frebaseapp.com",
  databaseURL: "https://********.firebaseio.com",
  projectId: "******",
  storageBucket: "",
  messagingSenderId: "*************"
};
//firebaseの設定画面で確認

firebase.initializeApp(config);
var db = firebase.database()
var receivedlineRef = db.ref( '/line/mes');

receivedlineRef.on("child_added", function(snap) {
  var linemessage = snap.val();
  snap.ref.remove(); //Delete child in firebase
  var textmain = linemessage.events[0].message.text;
  googlehome.notify(textmain, function(res) {
    console.log(textmain);
  });

nohup~&で実行すると、SSHを切断しても実行し続ける。

nohup node firebase.js &

完成!

今後の展開

なんだかんだで手間がかかったが、使ってみると色々アイデアが出てきてワクワクしてくる。
親が言っても聞かないときに、こっそりLINEで「わっちゃんもう寝ようね」と送って、googleHomeに話させる。「ほら天才googleHome様もそういってるから寝ようよ」みたいな感じで、しつけを代わりにやってもらうこともできる。
他にも、現在は日本語を読み上げる設定になっているが、英語を話させるのも楽しそう。LINEには翻訳BOTがあるので、親が考えた日本語を英語に翻訳させてgoogleHomeに話させれば親の英語力によらず英語教育が可能だ。
LINE以外にもfirebaseの更新でgoogleHomeを話させることができるわけだから、WEBをスクレイピングして「今日はひな祭りの日で、雛人形を飾ります」みたいな教養が取れれば、親の教養力によらず教養ある人間が育つだろう。

本当の今後の展開

いやはや機械が仕事を奪うってよく言われているが、これをやっていると子育ても奪われかねない。
いやまて、すでに僕は「息子に楽しんでもらうぞ~」という大義名分のもと、夜な夜なパソコンに齧りついてプログラムを書いているわけだが、すでに機械に子育ての機会を奪われている状況ではないか。
google Homeが自分から話をする機能はいずれgoogleが提供してくれるだろう。僕がわざわざしなくてもいいのではないか。
僕がgoogle Home開発をしている間、妻は祖父母に近況報告の手紙を書いていた。
f:id:anpontan382:20180303095210j:plain
人間ができること、すべきことむしろこれなのではないか!!

真理に到達した僕は、rassberry piからgoogle Homeを爆発させるコマンドを打ち込み、エンターキーをズッターン!と叩き、燃え上がるgoogle Homeを背に、寝ている息子のもとへ向かった(嘘)

でもホントは僕もわかっている。もう少し日々の子育てや家事をしたほうが、家族みんなにとって良いし、他にも6月にある重要な資格の勉強しなきゃいけないってこと。プログラムやブログを書いている場合じゃないことは確かなんだってこと。

buffaloルータでポートを開放するときの注意点

raspberry piに外部からアクセスできるようポートを解放しようとしたときに家のネットワーク設定で一部ハマったところを自分用メモに残しておく。

以前の記事で書いたが、僕の家のLANはwimaxルータ→buffalo社ルータ→PCという順でつながっている。
buffalo社のルータには、ルーターモード、ブリッジモード及びルーターモードとブリッジモードを自動切換するオートモードがあるのだが、ルーターモードにするとややこしいことになるというのが今回の話。
公式サイトの図が分かりやすいが(http://faq.buffalo.jp/app/answers/detail/a_id/16000
buffalo社ルータの上位機器(プロバイダーから提供される機器)にルーター機能がある場合はブリッジモード、ない場合はルーターモードにするのが一般的である。おそらくデフォルトはオートモードになっており、自動的に判別がおこなわれるはずだったが、なぜかルータモードになっていたため、2重でルータが接続される状態になっていた。
これについては、一般的な利用の中では問題はなかったが、外部からLANにアクセスする必要があると、複数ルータでポートを解放する必要が生じ、大変複雑な作業が必要となる。(https://www.akakagemaru.info/port/tracert-2.html
現状buffalo社ルータをルーターモードにする必要がないため、ブリッジモードへ固定することにした。

しかしブリッジモードへ固定すると、buffaloルータのアドレス「192.168.11.100」が自動的に割り振られる。
これはwimaxルータのDHCPが設定する「192.168.100.~」の範囲から外れてしまう為
・「192.168.100.~」が振られたPCから管理画面へログインができない
・buffaloルータへ接続したNASへアクセスできない
という問題が生じる。
そのため、wimaxルータが割り振るアドレスのセグメントに変更するという手順(http://faq.buffalo.jp/app/answers/detail/a_id/15978)を行う。これは、外部からアクセスできるようポートを解放する手順まで含めているが、LAN内だけでNASを使う場合は、上記リンクの手順1/4まで完了する。

僕の躓きポイントとして「2つ以上のネットワーク機器が接続されています」というエラーが起きた。
まず、エアステーション管理ツールで、現在のbuffaloルータのIPアドレスを取得する必要があるが、検索を実行すると「2つ以上のネットワーク機器が接続されています」というエラーが出た。
これについては、仮想OSで使用していたネットワークアダプタがあったため、
「コントロールパネル」「ネットワークと共有センター」「アダプター設定の変更」からbuffaloルータへ接続しているwifiアダプタ以外を無効にしておく必要がある。

上記手順が完了したら、「エクスプローラー」「PC]「ネットワークドライブの割り当て」で「\\buffaloルータに設定したIPアドレス」を入力すると、NASへアクセスができるようになるし、ウェブブラウザのアドレス欄にbuffaloルータに設定したIPアドレスを入力すると管理画面へログインできるようになる。

ここまでくればwimaxルータでの設定だけだ。
まず、wimaxルータへグローバルIPを設定する(http://www.uqwimax.jp/plan/wimax/option/global_ip/
そして管理画面で対象の機器のポートを解放すれば完了だ(https://www.akakagemaru.info/port/w04-portfw.html

対象機器(Rasberry Pi)側での作業についてはこちらを参考にした(https://qiita.com/3no3_tw/items/4b5975a9f3087edf4e20
SSHするポートについても標準から変更しておとセキュリティが向上する。(https://qiita.com/mukoya/items/606c6cfbdf2f5065e0e4

よし準備はととのったぁ!何しようかなぁ!
f:id:anpontan382:20180228224505p:plain

絵本で打線組んだ

f:id:anpontan382:20180219223546j:plain

息子への絵本の読み聞かせのなかでは、数々の名勝負が生まれている。
1冊目に甘いコースに攻めると、息子軍のご機嫌が悪化し、試合は中断を余儀なくされ、
そうなってしまうと、再開後もうんち攻撃などの追撃を許すことになりかねない。
絵本打線の選考は試合展開を決定する上で非常に重要な位置づけとなっている。
息子軍に何度も撃破されながら、試行錯誤の末、ついに僕監督は対息子軍最強打線を組むに至った。
それがこれだ!

1(三) ぶーぶーぶー
2(遊) じゃあじゃあびりびり
3(一) かばんばん
4(捕) いないいないばあ
5(二) あかちゃんごおしゃべりえほん
6(中) がたんごとんがたんごとん
7(右) どうぶつたっち2
8(左) なんだこりゃたまご
9(投) みんなのどうよう
抑え  みんなのおうたえほん
代打  しましまぐるぐる
代走  がたんごとんざぶんざぶん

 

解説しよう!

「ぶーぶーぶー」は非常シンプルでわかりやすく即効性がある1番打者にふさわしい絵本だ。
カラフルな車と様々な効果音の組み合わせは、今日の息子の調子をはかるうえでも欠かせない存在である。
続く「じゃあじゃあびりびり」も効果音をどれだけリアルに読むか、何回繰り返すかなど、その時その時で応用を聞かせることしやすい遊撃手にふさわしい一冊である。
クリーンナップは、かばんから色々なものが飛び出す「かばんばん」で息子の心を掴み、問答無用の王道、「いないいないばあ」が決定打を決める。
5番「あかちゃんごおしゃべりえほん」は教育的な側面があるのはもちろん、赤ちゃん語が連想ゲームのように連なっている構成であるため、大人は読むときに次のページの言葉を思い出す訓練をすると脳トレにもなる優れものである。
「がたんごとんがたんごとん」も、絵と文章がすごく微笑ましい大人にも癒しの絵本で、5番6番は後半疲れてくる大人が回復できるという側面がある。

7番「どうぶつたっち」は最近加わったルーキーであるが、ざらざらやつるつるの素材を動物にみたて、触れる絵本という今までのメンバーにはなかった特性を持った新しいタイプであるため、様子見でスタメン入りを果たした。
「なんだこりゃたまご」は僕監督が小さい頃から好きだったというコネ採用枠で、わざわざ実家から届けてもらい、25年ぶりの復活を果たした。コネ採用の批判があるが、僕が好きだった本なので、対息子軍にも効果を発揮することは確かであろう。
とても硬い卵をライオン・カバ・サイといった動物たちが自分の得意技で割ろうとする話なのだが、どの動物も非常に迫力のあるタッチで書かれていて、とてもおもしろい。ぜひみんな読もう!
投手枠もインパクト重視で音が鳴る絵本が選ばれた。先発に「みんなのどうよう」抑えに「みんなのおうたえほん」。どちらも絵本というより童謡プレイヤーだが、積極的な攻撃を期待して登用した。
代打「しましまぐるぐる」は一番最初に買った絵本であるが、だんだん飽きられつつあるようで、万を持して打席に立つ算段である。
「がたんごとんざぶんざぶんは」は「がたんごとんがたんごとん」の代走を努める。

これはあくまで6ヶ月期への対策であり、今回ベンチ入りを果たせなかった絵本にももちろんチャンスはあるので頑張って欲しい。

【R】保育園スレを形態素解析してトピックを眺める

4月からの保育園が決まったものの、色々と準備が必要になるようで妻とネットを漁っている。
有名な掲示板にも、保育園準備にあたり先輩ママからの助言をきけるスレがあるようだ。

【センパイ】保育園入園&復職準備スレ 11【教えて】 [無断転載禁止]©2ch.net

保育園に持っていかないといけないものや、復職後こういう場合はどうするといった様々なケースにとても丁寧なアドバイスがかかれていて、こういうのがあると友達がいなくても生きていける現代社会は本当にありがたいものだなぁとしみじみ感じる。
とはいえ1000件の書き込みを全部読むのは大変だ。
そんなときは、形態素解析とwordcloudでトピックをざっと視覚化してみよう。

まず、形態素解析エンジンMecabをインストールする。
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
その後Rで、XMLパッケージでスクレイピングし、
RMecabパッケージで形態素解析
wordcloudパッケージで視覚化という手順だ。

#パッケージロード
library(XML)
library(RMeCab)
library(wordcloud)
library(dplyr)

#掲示板を取得
html <- read_html("https://mevius.5ch.net/test/read.cgi/baby/1493387671/")

#掲示板のソースを見ると、書き込み内容はspanタグのclass='escaped'と
#なっているため、対象をxpathで抽出
node <- html_nodes(html,xpath="//span[@class = 'escaped']")

#htmlをテキストに変換
comment <- html_text(node)

#一旦ファイルに出力
write.table(comment,"comment.txt")

#形態素解析を実行
mecab <- docDF("comment.txt", type = 1)

f:id:anpontan382:20180212204551p:plain
1列目が単語、2・3列目が品詞、4列目が頻度となる。
意味不明なもの、記号や数字なども含めて6,700行あった。

#一般名詞、固有名詞だけを抽出
words <- mecab %>% filter(POS1 %in% c("名詞"), POS2 %in% c("一般","固有名詞"))

#wordcloudを描画
wordcloud(words$TERM,wores$comment.txt, min.freq= 7, scale=c(1,1),colors = brewer.pal(8,"Dark2"))

f:id:anpontan382:20180212210348p:plain
7回以上出現した単語をプロットしたが結果が多すぎて一部は表示されていない。その為、wordcloudを実行するたびに結果は変わる。

今回の結果からは、「Tシャツ」「ウインドブレーカー」「ストロー」「靴」「雨傘」「コップ」などについてはみんなが気にしてるものなので、考えとかないといけないようだ。

赤ちゃんの気持ちを知るには

僕の息子もまもなく6ヶ月になる。少し前にブカブカだった服がもう着れなくなっていたり、僕が帰宅するとキャッキャ言って喜ぶようになったと思ったら、人見知りなのか「う~」と唸るようになる時期もあり、かと思ったら最近はまたニコニコしてくれるようになったりと、この6ヶ月で本当にめぐるましく心身が変化していることがわかる。

体の成長は見ればわかるが、まだ言葉を話して意思表示ができないので、心の変化はある程度、想像が必要となる。なぜ、笑ったのか、泣いているのか、怒っているのかを推察し、いないないばぁをしたり、寝かせたりといったことを親はしなくてはならない。

とはいえ、赤ちゃんの気持ちを理解するのは非常に大変だ。最近妻は仕事復帰を見据え、母乳から哺乳瓶へ変えようとしたが、なかなか飲んでくれず、様々な哺乳瓶を試しては、なんでだめなんだろうと悩んでいた。根気強く飲ませ続けたところ、哺乳瓶で飲めるようになったが、息子にどういう心境の変化があったのかはよく分からない。

そんな中で「赤ちゃんの気持ち」なんて検索しているとこんな記事を見つけた。

関心したのは次の部分。

あるときぼくも別のスタッフと「赤ちゃんの気持ちになってみよう」ということで、いろんなものを口に入れてみました。なかでも凄かったのは振動子で、手のひらでささやかに感じる程度の「ブルブル」は、口に入れてみると歯をガタガタ言わせるし、口いっぱいに振動が広がるし、わ!!!すご!!となりました。直感では手の触力(そんなものはない)が10だとすると、口の触力は100だなという感じ。なるほど、みんながモノを口に入れようとするのは、そのほうが情報がたくさん入ってきて面白いからだ、ということに気がつきます。 

僕は大人の視点で、寝ている赤ちゃんを見下ろしながら、「赤ちゃんが」何を考えているのか勝手に解釈していたが、赤ちゃんと同じ条件で、見て聞いて触れたときに、「僕が」何を考えるかというのはとても意味があるのではと考えた。

注意してほしいのは、僕は決して赤ちゃんプレイに興味があるわけではない。前述までのものすごく全うで自然な理由から、哺乳瓶を使ってみる必要があった。

f:id:anpontan382:20180211230305p:plain

妻にもう使わない哺乳瓶を貰い、粉ミルクを溶かして、吸ってみた。真っ先に感じるのは、「飲みづらっ!」ということだ。

哺乳瓶には、直径1mm程度の穴しかあいておらず、吸い出すために乳首部分を吸う必要があるが、口を開けすぎても閉じすぎてもうまく吸うことが難しくなるため、乳首のサイズちょうどに口を開いて固定しなくてはならない。また吸う力も、強すぎると唇が巻き込まれて痛いし、弱すぎると何も出てこない、一定の量を常に出すにはこれもコツが必要だ。また哺乳瓶が真上を向いているときは自然に垂れてくる分がある。大人に飲まされる場合、数滴であるが自分のペースを乱されることになるだろう。また、これは赤ちゃんには関係ないかもしれないが粉ミルクは不味い。ずっと飲んでいると吐きそうになる。自分で飲むなら嫌になったらやめればいいが、赤ちゃんは強制的に飲まされるわけで、粉ミルクの味が気に入らなかったら絶望的な状況だろう。

そんなわけで300ミリを試行錯誤しながら10分以上かけて飲み干した僕は、こりゃ簡単に飲めるもんじゃねぇなという結論に達した。息子が哺乳瓶で飲めるようになるために妻は四苦八苦していたが、息子も同時に大変な苦行だったのだろう。

これからよく言われるヤダヤダ期というのが来て、いろいろなことがうまく進まないかもしれない。それを大人の視点で、「こんな簡単なことも出来ないのか」と思ってはいけないのだ。赤ちゃんの境遇でその問題に向かってみると、本人にとってそれが出来ないものすごく重大で深刻な理由があることがわかるかもしれない。

僕はこれからも真剣に、おむつを履いたり、ハイハイしたりして、息子の気持ちを理解できるよう努める所存である。