Slide 1

Slide 1 text

Webの外へ飛び出せ!

Slide 2

Slide 2 text

PHPer の 皆さん!

Slide 3

Slide 3 text

NativePHP って 知ってますか?

Slide 4

Slide 4 text

Web の外に 出られますよ!

Slide 5

Slide 5 text

PHPer にとっての ゲームチェンジャー NativePHP の紹介をします!

Slide 6

Slide 6 text

My Profile 勝佐 拓也 - かっつん   @kitkattsun0531 BABY JOB株式会社 保活サイト「えんさがそっ ♪」の開発保守 二児の父( 9 ~ 11月に育休取得) 子ども、筋トレ大好きおじさん

Slide 7

Slide 7 text

BABY JOBの紹介 乳児期 幼児期 学童期 妊娠・出産 産後うつ 保活が大変 いやいや期 学童不足 小一の壁 子育てには課題がたくさん・・・ 育児と子育て の両立が大変 保活(保育園探し)をサポート 保育園の準備をサポート

Slide 8

Slide 8 text

施設を 探す 見学の 申込 園の魅力 を発信 見学の 受付 サービス紹介 (えんさがそっ♪)

Slide 9

Slide 9 text

TABLE OF CONTENTS 01 NativePHP との出会い 02 NativePHP の 環境構築 03 NativePHP で アプリ作成 04 NativePHP の ここが気になる 05 まとめ

Slide 10

Slide 10 text

NativePHP との出会い 01

Slide 11

Slide 11 text

NativePHP の情報が飛び込んできた! Twitter のタイムラインを覗いていたら 2025年 4月 にLaravelのコアメンバーである Simon Hamp さんが NativePHP の メジャーバージョン v1 をリリースしたらしい🎉 どうやら、2023年 から 2年 かかったらしい!お疲れ様です! サイモン・ハンプ

Slide 12

Slide 12 text

この喜びようである Reference:https://x.com/simonhamp/status/1909792283370602955

Slide 13

Slide 13 text

みんな気になると思うので 後ほど業務改善アプリを作った 感想を共有します 🙌

Slide 14

Slide 14 text

そもそも NativePHP ってなんなの? PHP 開発者がネイティブのデスクトップまたは モバイルアプリを簡単に構築できるフレームワーク フロント側は HTML、CSS、JavaScript、 バックエンド側は PHP を使い、 Web サイトを作るのと同じ感覚で作れちゃう!

Slide 15

Slide 15 text

その Web 技術を担うのが Electron Electron は HTML、CSS、Javascript といった Web技術を使ってデスクトップアプリを開発できる NativePHP は Electron と連携することによって PHP で書かれたロジックが Electron のバックエンドとして 動作することができる Electron を使って開発された代表的なアプリには Slack や Discord などがある

Slide 16

Slide 16 text

NativePHP のざっくりした内部構造 Native UI NodeJS OS Main Process Renderer Process Electron Reference:https://youtu.be/iG7VscBFnqo?feature=shared&t=272

Slide 17

Slide 17 text

NativePHP のざっくりした内部構造 Main Process Renderer Process 1. アプリの起動すると Electron の Main Process が起動する 2. Electron の Main Process が PHP を内部サーバーとして起動する nginx、 Apache 起動 起動 Reference:https://youtu.be/iG7VscBFnqo?feature=shared&t=272 Electron

Slide 18

Slide 18 text

NativePHP のざっくりした内部構造 Native UI NodeJS OS Main Process Renderer Process 3. PHP から Electron の Main Process を操作できるようになる Reference:https://youtu.be/iG7VscBFnqo?feature=shared&t=272 Electron

Slide 19

Slide 19 text

PHP をどう実行しているのか デスクトップアプリを PHP で配布する際の大きな壁... ● PHP のインストールが必要 ● 適切な PHP のバージョン管理が必要 これらの問題を、どうすれば回避できるのか?

Slide 20

Slide 20 text

