データベースを使ったサイトを作りたい① データを収集する

あんま複雑じゃないやつ

なんかいい題材ないかなーと、さ迷っていたら将棋連盟のサイトにまいにち詰将棋というコーナーがあるのを知った。

https://www.shogi.or.jp/tsume_shogi/everyday/

これの右のメニューのところの手数のリンクはこのまいにち詰将棋のカテゴリ分けされているわけではなく、また別物で、まいにち詰将棋自体は特に整理されているわけではなさ気な感じだった。これをいい感じに検索できるサイトとかどうかなーと思ったので挑戦してみる。

スクレイピング

とりあえず今ある詰将棋を集めてデータを作る。今自分にできるのはVBA+IEでのスクレイピングなので、それ使ってデータを収集する。

Sub getdata()

    Dim objIE As InternetExplorer
    Set objIE = CreateObject("Internetexplorer.Application")
    
    objIE.Visible = True
    objIE.navigate "https://www.shogi.or.jp/tsume_shogi/everyday/"
    
    Do While objIE.Busy = True Or objIE.readyState <> 4
    DoEvents
    Loop
    
    Dim htmldoc As HTMLDocument
    Set htmldoc = objIE.document
    
    Call scrape(htmldoc)
    
    Dim lastpg As Long
    lastpg = 103
    
    For i = 2 To lastpg
        objIE.navigate "https://www.shogi.or.jp/tsume_shogi/everyday/index_" & i & ".html"

        Do While objIE.Busy = True Or objIE.readyState <> 4
        DoEvents
        Loop

        Set htmldoc = objIE.document

        Call scrape(htmldoc)

    Next i

End Sub
Function scrape(ByVal doc As HTMLDocument)
    
    
    Dim ul As IHTMLElementCollection
    Set ul = doc.getElementsByClassName("floatListA01Col3-30 indexListA01 fixHeight section04")
    
    Dim taga As IHTMLElementCollection
    Set taga = ul(0).getElementsByTagName("a")
    
    Dim tagp As IHTMLElementCollection
    Set tagp = ul(0).getElementsByTagName("p")
    
    For i = 0 To 11
        Dim lr As Long
        lr = ThisWorkbook.Sheets("data").Cells(Rows.Count, 1).End(xlUp).Row
    
        ThisWorkbook.Sheets("data").Range("A" & lr + 1).Value = tagp(i).innerText
        ThisWorkbook.Sheets("data").Range("B" & lr + 1).Value = taga(i).href
    Next i

End Function

こんな。最後のページでエラー出て止まるけど、とりあえず目的のデータを集めれた。

https://docs.google.com/spreadsheets/d/1Y4m1OsRpKM8bNnK9abkaHeeSyOuwnDy_jHKV79QnNW0/edit?usp=sharing

で、これをちょっと加工して、作成者と手数の列と更新日の列を作って、んー、とりあえずCSVで保存する。

https://docs.google.com/spreadsheets/d/16K37qfVCaHQOl1gGXy9PqUn_zjQm9U3n272CfIKKmvE/edit?usp=sharing

こんな。なんか、別にもうこれでフィルタかけりゃ目的達成できてね?っていうのはあるものの、これをデータベースに保存してー、クエリに応じてデータ引っ張ってきて表示ーみたいなのをやりたいの。

とりあえず今日はここまで。

カテゴリー: したい | タグ: , , | コメントする

メールサーバーを立てたい

メールサーバー

サーバーも借りたし、ドメインも取ったのに、メールサーバー立ててみてなかったなーと思い、立ててみることにした。ちょうどWebArenaのマニュアルに

https://help.arena.ne.jp/hc/ja/articles/360039330393

https://help.arena.ne.jp/hc/ja/articles/360038840014

https://help.arena.ne.jp/hc/ja/articles/360039330373

と、メールサーバー構築の方法が載ってたので、この通りにやってく。

DNSの設定

初っ端からDNSの設定方法が載ってなかったので自分で調べる。メール使えるようにするにはMXレコードというのを追加すればいいみたいなので追加した。ちなみになぜこのドメインがnjallaかというと単に厨二心がくすぐられたからであり、今はやや後悔している。情報とかないし、英語だし、ね。まぁそれはそれとして

追加した。

Postfixの設定

なんか元から入ってるらしい。内容的には上記のリンクの通り進める。んですが。

system-switch-mail

ってやってもコマンドが見つからねぇってなる。検索して

https://tech.godpress.net/?p=272

こちらの方のやり方を試してみたら

