ChatGPTに書かせた技術記事に赤入れしてみた

iOS 15で追加された新機能の中でも注目すべきは、Focus(集中)モードです。この機能を使うことで、自分がやるべきことに集中するために、通知やアプリアイコンの表示を制限できます。例えば、仕事中には仕事に関するアプリや連絡先からの通知だけを受け取り、プライベートな時間にはSNSやゲームからの通知を制限することができます。

Focusモードのデザイン

Focusモードのデザインには、アプリのアイコンに新しいリングが追加されました。このリングは、Focusモードに設定されていることを視覚的に表していますは、基本的にできることが限られています。iOS15の段階では、コミュニケーションアプリの送受信先によって通知をフィルタすることしか開発者にはできませんでしたまた、アプリの設定画面には、Focusモードに関するオプションが表示されます。ですが、iOS16から導入された「集中モードフィルタ」を使うことでより踏み込んだフィルタを作成することができるようになりました。アプリの開発者は、このオプション機能を使って、ユーザーがFocusモードで表示されるする内容を制御できる設定を提供できます。

アイコンにリングを追加する

アプリのアイコンにリングを追加するには、以下のコードをInfo.plistに追加します。

<key>UIApplicationShortcutWidget</key>
<dict>
    <key>UIApplicationShortcutWidgetIconFile</key>
    <string>MyAppFocusModeRing</string>
    <key>UIApplicationShortcutWidgetTitle</key>
    <string>Focus Mode</string>
</dict>

ここで、MyAppFocusModeRingは、リングの画像ファイル名です。また、UIApplicationShortcutWidgetTitleには、リングの下に表示されるテキストを指定します。

こちらのコードはホームスクリーンでアプリアイコンを長押しして出るアプリに使われるクイックアクション用のInfo.plistと考えられます。この記事の趣旨とは逸れるものなので詳細は省きます。

設定画面にオプションを追加する

アプリの設定画面にオプションを追加するには、以下のコードをSettings.bundleに追加します。iOS16向けにリリースされたSetFocusFilterIntentというプロトコルを用います。サンプルプロジェクトはApple公式のこちらで提供されています。また、詳細な解説はWWDC22のMeet Focus filtersというセッションでなされているようです。

以下はSetFocusFilterIntentのサンプルコードを抜粋し、日本語コメントをつけたものになります。

struct ExampleFocusFilter: SetFocusFilterIntent {
    // 常にダークモードを強制するか
    @Parameter(title: "Use Dark Mode", default: false)
    var alwaysUseDarkMode: Bool

    // ステータスの制限をかける
    @Parameter(title: "Status Message")
    var status: String?

    // チャットアプリなどでアカウントの制限をかける
    @Parameter(title: "Selected Account")
    var account: AccountEntity?
}

このように真偽値、文字列、AppEntityを継承したクラスと設定できる種類はそれなりに自由度があるようです。これをユーザーが設定アプリ上でカスタマイズすることで、各ユーザーの各集中モードにあったフィルタをユーザーが作成することができるようになります。

(※以下は関係のないコードです)

<dict>
    <key>Type</key>
    <string>PSToggleSwitchSpecifier</string>
    <key>Title</key>
    <string>Focus Mode</string>
    <key>Key</key>
    <string>focus_mode_enabled</string>
    <key>DefaultValue</key>
    <false/>
</dict>

ここで、Titleには、オプションのタイトルを指定します。また、Keyには、オプションの値を保存するためのキーを指定します。 なおこのコードはiOS本体の設定アプリにおいてトグルスイッチを使った設定を追加するものになっているようです。このままで動くかは保証できませんが、これによって設定アプリからアプリ内のfocus_mode_enabledの状態を切り替えられるようになると考えられます。

Focusモードの開発

Focusモードの開発には、新しいAPIが追加されました。このAPIを使うことで、アプリがFocusモードに対応できるようになります。例えば、そのAPIとは直接関係はないですが、アプリが通知を送信するとき、Focusモードに設定されている場合には、通知が制限されます。

Focusモードの状態を取得する

アプリがFocusモードに対応するためには、まずはFocusモードの状態を取得する必要があります。以下のコードを使って、現在のFocusモードの状態を取得できます。以下のコードは実在しません。集中モードの状態は、コミュニケーションアプリ向けのSiriのAPIから取得できます。