PHP を 静的バイナリ として アプリケーションに組み込んでいる これにより、ユーザーは PHP の設定周りを あまり意識せずに、アプリケーションを実行できる PHP をどう実行しているのか 例:macOS の場合

Slide 21

Slide 21 text

ちなみに PHP バージョンはいくつなのか バイナリの PHP:v8.4.8 ローカルの PHP:v8.4.4 バージョンの決定方法は見つけることができなかったが、 ローカルの PHP に依存してなさそう PHP をどう実行しているのか php -v PHP 8.4.8 (cli) (built: Jun 6 2025 00:20:11) (NTS) Copyright (c) The PHP Group Zend Engine v4.4.8,  Copyright (c) Zend Technologies with Zend OPcache v8.4.8,  Copyright (c), by Zend Technologies

Slide 22

Slide 22 text

NativePHP の 環境構築 02

Slide 23

Slide 23 text

# Requirements 1. PHP 8.3+ 2. Laravel 11 or higher 3. Node 22+ 4. Windows 10+ / macOS 12+ / Linux 多くの PHP / Laravel 開発者にとって 慣れ親しんだ技術スタックになっている 公式の通り、環境構築してみる Reference:https://nativephp.com/docs/desktop/1/getting-started/installation

Slide 24

Slide 24 text

NativePHP を Electron で 動作させるための基盤構築 アプリケーションが Electron ランタイムで動作するために 必要なすべてのクラス、コマンド、およびインターフェースが 含まれている composer require nativephp/electron Reference:https://nativephp.com/docs/desktop/1/getting-started/installation

Slide 25

Slide 25 text

NativePHP インストーラーを実行する NativePHP インストーラーは NativePHP サービス プロバイダーの公開を処理する このサービス プロバイダーは、ランタイム (Electron) で アプリケーションが動作するために必要な初期設定や準備をしてくれる php artisan native:install Reference:https://nativephp.com/docs/desktop/1/getting-started/installation

Slide 26

Slide 26 text

インストールで増えたファイルはこれだけ! # Providers/NativeAppServiceProvider.php デスクトップアプリケーション固有のサービスを Laravel アプリケーションに登録し、初期化できる # config/nativephp.php デスクトップアプリケーション固有の設定を定義できる

Slide 27

Slide 27 text

ネイティブアプリで動作する 開発サーバーを起動する ネイティブの デスクトップウィンドウが開く 開発者ツールがデフォルトで開く php artisan native:serve

Slide 28

Slide 28 text

Web ブラウザで動作する 開発サーバーを起動する いつもの Artisan コマンドでブラウザでの動作確認もできる 公式によると、先ほどのネイティブ環境では 対処が必要な例外を見つけるのが難しくなる可能性があるので ブラウザで軽く動作確認してみた方がいいみたい ⚠ NativePHP 固有の実装は動作しないので注意! php artisan serve

Slide 29

Slide 29 text

ビルドしてアプリ化する ビルドコマンドを実行すると 対話形式で OS や CPU アーキテクチャを選択して アプリケーションが作成できる php artisan native:build

Slide 30

Slide 30 text

NativePHPで アプリ作成 03

Slide 31

Slide 31 text

こんなアプリを作りたい 弊社は、業務の各タスクを工数管理しているが、 現在はスプレッドシートでの手動入力に頼っている この入力プロセスを、より効率的かつ簡便にしたい

Slide 32

Slide 32 text

工数入力のイメージ プロジェクト区分 工数 (h) タスク名 機能開発 - 検索機能の強化 2.50 ユーザーストーリーの作成 技術投資 - Laravel12 アップグレード 0.08 アップグレードのタイムアタック 技術広報 - 登壇 1.00 PHP カンファレンス 2025 のスライド作成 150 種類以上の ドロップダウンから 選択する タスクの種類別に 工数を入力する 各タスク名を 入力する

Slide 33

Slide 33 text