# alternatives --config mta

There is 1 program that provides 'mta'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number:

そもそもPostfixしか入ってなかった。幸先が悪いが進める。そしたら

-o smtpd_etrn_restrictions=reject

が無い。困った。とりあえず書き足しておいてみる。で、色々やって終わり。あれ?こんなんでいいの?

Dovecotの設定

これも上記リンク見ながらやるけど、起動しか書いてない。。。かつ

service dovecot start

って打っても

Redirecting to /bin/systemctl start dovecot.service
Failed to start dovecot.service: Unit not found.

ってなる。んんん~?怪しくなってきたぞ。でもまぁとりあえずインストールしないと。

yum install dovecot

できた。でもっかいスタートすると起動したっぽい。そして、これで終わったんだが、どういうことだ…。

〇〇@dalomo.netってメールアドレスになると思うんですが〇〇の部分っていつ設定したの?メールってサーバーに保存されるの?全然わからない。雰囲気で設定している。

さくらのマニュアル使う

https://www.sakura-vps.net/centos7-setting-list/postfix-settings-for-sakura-vps-centos7/

https://www.sakura-vps.net/centos7-setting-list/dovecot-settings-for-sakura-vps-centos7/

あまりにやってること足りないような気がしたので、さくらのマニュアルに沿ってやってみた。centOSのユーザーアカウントがそのままメアドのアカウントになるみたい。なるほどなー。

ポートが開いてなさげ

VPSのコンパネからセキュリティグループに

tcp:25,25,ip4:0.0.0.0/0
tcp:587,587,ip4:0.0.0.0/0
tcp:110,110,ip4:0.0.0.0/0
tcp:143,143,ip4:0.0.0.0/0

を追加。

確認する

インストール・設定が終わったので試してみた。

  • ターミナル上からmailコマンドで外部サーバー(Gmail)にメール送信→できる。
  • 外部サーバー(Gmail)から自サーバーへメール送信→なんかできないよーって返ってくる。
  • メールクライアント(Thunderbird)で自サーバーに接続しようとする→できない。

受信の部分とログインでうまくいってないっぽい。

telnetで確認

yum -y install telnet

でtelnetをインストール。

telnet localhost imap

結果

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.
* BYE Disconnected for inactivity.
Connection closed by foreign host.

意味よく分かんないけど、大丈夫な気がする。

ログを見る

vi /var/log/maillog

中身

dovecot: imap-login: Aborted login (no auth attempts in 0 secs):ほにゃらら

postfix/smtpd[27083]: warning: SASL authentication failure: Internal Error -4 in server.c near line 1757
postfix/smtpd[27083]: warning: xsasl_cyrus_server_get_mechanism_list: no mechanism available
postfix/smtpd[27083]: fatal: no SASL authentication mechanisms

これが怪しいかなぁ…。エラー文言でググると

https://www.ipentec.com/document/linux-postfix-warning-xsasl-cyrus-server-get-mechanism-list-no-mechanism-available

こちらを見つけた。あれ?入れてなかったっけ?と思って

yum list installed | grep cyrus

結果

cyrus-sasl.x86_64                  2.1.26-23.el7                  @base
cyrus-sasl-lib.x86_64              2.1.26-23.el7                  @base

おー、これかな?言われるがままに

yum install cyrus-sasl-plain
yum install cyrus-sasl-md5

してみて再度

yum list installed | grep cyrus

結果

cyrus-sasl.x86_64                  2.1.26-23.el7                  @base
cyrus-sasl-lib.x86_64              2.1.26-23.el7                  @base
cyrus-sasl-md5.x86_64              2.1.26-23.el7                  @base
cyrus-sasl-plain.x86_64            2.1.26-23.el7                  @base

ふむー。

メールクライアントで接続を試みてみると…

やったぜ!でも接続の保護なしってなってる。大丈夫なのかな。とりあえず試す。

  • 自→自 … OK
  • 自→外 … OK
  • 外→自 … OK

おー、すごいちゃんと送受信できてる。とりあえずこれでいーや。

カテゴリー: できた | タグ: , , , | コメントする

マジックミシンでマスク作ってもらった

マジックミシン

前回の記事と前後するぐらいに、マジックミシンで生地持ち込み可のマスク制作サービスを見つけたんですよ。作業賃1,000~1,200円だったかな?

https://www.magicmachine-rs.com/service/mask.html

いいじゃん~自分で作る必要ないじゃん~って思ってお願いしてみた。出来上がりまで1~2週間、自分は1週間だった。そしたら、見て。

