- 投稿日:2021-03-15T22:14:42+09:00
【Rails】Webpacker::Manifest::MissingEntryErrorの対処法【Docker】
環境
Ruby 2.6.6
Rails 6.1.1
Docker 20.10.2はじめに
Docker環境でRailsアプリを開発中に、サーバーを起動しhttp://localhost:3000/にアクセスすると発生。
Rails6ではwebpackerが標準サポートとなり、webpakerのインストールにはパッケージマネージャーであるyarnが必要。エラーの解決方法
1)まずyarnで必要なライブラリをインストールする
$ bin/yarn2)次にwebpackでJavaScriptのコンパイルをする
$ bin/webpack3)最後にJS配信用のdevサーバーを起動する。(自動でwatch&コンパイルされる)
$ bin/webpack-dev-serverこれをした後に一応docker-compose up -dで再起動し、localhost:3000にアクセスすると表示されました!
2と3はどちらかだけでも良いかも??参考
- 投稿日:2021-03-15T22:00:01+09:00
【就活用】MacでPDFを圧縮・パスワードを設定する方法
はじめに
就職活動では企業から履歴書・職務経歴書を送付するよう指示があります。
その際、圧縮とパスワードの設定をするよう言われるときがあり、その方法の共有です。やること
1 PDFの圧縮
2 PDFのパスワードの設定
1 PDFの圧縮
下記のURLにアクセスしサイトの指示に従い、PDFの圧縮を行います。
PDF圧縮アプリです。
2 PDFのパスワードの設定
③左下の「PDF」をクリックし、「PDF」として保存をクリックする
⑤写真のようにチェックボックスにチェックを入れ、「パスワード」を任意で入力する。確認には同じパスワードを入力し「OK」をクリックする。
※1と2の手順を逆にすると実行できないので注意です。
なぜ企業が指示を出すのか
※上記の番号と対応しています。
1 ・MacとwindowsなどのOSの違いで開けないファイルがあるからです。
・PDF化することで履歴書の改ざんを防ぐことができるからです。
・エクセルやワードではバージョンによって開けないこともあり、印刷ページがずれることもあるからです。
PDFであればPC環境に左右されることも少ないので、印刷や管理をしやすいためです。2 PDFを暗号化するため圧縮することと、容量を軽減できるからです。
個人情報となるので、もし外部に情報が漏れても問題ないようパスワードを設定します。
※しかしパスワードを別メールでお送りすることは無意味である可能性があります。諸説あり。以上です。
- 投稿日:2021-03-15T17:58:56+09:00
[Django REST Framework]でReactとのAPI連携
実行環境
MacOS BigSur -- 11.2.1
Python3 -- 3.8.2
Django -- 3.1.7
djangorestframework -- 3.12.2
npm -- 6.14.4
react -- 17.0.1
react-dom -- 17.0.1
axios -- 0.21.1Django REST Framework(DRF) を始めてみる
これまでDjangoのみを用いたWebアプリケーションの作成をしていましたが、フロントエンドの高度化ができず、DRFを用いてReactと組み合わせてみたい!!!と思いました。Reactに関してはまだ知識が少ないのですが、とりあえずDRFで作成したAPIをReactに渡す部分を実装をしたのでその手順をメモがてらに記述します。
DRFの続き(バックエンド)
前回の記事⇨
https://qiita.com/kachuno9/items/52a756f15207f625f358
でカスタムユーザーによるDRFプロジェクト作成は終わっているのでその続きからです。
ちなみに、ディレクトリ構成はこんな感じです。my_api ├── backend │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ ├── models.py │ ├── serializers.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── db.sqlite3 ├── manage.py ├── media └── my_api ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.pyModel
とりあえず簡単にPostモデルを作成しました。
models.pyclass Post(models.Model): title = models.CharField('タイトル', max_length=50) text = models.TextField('テキスト') created_at = models.DateField('作成日', auto_now_add=True) updated_at = models.DateField('更新日', auto_now=True) def __str__(self): return self.titleView
views.pyfrom django.shortcuts import render from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from backend import serializers from .models import Post class PostAll(APIView): def get(self, request): try: post = Post.objects.all().order_by('-created_at') res_list = [ { 'id': p.id, 'date': p.created_at, 'title': p.title, } for p in post ] return Response(res_list) except: return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)URL関連
さて、簡単なモデルとビューを作成したのでURLを設定します。
my_api/urls.pyfrom django.contrib import admin from django.urls import path, include from django.conf import settings urlpatterns = [ path('admin/', admin.site.urls), path('api/v1/', include('backend.urls')) ]backend/urls.pyfrom django.urls import path from backend import views urlpatterns = [ path('', views.PostAll.as_view()), ]動作確認
仮想環境内で、サーバーを立ち上げます。
$ python3 manage.py runserverhttp://localhost:8000/api/v1/
にアクセスすると、しっかりとAPIの動作確認が行えました。
ちなみにデータはadminサイトであらかじめサンプルようにいくつか追加しています。
Reactプロジェクト作成(フロント)
先程までとは別のターミナルを立ち上げて環境構築、プロジェクト作成を行います。アプリ名は「frontend」にしました。
$ npx create-react-app $ cd frontend $ npm install axios $ npm install react-router-dom $ npm startするとReacrのロゴが表示されるページが出てきて、正常にプロジェクト作成できた事がわかります。
ちなみに、frontend/srcのディレクトリ構成はこの通りです。frontend/src ├── App.css ├── App.js ├── App.test.js ├── index.css ├── index.js ├── reportWebVitals.js └── setupTests.jsReactとDRFの連携
さて、いよいよDRFとの連携を行います。DRFでは
http://localhost:8000/api/v1/
でデータを取得できるようにしているので、React側でここにGetリクエストを送るように実装します。axiosを用いることで簡単にリクエストを実装できるということで、インストールしました。App.jsimport React, { Component } from 'react'; import axios from 'axios'; class App extends Component { state = { posts: [] }; componentDidMount() { this.getPosts(); } getPosts() { axios .get('http://localhost:8000/api/v1/') .then(res => { this.setState({ posts: res.data }); }) .catch(err => { console.log(err); }); } render() { return ( <div> {this.state.posts.map(item => ( <div key={item.id}> <h1>{item.title}</h1> <p>{item.date}</p> </div> ))} </div> ); } } export default App;http://localhost:3000/
にアクセスするとしっかりDRFからデータを受け取っている事が分かります!!
今回はDRFとReactの連携が確認できたところまでです。
これまでバックエンドとフロントエンドを分けて開発するといった高度な開発経験がなかったので、DRFとReactが連携できただけですごく嬉しかったです(笑)
Reactに関してはまだまだ知識が少なく、見よう見まねですがこれから開発を進めていきたいと思います!!参考
以下のページが非常に分かりやすく、参考にさせていただきました。
- https://qiita.com/__init__/items/f5a5a64a05541fcda713#todo-api-%E3%81%AE%E6%A7%8B%E7%AF%89
- https://qiita.com/Piyopanman/items/5ffb9c290d452e0a5782
- https://qiita.com/Piyopanman/items/0a757a7b2dd412e07135
- 投稿日:2021-03-15T16:22:28+09:00
Mapture愛用者が「Fuwari」に機能追加して公開しました ?
普段、スクリーンショット拡張アプリの「Mapture」を愛用していた自分が、今回Swiftの勉強を兼ねて、オープンソースとして公開されている「Fuwari」に機能追加をして公開しました。
開発の経緯や今回追加した機能、初めてSwiftを書いた感想などを書いていきたいと思います。
開発経緯
コードを書いている上で、ドキュメントや参考ページを見ながら作業をすることが多々あると思いますが、そんな時自分は「Mapture」というソフトを使っていました。
機能としては、画面の好きな範囲を選択してスクショを撮影し、その画像を画面上に保持しておくことができます。このMaptureには「Gyazoに送る」という項目があって、元は撮影したスクショをGyazoに転送して共有できたのですが、ここ数年は使えなくなっていました。
2014年を最後に長らく更新されておらず、おそらくAPIが使えなくなったのでしょう。もう少し頻繁にメンテナンスされている代替アプリはないかと探していたときに見つけたのが、「Fuwari」でした。
2018年に公開されており、Qiitaで開発記事が上がっているほか、いろんなサイト様で紹介されているイケイケっぷり。
モダンなアイコンが素敵で、早速乗り換えを検討したのですが……
- ワークスペース間で画像を共有できない(ワークスペース切り替えてもついてきてくれない)
- 透明度を変更できない
- クラッシュするバグがある
- メモリ使用率が雪だるま式に増えていく
と、所々不具合や、機能的な物足りなさ(Maptureに慣れていた所為)を感じてしまいました。
更新も途絶えてしまっているようなので、「せっかくMITで公開してくれているんだし、自分で直して公開しよう!」と思い立ったのが、今回の経緯です。
公開したアプリ
Githubリポジトリはこちらです。
元のリポジトリをforkして、再配布形式で公開させていただいています。追加した機能
今回追加した機能や、バグフィックスの一覧です。
追加機能
- ➕右クリックメニューからGyazoに送信できる機能を追加しました
- ➕画像の拡大縮小をマウスドラッグで変更可能にしました
- ➕マウスウィールでキャプチャの透明度を変更できるようにしました
- ➕OS標準のダークテーマに対応しました
- ➕設定画面からドラッグ移動時の透明度を指定できるようにしました
変更箇所
- ✨Apple Siliconに対応したUniversal Binaryにしました
- ✨キャプチャのデフォルトショートカットをCmd+Shift+mに変更しました
- ✨キャプチャが全てのワークスペースで表示されるように変更しました
バグフィックス
- ?キャプチャをESCでキャンセルするとアプリがクラッシュする問題を修正
- ?メモリーリークが発生していた問題を修正
機能比較
下はOS標準のスクショ機能も含め、各アプリを比較した表です。
Fuwari(sskmy) Fuwari(origin) Mapture OS標準(Cmd+Shift+4) 画面上にキープ ✅ ✅ ✅ ✖️ ワークスペース間で共有 ✅ ✖️ ✅ - 透明度の変更 ✅ ✖️ ✅ - 共有リンクの生成(Gyazo) ✅ ✖️ ✖️ ▲(icloud) ショートカットキーの設定 ✅ ✅ ✖️ ✖️ ゴミファイルが残らない ✅ ✅ ✖️ ✖️ はじめてのSwift
普段はTypescript中心にWebフロントやReactNativeばかり触っていて、Swiftをがっつり触ったのは初めてでした。
なので今回の機能追加は、とても学びになることが多かったです。特に学びになった(足止め食らった)もの↓
- clone直後、フレームワークが最新のCarthageでビルドできなかった(超初歩)
- storyboardと@IBOutletする方法(超初歩)
- NSImageをbase64に変換して
multipart/form-data
で送信する方法- Xcode projectで環境変数(.env)を使う最適解
- メモリリークという概念に初めて触れた
ここら辺は時間がある時に別途記事にしたいですね。
Swiftという言語の書き方については、Typescriptに似たような雰囲気があって、比較的スムーズに書くことができました。
Xcodeの補完やFix機能が優秀というのもあるのかもしれません。今後の開発
Maptureの代替をようやく見つけた(作った)ので、自分自身がヘビーユーザとなり今後もメンテナンスしていくつもりです。
Githubで公開してあるので、不具合や追加機能のご要望等あればお待ちしております!
コメント欄や、Twitter (@sskmy1024r) での感想も承ります。なお、オリジナルの更新が途絶えてしまっているので今回このような形で公開しておりますが、開発が再開された場合、ソースコードの提供を含めてオリジナル版の発展に貢献する所存です。
最後に
今回の開発を得て、オープンソースプロジェクトの偉大さを改めて感じました。
触れたことのない言語で1からこのアプリを開発をすることは、今の自分には到底無理だと思いました。
素晴らしいアプリを開発していただき、かつオープンソースとして公開してくださっている@kentya6様、本当にありがとうございます?♂️そして世の中のOSSを公開してくださっている皆さん、OSSを使って新しい価値を生み出している皆さん、OSSを使ってくれている皆さん、ありがとうございます!!!
- 投稿日:2021-03-15T14:52:58+09:00
[Mac]Touch Barをカスタマイズするアプリ'Pock'のプラグイン開発
はじめに
まずは僕が使っているMacBookProのTouch Barをご覧ください!
左から、
escキー
、ストップウォッチ
、Dock
、音楽プレーヤ
、明るさ・音量設定
となってます。良い評判はあまり聞こえてくることのないMacBook ProのTouch Barですが、こんな感じでカスタマイズして使用すると割と便利だったりします。Pockとは
このようにTouch Barをカスタマイズするアプリの一つが
Pock
というものです。他にもBetterTouchTool
というものがありますがこちらは有料であるのに対し、Pockはオープンソースで開発されており無料で使用することができます。(BTTも便利なので利用していますが。。)
GitHubのリポジトリinstall方法
HomeBrewで簡単にインストールできます。
brew install pockこちらの公式サイトからもインストールできます。
[2021.3.14]
開発者様のツイートより、現在公式サイト復旧中であるとのことですのでgithubよりダウンロードするのが良いかもしれません。
↓
OVH had a considerable incident today. SBG-2, the datacenter where Pock’s website was hosted, is destroyed.
— Pierluigi Galdi (@pigigaldi) March 10, 2021
I will try to bring the site back to life as soon as possible. In the meantime, you can find the latest versions of Pock directly on GitHub. https://t.co/j5uzgtTXba
初めて起動した際、いくつかアクセシビリティやプライバシーの権限が求められますので各自判断して許可を与えてください。Widget
Pockをインストールするとデフォルトで、
Dock
、Now Playing
、ESC key
、Status
、Control Center
、Weather
の6つが使用できるようになります。(詳しい内容はこちらをご覧ください)
サードパーティ製のプラグインも開発できるようになってはいるようですが、現状公開されているものはほとんど見つけることが出来ませんでした。機能
マウスでの操作
Pockの設定から
Enable Mouse control
をオンにするとマウスでTouch Bar上のアイテムを操作できるようになります。Widget側が対応していないとクリックしても反応しないので注意が必要です。デフォルトでインストールされるwidgetの中にも対応していないものもありました。通常のTouch Bar表示との切り替え
macOS標準やアプリ標準のTouch Bar表示へも簡単に切り替えることが出来ます。キーボードの
control
を2回早押しすると切り替わります。Pockプラグインの開発
Pockプラグイン開発には、PockKitというライブラリを使用することとなります。こちらにドキュメントが公開されるようですが、現状ではあまり詳細には記述されていないようです。そのため各自でライブラリのコードを読む必要がありますが、本記事で簡単に解説します。
1. プラグインテンプレートをダウンロードする。
こちらのページからダウンロードします。初めから自分で作成したい場合は、Xcodeのプロジェクト作成から、macOS->Bundleと進み、Bundle Extensionの欄を
pock
に変更して作成してください。
以下のようなファイルが確認できると思います。
2. PockKitフレームワークのダウンロード
ダウンロードしたディレクトリ配下に移動し
pod install
コマンドでPockKitをダウンロードします。
今のところSwift Packageには対応していないようですが、ここにはSwift Packageから入れられると書いてあるので将来的には対応するのだろうと思われます。3. リネーム
Xcodeプロジェクト自体の名前など各自好きな名前に変更してください。
SampleWidget
クラスの名前を変更する場合、Info.plist
のPrincipal class
の部分も変更する必要があります。4. 表示したいviewの実装
表示したいviewを実装します。viewの実装に関しては通常のCocoaアプリの開発と変わりはないので割愛させていただきます。xibを使ったviewでも大丈夫です。(Bundleの指定には注意してください、自分も引っかかったのでw)
5. widgetクラスの実装
widgetクラスは、
PKWidget
プロトコルに準拠している必要があります。・ identifier
Touch Bar上のitemの識別子です。無難に逆ドメイン名を指定しておくと良いと思います。
・ customizationLabel
Pock上で使用されるwidgetのタイトルに当たる部分です。具体的にはTouch barカスタマイズ画面やWidget設定画面で表示されます。
・ view
表示したいviewのインスタンスを指定します。Touch Barの高さは30pointですので、作成するviewについてはこれより小さくある必要があります。
6. Build&Install
ビルドすると
.pock
という拡張子のファイルができるので、pockのInstall Widget...
をクリックして表示された画面にドラッグ&ドロップしてインストールします。するとpockからリロードを求められるのでリロードを行うと完了です。カスタマイズ画面から作成したwidgetを追加できるようになっていると思います。
また、普通に.pock
ファイルをダブルクリックするだけでもインストールできるかと思います。オプション
マウスでの操作
Widgetクラスを
PKScreenEdgeMouseDelegate
プロトコルに準拠させることでマウスでの操作に対応することが出来ます。
以下が実装が必要なメソッドとなっています。/// マウスがTouch Bar上に侵入した時(Widgetのviewに侵入した時ではないので注意) func screenEdgeController(_ controller: PKScreenEdgeController, mouseEnteredAtLocation location: NSPoint, in view: NSView) /// マウスがTouch Bar上を移動した時 func screenEdgeController(_ controller: PKScreenEdgeController, mouseMovedAtLocation location: NSPoint, in view: NSView) ///マウスがTouch Bar上の任意の点をクリックした時 func screenEdgeController(_ controller: PKScreenEdgeController, mouseClickAtLocation location: NSPoint, in view: NSView) //マウスがTouch Bar上から退避した時 func screenEdgeController(_ controller: PKScreenEdgeController, mouseExitedAtLocation location: NSPoint, in view: NSView)他にもドラッグジェスチャーなどについても実装することが出来ます。
開発者名の指定
Info.plist
のPKWidgetAuthor
に名前を指定することで実装できます。Widget設定画面に表示することが出来ます。
widgetの設定画面
作成したWidgetの設定画面を作ることも可能です。
PKWidgetPreference
プロトコルに準拠したViewControllerを作成し、Info.plist
のPKWidgetPreferenceClass
に作成したクラス名を指定することで実装できます。例として標準でインストールできるControlCenter widgetの設定画面は以下のようになっています。
templeteでは例として以下のような設定画面を実装しています。
pockプラグインの設定画面のサンプル pic.twitter.com/8NvvVq8z8t
— M (@p_x9) March 15, 2021おわりに
最後までお読みいただきありがとうございました。
何か質問などありましたらTwitterやこの記事のコメント欄までお願いします。答えられる範囲ではありますがお答えさせて頂きます。自分も以下のようなプラグインを作ってみました。気軽にタイム測定ができるので我ながら愛用しています。
このGitHubページからダウンロードできるので試してみてください。Touch Barに簡易的なタイマーitemを作った。
— M (@p_x9) March 8, 2021
タップでstart/stop
長押しでreset
Touch Barがスリープ状態に入ってもタイマーは継続するようにしてる。
割と便利に使えそうかもと思ってる。 pic.twitter.com/sUKYuqFjKd
- 投稿日:2021-03-15T14:46:37+09:00
MacのターミナルでExcelのプロセスを探す方法
- 投稿日:2021-03-15T09:51:55+09:00
M1に移行したらiTermが使えなくなった
m1のmacminiに移行したら,iTermが使えなくなった.
そこで,色々調べて解決できたのでメモとして
前提として,
今回の内容は使っているシェルなどによるエラーかもしれないので,全ての人に当てはまるわけでないです.また,私の使っているシェルはzshです.zsh以外の人は同じ方法でエラーが解消するかわかりません.
エラー内容
移行後,iTermを開いたら,ポップアップが表示され,雑に答えたところ,すぐにiTermが閉じてしまうようになってしまった.
そこで,標準のアプリであるターミナルからの復旧を試みるが,プロセスを完了しましたと表示され,コマンドを入力できない.
やったこと
https://bacchi.me/mac/terminal-troubleshoot/
(この処理は実際にはしなくても良いかもしれないが載せておく)
この記事を参考に/bin/shで起動し,mv .bash_profile .bash_profile_`/bin/date +%F`を実行する.(この処理は実際にはしなくても良いかもしれない)
ここで,dateと+%Fの間に半角スペースがあるので注意そして,
brew install zshをする.
上記のサイトではこれで上手くいっていたが,さらなるエラーが生じた.
さらなるエラー
エラー内容
/usr/local/Homebrew/Library/Homebrew/brew.sh: line 670: /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/current/bin/ruby: Bad CPU type in executable /usr/local/Homebrew/Library/Homebrew/brew.sh: line 670: /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/current/bin/ruby: Undefined error: 0 Error: 'git' must be installed and in your PATH! /usr/local/Homebrew/Library/Homebrew/brew.sh: line 670: /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/current/bin/ruby: Bad CPU type in executable /usr/local/Homebrew/Library/Homebrew/brew.sh: line 670: /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/current/bin/ruby: Undefined error: 0したこと
https://himariweb.com/program/homebrew-install-git/
このサイトを参考にCommandLineTools(CLT)を入れ直す.sudo rm -rf /Library/Developer/CommandLineTools xcode-select --install sudo xcode-select -r brew install gitこれらのコマンドでCLTを入れ直し,gitを再度インストールする.
その後は,エラーなどが出るが,
Error: git 2.23.0_1 is already installed To upgrade to 2.30.2, run: brew upgrade gitとかのバージョン関係のエラーなので指示に従っていく.
以上のことをして,
brew install zshまたは
brew reinstall zshにより,zshをインストールできるようになった.
そして,iTermを開いたらこれまで通りちゃんと動くようになってくれていた.
- 投稿日:2021-03-15T07:37:14+09:00
PHPのPDOでMySQLに接続する
環境
・macOS BigSur (11.2.2)
・PHP (7.4.12)
・MAMP (6.3)
・MySQL (5.7.32)前提条件
・MAMPのphpMyAdminでデータベース・テーブルを作成してあること
・データベースに接続するためのユーザーを作成してあることPDOとは
PHPからMySQLに接続するために必要なオブジェクトのこと
※PDOクラスのインスタンスを生成することにより、データベースサーバーとの接続が確率されるDB接続手順
//事前準備 $dsn = 'mysql:host=localhost;dbname=データベース名;charset=utf8'; $user = 'ユーザー名'; $pass = 'パスワード';変数に対象の「データベース情報」「DB接続するユーザー情報」を設定
//DB接続 $dbh = new PDO($dsn,$user,$pass);設定した変数を引数に入れて、PDOのオブジェクト生成
データを取得する
指定した列名のデータを全て取り出す例
※上記で生成したPDOオブジェクトを使用する
//SELECT文 $select_sql = 'SELECT * FROM テーブル名'; $stmt = $dbh->query($select_sql); foreach($stmt as $value){ echo $value['カラム名']; }データを登録する
入力フォームなどで入力された値を、プリペアドステートメントを使用してDBに登録する例
※プリペアドステートメントとは、SQL文を最初に用意しておいて、その後はクエリ内のパラメータの値だけを変更してクエリを実行できる機能のこと
//INSERT文 $insert_sql = 'INSERT INTO テーブル名(カラム名) VALUES(:name)'; $stmt = $dbh->prepare($insert_sql); $params = array(':name'=>$_POST['フォームに入力された値']); $stmt->execute($params);カラム名にデータ登録したいカラム名を指定する
VALUESを「:name」として抽象化し、後に$_POSTで値を設定する(※nameの部分は任意の文字で良い)
prepareメソッドでSQL文を実行する準備をする
executeメソッドでプリペアドステーメントを実行する※正式な値が入るまで一時的に場所を確保しておくために入れておく値のことをプレースホルダという
(今回だと「:name」の部分がプレースホルダ)
※プレースホルダに値を割り当てることをバインドというデータを削除する
指定された番号のIDを持つDBの値を削除する例
//DELETE文 $delete_sql = 'DELETE FROM テーブル名 WHERE idが入ってるカラム名 = :id'; $stmt = $dbh->prepare($delete_sql); $params = array('id'=>$_POST['指定された番号']); $stmt->execute($params);上記と同様、プリペアドステーメントを使用
データを変更する
指定された番号のIDを持つデータを対象に、指定されたカラム名の値を更新する例
//UPDATE文 $update_sql = 'UPDATE テーブル名 SET 更新するデータのカラム名 = :name WHERE 更新対象とするidが入ってるカラム名 = :id'; $stmt = $dbh->prepare($update_sql); $params = array('name'=>$_POST['更新するデータ'],'id'=>$_POST['指定された番号']); $stmt->execute($params);上記と同様、プリペアドステーメントを使用
try~catchを使ったエラーハンドリング(例外処理)
DB接続の成功/失敗を出力する例
try{ $dsn = 'mysql:host=localhost;dbname=データベース名;charset=utf8'; $user = 'ユーザー名'; $pass = 'パスワード'; $dbh = new PDO($dsn,$user,$pass); echo 'DB接続成功' }catch(PDOException $e) { echo 'DB接続エラー'; }(例外処理についての補足)
プログラム実行中に発生したエラーのことを例外という
例外が発生すると、プログラムが異常終了する
システム的に異常終了はさせたくないから、例外を検知して、例外が発生した場合に行う処理を用意する
この一連の処理のことを例外処理という
結果、エラーは発生しているが、プログラム自体は正常に動作したという状況を作ることができる
DBの接続が失敗したとき、プログラムが異常終了する
システム的に異常終了はさせたくないから、 DBの接続処理に対してエラーハンドリングする必要がある
- 投稿日:2021-03-15T07:37:14+09:00
PHP×MAMPでDB接続を行う
環境
・macOS BigSur (11.2.2)
・PHP (7.4.12)
・MAMP (6.3)
・MySQL (5.7.32)前提条件
・MAMPのphpMyAdminでデータベース・テーブルを作成してあること
・データベースに接続するためのユーザーを作成してあることPDOでDB接続
※PDOとは、MAMPでPHPからMySQLに接続するために必要なオブジェクトのこと
//事前準備 $dsn = 'mysql:host=localhost;dbname=データベース名;charset=utf8'; $user = 'ユーザー名'; $pass = 'パスワード';変数に対象の「データベース情報」「DB接続するユーザー情報」を設定
//DB接続 $dbh = new PDO($dsn,$user,$pass);設定した変数を引数に入れて、PDOのオブジェクト生成
データを取得する
生成したオブジェクトを使用してDBからデータを取り出す
※指定した列名のデータを全て取り出す例
//SELECT文 $select_sql = 'SELECT * FROM テーブル名'; $stmt = $dbh->query($select_sql); foreach($stmt as $value){ echo $value['列名']; }データを登録する
入力フォームなどで入力された値を、プリペアドステートメントを使用してDBに登録する例
※プリペアドステートメントとは、SQL文の値をいつでも変更できるように、変更する部分のみ変数のようにした命令文を作る仕組みのこと
//INSERT文 $insert_sql = 'INSERT INTO テーブル名(列名A) VALUES(:name)'; $stmt = $dbh->prepare($insert_sql); $params = array(':name'=>$_POST['フォームに入力された値']); $stmt->execute($params);列名Aにデータ登録したい列名を指定する
VALUESを「:name」として抽象化し、後に$_POSTで値を設定する(※nameの部分は任意の文字で良い)
prepareメソッドでSQL文を実行する準備をする
executeメソッドでプリペアドステーメントを実行する※「:name」と変化する値を確保することをプレースホルダという
※「:name」の部分に値を割り当てることをバインドというデータを削除する
指定された番号のIDを持つDBの値を削除する例
//DELETE文 $delete_sql = 'DELETE FROM テーブル名 WHERE idが入ってる列名 = :id'; $stmt = $dbh->prepare($delete_sql); $params = array('id'=>$_POST['指定された番号']); $stmt->execute($params);上記と同様、プリペアドステーメントを使用
データを変更する
指定された番号のIDを持つデータを対象に、指定された列名の値を更新する
//UPDATE文 $update_sql = 'UPDATE テーブル名 SET 更新するデータの列名 = :name WHERE 更新対象とするidが入ってる列名 = :id'; $stmt = $dbh->prepare($update_sql); $params = array('name'=>$_POST['更新するデータ'],'id'=>$_POST['指定された番号']); $stmt->execute($params);上記と同様、プリペアドステーメントを使用
try~catchを使ったエラーハンドリング(例外処理)
DB接続の成功/失敗を出力する例
※例外処理とは、エラーが発生した際の処理を設定しておくこと
(try~catchの間でエラーが発生した時、catchの中の処理が行われる)try{ $dsn = 'mysql:host=localhost;dbname=データベース名;charset=utf8'; $user = 'ユーザー名'; $pass = 'パスワード'; $dbh = new PDO($dsn,$user,$pass); echo 'DB接続成功' }catch(PDOException $e) { echo 'DB接続エラー'; }
- 投稿日:2021-03-15T07:37:14+09:00
PHP×MAMPでDB操作する
環境
・macOS BigSur (11.2.2)
・PHP (7.4.12)
・MAMP (6.3)
・MySQL (5.7.32)前提条件
・MAMPのphpMyAdminでデータベース・テーブルを作成してあること
・データベースに接続するためのユーザーを作成してあることPDOでDB接続
※PDOとは、MAMPでPHPからMySQLに接続するために必要なオブジェクトのこと
//事前準備 $dsn = 'mysql:host=localhost;dbname=データベース名;charset=utf8'; $user = 'ユーザー名'; $pass = 'パスワード';変数に対象の「データベース情報」「DB接続するユーザー情報」を設定
//DB接続 $dbh = new PDO($dsn,$user,$pass);設定した変数を引数に入れて、PDOのオブジェクト生成
データを取得する
指定した列名のデータを全て取り出す例
※上記で生成したオブジェクトを使用する//SELECT文 $select_sql = 'SELECT * FROM テーブル名'; $stmt = $dbh->query($select_sql); foreach($stmt as $value){ echo $value['列名']; }データを登録する
入力フォームなどで入力された値を、プリペアドステートメントを使用してDBに登録する例
※プリペアドステートメントとは、SQL文の値をいつでも変更できるように、変更する部分のみ変数のようにした命令文を作る仕組みのこと
//INSERT文 $insert_sql = 'INSERT INTO テーブル名(列名A) VALUES(:name)'; $stmt = $dbh->prepare($insert_sql); $params = array(':name'=>$_POST['フォームに入力された値']); $stmt->execute($params);列名Aにデータ登録したい列名を指定する
VALUESを「:name」として抽象化し、後に$_POSTで値を設定する(※nameの部分は任意の文字で良い)
prepareメソッドでSQL文を実行する準備をする
executeメソッドでプリペアドステーメントを実行する※「:name」と変化する値を確保することをプレースホルダという
※「:name」の部分に値を割り当てることをバインドというデータを削除する
指定された番号のIDを持つDBの値を削除する例
//DELETE文 $delete_sql = 'DELETE FROM テーブル名 WHERE idが入ってる列名 = :id'; $stmt = $dbh->prepare($delete_sql); $params = array('id'=>$_POST['指定された番号']); $stmt->execute($params);上記と同様、プリペアドステーメントを使用
データを変更する
指定された番号のIDを持つデータを対象に、指定された列名の値を更新する
//UPDATE文 $update_sql = 'UPDATE テーブル名 SET 更新するデータの列名 = :name WHERE 更新対象とするidが入ってる列名 = :id'; $stmt = $dbh->prepare($update_sql); $params = array('name'=>$_POST['更新するデータ'],'id'=>$_POST['指定された番号']); $stmt->execute($params);上記と同様、プリペアドステーメントを使用
try~catchを使ったエラーハンドリング(例外処理)
DB接続の成功/失敗を出力する例
※例外処理とは、エラーが発生した際の処理を設定しておくこと
(try~catchの間でエラーが発生した時、catchの中の処理が行われる)try{ $dsn = 'mysql:host=localhost;dbname=データベース名;charset=utf8'; $user = 'ユーザー名'; $pass = 'パスワード'; $dbh = new PDO($dsn,$user,$pass); echo 'DB接続成功' }catch(PDOException $e) { echo 'DB接続エラー'; }
- 投稿日:2021-03-15T02:13:04+09:00
Macの言語設定を英語にしていたらモリサワパスポートが起動しなかった
結論
Macの言語設定を英語にしているとモリサワのフォントインストーラが起動できない。
言語を日本語にすると直る。環境
OS macOS Big Sur バージョン 11.2 モリサワのライセンス MORISAWA PASSPORT アカデミック版 インストーラのバージョン 2.1.4 起きた事象
- MORISAWA PASSPORT アカデミック版が今年でライセンス切れになるためアップデートを試みる
- インストーラを起動しようとしたところ
Failed to open the menu.
とだけ出て何も進めない試したこと
- 公式で紹介されている「環境ファイルの再構築手順」に沿って
/Applications/MORISAWA
を削除してインストーラを再インストールする
- →効果無し
- インストールしたフォントファイル自体を移動してみる
- デスクトップに避難して、デフォルトでインストールされるフォルダを空にする
- フォルダ自体も削除してみる
- →どちらも効果無し
- 今の言語設定は英語なものの、インストールしたとき設定は日本語だったのを思い出し、戻す
- →起動できた