工数入力のイメージ 区分を選ぶの 考えすぎちゃう 工数を計っていない 工数の帳尻合わせに 走ってしまう タスク名を 正確に覚えていない プロジェクト区分 工数 (h) タスク名 機能開発 - 検索機能の強化 2.50 ユーザーストーリーの作成 技術投資 - Laravel12 アップグレード 0.08 アップグレードのタイムアタック 技術広報 - 登壇 1.00 PHP カンファレンス 2025 のスライド作成

Slide 34

Slide 34 text

区分を選ぶの 考えすぎちゃう 工数を計っていない 工数の帳尻合わせに 走ってしまう タスク名を 正確に覚えていない 1つ目の解決したいこと プロジェクト区分 工数 (h) タスク名 機能開発 - 検索機能の強化 2.50 ユーザーストーリーの作成 技術投資 - Laravel12 アップグレード 0.08 アップグレードのタイムアタック 技術広報 - 登壇 1.00 PHP カンファレンス 2025 のスライド作成

Slide 35

Slide 35 text

作業の手を止めずにタスクにかかった時間を計測したい 音声入力だけで時間計測の開始と終了ができないかな? Siri ショートカット NativePHP ① 工数をハンズフリーで時間計測をしたい ※Siri、ShortcutsはApple Inc.の商標です

Slide 36

Slide 36 text

🗣 音声入力 音声を検知 ショートカットを 実行 Artisan コマンドで実 行し計測する # 音声入力でタスクの時間計測をする ① 工数をハンズフリーで時間計測をしたい ※Siri、ShortcutsはApple Inc.の商標です

Slide 37

Slide 37 text

# コマンドライン処理を登録する(以下は計測開始の実装) public function handle(): void { // 進行中のタスクがあれば停止 $existingTask = Task::query()->whereNull('ended_at')->latest()->first(); if ($existingTask) { $existingTask->update(['ended_at' => Carbon::now()]); } // 新しいタスクを開始 $newTask = Task::query()->create(['started_at' => Carbon::now()]); } ① 工数をハンズフリーで時間計測をしたい

Slide 38

Slide 38 text

# Artisanコマンドを簡単に呼べるように MakeFileで登録 ARTISAN = $(PHP) artisan start: $(ARTISAN) task:start … ① 工数をハンズフリーで時間計測をしたい

Slide 39

Slide 39 text

# ショートカットアプリに登録 ① 工数をハンズフリーで時間計測をしたい

Slide 40

Slide 40 text

できちゃったぞ ...取説見てないのに ... タスクの時間計測が できてる

Slide 41

Slide 41 text

区分を選ぶの 考えすぎちゃう 工数を計っていない 工数の帳尻合わせに 走ってしまう タスク名を 正確に覚えていない 2つ目の解決したいこと プロジェクト区分 工数 (h) タスク名 機能開発 - 検索機能の強化 2.50 ユーザーストーリーの作成 技術投資 - Laravel12 アップグレード 0.08 アップグレードのタイムアタック 技術広報 - 登壇 1.00 PHP カンファレンス 2025 のスライド作成

Slide 42

Slide 42 text

プロジェクト区分の選定、タスク名の入力に時間がかかる タスク名の入力はサジェスト機能つけて簡素化できないかな? プロジェクト区分の選定は ローカル LLM に任せられないかな? ② タスク入力を簡易的にしたい Ollama Select2 オープンソース LLM を ローカル起動するのに 使うツール select 要素を リッチにする JS ライブラリ

Slide 43

Slide 43 text

② タスク入力を簡易的にしたい ⌨ タスク名を 途中まで入力 タスク名から プロジェクト区分を 推測してもらう タスク名を サジェストする ✅ タスク名と プロジェクト区分を 登録する

Slide 44

Slide 44 text

② タスク入力を簡易的にしたい # サジェスト機能の Select 2 を実装する taskInput.addEventListener('input', function () { fetchSuggestions(query, '/api/recommend'); } Blade resources/views/app.blade.php JS resources/js/script.js  フロントの   書き方 よくある

Slide 45

Slide 45 text