出来上がり

すごくない?

やばくない?

端も完璧。

表もすっごい綺麗。

難しそうなところもきっちりバッチリ。

裏面も当然のように美しい。ちなみにこれ生地が浮いてこないようにしつけてあるのね。でもパッと見じゃ全然分からんし、表に縫い目出てきてないからどうやってるのかも分からん。まじすごい。

細部もちゃんと作ってくれている。

プロの仕事を見た

マジで出来上がりを見たとき感動してしまった。自分で作った後だったっていうのもあるかもしんないけどほんとすごいと思う。これで売っててもおかしくない。ちなみに裏地違うのは持ってくの忘れてその日に違う生地買ったから。あとゴム紐は自分で通したけど、お店側でもやってくれる。この生地でいけますかーって相談にものってくれて、通常の生地じゃないから苦労かけさせてしまったっぽいけど見事に作り上げていただけました。いやーいい買い物したわ。もう1枚作ってもらおうかな~。

カテゴリー: のーと | タグ: , , , , , | コメントする

ザムストのスポーツ用マスク買えなかったので自分でマスク作った

ザムストのマウスカバー

コロナで巣篭もりしてたらめちゃめちゃ太ってしまったので、自粛期間明けからジムに通うことにした。普通にトレッドミルと、たまにステップミルを使ってる。んでステップミルはそんなでもないんだけど、トレッドミル使ってるとめちゃめちゃ汗かく。今の時期はまだ入場時マスク着用必須のため、普通の不織布マスクを使ってるのだけど、汗かくと口にまとわりつくわ、汗で濡れて通気性無くなって呼吸できなくなるわで大変。そんな時にスポーツ用のマスク、っていうかマウスカバーっていうらしい、をザムストが発売することを知った。

https://www.zamst.jp/topic/mouth-cover/

これは良さげだなと思ったのだけど、超人気で即日完売だった。うぬぅ。ただ、商品説明を見てみるとメッシュっぽい素材で、Wラッセルっていう生地を使ってることを知りまして、それは普通に売ってることを知った。お、これはもしや作ろうと思えば作れるのでは?自作マスクってよく聞くし…って思い立ったが吉日なので、自分で作ってみることにした。

ミシンをどうする

手縫いでやるかとふと思ったんだけど、さすがにそれは辛いんじゃないだろうかと思い直し、ただミシン買うほどでもないなぁと思ったのでレンタルサービスを使うことにした。

https://mishin-rent.com/

それがこちら、探した中では多分一番安い気がする。たぶんね。コンパクトミシンを1週間借りて4,200円でした。大体他のサイトって3泊4日~って感じが多かったんだけど、初心者っていうか学生時代以来のミシン利用だし絶対時間足りなくなるなと思ったので1週間の金額で比較した。表とかはありません。

生地を選ぶ

とにかくダブルラッセルっていう生地を探す。すると楽天で端切れを見つけた。

https://search.rakuten.co.jp/search/mall/%E3%83%80%E3%83%96%E3%83%AB%E3%83%A9%E3%83%83%E3%82%BB%E3%83%AB/

まぁなんか好きな色のを買う。んで、このダブルラッセルっていう生地が、リュックの背当てとかに使われている生地らしい。で裏面が直接顔に当たると擦れて痛そうだなぁと思ったので、裏地として違うメッシュ生地を買うことにした。

https://item.rakuten.co.jp/knit-yamanokko/yfm298-pi006/

これ。色々見てみて、これがいいかなぁと思って買ってみた。あとザムストのマス…、マウスカバー見ると、端の処理に違う素材の生地を使ってるみたい、ただなんの生地使ってるかまでは分からなかったのでとりあえず

https://item.rakuten.co.jp/knit-yamanokko/yfsk2200-900bk/

これを買ってみた。後で使ってみて思ったんだけど、接触冷感が付いてるやつを使ったほうがより快適かもしれない。これらの生地は吸汗機能は優秀なんだけど、メッシュ素材でも熱はある程度こもる感じだった。ただ作るの大変だったからとりあえずはこれで良しとして、まじで我慢できなくなったっら違う生地を使ってみようと思う。

マスク作る

作る解説は他の方の記事とか見るといいと思う。で、見様見真似だし、技術力の問題もありレシピ通りに作ってないし、ザムストのやつそのまんま作るのは絶対無理なので自己流です。なので流れだけ写真撮った。

ダブルラッセルの生地。表。

アップ。

