青竹雑記帖(6代目)

テキスト処理をメインとしたIT解説をします。

ツイ廃私がこの先生きのこるには

一時代の終わり

Twitter社の規約が(こっそりと)改訂され、「Twiiter公式クライアントアプリの代わりになるようなアプリ」について、Twitter APIの利用を制限する旨正式に発表されました。いろいろと場当たり的というか、本来望ましい手順を経ずに適当にやるあたり、諸君らは本当にまともに運営されている会社なのかと無職(広義)ながら疑問に思うところですが……まともな運営ならメチャクチャな機能をリリースしたり、恣意的に過ぎるツイート表示操作をしたり、大量に採用したりクビにしたりしない? その通り!

この規約改訂により制限(排除)されるアプリは、TLの閲覧とツイートがともに提供され、しかもそのスタイルが公式クライアントアプリに似たような振る舞いをするアプリであり、単にTLを取得するだけ、あるいは定型文を投稿するだけのようなアプリは従来通りAPIを利用したTwitterへのアクセスが可能であるとされています。

考えられる理由の憶測

おそらく本当の理由はリークでもない限り表には出てこないと思いますので、適当に憶測で書き連ねておくとします。

収益的観点で見ると、利用者全員に対して広告(プロモーションツイート)を表示させたい、正確にはそのようにしたと対外的に説明できる状況にして、「貴社のプロモーションツイートはターゲットユーザ全員に届いております!」としたいのではないかと思いました。サードパーティクライアントアプリによるTL閲覧や投稿においてはAPIの仕様上プロモーションツイートが配信されないため、スポンサーから「実際のところウチのプロモーションはどのくらい届いているのか? もっと増やせないのか?」と言われることもあったのではないかと推測しています。公式クライアントアプリに似た振る舞いをするアプリを排除するだけでも、その利用者の大部分は公式クライアントアプリへ移行すると思われますので、「プロモーションがより届くようになりましたぞ、というわけで広告費このくらいお願いできないでしょうか……?」として収入増にもつなげられそうです。

技術的観点で見ると、Twitter社買収直後に社内ITエンジニアが大量に離職してしまったとあり、各種のインフラ運営維持が間に合わなくなっているのではないかと考えられます。たとえば上記のプロモーション配信については、公式クライアント風のサードパーティアプリに対してもプロモーション込みのデータを渡すようにするという策が考えられますが、そのためのAPIエンドポイントを開発実装する人間がいなくなってしまった可能性があります。また、今あるAPIエンドポイントを管理できる人も不足したため、API公開範囲を縮小してコスト軽減を図るのかもしれません。

しかし離れられないのであった!

こんのクソ青鳥に付き合っていられるか、あばよ!

……ともいかないのがツイ廃の悲しさ。その有り余る情報技術系への適応能力のため、クソみたいな公式クライアントアプリでも30分で順応できてしまいました。人間関係上も、Twitter上でだけ交流がある人々が多数いるため、それを捨ててしまうことはできません。こうしてツイ廃は生きていく……

フォロワーからの提案

ここで、知人フォロワーのツイートに目が行きました。「Twitter公式アプリに類似するクライアントアプリが禁止なら、コマンドラインを叩くタイプのクライアントならセーフやな?」

なるほど!

どうみても「公式みたいな気軽な操作ができない(対外公式声明)」ような自作クライアントならば許される。許された。許せ(命令形)。コマンドラインは我が主戦場であり、私のバイブル「Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか」(Amazonでは品切れになっていました)でもシェルスクリプトだけで色々実現したクライアント「KOTORIOTOKO」が載っていたりします。つまり技術的には可能で、モチベーション的にもまさに今こうしたアプリを自分専用で作って動かす機運が高まっています。やろう。

github.com

テキストだけのターミナル画面に次々に表示されるツイート、必要があればそのツイートからWebに飛んで画像を見る、ツイートはコマンドラインにカタカタカタカタッ、ターンッ! これだ。各種の業務が一段落してまた一時の暇ができたので作ります。

Twitter社に艱難辛苦(大袈裟)を与えられながらも生きる道を考えるなど

Twitterサードパーティクライアントアプリの大量締め出し(数年ぶりn回目)

