旧字旧仮名で日本語の入力ができるiPhone用キーボード
noteの方でも開発記を書いてますが、「旧仮名キーボード」という名前でiPhone用キーボードアプリをリリースしました。
ただ、肝心の公式サイトが検索で出てきたり出てこなかったりするようなので、こちらのブログにも公式サイトのリンクを貼っておきます。
ぜひご利用ください。
入力された文章から括弧の部分だけを削除するサイト
たとえば、「吾輩(わがはい)は猫(ねこ)である。名前(なまえ)はまだ無(な)い。」のように括弧交じりの文章があり、括弧の部分だけを削除したいときにどうするか。
括弧と括弧内の文字を消すサイト
冒頭の問題を解決するために、括弧と括弧内の文字を消すためのサイトを公開しました。下のリンクから飛んでください。
https://yoshy-toshy.main.jp/tool/bracket-remover/
このサイトを使えば、「吾輩(わがはい)は猫(ねこ)である。」のような括弧交じりのテキストを「吾輩は猫である。」のような括弧なしテキストに変換することができます。また、「吾輩(わがはい(本作主人公の一人称))は猫(ねこ)である。」のように二重に括弧がある場合にも「吾輩は猫である。」に変換することができます。
現時点では全角の丸括弧しか対応していませんが、気が向けば半角やその他の括弧にも対応しようと思います。
雑記
「括弧 削除」のようにネットで検索しても正規表現(regular express)の記事ばかりが出てきて、一般の人が気軽に利用できるサイトが見当たらなかったので、作ってみました。個人的にはReactの勉強も兼ねて、こういう細かいツールを量産していきたいと思っているので、なにか他にもリクエストがあれば教えてください。
Switch用ソフト「はじめてゲームプログラミング」がついに明日発売
2021年6月11日(金)に任天堂からゲームプログラミングができるゲーム(正式名称:ナビつき! つくってわかる はじめてゲームプログラミング)が発売されるとのことで、これはぜひいろいろ研究したいと思い、自前で攻略サイトのようなものを開設しました。
このゲームの略称が「はじプロ」になるものだと踏んで、攻略サイトの名前は「はじプロ研究所」としました。
ゲーム内では、84匹のノードンという生き物を駆使してプログラミングしていくのがメインのプレイスタイルらしいので、とりあえずノードン図鑑というものを作っています。
とはいっても発売日は明日なので、まだほとんど詳しい情報が出ておらず、今はとりあえず推測でノードンたちの説明を書いているので、現時点ではでたらめなことを書いている可能性は十分にあります。
公式PVを見たのですが、ノードンの中には「ボタンが押されたら」や「画面タッチされたら」という条件をトリガーに発火し、なんらかの合図を別のオブジェクトに伝達するものがあり、これらを任意のキャラクターのイベントリスナーとして紐づけることができるようです。
Q&Aによると小1からでも遊べるものらしいのですが、3Dプログラミングに必須ともいえる平方根やアークタンジェントなどもきちんと用意されており、思いついたアイデアは一通り実現できるようになっているのかなと想像。
実は今朝すでにソフト自体は購入してダウンロードまで済ませてあるので、日付が変わってプレイが解禁になるまで待ち遠しいですね。
【押ボタンでLINE送信】高齢者向けの押ボタン式LINE投稿装置を作った(②LINEメッセージ送信編)
前回は電子回路を組む部分を紹介したので、今回はLINEメッセージ送信編です。
前回の記事はこちら。 yoshy-toshy.hateblo.jp
作り方
すでに前回の目標(ボタンを押すとコンソール上にメッセージが表示される状態)が完成した前提で説明します。
本記事での目標
ボタンを押すと、LINEメッセージが送信されるところまでを作ります。
自分の個人アカウント(あなたが普段プライベートで使っているアカウント)でLINEメッセージを送信するわけではなく、ボット用のアカウントを作り、そのボットにメッセージを送信させる仕組みです。
おおまかな流れ
下記の流れで作成します。
- ボット用アカウントの作成
- プログラムの修正
- アクセストークンの設定
- 宛先のUser IDの設定
- プログラムの実行
1. ボット用アカウントの作成
まず、公式ドキュメント(以下URL)に載っている手順で、チャネルを作成します。 作成したチャネル名はそのままボットの名前になります。
https://developers.line.biz/ja/docs/messaging-api/getting-started/
作成が終わると以下のようになります。
作成したチャネルをクリックして下の方にスクロールすると、友達追加用のQRコードが表示されているので、自分のスマートフォンで読み取って友達になっておきます。
2. プログラムの修正
前回のコードでは、ボタンを押したときにprint(self.text)
でコンソールにメッセージを表示する処理を実行していましたが、今回のコードでは、_send()
というメソッドを作り、LINEにself.text
のメッセージを送信する処理に書き換えます。
下記が修正版のコードです。Raspberry Piの任意のディレクトリに「line.py」というファイル名で保存します。
import RPi.GPIO as GPIO import time import os import json import urllib.request LINE_ACCESS_TOKEN=os.environ.get("LINE_ACCESS_TOKEN") LINE_USER_ID=os.environ.get("LINE_USER_ID") BUTTON_MESSAGE={} BUTTON_MESSAGE[6]="こんにちは" BUTTON_MESSAGE[13]="ありがとう" BUTTON_MESSAGE[19]="さよなら" BUTTON_MESSAGE[26]="また会いましょう" class Button: gpio=None before=False now=False token="" to="" text="" def __init__(self,gpio,token,to,text): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) self.gpio=gpio self.token=token self.to=to self.text=text def _send(self): data = {"to" : self.to, "messages" : [{"type" : "text", "text" : self.text}]}; headers = {"Content-Type" : "application/json; charset=UTF-8", "Authorization" : "Bearer " + self.token}; req = urllib.request.Request("https://api.line.me/v2/bot/message/push", json.dumps(data).encode(), headers) urllib.request.urlopen(req) def check_and_send(self): self.now=GPIO.input(self.gpio) if self.before==False and self.now ==True: self._send() self.before=self.now if __name__ == '__main__': GPIO.setmode(GPIO.BCM) buttons=[] for key in BUTTON_MESSAGE: button=Button(key,LINE_ACCESS_TOKEN,LINE_USER_ID,BUTTON_MESSAGE[key]) buttons.append(button) try: while True: for button in buttons: button.check_and_send() time.sleep(0.05) except KeyboardInterrupt: GPIO.cleanup()
LINEのPUSH API(メッセージを送るAPI)は、「アクセストークン」「宛先のUser ID」「メッセージの内容」をPOSTリクエストとしてhttps://api.line.me/v2/bot/message/push
に送ると実行されます。このうち、「アクセストークン」「宛先のUser ID」についてはコード中に書くのではなく、環境変数として定義したものを参照するようにしています。
次節以降で各環境変数の設定の方法を説明します。
3. アクセストークンの設定
アクセストークンとは、作成したアカウントのAPIを利用するための合言葉のようなもので、アカウントごとに固有の文字列が付与されます。このアクセストークンを添えてAPIを叩く(例のURLにPOSTリクエストを投げる)と、今回作成したアカウントに任意のメッセージを送らせることができます。
LINE APIにおいて、アクセストークンは「チャネル基本設定」の「アクセストークン(ロングターム)」の「再発行」ボタンを押すと取得することができます。
取得したアクセストークンをLINE_ACCESS_TOKEN
という名前で環境変数として保存します。
たとえば、取得したアクセストークンがXXXXYYYYZZZZ
という文字列だった場合、以下のようなコマンドで設定できます。(以下のコマンドで設定した環境変数は、ターミナルを閉じると無効になります)
$ echo LINE_ACCESS_TOKEN=XXXXYYYYZZZZ
ちなみに、LINE APIに限った話ではないのですが、アクセストークンは他人の目の触れない場所で管理する必要があります。たとえば、もしアクセストークンをコードの中に書き込んでGithubの公開リポジトリなどにうっかりプッシュしてしまった場合、悪意あるプログラマがAPI経由でアカウントを操作できてしまいます。コード中に直接書き込んでも動くことは動きますが、セキュリティ的にはタブー行為なので、今回のように環境変数として保持するようにします。
4. 宛先のUser IDの設定
ボタンを押した際にメッセージを送る宛先として、自分の個人アカウントのUser IDを使用します。
「チャネル基本設定」の「その他」の「Your User ID」に載っている文字列が、自分の個人アカウントのUser IDです。(アカウント検索などに使うIDとは別物です)
User IDはLINE_USER_ID
という名前で環境変数として保存します。
たとえば、自分のUser IDがUUURRRSSS
という文字列だった場合、以下のようなコマンドで設定できます。(以下のコマンドで設定した環境変数は、ターミナルを閉じると無効になります)
$ echo LINE_USER_ID=UUURRRSSS
5. プログラムの実行
ここまでで、ボット用アカウントが自分の個人アカウント宛にメッセージを送信する処理が完成しました。
以下のコマンドを実行し、プログラムを起動します。
$ python3 line.py
ボタンを押すと、以下のようにボット用アカウントから自分宛にメッセージが送信されるはずです。
送信されない場合、ボット用アカウントを友達登録していない可能性があるので、すでに説明したとおり、QRコードから友達登録してください。
次回予告
次回は、ボット宛に送信されたLINEメッセージを自分のサーバで受け取り、任意の画面表示を(半ば強引に)実現する方法を紹介します。
また、自分宛ではなく特定のグループ宛にメッセージを投稿するように変更を加える方法もあわせて説明します。
【押ボタンでLINE送信】高齢者向けの押ボタン式LINE投稿装置を作った(①電子回路編)
祖父が最近タブレットを買ってもらってLINEの使い方などを練習中らしいのですが、まだ使いこなすには時間がかかるということなので、敬老の日に「押ボタン式LINE投稿装置」の試作品を作ってみました。
作ったもの
操作盤で送信したいメッセージのボタンを押すと、あらかじめ設定しておいた特定のLINEグループにメッセージを投稿できます。
送受信したメッセージは、居間のテレビ(HDMI入力)から確認できます。母の部屋にちょうどいいテレビがあったので、LINE専用台として使うことにしました。
もちろん、LINEアプリでも投稿装置によって送信したメッセージの内容を確認できます。
試作品なので改善すべき課題は残っていますが、とりあえず動くものはできたので作り方などを紹介していきます。
作り方
今回のシステムは、Raspberry Pi(電子回路関係)、LINE Messaging API(LINEメッセージ送信関係)、Google Apps Script(大画面表示関係)など複数の技術を組み合わせて作っており、1つずつ説明すると長くなるので、記事を「電子回路編」「LINEメッセージ送信編」「大画面表示編」の3回に分けます。今日は電子回路編です。
本記事での目標
ボタンを押すと、コンソール上にメッセージが表示されるところまでを作ります。
大まかな流れ
下記の流れで作成します。
- 材料の調達
- Raspberry Piのセットアップ
- 回路の作成
- テストコードの実行
1. 材料の調達
秋葉原や大阪日本橋の電子部品屋に行くと入手できます。Raspberry Piやブレッドボードはさまざまな工作や実験に使えるので、1台買っておくと今後のクリエイティビティの幅が広がると思います。
部品名 | 価格 | 必要な個数 | 説明 | URL |
---|---|---|---|---|
Raspberry Pi 3 MODEL B 本体 | 5,000 [円/台] | 1台 | RaspbianというUNIX系OSで動く小型PC。電子回路への入出力をするためのピンが40本生えており、LED発光やモーター回転やボタン押下検知や温度検知など、さまざまな物理操作をプログラム上で制御できる。 | RASPBERRY-MODB-BPLUS 【本体】Raspberry Pi Model B+ |
Raspberry Pi用の電源コード | 700 [円/個] | 1個 | Raspberry Piを電源につなぐためのコード。 | スイッチングACアダプター(USB ACアダプター) MicroBオス 5V3A: 電源一般 秋月電子通商-電子部品・ネット通販 |
マイクロSDカード | 780 [円/枚] | 1枚 | Raspbian(Raspberry PiのOS)を焼くためのメモリ。 | TOSHIBA マイクロSDカード(microSDHC)EXCERIA 16GB 100MB/s: 雑貨 秋月電子通商-電子部品・ネット通販 |
ブレッドボード | 200 [円/枚] | 1枚 | 電子回路を組むための板。 | ブレッドボード BB−801: パーツ一般 秋月電子通商-電子部品・ネット通販 |
ジャンパーワイヤ(オス - メス) | 220 [円/10本] | 6本 | Raspberry Piとブレッドボードを接続するための導線。 | ブレッドボード・ジャンパーワイヤ(オス−メス) 15cm(黒) (10本入): パーツ一般 秋月電子通商-電子部品・ネット通販 |
ジャンパーワイヤ(オス - オス) | 180 [円/18本] | 最低4本 | ブレッドボード内で回路を作るための導線。 | ブレッドボード・ジャンパーワイヤ(オス−オス) 10cmセット: パーツ一般 秋月電子通商-電子部品・ネット通販 |
ボタン | 168 [円/個] | 4個 | ブレッドボード内で回路を作るための導線。 | 日本開閉器工業 JF-15SKCBNP2 タクトスイッチ黒枠○(青) |
抵抗(330Ω) | 100 [円/100個] | 4個 | 回路を作る際に使用する抵抗。抵抗がない場合、回路に大電流が流れてRaspberry Piが壊れるおそれがある。 | カーボン抵抗(炭素皮膜抵抗) 1/4W 330Ω (100本入): パーツ一般 秋月電子通商-電子部品・ネット通販 |
※上記のほか、Raspberry Piをセットアップするために、マイクロSDカードを自分のPCに挿すためのアダプタ、HDMI接続可能なディスプレイ、HDMI-HDMIコード、マウス、キーボードなどを適宜用意する必要があります。Raspberry Piセットアップまわりで必要な道具は、次章で紹介する記事が詳しいので参考にしてください。
また、電子回路が初めての人はLEDなども買っておいた方がよいかもしれません。電子工作の世界ではLEDをチカチカさせる通称「Lチカ」が、プログラミングでいうHello, world!にあたります。この記事の内容を実践する前に、Raspberry PiでのLチカを成功させておいたほうが理解がスムーズになります。
2. Raspberry Piのセットアップ
下記の記事のとおりにRaspberry Piをセットアップします。wi-fiに繋がるようになったら大丈夫です。
3. 回路の作成
下記のとおりに回路を作成します。 橙色の線がオス- メスのジャンパーワイヤで、青色の線がオス-オスのジャンパーワイヤです。
Raspberry Piの各ピンは役割が決まっているので、必ず下図に示したとおりのピンを利用します。
Raspberry Piのピンに関する解説
Raspberry Piのピンには複数の種類があり、電子回路を自作する際には、その配置を確認する必要があります。
下記は公式ドキュメント(https://www.raspberrypi.org/documentation/usage/gpio/README.md)に載っている図ですが、黄色が任意の入出力のためのピン、黒がグラウンド、橙が3.3V電源、赤が5V電源になっています。
今回の押ボタン式LINE投稿装置では、3.3V電源ピンからグラウンドピンにかけて電圧3.3Vの電気を流し、6番、13番、19番、26番の入力ピンにかかる電圧を見ることにより、どのボタン(回路を繋ぐためのスイッチ)が押されたかを判断します。Pythonプログラム上では、GPIO.input(ピン番号)
という関数がTrueを返すかFalseを返すかによって、その瞬間における当該ピンの入力を得ることができます。
ブレッドボードに関する解説
ブレッドボードは、大量の穴があいており、ジャンパーワイヤを挿すことによって回路を作成できるようになっています。各穴は下図の黄色で示すように内部で繋がっており、異なる2列にまたがるようにジャンパーワイヤを挿すと、その2列は回路的に接続された状態になります。
ボタンの爪に関する解説
ボタンの裏には回路に接続するための爪があるのですが、どの爪とどの爪がセットになっているのかを仕様書を読んで確認し、正しくブレッドボードに設置する必要があります。
そもそもボタンとは、回路図を見てわかるように、押している間だけ回路が繋がるスイッチのような役割を持つ部品です。今回購入したJF-15SKCBNP2という型番のボタンは、4つの爪があります。仕様書によると、各爪の関係性は下図のような構造になっているとのことなので、今回は1番と3番の組み合わせを利用します(2番と4番の組み合わせでも問題ありません)。
多くの場合、電子部品の仕様書はメーカの公式サイトからPDFダウンロードできます。
JF-15SKCBNP2の仕様: https://www.nkkswitches.co.jp/product/detailed/JF-15SKCBNP2.html
購入した部品の型番をGoogleで検索すると、公式サイトや仕様書などが見つかります。
4. テストコードの実行
下記のPythonコードで電子回路の動作確認ができます。test.py
という名前で保存し、Raspberry Piの任意のディレクトリに置きます。
# -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time BUTTON_MESSAGE={} BUTTON_MESSAGE[6]="こんにちは" BUTTON_MESSAGE[13]="ありがとう" BUTTON_MESSAGE[19]="さよなら" BUTTON_MESSAGE[26]="また会いましょう" class Button: gpio=None before=False now=False text="" def __init__(self,gpio,text): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) self.gpio=gpio self.text=text def check(self): self.now=GPIO.input(self.gpio) if self.before==False and self.now ==True: print(self.text) self.before=self.now if __name__ == "__main__": GPIO.setmode(GPIO.BCM) buttons=[] for key in BUTTON_MESSAGE: buttons.append(Button(key,BUTTON_MESSAGE[key])) try: while True: for button in buttons: button.check() time.sleep(0.05) except KeyboardInterrupt: GPIO.cleanup()
test.py
を保存したディレクトリで、下記のコマンドを実行します。
$ python3 test.py
ボタンを押せば、コンソール上に「こんにちは」「ありがとう」などのメッセージが表示されます。
ここまでで、本記事で目標としていた「ボタンを押すとコンソール上にメッセージが表示される状態」が完成しました。
表示するメッセージを変えたい場合はBUTTON_MESSAGE[ピン番号]
の値を書き換えます。
たとえば、6番ピン(「Raspberry Piのピンに関する解説」に掲載した図を参照)につながっているボタンのメッセージを「おはよう」に変えたい場合は、BUTTON_MESSAGE[6]="こんにちは"
をBUTTON_MESSAGE[6]="おはよう"
に書き換えます。
なお、アルゴリズムに関しては詳しくは解説しませんが、自分でソースコードを改変して実験してみたい人は「ラズパイ GPIO」などで検索すると、GPIO(ピン制御)まわりのコードについて詳しく知ることができます。たとえば、下記の記事がわかりやすいです。
次回予告
次回は、今回表示できるようになった各ボタンのメッセージをLINE Messaging APIによって送信する部分の作成方法を紹介します。
【馬鹿判定器】馬と鹿を弁別する画像認識AIを作った
Noteに移行しました
Noteに移行しました。記事のシェアなどはNote経由でお願いします。
メモ
記事本文は、Noteからご覧ください。 なんとなくデモサイトとソースコードのリンクは残しておきます。
デモサイト
https://horse-deer.herokuapp.com/
ソースコード
参考記事
AIモデル構築ロジックについては、以下の方々のソースコードなどを下敷きに作成しました。
【バルスの呪文】Python+Flaskでウェブサイト自爆ボタンを作ってみた
たとえば自分が運営しているウェブサイトが、何らかの理由で炎上したり、何者かに乗っ取られたりしたとき、管理者の意思でウェブサイトをただちに消滅させることができれば、被害を最小限に喰いとどめられるだろう。
いざというときに頼りになるのは自爆のみ。このことはラピュタのアニメを観ても明らかである。
作ったもの
以下はデモサイトです。
https://balse.herokuapp.com/leete_latobarita_uruth_ariaroth_bal_netoreel
画面中央にあるBALSEボタンを押すと、そのウェブサイト上の全ファイルが物理削除され、誰もそのサイトにアクセスできなくなります。
ちなみに、上のデモサイトを開いたときに「This website has been balesd by someone.」というメッセージが表示された人は、すでに通りすがりの誰かがBALSEボタンを押してサイトを破壊してしまった後なので、当面アクセスできません。
気まぐれで再デプロイするので、運が良いと下図のような画面が表示されます。
ソースコード
ローカル環境で動作させる方法
自分のPCでローカルサーバを立てて、画面を表示する方法を説明します。
少し危険なコードなので、くれぐれも削除するディレクトリのパスをCドライブに書き換えたり、プログラムファイルを元あったディレクトリの外に移動させたりしないようにしてください。すべて自己責任でお願いします。
動作確認したバージョン
- python 3.6.8
- flask 1.0.3
上記のバージョンは下記のコマンドで確認できます。
$ flask --version
Flaskがインストールされていない場合は、下記のコマンドでFlaskをインストールします。
$ pip install Flask
手順
すでにPythonの実行環境は整っているものとします。
Gitからリポジトリをクローンしてきます。
$ git clone https://github.com/yoshy-toshy/balse.git
次に、balseフォルダの中に移動し、laputa_command.py(Flaskのサーバ起動処理を含むPythonファイル)を実行します。
$ cd balse
$ python laputa_command.py
ここでサーバが起動します。
おそらく5000番ポートが開いたと思うので、以下のURLにアクセスします。
http://localhost:5000/leete_latobarita_uruth_ariaroth_bal_netoreel
なお、URL中のleete_latobarita_uruth_ariaroth_bal_netoreelというのは、laputa_command.pyの中で定義されているバルス画面へのパスです。
バルスの対象範囲は、基本的にlaputa_command.pyが置かれているディレクトリ以下すべてです。 ただし、laputa_command.py自身は消されずに残ります。
Herokuで動作させる方法
ローカル環境ではなく、Herokuで動作させる方法を説明します。 Herokuとは、自分の構築したウェブサイトをデプロイし、一般公開することができる環境です。一定の制限内ならば、無料で利用できます。
Githubに自分用のリポジトリを作成
HerokuはGithubのブランチと連携することにより、簡単に開発物をデプロイすることができます。
(おそらく前章でローカルに落としてきたリポジトリはバルスによって消失してしまっているのではないかと思うので)再びクローンして正常に動作することを確認します。
その後、Githubに自分用のリポジトリを作成してプッシュします。
Herokuにデプロイ
Herokuアカウントを持っていない場合、以下の公式サイトでアカウントを作成します。
アカウント登録が完了したら、適当な名前で新規アプリを作成し、先ほどGithubで作成したリポジトリのブランチと連携設定をします。 新規アプリ作成からブランチとの連携については、以下のページが参考になりました。
デプロイが完了したら、以下のURLを改変してバルス画面にアクセスします。
https://{アプリ名}.herokuapp.com/leete_latobarita_uruth_ariaroth_bal_netoreel
以上で完成です。
現在存在しているのはバルス画面だけですが、あとは自分の好きなようにページを追加するなどして自身のウェブサイトを構築できます。 BALSEボタンを押してウェブサイトを破壊してしまった場合、もう一度Herokuの管理画面からデプロイすれば、初期状態に復元することができます。