② タスク入力を簡易的にしたい # タスク名からローカル LLM にプロジェクト区分を推測してもらう $command = [‘/Applications/Ollama.app/Contents/Resources/ollama’, 'run', ‘llama3’, $prompt]; $process = new Process($command); $process->setTimeout(100); $process->run(); return trim($process->getOutput());

Slide 46

Slide 46 text

ローカル LLM も簡単に動作しちゃった ①タスク名を途中ま で入力、選択 ②タスク名を登録  プロジェクト区分を  推測して登録 ③工数計測中のタスクに  プロジェクト区分と  タスク名を登録

Slide 47

Slide 47 text

③ タスクごとに一定時間経過したら通知したい # 計測開始時にイベントリスナーで OS 通知を設定する public function handle() { if (!$this->task || $this->task->ended_at) { return null; } return Notification::title('タスクの経過時間のお知らせ ') ->message("「{$this->task->name}」 {$this->hoursElapsed}時間が経過しました ") ->show(); }

Slide 48

Slide 48 text

③ タスクごとに一定時間経過したら通知したい 簡単に通知できちゃった... NativePHP の起動時に Laravel のキューシステムをバックグラウンドで 自動的に動かしているので、 新たにキューワーカーを起動する必要がない

Slide 49

Slide 49 text

結果:アプリの実装にかかった時間 約 3 時間

Slide 50

Slide 50 text

結果:アプリによって入力に削減された時間  1 年間で 約 20 時間 の削減が できる試算! (1 日に 4 分の削減)

Slide 51

Slide 51 text

おまけ:指紋認証もできちゃう if (System::canPromptTouchID()) { if (!System::promptTouchID('認証が必要です')) { return; } } コード例は認証が通らなかったら 早期リターンしている 指紋認証もこんな簡単にできました!

Slide 52

Slide 52 text

Laravel の機能を そのまま使えるじゃん!

Slide 53

Slide 53 text

ネイティブアプリとの コラボが熱い 🔥 Siri   Shortcuts ※Siri、ShortcutsはApple Inc.の商標です

Slide 54

Slide 54 text

さらにモバイルのネイティブアプリも作れちゃう 実は今回のメジャーバージョンのリリースで モバイルのネイティブアプリも扱えるようになっている 新しくネイティブアプリの言語を習得せずに、 オンリー PHP でいける時代が来た! ただし!モバイル版はライセンス料($100~)が かかるので注意! Reference:https://apps.apple.com/us/app/daily-pursuit/id6740605199 例:クイズアプリ

Slide 55

Slide 55 text

NativePHPの ここが気になる 04

Slide 56

Slide 56 text

環境構築完了! 試しに起動してみるか!! ぬ...全然起動ないぞ? ① ネイティブアプリで動作する    開発サーバーを起動できない? php artisan native:serve

Slide 57

Slide 57 text

build the electron preload files successfully start electron app... Skip checkForUpdates because application is not packed and dev update config is not forced checkForUpdatesAndNotify called, downloadPromise is null Electron API server started on port 4000 Starting PHP server... /sample/vendor/nativephp/electron/resources/js/resources/php/php artisan serve /sample [] Copying storage folder... Storage path: /Library/Application Support/laravel-dev/storage App path:/sample Making sure app folders are available Linking storage path… 5 分経過して も変わらず... ビルドには成功してそう ① ネイティブアプリで動作する    開発サーバーを起動できない?

Slide 58

Slide 58 text

探ってみると、どうやら symfony/console が影響していた symfony/console の v7.2.7 → v7.3.* への変更で native:serve コマンドの動作に影響を与え localhostのポート 4000 への接続が失敗するみたい v7.2.7 へダウングレードすることで解決できた! Reference:https://github.com/NativePHP/laravel/issues/604 ① ネイティブアプリで動作する    開発サーバーを起動できない?

Slide 59

Slide 59 text

