20210315のMacに関する記事は11件です。

【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/yarn

2)次にwebpackでJavaScriptのコンパイルをする

$ bin/webpack

3)最後にJS配信用のdevサーバーを起動する。(自動でwatch&コンパイルされる)

$ bin/webpack-dev-server

これをした後に一応docker-compose up -dで再起動し、localhost:3000にアクセスすると表示されました!
2と3はどちらかだけでも良いかも??

参考

【Rails6】Webpacker::Manifest::MissingEntryErrorが出たときの対処法

【Rails】インストール時につまづきがちなエラー集】

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【就活用】MacでPDFを圧縮・パスワードを設定する方法

はじめに

就職活動では企業から履歴書・職務経歴書を送付するよう指示があります。
その際、圧縮とパスワードの設定をするよう言われるときがあり、その方法の共有です。

やること

1 PDFの圧縮

2 PDFのパスワードの設定

1 PDFの圧縮

下記のURLにアクセスしサイトの指示に従い、PDFの圧縮を行います。

PDF圧縮アプリです。

2 PDFのパスワードの設定

① デスクトップ左上の「ファイル」をクリック
image.png

②ファイルの中の「プリント」をクリックする
image.png

③左下の「PDF」をクリックし、「PDF」として保存をクリックする
image.png

④セキュリティオプションをクリックする
image.png

⑤写真のようにチェックボックスにチェックを入れ、「パスワード」を任意で入力する。確認には同じパスワードを入力し「OK」をクリックする。
image.png

⑥1つ前の画面に戻り、「保存」をクリックする
image.png

⑦写真のように「置き換え」をクリックする
image.png

⑧パスワード付きのPDFの完成
image.png

※1と2の手順を逆にすると実行できないので注意です。

なぜ企業が指示を出すのか

※上記の番号と対応しています。
1 ・MacとwindowsなどのOSの違いで開けないファイルがあるからです。
 ・PDF化することで履歴書の改ざんを防ぐことができるからです。
 ・エクセルやワードではバージョンによって開けないこともあり、印刷ページがずれることもあるからです。
  PDFであればPC環境に左右されることも少ないので、印刷や管理をしやすいためです。

2 PDFを暗号化するため圧縮することと、容量を軽減できるからです。

 個人情報となるので、もし外部に情報が漏れても問題ないようパスワードを設定します。
 ※しかしパスワードを別メールでお送りすることは無意味である可能性があります。諸説あり。

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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.1

Django 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.py

Model

とりあえず簡単にPostモデルを作成しました。

models.py
class 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.title

View

views.py
from 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.py
from 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.py
from django.urls import path
from backend import views

urlpatterns = [
    path('', views.PostAll.as_view()),
]

動作確認

仮想環境内で、サーバーを立ち上げます。

$ python3 manage.py runserver

http://localhost:8000/api/v1/
にアクセスすると、しっかりとAPIの動作確認が行えました。
ちなみにデータはadminサイトであらかじめサンプルようにいくつか追加しています。
スクリーンショット 2021-03-15 13.26.40.png

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.js

ReactとDRFの連携

さて、いよいよDRFとの連携を行います。DRFでは
http://localhost:8000/api/v1/
でデータを取得できるようにしているので、React側でここにGetリクエストを送るように実装します。axiosを用いることで簡単にリクエストを実装できるということで、インストールしました。

App.js
import 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からデータを受け取っている事が分かります!!
スクリーンショット 2021-03-15 17.54.23.png

今回は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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mapture愛用者が「Fuwari」に機能追加して公開しました ?

普段、スクリーンショット拡張アプリの「Mapture」を愛用していた自分が、今回Swiftの勉強を兼ねて、オープンソースとして公開されている「Fuwari」に機能追加をして公開しました。
開発の経緯や今回追加した機能、初めてSwiftを書いた感想などを書いていきたいと思います。

開発経緯

コードを書いている上で、ドキュメントや参考ページを見ながら作業をすることが多々あると思いますが、そんな時自分は「Mapture」というソフトを使っていました。
機能としては、画面の好きな範囲を選択してスクショを撮影し、その画像を画面上に保持しておくことができます。

image.png
チートシートを見ながらターミナルを叩く様子(Mapture配布サイトより引用)

このMaptureには「Gyazoに送る」という項目があって、元は撮影したスクショをGyazoに転送して共有できたのですが、ここ数年は使えなくなっていました。
2014年を最後に長らく更新されておらず、おそらくAPIが使えなくなったのでしょう。

もう少し頻繁にメンテナンスされている代替アプリはないかと探していたときに見つけたのが、「Fuwari」でした。
2018年に公開されており、Qiitaで開発記事が上がっているほか、いろんなサイト様で紹介されているイケイケっぷり。

モダンなアイコンが素敵で、早速乗り換えを検討したのですが……

  • ワークスペース間で画像を共有できない(ワークスペース切り替えてもついてきてくれない)
  • 透明度を変更できない
  • クラッシュするバグがある
  • メモリ使用率が雪だるま式に増えていく

