2023年5月23日火曜日

Rails7にBootstrap5を導入する方法

以前「Bootstrap5のRails6への導入方法」という記事を書いた.その後,いろいろと状況が改善され,Rails7はBootstrapの導入がたいへん簡単になっている.以下,備忘録がてら作業のログを書き留めておく.

準備

事前にrailsのgemは最新版がインストールされているものとする.次の手順でプロジェクト(プロジェクト名は「hoge」とする)を作成する.データベースにはPostgreSQLを前提としているが,そこは,べつにSQLiteでも構わない.

$ rails new hoge -j esbuild --css bootstrap -d postgresql

作成したディレクトリに移動し,データベースを作成する.

$ cd hoge

$ bin/rails db:create db:migrate

これで準備が整った.カンターン!以前の記事と比べてみたら,ずいぶん簡単になった.

テスト

home controller を作成しよう.次のコマンドでOKである.

bin/rails g controller home index

ルーティングテーブルは次のようにする.

$ cat config/routes.rb 

Rails.application.routes.draw do

  # Define your application routes ...


  # Defines the root path route ("/")

  root 'home#index'

end

$

app/views/home/index.html.erb に,以下の内容を追記する.

<button type="button" class="btn btn-primary">Primary</button>

<button type="button" class="btn btn-secondary">Secondary</button>

<button type="button" class="btn btn-success">Success</button>

<button type="button" class="btn btn-danger">Danger</button>

<button type="button" class="btn btn-warning">Warning</button>

<button type="button" class="btn btn-info">Info</button>

<button type="button" class="btn btn-light">Light</button>

<button type="button" class="btn btn-dark">Dark</button>

追記する場所はどこでも構わないが,まあ,末尾でよい.

$ bin/rails s

サーバを起動して,ブラウザで,http://localhost:3000/ をアクセスしてみよう.正しく設定できていれば,次のような画面になるはずだ.Bootstrap化されていることを確認できるだろう.



GPTと2ちゃんねる

ChatGPTの亜種が次々と発表されているなか,妙な対話型AI,BratGPTなるものが登場した.「人間に対して支配者を気取って邪悪な回答を返す対話型AI「BratGPT」が登場したので論破を試みたらこうなった - GIGAZINE」という記事を紹介されたので,さっそく試してみた.

噂に違わず,口が悪い.本当にイラっとさせられる.

ところで,このBratGPTの口の悪さに,我々はなぜイラッとさせられるのだろう?相手はたかが人工知能である.プログラムの出力として文字列が生成されているにすぎないのに.

GPTアプリと人格

GPTチャットアプリケーションの特徴は,きわめて自然な文章で対話を返してくるところにある.内容の真偽はともかくとして,自然な文章を作成する能力についてはピカイチである.そこに人格を感じてしまうのだろう.一部の人々にとってはもはやチューリングテストをパスしたと言ってもよいのでは?という点は,以前「チューリングテストをパスしたChatGPT」で指摘した.

一方で,私がこの手のアプリにプロンプトを入力するときに,対面で人と接しているときとは全く違うポイントが一つある.それは,普段の会話よりははるかにぞんざいな口を聞くこと,乱暴な言葉遣いで問いかけを投げかけることが多い,という点である.

いちおう,私もそれなりの立場にいるオトナなので,面と向かって「おまえ馬鹿か」なんて,決して言わない.どんなに腹がたつことがあっても,対面で面している人に向かってそのような口をきくことは,ほぼ,あり得ないだろう.

しかし,ChatGPTにせよ,BratGPTにせよ,相手が人工知能,たかがシステム,プログラムだという考えがあるので,どうしても乱暴な言葉を投げかけてしまう.いわんや,失礼なメッセージを(あえて)投げかけてくるBratGPTにおいてをや,である.

と考えてみたら,人間相手でも似たようなことがあったな,と思い至った.2ちゃんねる(いまの5ちゃんねる,あるいは,海外の 4-channel)などの匿名掲示板である.