let focusStatus = UIApplication.shared.focusStatus

ここで、focusStatusは、現在のFocusモードの状態を表すFocusStatus列挙型です。FocusStatusには、以下の3つのケースがあります。

  • none: Focusモードに設定されていない場合
  • personal: パーソナルなFocusモードに設定されている場合
  • work: ワークに関するFocusモードに設定されている場合

実際に取得するコードはこちらのフォーラムに掲載されています。また、リンク先で使われているINFocusStatusCenterはiOS15から使用可能ですが、取得できる情報は集中モードに設定されているかどうかだけであり、どの集中モードに入っているかは取得できません。

通知の制限を設定する

アプリがFocusモードに対応するためには、通知の制限を設定する必要があります。以下のコードを使って、通知の制限を設定できます。開発者がすることは特にありません。ユーザー側の設定に基づき、通知は制限されます。以下のコードは、存在しないAPIで条件分岐を行った通知送信のためのコードになります。

let focusStatus = UIApplication.shared.focusStatus

if focusStatus != .none {
    let notificationOptions: UNNotificationPresentationOptions = [.banner, .sound]
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: notificationOptions) { _, _ in }

    let content = UNMutableNotificationContent()
    content.title = "New Message"
    content.body = "You have a new message from John."

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
    center.add(request)
}

ここで、UNNotificationPresentationOptionsには、通知の表示形式を指定します。また、UNMutableNotificationContentには、通知の内容を指定します。UNTimeIntervalNotificationTriggerには、通知の発生タイミングを指定します。そして、UNNotificationRequestを使って、通知をリクエストします。こちらの内容は概ね正しいと考えられますが、本筋と外れるため省略します。

実際にアプリ側から集中モードに対してできることは、ユーザーが集中モードに応じて何をフィルタできるか、を提供することだけです。言い換えると、アプリ側がユーザーの集中モードの種類に応じて自動的に何かをするということはありません。あくまで各集中モードでアプリの表示をどう変えるかはユーザー側に委ねられています。こちらはiOS16からしか使えないこともあり現状ほとんどのアプリが導入しておらず、公式のアプリ(Safari/カレンダー/メール/メッセージ)でのみ導入されているようです。ユーザー側でどのように設定できるかはぜひiOS16以降の集中モードの設定画面下にある「フィルタを追加」を押して確認してみてください。参考までに押した後出てくる画面のスクショを貼っておきます。

まとめ

iOS 15で追加されたFocusモードは、自分がやるべきことに集中するための便利な機能です。この機能を使うことで、アプリの開発者はiOS16からの集中モードフィルタへの設定値を提供することで、ユーザーがFocusモードで表示される内容を制御できるようにすることができます。また、アプリが通知を送信するときには、通知が制限されます。是非、この機能を活用したアプリを開発してみてください。


みなさんこんにちは!エンジニアの藤井( @touyou_dev )です! 打ち消し線と赤文字だらけの謎の記事が一通り終わったところで突然ブログの書き出しみたいなことを書いてますが、今回の記事の本題はここからになります。

では、今までの文章は何かというと、今話題のChatGPTに書いてもらったブログに自分が赤入れしたものになります。 ただ、今回の記事は「ChatGPTを使ったらここまで簡単にブログが書けたよ!ChatGPTすごい!」みたいな今世の中に溢れ出している趣旨の話ではありません。個人的に提案したいChatGPTの活用方法、もっと言うと生成系AIとの向き合い方についての紹介記事にしていこうと思います。

本題に入る前に

というわけで今回の記事では本質ではないブログの生成部分の手順ですが、これを本題に入る前に紹介したいと思います。 自分がChatGPTに送ったのは以下の5文です。

  • あなたはデザイン会社で働くモバイルアプリエンジニアです。定期的に会社のブログに技術的な発信を行なっています。
  • iOSに関するデザインと開発を絡めた読者が興味を持ちそうな新しい話題の記事を書いてください。可能であればはてなブログ記法で見出しも含めて作成してください。
  • 具体的なコードを含めて、読んだ人がすぐ取り入れられるように書き直してください。
  • 続けてください
  • ありがとう

設定はなるべく自分に近づけつつ、読んで面白い記事になるような指示にしました。最後の二文は途中で止まったりしたこともあっておまけです。 これを一言一句同じように送ったからと言って同じ記事ができるわけではないのが生成系AIなわけですが、もしこの部分も参考になれば幸いです。