と、所々不具合や、機能的な物足りなさ(Maptureに慣れていた所為)を感じてしまいました。

更新も途絶えてしまっているようなので、「せっかくMITで公開してくれているんだし、自分で直して公開しよう!」と思い立ったのが、今回の経緯です。

公開したアプリ

Githubリポジトリはこちらです。
元のリポジトリをforkして、再配布形式で公開させていただいています。

デモ動画はこちら↓
image.png

追加した機能

今回追加した機能や、バグフィックスの一覧です。

追加機能

  • ➕右クリックメニューから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を使ってくれている皆さん、ありがとうございます!!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Mac]Touch Barをカスタマイズするアプリ'Pock'のプラグイン開発

はじめに

まずは僕が使っているMacBookProのTouch Barをご覧ください!
touchbar.png

左から、escキーストップウォッチDock音楽プレーヤ明るさ・音量設定となってます。良い評判はあまり聞こえてくることのないMacBook ProのTouch Barですが、こんな感じでカスタマイズして使用すると割と便利だったりします。

Pockとは

このようにTouch Barをカスタマイズするアプリの一つがPockというものです。他にもBetterTouchToolというものがありますがこちらは有料であるのに対し、Pockはオープンソースで開発されており無料で使用することができます。(BTTも便利なので利用していますが。。)
GitHubのリポジトリ

install方法

HomeBrewで簡単にインストールできます。

brew install pock

こちらの公式サイトからもインストールできます。
[2021.3.14]
開発者様のツイートより、現在公式サイト復旧中であるとのことですのでgithubよりダウンロードするのが良いかもしれません。


初めて起動した際、いくつかアクセシビリティやプライバシーの権限が求められますので各自判断して許可を与えてください。

Widget

Pockをインストールするとデフォルトで、DockNow PlayingESC keyStatusControl CenterWeatherの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に変更して作成してください。
以下のようなファイルが確認できると思います。
スクリーンショット 2021-03-15 13.51.51.png

2. PockKitフレームワークのダウンロード

ダウンロードしたディレクトリ配下に移動しpod installコマンドでPockKitをダウンロードします。
今のところSwift Packageには対応していないようですが、ここにはSwift Packageから入れられると書いてあるので将来的には対応するのだろうと思われます。

3. リネーム

Xcodeプロジェクト自体の名前など各自好きな名前に変更してください。SampleWidgetクラスの名前を変更する場合、Info.plistPrincipal 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.plistPKWidgetAuthorに名前を指定することで実装できます。Widget設定画面に表示することが出来ます。
author.png

widgetの設定画面

作成したWidgetの設定画面を作ることも可能です。PKWidgetPreferenceプロトコルに準拠したViewControllerを作成し、Info.plistPKWidgetPreferenceClassに作成したクラス名を指定することで実装できます。

例として標準でインストールできるControlCenter widgetの設定画面は以下のようになっています。

スクリーンショット 2021-03-15 14.43.39.png

templeteでは例として以下のような設定画面を実装しています。

おわりに

最後までお読みいただきありがとうございました。
何か質問などありましたらTwitterやこの記事のコメント欄までお願いします。答えられる範囲ではありますがお答えさせて頂きます。

自分も以下のようなプラグインを作ってみました。気軽にタイム測定ができるので我ながら愛用しています。
このGitHubページからダウンロードできるので試してみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacのターミナルでExcelのプロセスを探す方法

環境

  • Mac OS Catalina バージョン 10.15.7
  • Microsoft Excel for Mac バージョン 16.46

探し方

ターミナルで以下のコマンドを放つ
ps -efa | grep "Microsoft Excel"

返ってきたPID(左から2番目、awk '{print $2}'とかをパイプで付ければすぐとれる)でkill -9 [PID]すれば殺せる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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を開いたらこれまで通りちゃんと動くようになってくれていた.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の接続処理に対してエラーハンドリングする必要がある

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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接続エラー';
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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接続エラー';
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macの言語設定を英語にしていたらモリサワパスポートが起動しなかった

結論

Macの言語設定を英語にしているとモリサワのフォントインストーラが起動できない。
言語を日本語にすると直る。

環境

OS macOS Big Sur
バージョン 11.2
モリサワのライセンス MORISAWA PASSPORT アカデミック版
インストーラのバージョン 2.1.4

起きた事象

  1. MORISAWA PASSPORT アカデミック版が今年でライセンス切れになるためアップデートを試みる
  2. インストーラを起動しようとしたところFailed to open the menu.とだけ出て何も進めない

試したこと

  • 公式で紹介されている「環境ファイルの再構築手順」に沿って/Applications/MORISAWAを削除してインストーラを再インストールする
    • →効果無し
  • インストールしたフォントファイル自体を移動してみる
    • デスクトップに避難して、デフォルトでインストールされるフォルダを空にする
    • フォルダ自体も削除してみる
    • →どちらも効果無し
  • 今の言語設定は英語なものの、インストールしたとき設定は日本語だったのを思い出し、戻す
    • →起動できた
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む