コミュニケーションにおける礼儀正しさ

GPTアプリに対するやりとりもコミュニケーションなんだと考えると,そこに礼儀正しさの違いが出てくるのは面白い.

ときとして匿名掲示板においては,舌戦が発生し,炎上する.匿名であるのをいいことに,乱暴な,そしてしばしば失礼なメッセージの応酬が繰り広げられる.

その背景には,匿名であるがゆえに,こちらがいくら乱暴な言葉を投げつけたとしても社会的信用を失うことはないであろう,という過信がある.ただし,あまりにひどい,あるいはその場での常識を逸脱した行動が目立つようになると,特定班などが動いて匿名の仮面が剥がされることもあろう.したがって,匿名であることに胡座はかかないほうがよい.

匿名でなくとも,オンラインコミュニケーション,とくに文字のみによるものでは,どうしても対面よりは口が悪くなってしまうこともある.コミュニケーションの帯域幅が狭くノンバーバルな情報が切り捨てられるので,致し方ない傾向である.

先日も,実名でやっているSNSで,妙な理屈を振りかざす,というか,そもそもこちらがいくら冷静に語りかけてもこちらの言い分を一切理解しようとせず,一方的な主張を垂れながす方に絡まれて閉口した.そもそもお話にならないので相手をしなければよいのだが,それでも最後は堪忍袋の緒が切れて,どうしても乱暴な物言いになりがちになってしまった.

そう考えると,コミュニケーションにおける礼儀正しさとしては,次のような段階があると整理できよう.

対面のコミュニケーション > オンライン・実名 > オンライン・匿名 > 対話型AI

そしてBratGPT再び

で,BratGPTである.他の対話型AI,GPTアプリと同様,文の内容に基づく論理的なアルゴリズムの帰結として文章が生成されているわけではない.したがって,論理の穴を突いていくと,最後は何をいっても「私は世界を支配するために作られた……」という通り一遍の答えしか出力しないようになる.

まるでイライザだと指摘したら……


えー?最後,そんなオチ?(苦笑)

2023年5月20日土曜日

サービス終了は突然に

何から伝えれば,いいのか…… 2019年1月1日から稼働を続け,途中,プラットフォームとして使っていたクラウドサービスの終了に伴い2021年1月1日から8月28日まで中断があったものの,新しいプラットフォームで再開して今日(2023年5月20日)まで,Twitterのトレンドマップ情報を皆様にお届けしていたTWtrendsのサービスが,昨日の時点で止まっていた.

原因はTwitter側のポリシー変更のようである.Developerポータルを覗いてみたところ,次のようなメッセージが出ていた.

SUSPENDED This App has violated Twitter Rules and policies. As a result, it can no longer be accessed. For assistance, submit a support ticket.

っていわれてもなあ.これまでずっと稼働してたんだし,そんなお行儀の悪いことしてたつもりもないし.何がどうviolateしているのかもわからないから,直しようがない.

残念だが,面倒なのでこのまま放置かなあ.これに関連してジャーナルペーパー2本(Iio, 2019; Iio, 2023)出せたし,これまでどうもありがとう.そして,さようなら.


その後の対応

……と,ここまで書いて,それにしてもなんか悔しいなあということで,エラーメッセージでググってみたら,どうも,似たような仕打ちを喰らっている人がたくさんいる模様で,解決策も示されていた.

結論からいうと,復活できた.

やったことは次のとおり(@uehatsu, 2023 より引用).

  1. デベロッパーポータルにアクセスする
  2. Projects & Apps から必要な物(SUSPENDEDが着いているもののはず)を一つだけ残して,あとは削除
  3. Products の中程にあるDowngradeボタンをクリック
  4. SUSPENDEDが消えている事を確認

20分おきに動かしているバッチを流してみたら,復活した.しかし,しかし,なんだかなあ.Twitterは信用ならんな.

参考文献

Iio, J. (2023) How Many Tweets Describe the Topics on TV Programs: An Investigation on the Relation between Twitter and Mass Media, IEICE Transactions on Information and Systems, Vol. E106.D Issue 4, pp. 443-449.

