【Laravel】カスタムバリデーションを作成する
最近初めてLaravelの案件をやることになりまして。
ひっさびさのプログラミングということもあってフレームワークの進化に驚くばかり...。
Laravelはバリデーション周りがデフォルトで充実してていいですね。
しかし、デフォルトでは実装できないバリデーションの要件があったので、
勉強がてらカスタムバリデーションを実装してみました。
前提
- PHP7.0
- Laravel 5.5.x
1. カスタムバリデーションルールを作成する
php artisan
で雛形を作成する
$ php artisan make:rule HogeCustomRule
/app/Rules/HogeCusomRule.php
が出来上がる
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class HogeRule implements Rule { /** * Create a new rule instance. * * @return void */ public function __construct() { // } /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { // } /** * Get the validation error message. * * @return string */ public function message() { return 'The validation error message.'; } }
バリデーションルールはpasses()
に記載する
戻り値はboolになるよう処理を書くこと
falseのときにmessage()
に記載したエラーメッセージが表示される
public function passes($attribute, $value) { if($value % 2 == 0) { return true; } } public function message() { return ':attributeは偶数で入力してください'; }
2. フォームリクエストを作成する
php artisan
で雛形を作成する
$ php artisan make:request HogeRequest
/app/Http/Requests/HogeRequest.php
が出来上がる
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class HogeRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return false; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // ]; } }
rules()
にバリデーションルールを書いていく
カスタムバリデーションルールはuse
で宣言した後、new HogeRule()
で適用する
use App\Rules\HogeRule;
class HogeRequest extends FormRequest
{
...
public function rules()
{
return [
'hoge' => 'required', 'integer', new HogeRule()
];
}
}
3. コントローラで利用する
コントローラー内で利用したいアクションの引数の型に先程作成したHogeRequest
を利用する
引数に宣言することでアクション実行時にバリデーションチェックを自動的に行なってくれる
use Illuminate\Http\Request; use App\Http\Requests\HogeRequest; class HogeController extends Controller { public function index() { ... } public function store(HogeRequest $request) { ... } }
やってみて
わりと簡単に実装できるもんですね。
Controllerの引数に指定するだけで自動的にバリデーションチェックをやってくれるのマジ凄い。
最近のフレームワークってこういった挙動がトレンドなんですかね。
参考サイト
- バリデーション 5.5 Laravel
- Laravel5.5で、カスタムバリデーションルール(Custom Validation Rules) 一言多いプログラマーの独り言
- laravelで独自のバリデーションルールを追加 - Qiita
- 作者: 掌田津耶乃
- 出版社/メーカー: 秀和システム
- 発売日: 2017/09/16
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 掌田津耶乃
- 出版社/メーカー: 秀和システム
- 発売日: 2019/07/26
- メディア: 単行本
- この商品を含むブログを見る
【Docker】MacにDockerをインストールしてみた & 少し操作してみた
必要に迫られたのでそろそろdockerを勉強してみた結果を記します。
今回の環境
やってみる
Docker for Macをインストールする
Docker for Macは公式サイトでもインストールできるみたいだけど、今回はhomebrewを利用してインストールしてみます。
$ brew search docker ==> Formulae docker docker-compose docker-gen docker-machine-driver-hyperkit docker-machine-parallels docker-clean docker-compose-completion docker-ls docker-machine-driver-vultr docker-squash docker-cloud docker-credential-helper docker-machine docker-machine-driver-xhyve docker-swarm docker-completion docker-credential-helper-ecr docker-machine-completion docker-machine-nfs docker2aci ==> Casks docker docker-toolbox homebrew/cask-versions/docker-edge $ brew cask install docker Updating Homebrew... ==> Satisfying dependencies ==> Downloading https://download.docker.com/mac/stable/28905/Docker.dmg ######################################################################## 100.0% ==> Verifying SHA-256 checksum for Cask 'docker'. ==> Installing Cask docker ==> Moving App 'Docker.app' to '/Applications/Docker.app'. 🍺 docker was successfully installed!
Dockerがインストールされたか念の為確認
インストールしたDocker.appを起動し、ステータスが「Docker Desktop is running」となれば起動完了です。
念の為Terminalからコマンドの確認がてらバージョンを表示してみます。
$ docker --version Docker version 18.09.0, build 4d60db4 $ docker-machine version docker-machine version 0.16.0, build 702c267f $ docker-compose version docker-compose version 1.23.1, build b02f1306 docker-py version: 3.5.0 CPython version: 3.6.6 OpenSSL version: OpenSSL 1.1.0h 27 Mar 2018
Hello Worldしてみる
公式サイトにある手順に沿い、Terminalでhello-world
というDocker Imageをインストールします。
docker run
で起動するDocker Imageがローカルに無い場合、Docker Hubから自動的にPullしてくれるようですね、便利。
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world d1725b59e92d: Pull complete Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
次はnginx
のDocker Imageをインストールします
$ docker run -d -p 80:80 --name webserver nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx a5a6f2f73cd8: Pull complete 67da5fbcb7a0: Pull complete e82455fa5628: Pull complete Digest: sha256:31b8e90a349d1fce7621f5a5a08e4fc519b634f7d3feb09d53fac9b12aa4d991 Status: Downloaded newer image for nginx:latest 11b1835537b3da82eeb655a4c43ad5010eeb4fcb3fff626501ba795e9469fa0d
【構文】
docker run -d -p 80:80 --name {エイリアス名} nginx
コマンド, オプション | 内容 |
---|---|
docker run | Docker Imageからコンテナを起動する |
-d | コンテナをデタッチド・モードで起動する |
-p 80:80 | ポートフォワーディングの設定を行う。この例ではホスト側80番ポートの通信をコンテナ側80番ポートに転送する |
--name | コンテナのエイリアス名を設定する |
nginx | この部分はDocker Image名を設定する |
nginx
が起動したらブラウザを開き、http://localhost
にアクセスしてみます。
「Welcome to nginx!」が表示されれば完了です。
ちなみにdocker container ls
を利用することで現在コンテナが起動しているかも確認できるぽい。
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11b1835537b3 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp webserver
コンテナを確認したり止めたりイメージを削除したり
コンテナの確認
基本はdocker container ls
を利用します。
-a
オプションをつけることで起動していないコンテナも一覧表示します。
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11b1835537b3 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp webserver $ $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11b1835537b3 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp webserver 2a79441c51b8 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago adoring_volhard
コンテナの停止
docker container stop {コンテナ名}
でコンテナを停止することができます。
$ docker container stop webserver webserver # 停止したか確認 $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11b1835537b3 nginx "nginx -g 'daemon of…" 2 hours ago Exited (0) 20 seconds ago webserver
コンテナの削除
docker container rm {コンテナ名}
でコンテナを削除することができます。
$ docker container rm webserver webserver # webserverコンテナが削除されていることを確認 $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2a79441c51b8 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago adoring_volhard
イメージの確認
docker image ls
でローカルにあるイメージを一覧表示します。
Owner-no-MacBook-Air:docker_sample owner$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest e81eb098537d 3 days ago 109MB hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
イメージの削除
docker image rm {イメージ名}
でローカルにあるイメージを削除できます。
$ docker image rm nginx Untagged: nginx:latest Untagged: nginx@sha256:31b8e90a349d1fce7621f5a5a08e4fc519b634f7d3feb09d53fac9b12aa4d991 Deleted: sha256:e81eb098537d6c4a75438eacc6a2ed94af74ca168076f719f3a0558bd24d646a Deleted: sha256:7055505a92c39c6f943403d54a1cda020bfeb523b55d9d78bfe1dad0dd32bb2d Deleted: sha256:378a8fcc106dc4d3a9f2dc0b642b164e25de3aab98a829e72b2d8c0cf0bad8ee Deleted: sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3 # nginxが削除されていることを確認 $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
やってみて
初心者でも割とすんなり出来ました。 これだけでは案件に全然使えないので、もっと色々調べなきゃですね...。
参考サイト
- Get started with Docker for Mac | Docker Documentation
- Mac に homebrew で docker 入れたい 2017年末版 - Qiita
- DockerをMacにインストールする (更新:2018/5/14) - Qiita
- 作者: 山田明憲
- 出版社/メーカー: 技術評論社
- 発売日: 2018/08/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)
- 作者: 中井悦司
- 出版社/メーカー: 技術評論社
- 発売日: 2015/09/26
- メディア: 大型本
- この商品を含むブログ (2件) を見る
enkeeoのカーボン製トレッキングポールを買ってみた
表題の通り、enkeeoのトレッキングポールを購入しました。
Amazonのタイムセールで¥3,280でした。
似たようなトレッキングポールは何個かあったのですが、決め手になったのは以下の3通り。
- カーボン製であること
- 伸縮の際の固定ははレバー式であること
- かっこいいこと
登山利用なのでなるべく軽いことを重要視していたので、カーボン製なのはとても助かります。
他にこの価格帯でカーボン製のポールがあまりなかったんですよね...。
早速開けてみたところです。
ポールの他に接地面の付属品が4セットほど入っています。
雪山等を歩くつもりは今のところ無いのですが、あって困るものではないのでいいですね。
伸縮の際のジョイント部分はレバーで固定する形となっています。
一緒にトレッキングしている方から「スクリューロック式はやめておけ、使ってると緩む」という話を聞いていたのでこの部分は譲れませんでした。
購入時は下のレバーについているネジがキツく伸ばしづらいので予めネジを緩めて伸ばすよう注意してください。
ちなみに最短65cm、最長135cmまで伸縮ができるようです。
取っ手の部分は人工光学に基づいて設計されているらしく、かっこいいだけでなく持ちやすいです。 試しに持って歩きましたが、適度に太く握りやすい印象でした。
まだトレッキングに利用はしていないですが、ざっくり触った感じ価格以上の価値があるんじゃないかと思いました。
早くこのポールを使ってトレッキングがしてみたい...してみたい...!
【AWS】RDS(MySQL)で発生したIPブロックを解消する
今やっている案件で、急にRDSへの接続ができず以下のエラーを吐くようになりました。
Host 'xxx.xxx.xxx.xxx' is blocked because of many connection errors; 〜以下続く
調べたところ、MySQLのシステム変数であるmax_connect_errors
で設定した値以上接続失敗をするとIPブロックされてしまうようです。
解消方法は以下の通り。
- IPブロックされていないホストからMySQLに接続
$ mysql -u [username] -p -h [hostname]
- MySQLにログイン後、以下コマンドを実施
mysql> FLUSH HOSTS; Query OK, 0 rows affected (0.01 sec)
これで解消できます。 解消したのはいいのですが、何故起きたのかを突き止めないとですね...(ヽ´ω`)
- 作者: 山田祥寛,山田奈美
- 出版社/メーカー: 技術評論社
- 発売日: 2018/02/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
【Python】Pythonを使ってGoogle Spread Sheetを操作してみる
社内でやっているIoT案件にて、PythonからGoogle Spreadsheetにデータを送信する必要があったので試してみた。
環境
手順
1. Google Spread SheetのAPIキーを取得する
Google API コンソールのページに遷移する
「アプリケーションを登録するプロジェクトの選択」から任意のプロジェクトを選択する
プロジェクトが存在しない場合、「プロジェクトの作成」をクリックし、プロジェクトを作成する。
プロジェクトを作成した場合、認証用の鍵がダウンロードされる。
ダウンロードした認証用の鍵は「client_secret.json」というファイル名にリネームし、実行ファイルと同じ場所に置いておく。
2. Google API用のPythonパッケージをダウンロードする
pip
を利用してgoogle-api-python-client
, oauth2client
をダウンロードする
※ サンプルコードはgoogle-api-python-client
だけでいいっぽいけど、うちの環境ではoauth2client
も必要だった。
$ pip install --upgrade google-api-python-client $ pip install --upgrade oauth2client
3. サンプルコードを写経する
サンプルコードのコードをエディタに書き、動かしてみる。
from __future__ import print_function import httplib2 import os from apiclient import discovery from oauth2client import client from oauth2client import tools from oauth2client.file import Storage try: import argparse flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() except ImportError: flags = None # If modifying these scopes, delete your previously saved credentials # at ~/.credentials/sheets.googleapis.com-python-quickstart.json SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly' CLIENT_SECRET_FILE = 'client_secret.json' APPLICATION_NAME = 'Google Sheets API Python Quickstart' def get_credentials(): """Gets valid user credentials from storage. If nothing has been stored, or if the stored credentials are invalid, the OAuth2 flow is completed to obtain the new credentials. Returns: Credentials, the obtained credential. """ home_dir = os.path.expanduser('~') credential_dir = os.path.join(home_dir, '.credentials') if not os.path.exists(credential_dir): os.makedirs(credential_dir) credential_path = os.path.join(credential_dir, 'sheets.googleapis.com-python-quickstart.json') store = Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME if flags: credentials = tools.run_flow(flow, store, flags) else: # Needed only for compatibility with Python 2.6 credentials = tools.run(flow, store) print('Storing credentials to ' + credential_path) return credentials def main(): """Shows basic usage of the Sheets API. Creates a Sheets API service object and prints the names and majors of students in a sample spreadsheet: https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit """ credentials = get_credentials() http = credentials.authorize(httplib2.Http()) discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?' 'version=v4') service = discovery.build('sheets', 'v4', http=http, discoveryServiceUrl=discoveryUrl) spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms' rangeName = 'Class Data!A2:E' result = service.spreadsheets().values().get( spreadsheetId=spreadsheetId, range=rangeName).execute() values = result.get('values', []) if not values: print('No data found.') else: print('Name, Major:') for row in values: # Print columns A and E, which correspond to indices 0 and 4. print('%s, %s' % (row[0], row[4])) if __name__ == '__main__': main()
ソースの流れを見る感じ、get_credentials()
でOAuthの認証情報を取得し、ローカルにjson形式で保存。
json形式で保存することで、2回目以降の認証をスキップできるみたい。
credentials = get_credentials() http = credentials.authorize(httplib2.Http()) discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?' 'version=v4') service = discovery.build('sheets', 'v4', http=http, discoveryServiceUrl=discoveryUrl)
このあたりでGoogle SpreadsheetへアクセスするためのServiceを作成している。 Spreadsheetの内容を取得するのは以下コード部分。
spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms' rangeName = 'Class Data!A2:E' result = service.spreadsheets().values().get( spreadsheetId=spreadsheetId, range=rangeName).execute() values = result.get('values', [])
spreadsheetId
でアクセス先のSpreadsheetを設定し、rangeName
で取得する位置を設定している。
データの取得自体はservice.spreadsheets().values().get()
を利用する。
ちなみにデータの書き込みは上記サンプルコードのうち、以下の部分を書き換える。
# SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly' SCOPES = 'https://www.googleapis.com/auth/spreadsheets' # result = service.spreadsheets().values().get(...).execure() ValueInputOption = 'USER_ENTERED' body = { 'values': [[1, 2, 3]] } # データの書き込みは service.spreadsheets().values().update() を利用する # データの追記は service.spreadsheets().values().append() を利用する # valueInputOption='USER_ENTERED`オプションを利用すると、「書式設定」が自動になり、通常入力と同じ状態になる # → 入力時に書式を自動判別してくれる result = service.spreadsheets().values().update( spreadsheetId=spreadsheetId, range=rangeName, valueInputOption=ValueInputOption, body=body).execute()
参考サイト
- PythonとSheets API v4でGoogleスプレッドシートを読み書きする - kumilog.net
- Python Quickstart | Sheets | Google Developers
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
はじめてのGoogleスプレッドシートの教科書2018: データ入力・四則演算・関数の基礎・フィルター・グラフ・ピボットテーブルetc...大学生・新卒のためのはじめてのスプレッドシートの教科書
- 作者: 武田雅人,阿南大輝,久原英之
- 出版社/メーカー: 株式会社Tekuru
- 発売日: 2018/05/12
- メディア: Kindle版
- この商品を含むブログを見る
MacにRaspberry Piの仮想環境を作成する
概要
- Virtualboxを利用してRaspbeery Pi(stretch)の環境を作成した際のメモ
環境
- ホストPC
- OS: MacOS High Sierra (ver10.13.1)
- Virtualbox: 5.2.18 r124319 (Qt5.6.3)
- ゲストPC
前提
- Raspbian(stretch)のisoを予めダウンロードしておく
- ダウンロード先: DEBIAN STRETCH WITH RASPBERRY PI DESKTOP
- ファイル名: 2018-06-27-rpd-x86-stretch.iso
作成手順
1. 仮想環境を作成する
- [新規アイコン]をクリック
- 各種設定内容を入力する
- 名前: 任意の名称を入力
- タイプ: Linux
- バージョン: Debian(64-bit)
- メモリーサイズ: 1024MB
- ハードディスク: 仮想ハードディスクを作成する
- ファイルの場所: デフォルト
- ファイルサイズ: 8.00GB
- ハードディスクのファイルタイプ: VDI(Virtualbox Disk Image)
- 物理ハードディスクにあるストレージ: 可変サイズ
2. 作成した仮想環境にOSを設定する
- 1.で作成した仮想環境を選択し、[設定]をクリック
- [システム] > [プロセッサー] > プロセッサー数を2に変更
- [ストレージ] > [コントローラー: IDE] > [空]を選択
- ディスクアイコンをクリックし、予めダウンロードしていたIOSファイルを選択
- 右下の[OK]を選択
3. OSのセットアップを行う
- 2.で設定した仮想環境を選択し、[起動]をクリック
- OSのインストール画面が表示される
- [Graphical Install]を選択し、[Enter]を押す
- キーボードの選択画面が表示される
- [Japanese]を選択し、[Enter]
- パーティションの設定画面が表示される
- パーティションを分ける必要はないため、[Guided - use entrie disk]を選択し、[Enter]
- [SCSI3(0,0,0) (sda) - 2.1 GB HARDDISK]を選択し、[Enter]
- [All files in one partition(recommended for new users]を選択し、[Enter]
- [Finish partitioning and write changes to disk]を選択し、[Enter]
- [Yes]を選択し、[Enter]
- ブートローダーの設定画面が表示される
- [Yes]を選択し、[Enter]
- [dev/sda]を選択し、[Enter]
- インストール完了画面が表示される
- 画面右下[Continue]を[Enter]
- Raspbianのデスクトップ画面が表示されればインストール完了
これでMac上にRaspberry Piの環境が作成できました。 最低限の設定しかしていないので、あとは案件やら要件に合わせてセットアップをどうぞ。
Raspberry Pi3 B+ コンプリートスターターキット (Standard, 16G)
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
- この商品を含むブログを見る
カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)
- 作者: 金丸隆志
- 出版社/メーカー: 講談社
- 発売日: 2016/07/20
- メディア: 新書
- この商品を含むブログ (1件) を見る
【Python】 Pyenvを利用してPython3.5.xをインストールしようとしたらエラーが出る件
pyenvを利用してPython3.5.3を入れようとしたら次のようなエラーががが。
$ CFLAGS="-I$(brew --prefix openssl)/include" LDFLAGS="-L$(brew --prefix openssl)/lib" pyenv install -v 3.5.3 BUILD FAILED (OS X 10.13.1 using python-build 20160602) Inspect or clean up the working tree at /var/folders/4m/cg10dgps2_j5f6_0pqpbcfc40000gn/T/python-build.20180918160654.71021 Results logged to /var/folders/4m/cg10dgps2_j5f6_0pqpbcfc40000gn/T/python-build.20180918160654.71021.log Last 10 log lines: File "/private/var/folders/4m/cg10dgps2_j5f6_0pqpbcfc40000gn/T/python-build.20180918160654.71021/Python-3.5.3/Lib/ensurepip/__main__.py", line 4, in <module> ensurepip._main() File "/private/var/folders/4m/cg10dgps2_j5f6_0pqpbcfc40000gn/T/python-build.20180918160654.71021/Python-3.5.3/Lib/ensurepip/__init__.py", line 209, in _main default_pip=args.default_pip, File "/private/var/folders/4m/cg10dgps2_j5f6_0pqpbcfc40000gn/T/python-build.20180918160654.71021/Python-3.5.3/Lib/ensurepip/__init__.py", line 116, in bootstrap _run_pip(args + [p[0] for p in _PROJECTS], additional_paths) File "/private/var/folders/4m/cg10dgps2_j5f6_0pqpbcfc40000gn/T/python-build.20180918160654.71021/Python-3.5.3/Lib/ensurepip/__init__.py", line 40, in _run_pip import pip zipimport.ZipImportError: can't decompress data; zlib not available
解決方法
どうやら「Xcode command line tools」というものをインストールしないといけないらしい。
$ xcode-select --install xcode-select: note: install requested for command line developer tools
このコマンドを打つとプロンプトが起動してGUIからインストールすることになる。
インストール完了後、改めてpythonをインストールする
$ CFLAGS="-I$(brew --prefix openssl)/include" LDFLAGS="-L$(brew --prefix openssl)/lib" pyenv install -v 3.5.3
3.5.3がインストールされていることを確認する
$ pyenv versions * system 3.5.3 3.6.0
参考URL
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る