20210509のMacに関する記事は8件です。

vim終了時にアンドゥファイル削除スクリプト

vimにて、プログラム修正などをやり直したいときが頻繁に発生する。 それは当然のことだろうし、他の人も例外はないだろう。 そして、やり直しをしやすいように、私はmbbill/undotreeと言うプラグインを使っている。 それはさておき、現在のバッファを裏に回し、他のファイルを修正後に、バッファを戻した場合、やり直しが出来ずに困っていた。 そのため、アンドゥファイルを生成することに決めた。 ということで、またもや壁にぶち当たる。 以下、その壁の壊し方。 アンドゥファイル生存期間 アンドゥファイルが生成された状態のままでは、生成された状態までやり直しをすることができる。 しかし、私はファイルを開き直した場合、やり直しはそこから始まる状態になって欲しい。 そして、バッファを切り替えた場合もやり直しは有効化を保持したままになって欲しい。 vim本体を終了したときに限り、アンドゥファイルを削除してくれればいいと思っていた。 プラグインでそこまで細かい制御が出来るように見えず、仕方ないため、自作することにした。 vim終了時にアンドゥファイル削除 何のことはなく、ほんの数行で完成する。 (故に、当然のように完成までに数時間費やしたのは内緒だ) そして、未完成でもある。 vimrc augroup quitcmd autocmd! autocmd VimLeave * call s:CleanupStuff() augroup END function! s:CleanupStuff() let l:undoFileName=expand('%:p') let l:undo_fileName = substitute(l:undoFileName, '\/', "%", "g") let l:deleteUndoFile=&undodir . "/" . l:undo_fileName call delete(l:deleteUndoFile) endfunction 終了時にスクリプトが動くようにVimLeaveで関数を呼び出す。 その関数内で、"アンドゥファイル生成場所+ファイル名"の組み合わせでフルPathファイル名を作り出してからファイル削除の手順を踏んだ。 Qiitaにするほどの内容ではないが、前回の投稿から期間を空けるのもどうかと思ったため執筆した次第だ。 ある程度詳細な解説 関数内の解説 1行目:let l:undoFileName=expand('%:p') 見たまんま。 開いているファイルのフルPathを含むファイル名を抜き出す。 2行目:let l:undo_fileName = substitute(l:undoFileName, '\/', "%", "g") 上記のファイル名からスラッシュでのディレクトリ区切りをパーセント記号に置き換える。 この置換方法の調査に時間が掛かった。 第1引数に結果を格納すると思い込んでしまっていた。 他のプログラム言語のように戻り値扱いだった。 そのため、vimscriptの解説本出版を望む(当然vim8対応だぞ)。 3行目:let l:deleteUndoFile=&undodir . "/" . l:undo_fileName 上記の置き換えは、アンドゥファイル名のためだった。そのため、新たにアンドゥファイル生成場所のPathを先頭に追加し、改めてフルPathを作り上げた。 4行目:call delete(l:deleteUndoFile) 実際のファイル削除実施。 感想 作ってみれば何てことは無いが、ないと困っていた。 ないから我慢して使っていたが、やっぱり我慢できない。 こんな時に取り組めるだけの知識を持っているというのは一歩を踏み出しやすい。 ちょっとした思い込みで時間を無駄遣いしてしまったが、知識があるというのは新しい世界への扉を見つけやすいと言うことでもある。 やはり、勉強以上に重要なことはないし、知識のみが人間であることを証明する。 今後もぼそぼそ新しい扉を開いていける人間になりたい。 今後 リンクファイルなどにより、実態ファイルを開いていない場合、削除できないようだ。 アンドゥファイルは、実態ファイル名で生成するようで、対処できないぞ・・・う〜む。 今後はそれを改善していきたい。 もう一つ。 致命的なのは、複数ファイルをタブで開いておき、編集したファイル以外のタブを開いた状態でvim本体を終了した場合、アンドゥファイル削除がなされない。 これは非常に困る。 終了検知の方法が間違っている? もう一つ。 xolox/vim-sessionプラグインでセッション管理をしているのだが、これからセッションを再起動させた場合もアンドゥファイル削除をせずに再起動が終わる。 困る。 vim終了後に、セッションを開けば良いのかもしれないが、煩わしい。 上記通り、他のタブを開いた状態でvim本体を終了した場合も目的のアンドゥファイルを削除しないため、vim本体の終了方法にも気を遣う必要が出てくる。 困った。 もう一つ。 バッファを閉じた場合もアンドゥファイル削除はしてくれない。 さらに、上記通り目的のバッファをアクティブにせずにvim本体を終了した場合も目的のアンドゥファイルを削除しないため、致命的なスクリプトを作ったことになる。 何とかして対処したい・・・。 非常に困った。 そもそもが欠陥品 一番大事なWindows向けが動かない。 Macでは動いたのだが・・・大変残念だ。 今後のさらなる追加機能。 バッファを裏に回してもスワップファイルを維持したままにする。 これで、私の環境は完璧に近づくだろう。 私の最後の感想:新しい扉を開けることは出来なかった。 以上。 <!-- vim:set ts=4 sts=4 sw=4 tw=0: -->
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelを調べる:Docker起動編