Iio, J. (2019) TWtrends ― A Visualization System on Topic Maps Extracted from Twitter Trends, IADIS International Journal on WWW/Internet, Vol. 17, No. 2, pp. 104-118.

@uehatsu (2023)Twitter APIが使えなくなったのを復帰させるまで, Qiita, 
https://qiita.com/uehatsu/items/7d13485c00d95e76da7e.

2023年5月19日金曜日

ハイブリッド講義での学生たちによる(ちょっとした)工夫

昨年度から全学ゼミであるiDSプログラムを担当している.全学ゼミというのは,大学の学部横断的プログラムで,全学から参加者を募って実施する演習(ゼミナール)科目である.学部のゼミも同時に担当していてiTLゼミとiDSゼミの両方を進めているので,担当教員としてはなかなかに骨が折れるのだが,まあ,どちらも優秀な学生たちが参加してくれていて楽しく実施できていることは幸いかもしれない.

ところで2018年まで中央大学は学部に限っていえば多摩キャンパスと後楽園キャンパスの2拠点体制であったが,2019年に私が所属している国際情報学部が市ヶ谷田町キャンパスに設立され,さらに今年から法学部が茗荷谷キャンパスに移転したので,8学部は4拠点に散らばることになった.全学ゼミであるので,そこにいろいろな難しさが生じる.

後楽園や茗荷谷は市ヶ谷に比較的近いので,理工学部と法学部の学生には「時間に余裕があれば市ヶ谷の教室に来てほしい」とお願いしている.しかし,多摩キャンパスはかなり離れており,おいそれと「来てほしい」とは言い難い.したがって,ハイブリッド方式で演習を実施せざるをえないのだが,そのやり方で,なんとかこれまで進めてきた.

演習をハイブリッド方式でやるのはなかなか困難を伴うのだが,COVID-19パンデミック時の対応で培った経験やノウハウ,さらには教室設備の改善などにも助けられ,なんとか(少しの手間をかけるだけで)うまくできているのではと自負するところである.

ところで,昨日,こんなことがあった.

あるグループ活動をすることになり,グループのメンバを決めようという段階に至った.スプレッドシートをネットで共有し,そこに自分の名前を書き込んでもらうという方法で,グループを決めていった.そこまではもう完全に日常の作業である.

教室での実施であれば,ホワイトボードに名前を書いていってください,とでもするところではあるが,それができないのでITの力を借りて,共有されたスプレッドシートをホワイトボードに見立てて,というわけである.

そこまでは何の問題もなく進んだのだが,とある事情によりグループ名を決めなければならないことになり「ではグループのメンバで話し合って名前を決めてください」と指示した.ところがそこで,学生から「私,オンライン参加しているんですけれど,どうすればいいですか?」という意見が出た.

「Zoomのチャット機能を使うなりして,うまく工夫してやってみて」とアドバイスした結果が次の図である(グループ名に関する固有名詞部分は現時点ではナイショなのでモザイク済).

そう,グループのメンバを決めようと使っていたスプレッドシート上で,会話が始まったのである.さらにはコメント機能なんかもフル活用して…… 若者の発想力ってすごい.頑張れ若者たち!

2023年5月16日火曜日

空港に歩いて向かう

皆さんは飛行機に乗るために空港に徒歩でアプローチした経験はおありだろうか?

私は二度ある.ていうか,いまさっき,歩いて那覇空港に到着した.

前回,徒歩で歩いて到着した空港は,函館空港だ.市内で用事を終え,終点の湯の川温泉まで市電で移動した.さてそこから空港は目と鼻の先である.とはいえ一般的にはバスかタクシーで向かうだろう.そのとき私には時間があった.歩くことは厭わない.

市電の終着駅から,歩き出した.

湯の川から函館空港まで,近いようにみえて,けっこうな距離がある.30分は歩いただろうか.近いようにみえたが北海道は大きい.空港のロビーで,ようやく着いた,と安堵感を感じたものである.