裏面。写真で見ると生地詰まってるように見えるけど、全然そんなことはなく、スッカスカだった。ただやっぱりこれが直接肌に当たると擦れる気がする。

型紙も自分で作って切り抜いた。

そんで裏地に使うつもりの生地。

アップ。スベスベメッシュで気持ちよさそー。

これも切り抜いた。

ミシン!家にミシンあるってなんか慣れない。あとめっちゃ場所取る。生地を重ね合わせて、ずれないようにして縫ってく。

なんで撮ったか忘れた。

カーブを縫い合わせましたの図。すでに生地がずれてきてるので、ずれたところはぶった切った。

端を包む用の生地。

包んだ。めっちゃ難しかった。縫い目ガタガタだし。生地の端からの距離が最初と最後で合ってないし。表縫ってたと思ったら、裏はちゃんと針が布を通ってなくて無駄に2回縫ったりしたし。

ゴム紐通すところも同じ生地で作った。

初めてにしてはよくできたと思うんですけど!

まぁ縫い目荒いし、ところどころ失敗してるし見栄えは良くない。うん。

でも意外と上手にできたと思うんだけどなぁ~。ちゃんと使えてるし。

ゴム紐も通したー。耳が痛くならないように、頭に回すタイプの付け方にした。

ただ第一印象は、なんかブラジャーみたい、でした。

使ってみた

使用中の写真はありませんが、使ってみたら非常に快適。メッシュ生地で通気性抜群のため激しく呼吸したとしても息苦しさは皆無だった。めっちゃいい、見た目悪いけど。ただ上にも書いたようにある程度熱はこもる感じがする、特に運動し始めのぐらいはそれが顕著だなー。息が激しくなってくると空気がどんどん循環されるのであまり気にならなくなってくるけどね。これはまた別の生地を使ってみれば解決するのかなぁ?ただ今のままでも十分満足する結果なので、それは気が向いたらまた買ってやってみよう。(多分しない)

カテゴリー: したい, できた | タグ: , , , , | コメントする

FusionPCBから基板が届いた

FusionPCB

注文してた基板がやっと届いた!6/8に届いたから、2ヶ月かかった…コロナあったから仕方ないとはいえ、長かったなぁ…。

プチプチ真空パックされている。こんな感じなんだー。

うひょー、ピッカピッカでめっちゃちゃんとしてる!

ちゃんとurlも入ってるwもっとシルクスクリーン入れればよかったな。あっさりしてる。

チップ置いてみた。もう完全にぴったし!良かったぁ~これが心配だったんだよね。

10枚あるよ!こんなには、いらなかったりする。まぁ最低発注単位が10枚だったからなんだけど。どうしよう、欲しい人とかいるかな。でも1mmピッチの52pin QFPの半導体用DIP化基板なんてニッチ過ぎるよな。まぁもしいたら言ってくれればあげます。よろぴく。

カテゴリー: のーと | コメントする

twitterで腐り芸人botを作りたい

腐り芸人

この前ゴッドタンを見ていたら腐り芸人の発言でかるたを作ろうという回だった。読み札を眺めていると、なんかtwitterっぽいなぁと思ったので、これを元ネタにbotを作ってみたくなった。やったことないけど多分簡単だろうと高を括りつつやってみる。

データを作る

幸いTVerで配信していたので、それを一時停止しながらデータを打ち込んだ。いくつか複数読み札がある。あ、い、う…は一応見出しでつけたけど、いらないかもしんない。エクセルに打ち込んだけど、とりあえずtxtで保存しとく。

twitterのアカウントを作る

https://twitter.com/RottenComedian

PCからだと一旦ログアウトしないと新規アカウントを作れないみたいなので、一旦ログアウトしたらパスワードを忘れていることに気づき焦った。アイコンとヘッダ画像を変えて、名前を変えられるようにして腐り芸人botという名前にしようと思う。

 

形から入るタイプ。アイコンとヘッダ作ったけど、なーんか野暮ったいね。素人だからしょうがないっかー。

twitter側の設定をする

APIを使ってアクセスする感じらしく、その場合こんな感じの流れで準備してくらしい。

How to get started with the Twitter APIs

To get started using the Labs endpoints, standard APIs, premium APIs, enterprise APIs, or Ads APIs, you need to create a developer account and generate keys and tokens.

  1. Apply and receive approval for a Twitter developer account.
  2. Create a Twitter developer app.
  3. Generate your app’s API keys and user’s access tokens.
  4. Generate your app’s bearer token.
  5. Apply and receive access to the desired API.
  6. Find the documentationlibraries, code examples, and other resources that you need to make your first successful request.