Laravelを調べる: Docker起動編 2021/05/09 : ただいま編集中です! 環境 Name Version OS macOS Catalina (ver 10.15.7) docker desktop version 3.2.2 準備 Docker Desktopがインストールされていれば、以下のコマンドで使い始めることが可能。(簡単!) # mysql、pgsql、mariadb、redis、memcached、meilisearch、selenium、mailhog # default : mysql、redis、meilisearch、mailhog、selenium $ curl -s "https://laravel.build/example-app?with=mysql,redis" | bash $ cd example-app $ ./vendor/bin/sail up sailコマンドでの実行/停止 実行 # フォアグラウンドで実行 $ ./vendor/bin/sail up # # バックグラウンドで実行 $ ./vendor/bin/sail up -d 停止 $ ./vendor/bin/sail down 動作確認 ./vendor/bin/sail up を実行した状態で http://localhost/ にアクセスするとLaravelのページが表示される。 起動してからsailコマンドでできること シェルを起動 $ ./vendor/bin/sail shell mysqlにログイン $ ./vendor/bin/sail mysql 展開されたファイル 展開されたファイルのうち、頻繁に使うと思われるディレクトリ (app, config, database, routes) の内容をリストアップしておく。 すでに app/Models/User.php と 2014_10_12_000000_create_users_table.php がある点に注意。 このままmidgrateするとデフォルトの状態でUserテーブルが作られる。 % tree app app ├── Console │   └── Kernel.php ├── Exceptions │   └── Handler.php ├── Http │   ├── Controllers │   │   └── Controller.php │   ├── Kernel.php │   └── Middleware │   ├── Authenticate.php │   ├── EncryptCookies.php │   ├── PreventRequestsDuringMaintenance.php │   ├── RedirectIfAuthenticated.php │   ├── TrimStrings.php │   ├── TrustHosts.php │   ├── TrustProxies.php │   └── VerifyCsrfToken.php ├── Models │   └── User.php └── Providers ├── AppServiceProvider.php ├── AuthServiceProvider.php ├── BroadcastServiceProvider.php ├── EventServiceProvider.php └── RouteServiceProvider.php % tree config config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cors.php ├── database.php ├── filesystems.php ├── hashing.php ├── logging.php ├── mail.php ├── queue.php ├── services.php ├── session.php └── view.php % tree database database ├── factories │   └── UserFactory.php ├── migrations │   ├── 2014_10_12_000000_create_users_table.php │   ├── 2014_10_12_100000_create_password_resets_table.php │   └── 2019_08_19_000000_create_failed_jobs_table.php └── seeders └── DatabaseSeeder.php % tree routes routes ├── api.php ├── channels.php ├── console.php └── web.php 参考 Laravelとの出会い
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macでデュアルディスプレイの際にカーソルの移動が面倒

問題 Macでデュアルディスプレイで作業している際,カーソルの移動をトラックパッドやマウスで行うの面倒 解決 https://apps.apple.com/jp/app/screenjump/id631940883?mt=12 をインストールすると, fn + control で移動してくれる.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

よく使うUNIXコマンド