くそう、またやりやがった!(画像略)

歴戦のTwitterオタクや、公式ウェブサイトや公式クライアントアプリが使いにくいなーという人が利用するサードパーティクライアントアプリが、数年ぶりにまた締め出しを食らいました。金曜日の日本時間12時過ぎ、突如として「認証が必要です」とのメッセージが表示されて強制ログアウトさせられ、その後再認証を試みるも蹴られまくり、諦めて公式クライアントアプリに緊急避難する事態となりました。はじめは自分のアカウントが凍結されたことを疑いましたが、タイムラインの報告では多くの有名どころのアプリを使っていた人がことごとく同様の被害に遭っていたため、これはTwitter社が何らかの意図をもって実行したものと思われます。状況をみるに、APIの総アクセス数が多い(≒利用者が多い)アプリの認証トークンを利用したAPIアクセス権限を停止した可能性があります。

この件について、Twitter社は現時点では特に公式声明を発表していません。情報技術をかじる者として、Twitter社がやりそうな声明の内容は多少は推測がつきます。「APIサーバへの負荷を軽減しつつユーザ体験のさらなる向上を図るため云々」とか言えば、社会的にも突っ込みようがない見解となります。本当のところはわかりません。

私は比較的初期からサードパーティクライアントアプリを利用してきました。当時は新着ツイートを次々に配信するUserStream APIが提供されており、アプリを立ち上げて接続し、UserStreamをオンにするだけで新着ツイートが無限に流れてきていました。我らTwitter中毒者にとっては新しい情報が続々来るのは幸せスパイラルそのものです。パック酒でスパイラルをグングン回すバンドメンバーよりは肝臓の健康によく、目の健康に悪いです。私はPCではOpenTweenやJanetterを利用していました。そのAPIが廃止されたとき、パソコンではTweetDeck利用に移行しましたが、スマートフォンでは引き続きサードパーティクライアントを活用していました。SobaChaやTweetCaster、びよーんったー、近年では長きにわたりTwitPane+を愛用していました。しかしこのたび、TwitPane+が締め出されてしまい、途方に暮れています。せっかく今月のみかじめ料を払ったのに……(Twitter Blue)

実際、近年のTwitter社は新機能に対するAPIエンドポイントを用意せず、公式クライアントアプリを使うよう誘導していた節があります。代表的なものとしては、投票機能は表示するための情報を得ることができても投票作成・投票実施用エンドポイントが無いため、サードパーティクライアントアプリでは機能を実装したくてもできません。Twitterスペースもそうです。リアルタイムなプッシュ通知機能もAPIが存在しません。スペースはどうでもいいですが、投票機能やプッシュ通知は活用しているので、癪ではあるものの公式クライアントアプリを併用していました。公式アプリを使えと言われればツイ廃ですから順応できなくもありませんが、でもなんだか使いにくい、でも手が伸びて使ってしまう。くそう。

そうだ、アプリ、作ろう(ただし自分専用)

金を払った手前、Twitter社に無条件降伏するのは業腹なので、10年ぶりに思い立って自分専用のTwitterクライアントアプリを作ることにしました。昨年夏にAPIアクセス用の申請をしていて、認証トークンの発行は受けていたため、それを活用することにしました。まずは実験としてPythonスクリプトからの投稿を試し、無事成功しました。昔と比べると認証回りが強化されて、手順がだいぶ増えている感じです。

APIとして外部公開されているものを全部実装しようとすると非常に面倒なので、公式アプリだと使いにくい部分だけを実装することを目指します。具体的には

  • ワンステップでの投稿(誤タップ防止機構つき)
  • ハッシュタグの入力支援を自分好みに
  • TLの表示を自分好みに
  • via芸をやりたいので投稿元アプリを表示

あたりを考えています。保有端末がAndroid系とiPhoneiPad系と両方あるため、ウェブアプリの形式で作るつもりです。がんばります。このあたりもうまくいったらこのブログの連載にしてみようかなと思います。

文字だけで扱うコンピュータの世界(13):テキスト調理その1・郵便番号データのフィルタリング

承前

blog.aotake91.net

♪~(音楽)