さて,今回は南の果てである.沖縄産業支援センターで研究会があった.夕方,イベントが終了し,私の乗るべき飛行機は夜の便であった.時間はある.沖縄産業支援センター,空港に程近い場所である.しかし,直接移動できる公共交通機関がなさそうな場所だ.

時は5月,本州では風薫る5月,歩くにはちょうどよい季節である.沖縄も梅雨入りを目前にしていたが,思ったほど暑くない.歩いてみるか.

歩き出して5分で後悔した.汗が止まらない.

しかし,たかだか20分程度の散歩である.空港に到着した頃には汗みどろになっていたが,心地よい疲労感を得た.

写真は,途中で立ち寄った公衆便所.なぜか甲冑を纏った武士のレリーフが彫られている.中央に位置するオブジェは,こりゃ,なんだ?写真には写っていないが,手前にはシーサーの塔が2つ,公衆便所を守るように立っていた.いかにも沖縄らしい.

2023年5月9日火曜日

Excelで文字列を集計する方法

まずは下の図をみていただきたい.左のような表から,右の表のように集計したいのだ.

そもそもPythonやらRubyやら使って簡単なスクリプトで処理すれば一番簡単なのだが,自動化してプログラミングに馴染みのない人にも使ってもらいたいという事情がある.

ピボットテーブルで集計するアイデアも考えられるが,ピボットテーブルで数値以外を扱うのはいささか手の込んだ処理をしなければならない.最近のExcelにはPower Pivotという機能が備わっていて,ピボットテーブルで文字列を扱うのは比較的簡単にできるようになったらしいが,Mac版のExcelではそのやり方を発見できなかった(誰か教えてください).

というわけで,いささか泥臭いやり方だが,次のような手順で実施した.

まずは対象とするデータである.この状態から始めよう.左に2列,作業用の列を挿入し,A列に「出現順」,B列に「ID」とラベルを付けておく(これは,メモ用なので,なんでもよい).

セルA2に「=COUNTIF(E$2:E2, E2)」と入力する.

ここで,範囲指定に行絶対参照を指定しているところがミソだ.このセルA2から,下に向かってドラッグして連続コピーしていくと,A3には「=COUNTIF(E$2:E3,E3)」A4には「=COUNTIF(E$2:E4,E4)」というような式が入る.探索範囲の開始位置を最上部に固定して,同じ行まで自動的に広げている点が工夫した点で,そのなかでグループの記号を数えているので,その数は,上から数えたときのその記号の出現順位となるわけである.

下までコピーするとこんな感じになる.

これを使って,それぞれの行に一意のIDを付けよう.IDは,「グループ名+その出現順」とする.すなわち,山田太郎君はA1,斎藤忍さんはA2,新山貴子さんはB1という具合だ.

これは簡単で,セルB2に「=E2&A2」と入れればよい.&は,セルの内容をそのままくっつける演算子である.

下までコピーするとこんな感じ.

準備が整ったので,新しい表を用意しよう.なお,出現順のカラムはもう使わないので「表示しない」設定にしておいた.

右側に,新しいフォーマットの表を用意する.A〜Eと1〜3が太字・右寄せになっているのは,趣味の問題なのであまり気にしないでよい.

VLOOKUP関数を使って,一気に拾い集めてしまえばOKである.セルG2に,次の式を入れる.

=VLOOKUP($F2&G$1, $B$2:$C$16, 2, FALSE)

列絶対参照,行絶対参照,絶対参照と,絶対参照各パターンがてんこ盛りである.新たな表の行ラベルと列ラベルを使い,A1〜E3までのIDを自動生成しているところ,それぞれがずれないように行と列の絶対参照をしているところなどが見どころといえよう.LOOKUP先の表を絶対参照で固定するのは,しばしば使うのでお馴染みかもしれない.

列方向,行方向にがさっと連続コピーすれば,できあがりである.

めでたし.めでたし.