操作共通 まず、どのコマンドにも共通するテクニックをご紹介します。 それは、help 機能です。 どのようなコマンドであっても、そのコマンドの後に -- help と続けて入力することで、その具体的な利用方法が表示されます。 例えば、mvコマンドの使い方がわからなかった場合 sh-3.2# mv -- help usage: mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory あるいは、省略して sh-3.2# mv -- h usage: mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory という形で使い方を表示してくれます。また、これだけではよくわからない場合、manコマンドで man 調べる語句 と入力すると、その説明が表示されます。例えばmvの場合・・・ sh-3.2# man mv NAME mv -- move files SYNOPSIS mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory DESCRIPTION In its first form, the mv utility renames the file named by the source operand to the destination path named by the target operand. This form is assumed when the last operand does not name an already existing directory. In its second form, mv moves each file named by a source operand to a destination file in the existing directory named by the directory operand. The destination path for each operand is the pathname produced by the concatenation of the last operand, a slash, and the final pathname component of the named file. The following options are available: -f Do not prompt for confirmation before overwriting the destination path. (The -f option overrides any previous -i or -n options.) -i Cause mv to write a prompt to standard error before moving a file that would overwrite an existing file. If the response from the standard input begins command [-pVv] command [arg ...] compgen [-abcdefgjksuv] [-o option complete [-abcdefgjksuv] [-pr] [-o continue [n] -省略- : Berkeley Software Distribution License のように、詳しく使い方を表示してくれます。終了するときは、最後の:の後にqと入力します。 :q これを使うことで、大抵の使い方はわかるようになるでしょう。(manで出てこないコマンドもあります。) 次に、よく使うコマンドと、特に知っておきたいコツについてご紹介します。 cdコマンド change directory の略で、現在のワーキングディレクトリ(カレントディレクトリ)を変更します。 cdコマンド(ディレクトリを指定しない素のコマンドの動作) cd ディレクトリを指定せずに「cd」のみで実行すると、ホームディレクトリ(Terminalを開いた時に、一番最初に表示されているディレクトリ)に移動することができます。 指定したディレクトリに移動したいときの、cdコマンド cd /home 指定したディレクトリに移動します。 ディレクトを遡るcdコマンド cd .. 一つ上のディレクトリに移動します。 lsコマンド list segmentsの略で、ファイルやディレクトリの情報を表示します。 表示 lsだけだと、フォルダ・ファイル名だけ表示されます sh-3.2# ls Applications Downloads Music Desktop Library Public -ls を追加すると、その権限や容量やタイムスタンプまで見ることができます。 sh-3.2# ls -ls 0 drwx------@ 4 username staff 128 4 5 13:02 Applications 0 drwx------+ 53 username staff 1696 5 8 18:21 Downloads 0 drwx------+ 4 username staff 128 4 9 11:11 Music 0 drwx------@ 4 username staff 128 5 8 18:21 Desktop 0 drwx------@ 71 username staff 2272 4 7 22:16 Library 0 drwxr-xr-x+ 7 username staff 224 5 8 16:46 Public pwdコマンド present working directory の略で「今作業しているディレクトリ」という意味です。 現在のディレクトリを絶対パスで表示することができます。 表示 sh-3.2# pwd /Users/username catコマンド concatenate(連結すること)の略で、ファイルを連結させたり表示したりするのに用います。 ファイルの表示 cat ファイル名 ファイル操作 ファイルの作成 touchコマンドは、ファイルの最終更新日を変更するコマンドです。 ただ、よく使うのはファイルを作成するときで、新しいファイルを作成する機能だと覚えている人も多いと思います。 「touch ファイル名」でtouchコマンドを実行した時間がファイルの最終更新日となります。 指定したファイルがない場合は、サイズが「0」のファイルが作成されます touch ファイル名 mvコマンド move の略で、ファイルやディレクトリを移動したり、リネーム(ファイル名を変更する)したりするコマンドです。 「mv ファイル 移動先ディレクトリ」とすると、ファイルが指定したディレクトリに移動されます。 異動先にファイル名まで指定した場合は、「ファイルからファイルへの移動=リネーム」となります ファイル・ディレクトリの移動 mv ディレクトリ名 移動先のディレクトリ名 ファイル名を変更する mv ファイル名 新しいファイル名 cpコマンド copy の略で、ファイルをコピーする際に利用するコマンドです。 「cp コピー元 コピー先」のように指定すると、ファイルをコピーすることができます。 コピー先に「ディレクトリ」を指定した場合は、指定したディレクトリにコピー元と同じ名前のファイルが作成されます。 ファイルのコピー cp コピーするファイル名 新しいファイル名 cpコマンド ディレクトリのコピー cp -r コピーするディレクトリ名 新しいディレクトリ名 注意: -r をつけずにディレクトリをコピーしようとすると、エラーが出力され、コピーは実行されません。 rmコマンド remove の略で、ファイルやディレクトリを削除するコマンドです。 ファイルの削除 rm ファイル名 ディレクトリの削除 rm -r ディレクトリ 注意: -r をつけずにディレクトリをコピーしようとすると、エラーが出力され、コピーは実行されません。 コマンドの特性 過去に実行したコマンドは、上矢印キー「↑」で入力することができる。 ファイルやフォルダがあると、頭文字を入力してTabキーを押すと入力補完される
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac-セキュリティ&プライバシーの制御-カメラ編