ATK「きょうの料理」の時間です。今日はお手軽な一品として「郵便番号データのフィルタリング」を作りましょう。材料は次の4つです。

  • 郵便番号データ(全国版) …… 11.7MB
  • Python言語の処理系 …… 一式
  • テキストエディタ …… 1つ
  • お茶 …… 1杯(※八女茶か嬉野茶が良いとされる)

郵便番号データは、以下の過去記事を参考に入手してください。

blog.aotake91.net

テキストエディタはひとまずVisual Studio Codeにしておきましょう。Visual Studio Codeの設定は、「Python Visual Studio Code 設定」のような単語で検索するとよい情報が出てくるかもしれません。そしてPythonの環境構築は以下のPython情報サイト(公式と言っていい)を参考にしてください。……でも初っ端に「Pythonのインストール、必要ですか?」と書いてありますね。この点でこのサイトが素晴らしいことが分かります。いくらガイドがあるとはいえ環境構築は面倒なので、やみくもにインストールさせるのは自分も気が進みません。単にプログラミングを体験するのであれば、まず体験をすれば良いというのが私の持論です。ここからのことは初手でやると訳がわからなくなりますので、先に「ゼロからのPython入門講座」やっときますか。ではよろしゅう。

www.python.jp

www.python.jp

「もう入門したからはよ次やれ」

……本当にやりました? 人間不思議なもので、目で読むだけだと頭の中を素通りしてしまいます。世の中のあらゆることの学習にあたって、手で書くと覚えやすいという経験則があります。プログラムを紙に手で書くのは50年前に終わっていますので、ここはスマートにキーボードでプログラムを打ち込むところからやりましょう。するとなぜか覚えます。不思議なものです。

サンプルプログラム

ではいきなりですが、このプログラムを打ち込んでください。入門のところでさんざん手打ちしたと信じていますので、ここからはコピペでOKです。私はRuby派なので、下のプログラムはもしかしたらPython的でない書き方かもしれません。さらに、いろいろ説明を端折っていきなりヘンな書き方を多数投入しているので初学者には向きません。「ゼロからのPython入門講座」に戻ってください。

"""
chapter13.py
郵便番号データから、指定した住所の郵便番号一覧を取り出して表示する。
"""

with open('KEN_ALL.CSV') as f:
    for line in f:
        # 1行読み込んだデータを、カンマ記号で分けてリスト化する
        # その際、各フィールドの値を囲むダブルクォートを取り除く
        line_elements = line.replace('"', '').split(',')

        if line_elements[6] == '福岡県' and line_elements[7] == '小郡市':
            print("{} - {} {} {}".format(line_elements[2], line_elements[6],
                                         line_elements[7], line_elements[8]))

よくある質問(FAQ)

  • 質問1 福岡県小郡市ってどこ?
  • 回答1 私の故郷にして本拠地です。

よくわからない解説

どのような分野でも、一通りできるようになった段階では、初学者に教えることができないとされています。その理由のひとつは「一通りできるレベルでは、初学者がわからないことや、わからないところがわからない」点にあります。私は何にひっかかりがちかすべてを把握する免許皆伝覇王であると豪語したいところですが、あまりフカすと真の達人からボコられるのでやめます。

このプログラムは、郵便番号データファイルを開いて1行ずつ読み込みます。その際にカンマ記号でデータを区切って分け、さらにダブルクォートを取り除きます。その中から、6番目の列(最初の列は0番目です)に書かれている都道府県と、7番目の列に書かれている市区町村を調べ、条件に一致するものを取り出して画面に出力します。出力する項目は、郵便番号、都道府県、市区町村、市区町村名以下の地区・大字等地名です。

実行!

プログラムと、郵便番号データを同じフォルダに入れて、その画面で右クリックして、「Codeで開く」というのをクリックしてください。 環境構築が完了している Visual Studio Code であれば、次のような画面が出てきます。右上の横向き三角(再生ボタンみたいなもの)をクリックすると、プログラムが実行できます。

Visual Studio Codeの画面です。この画面の右上に実行ボタンがあります。

結果がたちどころに表示されました。プログラムで指定した通り、私の本拠地である福岡県小郡市の郵便番号一覧が出てきました。

今日はとりあえずこのへんで