twitterの開発者登録をする

APIを使うには開発者登録が必要みたいなのでする。

https://developer.twitter.com/en/docs/basics/getting-started

ここの、Standard APIっていうのを使いたい。

https://developer.twitter.com/en/docs/basics/developer-portal/overview

開発者ポータル?

https://developer.twitter.com/en/application/use-case

ほんでこっから登録かな。

理由を聞かれるので選択。

アカウントの確認、電話番号の登録が必要だった。国名と開発者名?を入力。

APIを利用するのにどうしようと思ってるかの作文をしなさいと…。200単語以上だと…。その他にも質問があって、どれも100単語ぐらいは書かんといけんみたい…。機械翻訳を駆使しつつ頑張って入力する。

んで、入力確認して、利用規約にオッケーしたら完了。メールが送られてくるので確認してクリック。

でけたー。

新規アプリを作成する

アプリではないんだけど、アプリ作んないとAPIキーが発行されないみたいなので作る。

https://developer.twitter.com/en/apps

ここから右上のボタン押す。

詳細を入力。とりまRequiredだけ入れてる。また作文がある…。

そうすると、Keys and tokensが表示されるようになる。やっとAPIKeyをゲットやで。あと、OAuthっていうのがあるみたい。なにそれ。

OAuthってなんなんすかね

https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be

https://ja.wikipedia.org/wiki/OAuth

ここら辺読んでみたんですが、IDとパスワードを使わずにAPIの認可とかに使われる技術らしい。OAuth1.0aとOAuth2とあって、ツイートを投稿するだけなら1.0aだけでいいみたい。いまいちよく分かってないが、それを実装するわけでないしライブラリがあるっぽいのでおとなしくそれ使おうと思う。んでボタン押すとまた2つのKeyが表示された。初回しか表示されないので忘れず保存~。

サーバー側の準備する

ブログのためにサーバー借りてみたはいいけど、それ以外になんも使ってなかったのでこの機会に使ってみたい。っていうのもあってbot作ろうと思った。言語なんにしようかなーって思ったんだけど、phpとpythonで迷って、pythonにすることにした。以前使ってみたことあるしね。

pythonの準備する

VPSに入ってたっけ?と思ったので

python --version

したら

Python 2.7.5

だった。古い気ガス。2.7.5は俺じゃもう使わないだろうし、3系にしたいなーと思ったので

https://www.python.jp/install/centos/index.html

ここを見つつやってこうと思う。公式だし大丈夫だよ…ね?

$ sudo yum groupinstall "development tools"
$ sudo yum install bzip2-devel gdbm-devel libffi-devel \
  libuuid-devel ncurses-devel openssl-devel readline-devel \
  sqlite-devel tk-devel wget xz-devel zlib-devel

これやった。そんでソースダウンロードしてくる代わりに

curl -OL https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz

こう。関係ないけどLinuxって自分のファイルどこに置けばいいか迷う。今回はhomeにdalomoってフォルダ作った。んで

tar xzf Python-3.8.3.tgz

てやって解凍。できたフォルダに移動してー

$ ./configure --enable-shared
$ make
$ sudo make install
$ sudo sh -c "echo '/usr/local/lib' > /etc/ld.so.conf.d/custom_python3.conf"
$ sudo ldconfig

英語がすごい速さで流れるのを待つと終わった。そしたらかくにん。

python3 --version

どきどき

Python 3.8.3

できたー!プログラムも動くかしら

https://qiita.com/TakesxiSximada/items/65f8c018d25c6b08df85

こちらのtest.pyを拝借しまして実行すると…動いた!おっけーですね。でもこれもとから入ってた2系と共存してるんだけど大丈夫なのかな?まぁいいか。後で変ななったら考えよう。

プログラムを書く

ようやく書くんだけど、よく分かってないので取っ掛かりがほしい…。頑張ってtwitterの開発者ページを探すと、すごーーーく簡単に言うと、OAuthっていうのでAPIの使用許諾をもらって、APIのうち、statuses/updateっていうエンドポイントにPOSTする?とツイートできるみたい。そうですか。こう、1からやるとすると、OAuthの仕組みを理解してフローに沿ったコード書いたり、PythonでのHTTPリクエストのやり方を理解したり、まぁ無理そう…っておもいました。そしたら言語別の便利ライブラリっていうページをtwitterが用意してるのを見つけた。

https://developer.twitter.com/en/docs/developer-utilities/twitter-libraries