はじめに... 調査した内容を時系列にまとめた資料なので、その点ご了承ください。 目次 実行環境 実現したいこと CLIを使った制御 プロファイルを使った制御(ProfileCreator) プロファイル生成 プロファイル適用 プロファイル動作確認 まとめ 1. 実行環境 項目 情報 OS macOS 11.3.1 HW MacBook Air (11-inch, Mid 2013) MDM環境 microsoft intune 2. 実現したいこと 最終目標 GUIの操作なしにmacのセットアップが行える環境を整備したい 今回の目標 GUIの操作なしにシステム環境設定 > セキュリティとプライバシー > プライバシー の設定をセットアップする 3. CLIを使った制御 調査したところ…関連した情報を3つほど得ることができたが、採用は見送りとした。 tccutilコマンド /Library/Preferences/.GlobalPreferences の設定変更 /Library/Application Support/com.apple.TCC/TCC.db の設定変更 tccutil コマンドは、Big Sur(11.3.1)では、reset(削除)するオプションしか存在せず、「操作」に当たらない。また、Configやsqlite形式のファイルを操作し、設定する方法もあったが、継続利用できるかは不透明なため見送りとする。 参照リンク https://stackoverflow.com/questions/37865439/terminal-command-to-change-security-and-privacy-advanced-setting https://www.macobserver.com/tips/macos-disable-webcam-mac/ https://developer.apple.com/forums/thread/119373 https://apple.stackexchange.com/questions/178313/change-accessibility-setting-on-mac-using-terminal 4. プロファイルを使った制御(ProifleCreator) CLIを諦めて、プロファイルにより制御できないか調査した。MDMのポリシー制御設定を使うことで制御できるとの情報があったが、手動で記載するのは辛いため、githubで公開されているProfileCreatorを使って、プロファイルの雛形を作成することにした。 5. プロファイル生成 今回は、テストのしやすさを重視し、Edge For macOSにてcameraデバイスの制御(拒否)を行なってみる。 プロファイルの生成は、ProifleCreatorを使って、Privacy Preferences Policy Control からCameraデバイスを選択、アプリの登録する。 また、アプリの登録については、Finderからアプリをドラッグ&ドロップすれば登録できる。 制御可能な内容は、設定毎に定められており、Cameraデバイスの制御は、「拒否」することしかできないため、注意が必要。 5. プロファイル適用 MDMプロファイルとなるため、何らかのMDMサービス経由で適用が必要。 今回はintuneを利用して、対象端末にプロファイルを適用する。 ※ 端末は、すでにintuneへ参加しているものとする。 Microsoft Endpoint Manager Admin Centerにログインし、 デバイス > macOS > 構成プロファイルを開き、プロファイル作成ボタンをクリック。 今回は、以下のようにポリシーを作成/適用。 適用した後、しばらくするとmacOSにプロファイルが適用される。 7. プロファイル動作確認 webブラウザ経由でカメラの動作を確認したところ、プライバシー設定にてカメラを設定しているにもかかわらず、カメラが利用できない状態となった。無事成功。 設定-セキュリティとプライバシー 8. まとめ MDM + プロファイルを使って、GUIの操作なしにシステム環境設定 > セキュリティとプライバシー > プライバシーの設定をすることができた ただし、プロファイルを設定しても、システム環境設定の設定項目がグレーアウトするなどの機能はなかった ※なお、プロファイルを設定しない状態でカメラが利用できることは確認済
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macのデスクトップをすっきりさせるテクニック5選