検索条件の都道府県や市区町村を変えて遊んでみてください。もし多少プログラミングに慣れていたら、検索条件の列の追加や変更をしてみてください。

次回はこの続きをもう少しやりますか。別な話題に行くかもしれません。

あ、お茶のこと忘れてた

八女茶は福岡県八女市で産出されるお茶です。全国的には玉露で名高いです。嬉野茶は佐賀県嬉野市の特産です。最近西九州新幹線が開業しましたので、嬉野温泉駅で下車して遊びに行ってみてください。日本茶については次の2冊を勧めておきます。私も美味しくお茶を淹れられるわけではありませんが、抽出温度に気を配ると良いそうです。

コンピュータの奴隷にならないために(大層なタイトルに比して中身スカスカ)

はじめに

2020年代、仕事をする人の多くは何かしらパソコンを触ることと思います*1。その際、コンピュータに使われないよう心がけてみてください。

どうしたらいいか

自分が処理すべき仕事を観察し、そのために必要なことを明らかにしてください。その結果、もしかしたら『パソコンいらんやんけ』という結論に至るかもしれません。その時は遠慮なくパソコンを窓の外に投げ捨て……るのはもったいないので、押入にしまってもかまいません。

私が勝手に奉じる「異端」の学派・ユニケージ手法の思想を説明する『ユニケージ原論』の一節において、「まずそこに仕事がある。それを片付けるためにコンピュータがあり、プログラムがある」という趣旨の記述があり、大変感銘を受けました。最初はKindle Unlimitedで読みましたが、そちらのサブスクを解約したため、現在紙の書籍の調達を図っています。きちんとした記述は本が届き次第確認して引用追記します。この記述は至極当然のことですが、昨今は意外と忘れられがちではないでしょうか。コンピュータは人を楽にするためにあるべき相棒であり、人を苦しめる悪鬼羅刹が詰まった箱にしてはなりません。

とはいえ目の前のコンピュータシステムが我々を呵責する

「俺の仕事にはパソコンがいらんとわかった!」となったところで、会社組織だと社内の業務システムで計画と進捗を入れろだの、経費精算は自分で入力しろだの、管理職は諸事の決裁をシステム経由でやれだの、使用を強制される場面はあるわけです。少し入力を間違えるとシステムが「貴様は間違っているッッッッ!!!!!」と絞め上げに来ます。こわい。パソコンが心身と融合しているような自分でさえ、そういうシステムを滅ぼさねばならないと敵視するくらいなので、一般の人は大変面倒くさいと思いつつ使っているんだろうなと思います。

結論:つよくいきてください

結局それかよ。でも心掛けがあるのと無いのとでは、違ってくるものがあると思います。自分の仕事を整理してみて、なんかこれパソコン使う意味ある? というのが見つかったらチャンスです。最終的にパソコンでカタカタ打ち込まなければならないにせよ、そこに至るまでに散々パソコンに使われまくるより、パソコンから離れて思い通りに仕事をする部分があると精神衛生上よろしいかと存じます。

おまけ:発注側への外野からの居丈高な説教

社内システム部門に発注するにせよ、社外のベンダーに発注するにせよ、発注の際は自分の会社の業務を箸の上げ下ろしまで明らかにして、業務を整理することです。ふわっとした中身だけを投げて、後からあれやりたいこれやりたい、あれが欠けていたこれを入れられないか……そのようなことをやっていたらちぐはぐなことになり、最終的に機能実装希望を出したはずの社内の人間から突き上げを食らうことになります。もちろん受注側も発注側がコロコロ言い分を変えたらイラッと来ます。会社と会社の付き合いだから唯々諾々と従いますが、終業後会社から一歩外に出てただの人とただの人になった時には、夜道に気をつけることです。……脅しではありません。世間一般の心がけを述べたまでです。

※この話はフィクションです。実在のウンタラカンタラとはホゲホゲフガフガ云々。

*1:実は私の身の回りにはそうでない人も結構います。うちの母はパソコンを全く触りませんし、私の行きつけの理髪店のわりと若いマスターは、顧客名簿や会計帳簿をすべて手書きで管理しており、年賀状作りの時だけパソコンを引っ張り出すそうです。

文字だけで扱うコンピュータの世界(12):テキストデータの料理道具