これだ。これでいこう。pythonのところを引用すると

Python

みたいなんがある。違いはよく分かりません。じゃあどれを使わせてもらおうとチラチラ見まして、簡単に書けそうかなぁっていう

https://github.com/sixohsix/twitter

こちらを使ってみることにする。ねこかわいい。すっごいふわふわしてるけど大丈夫かな。まぁとりあえず

pip install twitter

でインストールだ!…あれ?

pip: command not found

って出る。なんでやねん3.8.3やぞ、同梱されてるんちゃうんかとドキドキしながらググると

https://www.python.jp/install/centos/pip.html

ん?あ、なんかpip3ってコマンド使わないとダメみたい。へー。

pip3 install twitter
Collecting twitter
  Downloading https://files.pythonhosted.org/packages/85/e2/f602e3f584503f03e0389491b251464f8ecfe2596ac86e6b9068fe7419d3/twitter-1.18.0-py2.py3-none-any.whl (54kB)
     |????????????????????????????????| 61kB 4.2MB/s
Installing collected packages: twitter
Successfully installed twitter-1.18.0

おーできた。

そしたら、フォルダ作って、中にrottenbot.pyってファイル作って、サンプルに従いこんな

from twitter import *

token = "な"
token_secret = "い"
consumer_key = "し"
consumer_secret = "ょ"

t = Twitter(
    auth=OAuth(token, token_secret, consumer_key, consumer_secret))

t.statuses.update(
    status="Hello, World.")

コードを書きまして

python3 rottenbot.py

て実行すると…

https://twitter.com/RottenComedian/status/1271478032927092737

すげー!!!投稿できてる!感動するわこんなん。

そしたらあとはかるたデータを読み込んでランダムにツイートさせるようにすればいいんだな。

テキストから読み込んでランダムに選択する

とりあえずテストしてみるために、データをテキストファイルにして、一応文字コードをUTF-8に変換。そんでtest.pyってファイルを作って

import random

f = open('rotten.txt')
t = f.readlines()
f.close
r = random.choice(t)
print(r)

ってコード書いてみる。実行すると

python3 test.py
のびのびやれる番組は 2クールで終わる #腐り芸人

おおおー、表示された。でも、最後に改行が入ってる。これは一応削除しておきたい。strip()使えばいいみたい。

print(r.strip())

これでいいみたい。行末の改行がなくなった。そしたらrottenbot.pyの方にも書く。

from twitter import *
import random

def getword():
    f = open('rotten.txt')
    t = f.readlines()
    f.close
    r = random.choice(t)
    return r.strip()

token = "ひ"
token_secret = "み"
consumer_key = "つ"
consumer_secret = "。"

t = Twitter(
    auth=OAuth(token, token_secret, consumer_key, consumer_secret))

t.statuses.update(
    status=getword())

こんな?そしたら実行してみよう!どきどき

https://twitter.com/RottenComedian/status/1271532485331959809

やったー!できたー!わーい!そしたら、cronで定期実行すればいいね。

cronに設定する

https://crontab.guru/#0,30_*_*_*_*

こうした。

つまずき

http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/command/vi.html

https://ja.stackoverflow.com/q/20565

完成

できた!今んとこ30分に1回つぶやく感じかな。いやーできるもんだなぁ。

カテゴリー: したい, できた | タグ: , , , , | コメントする

シャープの不織布マスクMA-1050が届いた

シャープのマスクMA-1050

人権を手に入れた。届くのはえーな。佐川急便で届いた。

裏面

裏面の注意書き。

開けてく

開け口は透明なシールが貼ってある。破けた。

パッカーン

中身

25枚入の袋が2つ入ってた。

取り出したー。耳紐がちょっと弱々しい。

ロゴ。読めるように外側に向けて使用する。これ恥ずかしい人もいるんじゃないかな…。

感想

正直言うと、最初の感想はちゃっちぃ、です。これは耳紐によるところが大きいと思う。これがなんか細い、まぁそれはそれとして。フィルターが他のマスクと比べてなんか艶がある素材ね。マスクとしての機能は十分あるし、若干大きめなのかな?それは嬉しい。まだ一日中着けてないけど、使い捨てマスクとしては十分だなーって思った。おわり。

応募はこちら

https://cocorolife.jp.sharp/mask/

カテゴリー: のーと | タグ: | コメントする

シャープのマスク当選した

これで人間になれる。

ビミョーに分かりづらい流れだった。

カテゴリー: のーと | タグ: | コメントする

テトリス的なものを作ろうとしている