個人的なスタンスの表明

さて、本題に入っていくわけですが、まず前提として生成系AIに対する個人的なスタンスについて書いていこうと思います。 この節に書くことは会社の意見を代表するものではなく、あくまで自分という一個人の意見として受け取っていただけると嬉しいです(会社のブログで何を言っているんだという話になるかもしれませんが笑)

ChatGPT、すごいですよね。GPT-4が出てきて、より実用性も高まってきた気がします。自分が大学とかで機械学習の授業受けていた時、どうせならこのぐらいできて欲しいと思っていたことが実現し始めているのでようやく来たかという気持ちなのですが、世間の反応に関しては少し違和感を感じる部分があります。 それは「ChatGPTがあるから、作業を代替できるものは要らなくなる」理論についての違和感です。

たしかにChatGPTで一定の作業はショートカットできるようになるでしょう。GPT-4で精度が上がってその信頼度もより上がってくると思います。 ですがそれを最終的なアウトプットへの責任を放棄することにはつなげてはいけません。AIはどんなに精度が上がったとしても完全なる100%になるわけではないでしょうし、仮に100%になったとしてもそれが100%であるという保証は人間が行わなければなりません。 つまりアウトプットを評価し、時には修正させ、時には自分で修正するという作業は間違いなく必要になってくる工程になるわけです。

そしてこれを行うには、自分自身も真偽を判断できるぐらいの知識を身につけておかなければなりません。 電卓が出たからといって、算数がなくならなかったように、生成系AIが出たからといって、人間がゼロから作り上げるプログラミングやデザインは決して無くならないのです。もっと言えば、それを淘汰してしまうといよいよターミネーターなどのSF映画が描いてきたデストピアが来てしまうでしょう。

これを防ぐには勉強するしかありません。ChatGPTがあるからこそ、自分でコーディングすることが大事になってきます。

ただ、それだけだとスピードで生成系AIの進化に負けて、無思考で生成系AIを信じる人の手によって淘汰されてしまう恐れがあります。 そこで提案するのが「ChatGPT赤入れ勉強法」です

ChatGPT赤入れ勉強法

ChatGPT赤入れ勉強法のやり方はいたって簡単です。 まずChatGPTに勉強したい話題について語らせます。どうせならブログ記事などの形式にしてもらうのもいいと思います。

それが終わったら、次にそのアウトプットの一つ一つについて実際に検索などで調べ、確実に信頼できる情報源の情報をもとに間違っている部分を修正していきます。GPT-3.5の嘘が多い状態でもいいですし、GPT-4の精度が上がった中から探し出すというのもいいと思うのでバージョンなどは気にしなくていいと思います。全く間違いがないことがわかれば、それはそれもいいです。

これはファクトチェック・デバッグ・ブラッシュアップと言われるような行為の練習になります。これらは生成系AIと共存していく中で必須の能力になってくるでしょう。

と同時に、自分がこれをおすすめしたい理由として、これが擬似的な教師体験になるから、という点があります。自分以外の存在が作ったアウトプットの間違いを見つけるというのはまさに教師がテストの採点をする行為と同義であると言えると思います。また、それに加えてその間違いを修正するという行為を通して、正しい知識を自分でアウトプットするという行為に繋がります。

有名な話として「人に教えると教える側の勉強になる」というものがありますが、まさにこの効果を自分一人で完結させることができるわけです。 そしてこの教えることによる勉強というのは成長スピードが比較的早いという感覚があります。

ですので、このChatGPT赤入れ勉強法はこれからの時代に間違いなくおすすめできる勉強法であると、自分としては自信を持って言えます。

まとめ

ある意味二記事を連結したような記事になってしまったので、長くなってしまいましたが、ChatGPTに書いてもらった記事に赤入れをしたもの、そしてそれを活用した勉強法の提案をさせていただきました。 実際特に工夫もなく出したGPT-3版ChatGPTの記事だと、ほぼ全ての内容を書き直す結果となってしまいましたが、一方であまり知られていなかったAPIの発見にも繋がり、提案した通り自分の勉強になりました。

ChatGPTはインパクトこそ大きいですが、順当な技術革新の一つだと思っています。

盲信も絶望もせず、フラットに自分たちの生活を良くしていけるよう付き合っていく方法をこれからも模索していこうと思います。