仕切り直し

はい、論文は未だ終わっていません。ゴミです。ただ、ゴミを散らかしてゴミ屋敷にするくらいなら、せめてゴミ袋にまとめて不法投棄すべきなので、その敗戦処理を進めています。同じものにばかり向かい合っていると頭が凝り固まるので、そろそろ再開します。なんと前回の第11回からもう23日経っています。毎日書いたらとっくに34回目になっていたことでしょう。この連載は全255回なので。

blog.aotake91.net

おさらい:テキストデータの形を揃える重要性!

前回、CSVファイル(カンマ区切りファイル)というテキストデータの形式を紹介しました。種々の情報をカンマ記号によって区切って並べて表現するという、簡易的なデータベースのひとつともいえる形式です。このように整えると、今から話すデータ処理がとてもやりやすくなります。

……ところで、実は私、CSVファイルがあまり好きではありません。区切り記号がカンマであるというのは、実はかなり厄介です。とりわけ、カンマが文の区切りとして現れる分、日本語圏よりも英語圏の方が大変かもしれません。どのくらい厄介かを一例として示しますと、

  • 数字を3ケタごとに区切って表示したものをそのまま保存できない。
  • 文章の区切りとして現れるカンマを、データ区切りのカンマと分ける必要がある。
  • 上記の問題を解決するため、データを1つずつ "(ダブルクォート)で囲む方法があるが、データ中にダブルクォートが出てくると、それをデータ囲みのダブルクォートと分ける必要が出てくる。

……やる気なくしました? 奇遇ですね、私もです。CSVファイルは単純な分さまざまな記述法が乱立し、2005年10月にようやくそれらをまとめる形のメモとして、RFC4180 (Common Format and MIME Type for Comma-Separated Values (CSV) Files) が出されました。ただ、これは他の多くのRFCと異なり、標準を定める文書ではありません。単に、CSVファイルがどのようなものであるかを示した情報提供文書の位置付けです。

https://www.ietf.org/rfc/rfc4180.txt

でも、こういう一定の区切り記号でデータを記述すること自体は好きです。私が持つIT的十徳ナイフ・シェルスクリプトAWKの組み合わせで刻みやすいので。区切り記号がカンマ以外、できればデータ中に出て来ないものでありさえすれば良いのです。こうした場合の区切り文字として、よく使われるのが「タブ文字」(ASCII 0x09)です。タブ文字は通常、データ中に使われることはありません。それでいて、キーボードからは「Tab」キーを打つだけで入るので大変入力しやすい文字です。……あー、でもスマートフォンタブレット端末からは入力しづらいと思われます。端末のソフトウェアキーボードにタブ入力のボタンが無いので。

みなさんがタブ区切りを目にする機会のひとつは、ウェブブラウザ(Google Chrome系でもFirefoxでも)で表形式のものをコピーしたときでしょうか。このとき、セルの区切りがタブ文字に変換されてクリップボードに入ります。そのまま貼り付けると、タブ区切りのデータが完成です。せっかくなので、だいぶ前に語ったテキストエディタをどれかひとつ開いて、データを貼りつけて保存してみてください。

料理道具の紹介

ここからは、テキストデータの料理道具を紹介していきます。基本的にはプログラミング言語の紹介になります。正直ありきたりな言語しか取り上げません。あまりエッジの効いた言語を紹介しても応用がまだ難しいと思われますし、なにより私自身が書けません。Haskellまじでこわい。

1. Pythonプログラミング言語

……あまり好きではありませんが、おそらくいろいろなことができて、応用も効いて、あなたのイットライフ(ITライフ)を豊かにするものですから、それを紹介しないのは信義則にもとります。ですから一番手に出します。

www.python.jp

いろいろできます。ここで話していくテキストデータの処理はもちろん、最近流行りの機械学習(ちっとも正しくないけれども世の人に通じやすい呼び方はAI)も、この言語を利用してライブラリを呼び出せば実現できます。これがあれば日常用途はだいたい解決します。めっちゃくやしいですが。惜しむらくは、公式ドキュメントが大してやさしくないことです。あれを読んだだけで物を作れたら君は天才です。今すぐに大学の情報系学科に来るか、会社を立ち上げて億万長者への第一歩を踏み出してください。私とて別に本を読んで学んだわけではありませんが、初学者にとっつきやすそうな本は次の通りです。でも、ここでいきなりポチるより、本屋さんで現物を手にとってパラパラめくってから選んだ方が良いです。最近は私の故郷みたいなクソ田舎のちっこい本屋にもたまに置いてあるようになりましたので。