テトリス

ここまでできた。

カテゴリー: したい | タグ: , , , | コメントする

ドットマトリックスLEDで電光掲示板的なものを作りたい

電光掲示板

せっかくなので、電光掲示板的なものを作りたい。スクロールするやつ。

作戦を練る

なんか参考サイト的なものを探したのだけれど、探し方が悪いのかあんまよく分からなかったので作戦を練る。電光掲示板の表示の流れを分解していくと、表示したいデータを作って、現在の表示を右にひとマスずつずらして、表示したいデータの一番左から順に、ひとマスずらした空きの所にはめ込んで、また表示してあげれば流れていくように見えるはず。…はず。

こんな感じ。

とりあえず、きれいなコードとか、再利用しやすいコードとか、汎用性のあるコードとか、意識せずにとにかくまず動くものを作ろう。

表示したいデータを作る

フォントからビットデータ作るとか高尚なことが分からんので、美咲フォントを参考に、手打ちでエクセルを使いつつ配列データを作った。

これが

const boolean data[8][24] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0},
  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0}
};

こうなる。

コード書く

#include <ht16k33.h>

HT16K33 HT;

uint8_t disptable[8][16][2] = {
  {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}, {7, 0}, {8, 0}, {9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0}},
  {{16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0}, {24, 0}, {25, 0}, {26, 0}, {27, 0}, {28, 0}, {29, 0}, {30, 0}, {31, 0}},
  {{32, 0}, {33, 0}, {34, 0}, {35, 0}, {36, 0}, {37, 0}, {38, 0}, {39, 0}, {40, 0}, {41, 0}, {42, 0}, {43, 0}, {44, 0}, {45, 0}, {46, 0}, {47, 0}},
  {{48, 0}, {49, 0}, {50, 0}, {51, 0}, {52, 0}, {53, 0}, {54, 0}, {55, 0}, {56, 0}, {57, 0}, {58, 0}, {59, 0}, {60, 0}, {61, 0}, {62, 0}, {63, 0}},
  {{64, 0}, {65, 0}, {66, 0}, {67, 0}, {68, 0}, {69, 0}, {70, 0}, {71, 0}, {72, 0}, {73, 0}, {74, 0}, {75, 0}, {76, 0}, {77, 0}, {78, 0}, {79, 0}},
  {{80, 0}, {81, 0}, {82, 0}, {83, 0}, {84, 0}, {85, 0}, {86, 0}, {87, 0}, {88, 0}, {89, 0}, {90, 0}, {91, 0}, {92, 0}, {93, 0}, {94, 0}, {95, 0}},
  {{96, 0}, {97, 0}, {98, 0}, {99, 0}, {100, 0}, {101, 0}, {102, 0}, {103, 0}, {104, 0}, {105, 0}, {106, 0}, {107, 0}, {108, 0}, {109, 0}, {110, 0}, {111, 0}},
  {{112, 0}, {113, 0}, {114, 0}, {115, 0}, {116, 0}, {117, 0}, {118, 0}, {119, 0}, {120, 0}, {121, 0}, {122, 0}, {123, 0}, {124, 0}, {125, 0}, {126, 0}, {127, 0}}
};

const boolean data[8][24] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0},
  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0},
  {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0}
};

void moveline() {
  for (int i = 0 ; i < 8; i++) {
    for (int j = 1; j < 16; j++) {
      disptable[i][j - 1][1] = disptable[i][j][1];
    }
  }
}

void dispset() {
  for (int i = 0 ; i < 8; i++) {
    for (int j = 0; j < 16; j++) {
      if (disptable[i][j][1] == 1) {
        HT.setLed(disptable[i][j][0]);
      } else {
        HT.clearLed(disptable[i][j][0]);
      }
    }
  }
}

void setup() {
  HT.begin(0x00);
}

void loop() {

  for (int i = 0 ; i < 24; i++) {

    moveline();

    for (int j = 0; j < 8; j++) {
      if (data[j][i]) {
        disptable[j][15][1] = 1;
      } else {
        disptable[j][15][1] = 0;
      }
    }

    HT.clearAll();
    dispset();

    HT.sendLed();
    delay(100);
  }

  for (int i = 0 ; i < 24; i++) {

    moveline();
    HT.clearAll();
    dispset();

    HT.sendLed();
    delay(100);
  }
}

そんで

動画だとちらついてるけど、実際目で見るといい感じです。コードきったないけどとりあえず動いた。次の段階に行けるだろうか。

縦方向も

#include <ht16k33.h>