これは何 デスクトップの乱れは心の乱れ Macのデスクトップをできるだけ綺麗に整理する方法をまとめた記事です 1. Spotlight Search or Alfredを起点にする 機能は色々ありますが、ランチャーとしての使用だけに絞った話で問題ありません。 ランチャーの使用が直接的にデスクトップをすっきりさせるわけではありませんが、これらを起点に全ての操作を実行するとデスクトップをすっきりさせやすいです。 Spotlight Searchの場合はMacのデフォルトの機能なのでCommand + Spaceで起動できます。 Alfredは公式サイトからインストーラーをダウンロードするか Homebrewからインストールするかです。 brew install --cask alfred 筆者はクリップボード拡張や1Passwordとの連携も含めてAlfredの方が好きです。 2. Dockを非表示にする Dockあり Dockなし Dockは「Macらしさ」の要素でもありますが、ディスプレイの中で面積をとっているのも事実です。 そのため、利便性を重視してずっと非表示にしています。 「不便じゃない?」と聞かれることもあるのですが、ランチャーからのアプリ起動を前提にすれば特に問題は無いのでないでしょうか。1 ただし「完全に非表示」にはできないため、以下のステップを踏みます。 System Preferences > Dock & Menu BarよりAutomatically hide and show the Dockにチェックを入れる 以下のコマンドを叩き、非表示から表示になるまでのdelayの時間を長くする 擬似的にずっと非表示になる defaults write com.apple.dock "autohide-delay" -float "100" && killall Dock 「試しにやってみたけど、やっぱりDockは必要だな……」というときは以下のコマンドで初期設定に戻せます。 defaults delete com.apple.dock "autohide-delay" && killall Dock ちなみに初期設定のdelayは0.5なので以下のコマンドも同じ意味を持ちます。 defaults write com.apple.dock "autohide-delay" -float "0.5" && killall Dock 3. BartenderでMenu Barを整理する アイコンが多いMenu Bar アイコンが少ないMenu Bar 色んなアプリを増やすとMenu Barにアイコンが増えますよね? アイコンが増えるとごちゃごちゃしてきて嫌になるので、整理しちゃいましょう。 ただし、設定からオンオフできるアプリも多いですが、オフにしたらしたでアクセスしづらい機能がある場合も……。 そんな悩みがあっても、Bartenderを入れると簡単に整理できますし、必要なときはアクセスも容易です。 こちらも公式サイトからダウンロードするか Homebrewからインストールするかです。(ちなみに有料で、15$です。) brew install --cask bartender 以下のように設定画面から、アイコンの表示の種別を設定できます。 常に表示するアイコン バッテリーやWi-Fiのステータスは流石に常時見えていて欲しいので表示しています 普段は隠しておくアイコン それ以外の常駐アプリのアイコンは隠してあります 「…」のようなアイコンを押すと、隠しているアイコンが出現します ずっと隠しておくアイコン これは私は設定していません 注意点として、日付とControl Centerのアイコンは非表示できません。 日付はいつも見るので良いのですがControl Centerはほぼ使ったことがなく……正直言って非表示にしたいので、もしやり方をご存じの方がいれば是非教えてください。 4. Automatorでデスクトップから自動でファイルを移動する せっかくDockやMenu Barを綺麗にしても、デスクトップにたくさんのファイルが散らかっていては意味がありません。 ですが、「毎日綺麗にしよう」と思っても人間の意志の強さなんてたかがしれています。いつの間にか散らかるものです。 というわけでシステムの力に頼りましょう。 まずはAutomatorを使ってデスクトップのファイルを退避するアプリを作ります。 先に完成系をお見せするとこんな感じ。 起動、ファイル作成 まず、Automatorで新規ファイルを作成したらApplicationを選びます。 デスクトップのアイテムを取得して、変数に格納 Find Finder Itemsで、Search対象をDesktopにする Set Value of Variablesで格納、名前は適当に(今回はDesktop Itemsとしています) 新しいフォルダを作成して、変数に格納 New Folderを選択して、日付のフォーマットとフォルダを作成する場所を選ぶ その際、右クリックをしてからIgnore Inputを選ばないと上手く動いてくれません こちらも変数に格納、名前は適当に(今回はNew Folderとしています) Desktop ItemsをNew Folderへ移動 Get Value of VariableでDesktop Itemsを選択 Move Finder ItemsでToにNew Folderを選択 この状態でどこかのフォルダに作ったアプリを保存して、起動するとデスクトップにあるデータを設定したフォルダへ移動してくれます。 そしてもう一手間かけて自動化しましょう。 cronで定期実行 ターミナルを開き、以下のコマンドを叩きます。 crontab -e 起動したら、任意の時間と保存したアプリの指定をします。 私はApplicationsにDesktopToTemp.appという名前で保存して、毎日23:59に起動しようと思ったので、こうなりました。 59 23 * * * open /Applications/DesktopToTemp.app これで、デスクトップにファイルが溜まりまくる事態を回避できました。 5. 壁紙を単色にする これは完全に好みの問題ですが……。 System Preferences > Desktop & Screen Saverに進みと壁紙が変えられるのはみなさんご存じかと思いますが、デフォルトの写真の他に「Colors」という項目があります。 気に入った色がなければCustom Color...からカラーピッカーを起動して選べます。 まとめ Spotlight Search or Alfredを起点にする Dockを非表示にする BartenderでMenu Barを整理する Automatorでデスクトップから自動でファイルを移動する 壁紙を単色にする こんなにこだわって何があるんだと言われれば、何もありません。 ただなんとなく気分が良くなるだけの代物ですが、似たような嗜好の方がいたら仲良くなれる気がしています。 現在起動中のアプリが一覧できるのは良い機能だと思いますが、筆者の場合は30分〜1時間も触っていないアプリは落としてしまうので、余計に重要度が低いです。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ルーティングについて(Laravelでウェブアプリを作ろう)