問題があるとしたら、入門書を読んで学んだだけでは、プログラムとして何を書いたらいいか分からないという点です。日本語の五十音や漢字、主語や述語を学んだだけでは論文や物語が書けないのと同様、作りたいものに向いた思考法や、処理手順規則のようなものを学ぶ必要があります。本連載ではしばらく先でその部分へ入ろうと思います。

2. Rubyプログラミング言語

超大好きです。全人類使いたまへ。

これもいろいろできます。かなり気が効いたメソッド(データを処理するための命令)が豊富に揃っており、Pythonだと面倒な記述が必要な部分でも、Rubyですと1行で済むことは往々にしてあります。ウェブ系プログラミングでは「Ruby on Rails」というフレームワークRubyを利用してプログラムを作るようになっています。惜しむらくは、機械学習系の環境の面ではPythonが世界に覇を唱えていて、Rubyだけでは実質的に機械学習の環境が整わない(整えられなくはないが、Pythonだと数個の手順で済むところを数百個の手順を要してしかも構築失敗しやすい)点があるため、そちらに興味がある人を誘いづらい点にあります。まあ、RubyからPythonやCのライブラリを呼び出す仕組みを利用したり、機械学習のライブラリを呼び出す直前までのデータ整形をRubyで書く(わたしです)などすれば良いのですが……

www.ruby-lang.org

rubyonrails.org

3. AWKプログラミング言語

ja.wikipedia.org

私が初手で使う言語です。

    1. お前Rubyが超大好きだって言ったじゃねえか、初手で使わんのか。
    1. 最近Bashコマンドラインから直接いろいろ書いてデータを刻むようになりまして。

正直に申しまして、この言語をいきなり使う人間は奇怪の具現です。真似をしてはいけません。でも、サーバサイドのプログラミングや保守管理を実施する人は学ぶべきです。仕事の能率が18,446,744,073,709,551,616倍(64ビット)になります。成立が1977年なのでもう46歳です。2年一昔とされる(当社調べ)の情報技術の世界では二十三昔の枯れに枯れたプログラミング言語です。でもバージョンアップが続いています。AWKを使うと、CSVのようなデータを区切り文字で分けて、フィルタリングや集計を実施することができます。手軽ながら強いです。

4. UNIXコマンド群

AWKと組み合わせて、いろいろなコマンドを利用してテキストデータを刻むこともよくやります。UNIXmacOS)やLinuxで利用できます。Windowsでも、WSL(Windows Subsystem for Linux)を利用してLinuxをインストールすると使えます。いくつか出しますと。

  • すぐに使えるもの
    • grep : 特定の語を検索して抽出する。
    • sed : 1行ごとに、与えられた命令に従ってテキストデータを処理する。
    • sort : ファイルの行を指定した一定の基準で並べ替える。
    • uniq : 重複した行を1行にまとめる。
    • join : 2つのファイルについて、指定したフィールドの値が一致するものを結合する。(SQLにおけるJOIN句に類似)
  • 追加インストールで使えるもの
    • jq : JSONJavaScript Object Notation)形式のテキストデータを処理・抽出ができる。
    • xmllint : XML形式のテキストデータを処理・抽出ができる。

このあたりのこともベラベラ喋りたいのですが、連載回的にはしばらく先のことになりそうです。

5. LibreOffice Calc(表計算ソフト)

ここまで来て突然表計算ソフトが出てきましたが、プログラミングがいっちょんわからん(←肥筑方言。共通語訳の一例:まったくもってわからない)人には大変有力、プログラミングがわかる人にも有力な選択肢です。視覚的にデータが処理できるので最高です。でも数百万件もあるデータは扱えないので、その場合はプログラミング言語を学んでいただく必要があります。

次回予告

Pythonを使って郵便番号データをいろいろやります。たぶん。