HT16K33 HT;

uint8_t disptable[16][8][2] = {
  {{112, 0}, {96, 0}, {80, 0}, {64, 0}, {48, 0}, {32, 0}, {16, 0}, {0, 0}},
  {{113, 0}, {97, 0}, {81, 0}, {65, 0}, {49, 0}, {33, 0}, {17, 0}, {1, 0}},
  {{114, 0}, {98, 0}, {82, 0}, {66, 0}, {50, 0}, {34, 0}, {18, 0}, {2, 0}},
  {{115, 0}, {99, 0}, {83, 0}, {67, 0}, {51, 0}, {35, 0}, {19, 0}, {3, 0}},
  {{116, 0}, {100, 0}, {84, 0}, {68, 0}, {52, 0}, {36, 0}, {20, 0}, {4, 0}},
  {{117, 0}, {101, 0}, {85, 0}, {69, 0}, {53, 0}, {37, 0}, {21, 0}, {5, 0}},
  {{118, 0}, {102, 0}, {86, 0}, {70, 0}, {54, 0}, {38, 0}, {22, 0}, {6, 0}},
  {{119, 0}, {103, 0}, {87, 0}, {71, 0}, {55, 0}, {39, 0}, {23, 0}, {7, 0}},
  {{120, 0}, {104, 0}, {88, 0}, {72, 0}, {56, 0}, {40, 0}, {24, 0}, {8, 0}},
  {{121, 0}, {105, 0}, {89, 0}, {73, 0}, {57, 0}, {41, 0}, {25, 0}, {9, 0}},
  {{122, 0}, {106, 0}, {90, 0}, {74, 0}, {58, 0}, {42, 0}, {26, 0}, {10, 0}},
  {{123, 0}, {107, 0}, {91, 0}, {75, 0}, {59, 0}, {43, 0}, {27, 0}, {11, 0}},
  {{124, 0}, {108, 0}, {92, 0}, {76, 0}, {60, 0}, {44, 0}, {28, 0}, {12, 0}},
  {{125, 0}, {109, 0}, {93, 0}, {77, 0}, {61, 0}, {45, 0}, {29, 0}, {13, 0}},
  {{126, 0}, {110, 0}, {94, 0}, {78, 0}, {62, 0}, {46, 0}, {30, 0}, {14, 0}},
  {{127, 0}, {111, 0}, {95, 0}, {79, 0}, {63, 0}, {47, 0}, {31, 0}, {15, 0}}

};

const boolean data[24][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 1, 0, 1, 0},
  {1, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 0, 1, 1, 1, 0},
  {0, 1, 0, 0, 0, 0, 0, 0},
  {0, 1, 0, 0, 1, 0, 0, 0},
  {1, 0, 0, 1, 0, 0, 0, 0},
  {1, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 0, 0},
  {1, 0, 0, 0, 0, 0, 1, 0},
  {0, 0, 0, 0, 0, 0, 1, 0},
  {0, 0, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0, 0, 1, 0},
  {0, 0, 0, 1, 1, 1, 0, 0}
};

void moveline() {
  for (int i = 1; i < 16; i++) {
    for (int j = 0 ; j < 8; j++) {
      disptable[i - 1][j][1] = disptable[i][j][1];
    }
  }

  for (int k = 0; k < 8; k++) {
    disptable[15][k][1] = 0;
  }
}

void dispset() {
  for (int i = 0; i < 16; i++) {
    for (int j = 0 ; j < 8; j++) {
      if (disptable[i][j][1] == 1) {
        HT.setLed(disptable[i][j][0]);
      } else {
        HT.clearLed(disptable[i][j][0]);
      }
    }
  }
}

void setup() {
  HT.begin(0x00);
  HT.setBrightness(1);
}

void loop() {

  for (int j = 0 ; j < 24; j++) {

    moveline();

    for (int i = 0; i < 8; i++) {
      if (data[j][i]) {
        disptable[15][i][1] = 1;
      } else {
        disptable[15][i][1] = 0;
      }
    }

    HT.clearAll();
    dispset();

    HT.sendLed();
    delay(100);
  }

  for (int i = 0 ; i < 24; i++) {

    moveline();
    HT.clearAll();
    dispset();

    HT.sendLed();
    delay(100);
  }
}

縦でもやってみた。moveline()に最後の行が繋がっちゃうバグが有ったので対処した。あと眩しいので暗くした。

参考

https://littlelimit.net/misaki.htm

カテゴリー: したい | タグ: , , , , | コメントする