ルーティングとは 特定のアドレスにアクセスした時、どの処理を呼び出して実行するか。それを管理するのが「ルーティング」です。実際の処理が記載されているというよりあくまでどの処理かの紐付けを行なっているだけです。具体的に実行すべき処理は「コントローラー」に記載されています。 前提条件 プロジェクトの作成が終わっている状態 まだ作成できていない方はこちら 実際のアプリでは プロジェクトの作成が完了すると以下のコマンドでサーバーを立ち上げてアプリを使うことができます。 サーバーの起動(ターミナル) php artisan serve 実行後に表示されるURLをブラウザで開くとLaravelのページが表示されると思います。 これはアプリ内のresouces/views/welcome.blade.phpが表示されている状態です。 このファイルを開く、という指定はroutes/web.php内に記載されています。 デフォルト(routes/web.php) <?php use Illuminate\Support\Facades\Route; //ここで「welcome」の指定がある Route::get('/', function(){ return view('welcome'); }); view関数で指定することで、自動的にresouces/views内のファイルという指定がされるというわけです。 例えば、view関数でファイルを分けずにweb.php内に直接htmlを記述することも可能です(本来はこういう使い方をすることはないが、動きの理解として。) view関数を使わずにべた書き(routes/web.php) Route::get('test', function () { return '<html><body><h1>Hello</h1><p>This is sample page.</p></body></html>'; } サーバーの起動後http://localhost:8000/testに接続すると記述した内容が表示されていることがわかる。 他にリクエストされた時のパラメーターを利用する方法もある。 必須パラメーターの利用(routes/web.php) Route::get('test/{str}', function ($str) { return '<html><body><h1>Hello</h1><p>This is sample page.</p><p>{$str}</p></body></html>'; } サーバーの起動後http://localhost:8000/test/好きな単語に接続すると好きな言葉に記載した内容が表示されていることがわかる。上記のパラメーターは「必須パラメーター」というもので記載しないとエラーになります。対して「任意パラメーター」の書き方は以下のように「?」をつける+デフォルト値を設定するだけです。 任意パラメーターの利用(routes/web.php) Route::get('test/{str?}', function ($str='no contents.') { return '<html><body><h1>Hello</h1><p>This is sample page.</p><p>{$str}</p></body></html>'; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacにElixir + Phoenix環境を構築してAPIを作る