② Tauri にサポートしてなさそう NativePHP インストーラーは NativePHP サービス プロバイダーの公開を処理する このサービス プロバイダーは、使用しているランタイム (Electron または Tauri) で アプリケーションが動作するために必要な初期設定や準備をしてくれる 日本語訳 なんだか、Tauriが使えそう! でもインストールする記述がない

Slide 60

Slide 60 text

Reference:https://github.com/orgs/NativePHP/discussions/248 ② Tauri にサポートしてなさそう

Slide 61

Slide 61 text

Tauri のサポートに取り組んでいるが、Electron よりも課題が多い Rustへの適応の難しさ  Tauriは Rust で構築されており、NativePHP の開発者は Rust に深く精通していない 異なるアーキテクチャ  Tauri はブラウザエンジンを搭載していないため、Electron とは異なる課題がある 高い機能要件  NativePHP は、Tauri のビルドに対して高い基準を設けており  Web サーバーに依存しないアプリケーションを構築するという目標を含んでいる  これには、Tauri チームとの多大な投資と協力が必要である Reference:https://github.com/orgs/NativePHP/discussions/248 ② Tauri にサポートしてなさそう

Slide 62

Slide 62 text

③ NativePHP は Laravel がないと動作しないの? # Requirements 1. PHP 8.3+ 2. Laravel 11 or higher 3. Node 22+ 4. Windows 10+ / macOS 12+ / Linux 環境構築のページでは Laravel が 必須になっている Reference:https://nativephp.com/docs/desktop/1/getting-started/installation

Slide 63

Slide 63 text

③ NativePHP は Laravel がないと動作しないの? Reference:https://github.com/orgs/NativePHP/discussions/141

Slide 64

Slide 64 text

③ NativePHP は Laravel がないと動作しないの? Reference:https://github.com/orgs/NativePHP/discussions/141 Question: Laravelフレームワークに依存せずに、 NativePHPを利用できますか?

Slide 65

Slide 65 text

③ NativePHP は Laravel がないと動作しないの? Reference:https://github.com/orgs/NativePHP/discussions/141 Laravel なしで 動きますか?

Slide 66

Slide 66 text

③ NativePHP は Laravel がないと動作しないの? Reference:https://github.com/orgs/NativePHP/discussions/141 Laravel なしで 動きますか? Answer:  準備中ですが、  具体的な時期はまだ決まっていません。  参考までにユースケースを教えてほしいです。 返答なし、一年経過。。。 Question(別の方):進展ありましたか? Answer:いいえ、優先度が高くないので...

Slide 67

Slide 67 text

④ アプリの起動が遅い Double Click!! … 1 minutes Launched!! No way... Did it FREEZE?!

Slide 68

Slide 68 text

まとめ 05

Slide 69

Slide 69 text

NativePHP は Web を飛び出すきっかけをくれた 長年、Web 開発の世界に閉じこもりがち だった PHP 開発者にとって、 NativePHP は新たな可能性の扉を開いた(気がする) 慣れ親しんだ PHP と Laravel の知識をそのまま活かして、 デスクトップアプリケーション開発という 未知の領域へ足を踏み出すことを可能にした これにより、Web ブラウザの枠を超え、 よりリッチで、OS と密接に連携するアプリケーションを 手がける道が拓かれた

Slide 70

Slide 70 text

ネイティブアプリ開発への道 ネイティブ機能の活用 デスクトップ・モバイルならではの機能に直接アクセスし、 リッチな体験を PHP で実現できてしまう 既存資産の活用 新しい言語を学ぶことなく、 培った PHP / Laravel のスキルとコードを最大限に生かせる さらに Web 開発者が一度は考えたことがあるであろう モバイルアプリへ横展開しやすくなった

Slide 71

Slide 71 text

皆さん、 初めてアプリを作って 動いた時の感動を 覚えてますか?

Slide 72

Slide 72 text

いつも業務で緊張感がある中 取り組まれていると思います

Slide 73

Slide 73 text

たまには息抜きに 雑なデスクトップアプリを 作ってみませんか?

Slide 74

Slide 74 text

hank you for listening