はじめに ElixirとPhoenixでAPIを作る。 OS / 言語 / フレームワーク バージョン macOS BigSur 11.2.4 Elixir 1.11.4 Phoenix v1.5.8 Elixirをインストール $ brew install elixir $ iex -v Erlang/OTP 23 [erts-11.2.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace] IEx 1.11.4 (compiled with Erlang/OTP 23) Phoenixインストール $ mix local.hex $ mix phx Phoenix v1.5.8 Productive. Reliable. Fast. A productive web framework that does not compromise speed or maintainability. Available tasks: mix phx.digest # Digests and compresses static files mix phx.digest.clean # Removes old versions of static assets. mix phx.gen.cert # Generates a self-signed certificate for HTTPS testing mix phx.gen.channel # Generates a Phoenix channel mix phx.gen.context # Generates a context with functions around an Ecto schema mix phx.gen.embedded # Generates an embedded Ecto schema file mix phx.gen.html # Generates controller, views, and context for an HTML resource mix phx.gen.json # Generates controller, views, and context for a JSON resource mix phx.gen.live # Generates LiveView, templates, and context for a resource mix phx.gen.presence # Generates a Presence tracker mix phx.gen.schema # Generates an Ecto schema and migration file mix phx.gen.secret # Generates a secret mix phx.new # Creates a new Phoenix v1.5.8 application mix phx.new.ecto # Creates a new Ecto project within an umbrella project mix phx.new.web # Creates a new Phoenix web project within an umbrella project mix phx.routes # Prints all routes mix phx.server # Starts applications and their servers プロジェクト作成 DBはMySQLを利用する。 今回はAPIなのでHTMLもWebpackも不要となる。 その他不要なものは生成しない。 $ mix phx.new --no-html --no-webpack --no-gettext --no-dashboard --database mysql sample * creating sample/config/config.exs * creating sample/config/dev.exs * creating sample/config/prod.exs * creating sample/config/prod.secret.exs * creating sample/config/test.exs * creating sample/lib/sample/application.ex * creating sample/lib/sample.ex * creating sample/lib/sample_web/channels/user_socket.ex * creating sample/lib/sample_web/views/error_helpers.ex * creating sample/lib/sample_web/views/error_view.ex * creating sample/lib/sample_web/endpoint.ex * creating sample/lib/sample_web/router.ex * creating sample/lib/sample_web/telemetry.ex * creating sample/lib/sample_web.ex * creating sample/mix.exs * creating sample/README.md * creating sample/.formatter.exs * creating sample/.gitignore * creating sample/test/support/channel_case.ex * creating sample/test/support/conn_case.ex * creating sample/test/test_helper.exs * creating sample/test/sample_web/views/error_view_test.exs * creating sample/lib/sample/repo.ex * creating sample/priv/repo/migrations/.formatter.exs * creating sample/priv/repo/seeds.exs * creating sample/test/support/data_case.ex Fetch and install dependencies? [Yn] Y * running mix deps.get * running mix deps.compile We are almost there! The following steps are missing: $ cd sample Then configure your database in config/dev.exs and run: $ mix ecto.create Start your Phoenix app with: $ mix phx.server You can also run your app inside IEx (Interactive Elixir) as: $ iex -S mix phx.server MySQL情報を編集 $ cd sample 必要に応じてMySQLの接続情報を編集する。 config/dev.exs config :sample, Sample.Repo, 5 username: "root", 6 password: "", 7 database: "sample_dev", 8 hostname: "localhost", DB作成 $ mix ecto.create Compiling 10 files (.ex) Generated sample app The database for Sample.Repo has been created sample_devDBが作成されたことを確認する。 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sample_dev | +--------------------+ 8 rows in set (0.007 sec) API作成 公式の通りにAPIを作成する。 $ mix phx.gen.json Accounts User users name:string age:integer * creating lib/sample_web/controllers/user_controller.ex * creating lib/sample_web/views/user_view.ex * creating test/sample_web/controllers/user_controller_test.exs * creating lib/sample_web/views/changeset_view.ex * creating lib/sample_web/controllers/fallback_controller.ex * creating lib/sample/accounts/user.ex * creating priv/repo/migrations/20210508154721_create_users.exs * creating lib/sample/accounts.ex * injecting lib/sample/accounts.ex * creating test/sample/accounts_test.exs * injecting test/sample/accounts_test.exs Add the resource to your :api scope in lib/sample_web/router.ex: resources "/users", UserController, except: [:new, :edit] Remember to update your repository by running migrations: $ mix ecto.migrate テーブル作成 $ mix ecto.migrate Compiling 6 files (.ex) warning: SampleWeb.Router.Helpers.user_path/3 is undefined or private lib/sample_web/controllers/user_controller.ex:18: SampleWeb.UserController.create/2 Generated sample app 00:48:20.596 [info] == Running 20210508154721 Sample.Repo.Migrations.CreateUsers.change/0 forward 00:48:20.603 [info] create table users 00:48:20.651 [info] == Migrated 20210508154721 in 0.0s テーブルが作成されたことを確認する。 MariaDB [(none)]> use sample_dev Database changed MariaDB [sample_dev]> show tables; Empty set (0.001 sec) MariaDB [sample_dev]> show tables; +----------------------+ | Tables_in_sample_dev | +----------------------+ | schema_migrations | | users | +----------------------+ 2 rows in set (0.002 sec) サーバ起動 起動すると以下のようなログが出力される。 $ mix phx.server [info] Running SampleWeb.Endpoint with cowboy 2.8.0 at 0.0.0.0:4000 (http) [info] Access SampleWeb.Endpoint at http://localhost:4000 ポート番号の変更 ポート番号を4000から変更したい場合は19行目付近を変更すれば良い。 config/dev.exs 18 config :sample, SampleWeb.Endpoint, 19 http: [port: 4000], 20 debug_errors: true, 21 code_reloader: true, 22 check_origin: false, 23 watchers: [] ルータにAPIを定義 usersAPIを定義する。 router.ex defmodule SampleWeb.Router do use SampleWeb, :router pipeline :api do plug :accepts, ["json"] end scope "/api", SampleWeb do pipe_through :api resources "/users", UserController, only: [:index, :show, :create, :update] ←追加 end end ユーザ情報取得 データ未登録の状態で試しにAPIを実行する。 $ curl http://localhost:4000/api/users {"data":[]} 当然、データなしで返却される。 ちなみにログは以下のような出力。 ログ [info] GET /api/users [debug] Processing with SampleWeb.UserController.index/2 Parameters: %{} Pipelines: [:api] [debug] QUERY OK source="users" db=21.0ms queue=16.4ms idle=728.9ms SELECT u0.`id`, u0.`age`, u0.`name`, u0.`inserted_at`, u0.`updated_at` FROM `users` AS u0 [] [info] Sent 200 in 74ms ユーザ登録 適当なユーザを登録してみる。 $ curl -X POST -H "Content-type: application/json" -d '{"name":" Chris McCord ","age": 31}}' http://localhost:4000/api/users ログ [info] POST /api/users [debug] Processing with SampleWeb.UserController.create/2 Parameters: %{"user" => %{"age" => 31, "name" => " Chris McCord "}} Pipelines: [:api] [debug] QUERY OK db=18.4ms queue=16.1ms idle=1644.9ms INSERT INTO `users` (`age`,`name`,`inserted_at`,`updated_at`) VALUES (?,?,?,?) [31, " Chris McCord ", ~N[2021-05-08 16:35:14], ~N[2021-05-08 16:35:14]] [info] Sent 201 in 111ms 登録結果の確認 API経由で登録したユーザ情報が登録されているかSelect文とAPIを実行し確認してみる。 usersテーブル テーブルをselectしユーザ情報を確認する。 MariaDB [sample_dev]> select * from users; +----+----------------+------+---------------------+---------------------+ | id | name | age | inserted_at | updated_at | +----+----------------+------+---------------------+---------------------+ | 1 | Chris McCord | 31 | 2021-05-08 16:35:14 | 2021-05-08 16:35:14 | +----+----------------+------+---------------------+---------------------+ 1 row in set (0.002 sec) usersAPI APIを実行しユーザ情報を確認する。 $ curl http://localhost:4000/api/users {"data":[{"age":31,"id":1,"name":" Chris McCord "}]} おわりに Phoenixを使うことで特にハマることなく容易にAPIを作ることが出来た。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む