Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all 21344 articles
Browse latest View live

就活の為にポートフォリオサイトを作ったけど載せる程成果物がない件について

$
0
0

はじめに

コロナウィルスの波に負けず、就活の波もやってきました。せっかくなので自分も最近ハマっているFlutter Webを利用してポートフォリオを作ろうと思いました。しかし、ポートフォリオと言うのは作品を載せる為にあるもの・・・。僕のは自己紹介ページになってしまいました。誰得!:thinking:

今回実装したコードはこちらです。

My Portfolio

GitHub

スクリーンショット 2020-02-25 22.41.42.png

要約

  • Flutterはいいぞ
  • 成果物はもっと早めにたくさん作っておこう
  • 僕を雇ってくれませんか?

技術の選定

  • Flutter&Dart

  • GitHub Pages

できる限り労力をかけたくない・・・

特有のめんどくさがり性です。今からHTMLを書いて・・・それに合わせてCSS書いて・・・と普段からHTML/CSSを書かない私には苦痛でした。そこで何かで簡単に代用できるものを探した結果、ちょうど今ハマっていて、1ヶ月くらい勉強したFlutterにWeb開発機能があったので利用することにしました。

デプロイを簡単に済ませたい・・・

昔GitHub Pageを使ってとっても楽に済んだのと、独自ドメインを設定できた思い出もあったので、私のニーズにマッチしていると思い選定しました。

Flutterとは?

Flutter (フラッター) は、Googleによって開発されたフリーかつオープンソースモバイルアプリケーションフレームワークである。FlutterはAndroidiOS向けのアプリケーションの開発に利用されている。

(From Wikipedia)

マテリアルデザインによる美しいUIを利用できるフレームワークです。なのでデザインが全くできない私でも、ある程度見られるレベルのものが簡単に作れてしまいます。独自のWidgetと言う概念に慣れるまで大変ですが、慣れてしまえば、レゴブロックを組み合わせるかのように開発が出来るのでとってもに楽しいです。

動作環境

スクリーンショット 2020-02-25 22.30.57.png

flutter doctor -vで一気に出力できます。トラブルシューティングで質問するときに結構便利です。

セットアップについて

今回はFlutterメインの記事ではないので、もし利用したい場合はドキュメントを参考にしてください。とても丁寧で分かりやすいです。

Web版を利用するにはチャンネルを切り替える必要があります。

flutter channel beta
flutter upgrade
flutter config --enable-web

これは一例ですが、更に詳しいことがドキュメントに書いてあるのでそちらを参照してください。

学習の進め方

これは私の進め方ですが、

  1. 公式ドキュメントに順序立ててチュートリアルがあるのでそちらをこなす。
  2. The Complete 2020 Flutter Development Bootcamp with Dartをこなす。(めちゃくちゃ分かりやすい!)
  3. 実際に自分でアプリを開発してみる

以上の流れでした。「うわ!英語のサイトばっかじゃん!出た英語ハラスメント!」と思われる方もいると思いますが、大丈夫です。

TOEIC300点台の私ですが、Google翻訳で進められました。Udemyとかだと文字起こしができて、それをGoogle翻訳のページ翻訳で訳してくれるのでノンストレスで学習ができました。ついでにリスニングの勉強にもなったかなぁと思っています。

Flutterの効率良い学び こちらの記事もオススメです。一読して自分が肌に合う学習の方法を探していきましょう。

作成のフローチャート

  1. ページレイアウトを考える
  2. ハードコーディングしつつ、レイアウトを形を作る
  3. ハードコーディングをソフトにしつつ、定数やWidgetは切り分けて行く
  4. デプロイする

プログラムについて

構成

> tree
.
├── README.md
├── analysis_options.yaml
├── assets
│   ├── FZ.otf
│   ├── SourceSansPro-Regular.ttf
│   ├── images
│   └── works
├── build
├── lib
│   ├── config
│   │   ├── assets.dart
│   │   ├── constants.dart
│   │   └── projects.dart
│   ├── generated_plugin_registrant.dart
│   ├── main.dart
│   ├── models
│   │   └── project_model.dart
│   ├── pages
│   │   └── home_page.dart
│   ├── tabs
│   │   ├── about_tab.dart
│   │   ├── blog_tab.dart
│   │   └── projects_tab.dart
│   └── widgets
│       ├── my_chip.dart
│       ├── project.dart
│       ├── responsive.dart
│       └── wrap_chip_list.dart
├── my_portfolio.iml
├── pubspec.lock
├── pubspec.yaml
└── web

analysis_options.yaml静的解析用ファイル。これがあるとダメなコードを怒ってくれる

assetsフォントや画像はここのディレクトリに打ち込みます。

libソースコードは基本的にここに全部入れます。

config定数やリスト、画像のURLなど変更がしやすいようにこのディレクトリにまとめます。

modelsデータクラスを定義しているファイルを置きます。

widgets切り分けたWidgetをまとめています。

pubspec.yaml ライブラリの指定等をここで行います。Gemfileみたいな奴です。

使用ライブラリ

http:^0.12.0+4animated_text_kit:^2.0.0url_launcher_web:^0.1.1+1url_launcher:^5.1.4pedantic_mono:^1.8.0

http HTTPリクエストを作成するためのライブラリです。現状まだ使用していませんが、API等と通信を行う際に利用します。

animated_text_kitテキストをオシャレな感じにアニメーションを付与してくれます。タイプライターのような演出はこのライブラリを使用しています。

url_launcher_web Flutter for WebでURLを開くにはこちらのライブラリが必要になるそうです。依存関係として下記のライブラリも必要なので忘れずにどっちも追加しましょう。

url_launcher上記のライブラリを使う為に入れます。

pedantic_mono analysis_option.yamlの情報を取得します。詳しくはこちらを見てください。Dart/Flutter の静的解析強化のススメ

メインコードについて

冗長になってしまうので詳しくはGitHubを参照してください。一応説明として入れると

main.dart Flutterを起動すると実行されるファイル。大本です。

home_page.dart起動後に呼び出されるホームとなるページです。このページの中にタブとしてAbout, Blog, Projectを組み込んでいます。

about_tab.dart, blog_tab.dart, projects_tab.dartタブごとのページの中身です。ここにゴリゴリにUIを実装していきます。微妙にハードコーティングが残ってるのは許してください。

ビルドする!

ソースコードを書き終えたら後はビルドするだけです。

flutter build web

上記のコマンドより、buildディレクトリの中にWebディレクトリが生成されます。それをGitHubにアップロードすることによってGitHubPagesで見ることができるようになります。

GitHubPagesに独自ドメインを設定するにはこちらを参照してください。基本的に

  • ドメインを取得する

  • 取得したドメインのネームサーバーでGitHubのAレコードを4つ登録する

  • 数分待つ

ことによって正常に独自ドメインを設定できると思います。リンク先はお名前.comですが、ムームードメイン等でも設定できます。調べてみると出てくるでしょう。

課題

  • パフォーマンスが悪い・・・constで指定してbuildを抑えたり、画像サイズを小さくしたり、工夫はしていますがイマイチ良くなりません。なので今詳しく勉強しているところです。

  • Blogを作っていない・・・Blogの実装をかなり迷っています。と言うのもブログが分散しすぎてて一元化できていないからです。飽き性はこれだからダメですね。

  • 成果物がない・・・成果物が全くと言っていいほどありません。正直これを作るのも少し躊躇いました。

  • 言うほどアピールポイントになっていない・・・現状Flutterを採用している企業も少ないので「ふ〜ん、でも君Railsできないじゃん」って言われてしまいそうです。残念。

終わりに

Flutterはめちゃくちゃ楽しいです!レゴブロックしてみたいで本当に面白いです。ぜひ今ポートフォリオサイトを作ろうか迷ってる人はFlutter for Webも選択肢に入れてみてはいかがでしょうか?

参考文献

Flutter for Web : Building a Portfolio Website

Dart/Flutter の静的解析強化のススメ

Build and Deploy a Flutter Web App

Flutter Documentation

ムームードメインで購入したドメインをGITHUB PAGESに適用する

Flutter From Wikipedia

【参考例あり】高評価を受けるエンジニア未経験者のポートフォリオとは?必要なレベルも公開

Naoto Suzuki's portfolio


[C++] 基本的なコンパイル方法 [C++初心者]

$
0
0

C++ 言語で書かれたソースコードをコンパイルする基本的な方法を書きます.
コンパイラはインストール済みでパスが正しく通っているものとします.

前提

  • コンパイルしたいファイル: test.cpp
  • 使用するコンパイラ: g++
  • 出力したい実行ファイル名: out

test.cpp

test.cpp
#include <cstdio>
intmain(){printf("hello\n");}

コンパイル方法

$ g++ -o out test.cpp

-o outは省略可能で,デフォルトでは a.outというファイルが出力されます.

コンパイル結果

コンパイルに成功すると,outという名前の実行ファイルが生成されます.

$ ls
out     test.cpp

実行結果

$ ./out 
hello

その他よく遭遇するケース

複数のファイルをコンパイルしたい

  • main関数が書かれたソース: test2.cpp
  • 自作関数が書かれたソース: mylib.cpp
  • mylib.cppに対応するヘッダファイル: mylib.h
mylib.cpp
#include <cstdio>
voidprintHello(){printf("hello\n");return;}
mylib.h
#ifndef __MYlIB_H_
#define __MYlIB_H_
voidprintHello();#endif
test2.cpp
#include "mylib.h"
intmain(){printHello();}

コンパイル方法(分割)

-cオプションをつけることでコンパイルのみ (i.e., 実行ファイルを生成しない) を実行し,オブジェクトファイル test2.oおよび mylib.o生成します.

$ g++ -c-o test2.o test2.cpp 
$ g++ -c-o mylib.o mylib.cpp
$ ls
mylib.cpp   mylib.h     mylib.o     test2.cpp   test2.o

あとはオブジェクトファイルをまとめて g++をかけます.

$ g++ test2.o mylib.o -o out
$ ls
mylib.cpp   mylib.h     mylib.o     out     test2.cpp
$ ./out 
hello

コンパイル方法(一括)

上記のような「分解コンパイル」をせずに,次にように一括でコンパイルすることも可能です.

$ g++ test2.cpp mylib.cpp -o out2
$ ./out2
hello

一括コンパイルと比べると分割コンパイルの手順はやや面倒に見えますが,いくつかの利点があるそうです (参考[2]).

いちいちコンパイルのコマンド覚えて打ち込むの面倒くさい

Makefile を使います.
makeコマンドのインストール方法などは割愛します.

Makefile
all:testclean:rm-f*.oout2test:test2.cpp mylib.cpp mylib.hg++-c-otest2.otest2.cppg++-c-omylib.omylib.cppg++-oout2test2.omylib.o

これを置けば,makeを打つだけでコンパイルできます.
Makefile の書き方などはここでは説明しません.

$ ls
Makefile    mylib.cpp   mylib.h     test2.cpp
$ make
g++ -c -o test2.o test2.cpp
g++ -c -o mylib.o mylib.cpp
g++ -o out2 test2.o mylib.o
$ ls
Makefile    mylib.cpp   mylib.h     mylib.o     out2        test2.cpp   test2.o
$ ./out2 
hello

その他

個人的によく使うオプション

  • -Wall: 警告(Warning)をすべて(all)無視します.
  • -std=c++11: C++11 の機能を使いたいときに付けます.
  • -I <dir>: include search path を追加するときに付けます.
  • -L <dir>: library search path を追加するときに付けます.
  • -l <file>: library file をリンクするときに付けます.

参考

[1] http://www.ysr.net.it-chiba.ac.jp/data/cc.html
[2] http://sa.eei.eng.osaka-u.ac.jp/eeisa003/tani_prog/HOWTOprogC/split.htm
[3] https://qiita.com/lrf141/items/9ba070a2a1c3e5faf71c

SQLite FDW で PostgreSQL から SQLite データベースを使ってみよう!

$
0
0

はじめに

SQLite FDW を使って、PostgreSQL から SQLite データベース にアクセスしてみました。今回、PostgreSQL, SQLite をソースコードからインストールしていますが、既に PostgreSQL Version 9.6, 10, 11 または 12、SQLite3 がインストールされている場合、PostgreSQL, SQLite のインストールを飛ばして、SQLite FDW のインストールから始めて下さい。

FDW (Foreign Data Wrapper) とは

PostgreSQLには、SQL2003 SQL/MED 規格に沿った他データソースへのアクセス機能である、FDW(Foreign Data Wrapper) 機能が存在します。この機能により、様々なデータソースへのアクセスが可能となっています。現在、Oracle や SQL Server などの商業 RDBMS、SQLite や MySQL などのOSS RDBMS、Cassandra や GridDB といった NoSQL データベースといったデータソースへアクセスするためのFDWがユーザによって作成・公開されています。

PostgreSQLをソースコードからインストール

PostgreSQLをソースコードからインストールします。PostgreSQLドキュメントを参考しています。

CentOS7 で postgresユーザを作成します。

$ sudo groupadd postgresql
$ sudo useradd -d /home/postgres -g postgres -s /bin/bash postgres
$ sudo passwd postgres
$ su - postgres

PostgreSQLコミュニティから、PostgreSQLを入手します。

$ wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.bz2
$ tar-jxvf postgresql-12.2.tar.bz2

PostgreSQLをインストールします。

$ cd postgresql-12.2
$ ./configure 
$ make
$ make install$ cd

SQLiteをソースコードからインストール

SQLite をソースコードからインストールします。SQLite - Installationの Install SQLite on Linux を参考しています。
SQLiteコミュニティから SQLite を入手します。

$ wget https://www.sqlite.org/2020/sqlite-src-3310100.zip
$ unzip sqlite-src-3310100.zip
$ mv sqlite-src-3310100 sqlite3.31.1

SQLiteをインストールします。

$ cd sqlite3.31.1
$ ./configure
$ make
$ sudo make install

環境設定

環境設定 LD_LIBRARY_PATH を設定します。

$ LD_LIBRARY_PATH=/usr/local/pgsql/lib:/usr/local/lib
$ export LD_LIBRARY_PATH

環境設定 PATH を設定します。

$ PATH=/usr/local/pgsql/bin:$PATH$ export PATH

SQLite FDW のインストール

SQLite FDW をインストールします。GitHubにある readme.mdを参考しています。
PostgreSQLコミュニティによると、SQLite FDW が2つ存在しますが、更新やプッシュダウンが可能なこちらの SQLite FDWを使用します。以下の方法は、SQLite FDW ソースコードをPostgreSQLソースツリーに含めてインストールする方法です。

$ cd ~/postgresql-12.2/contrib
$ git clone https://github.com/pgspider/sqlite_fdw.git
$ cd sqlite_fdw
$ make
$ sudo make install

もし、pg_configコマンドにパスが通っている場合には、下記のコマンドでインストールできます。

$makeUSE_PGXS=1$sudomakeinstallUSE_PGXS=1

PostgreSQL を起動します。

$ initdb -D /usr/local/pgsql/data
$ postgres -D /usr/local/pgsql/data &

サンプルデータベースを入手

SQLite tutorialからサンプルデータベースを入手します。

$ cd /usr/local/pgsql/data/
$ wget https://www.sqlitetutorial.net/wp-content/uploads/2018/03/chinook.zip
$ unzip chinook.zip

Command Line Shell (sqlite3) でサンプルデータベース(chinnook.db) を確認してみましょう。11のテーブルが存在します。

$ sqlite3 chinook.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help"for usage hints.
sqlite> .tab
albums          employees       invoices        playlists     
artists         genres          media_types     tracks        
customers       invoice_items   playlist_track

SQLite FDW の初期設定

CREATE EXTENSION で SQLite FDW をデータベースに取り込みます。

$psqlpsql(12.2)Type"help"forhelp.postgres=#CREATEEXTENSIONsqlite_fdw;CREATEEXTENSION

CREATE SERVER で新しい外部サーバを定義します。 今回は sqlite_server を外部サーバ名とします。OPTIONSで、SQLiteのデータベースファイル名を指定します。
次に外部テーブル一覧で何もないことを確認します。

postgres=#CREATESERVERsqlite_serverFOREIGNDATAWRAPPERsqlite_fdwpostgres=#OPTIONS(database'/usr/local/pgsql/data/chinook.db');CREATESERVERpostgres=#\dEDidnotfindanyrelations.

外部テーブルの作成して動作確認

SQLite で、media_types テーブルのカラム情報を表示します。

sqlite>PRAGMAtable_info(media_types);0|MediaTypeId|INTEGER|1||11|Name|NVARCHAR(120)|0||0

media_types テーブルのカラム情報から、PostgreSQLで、media_types テーブルの外部テーブルを作成します。

postgres=#CREATEFOREIGNTABLEmedia_types("MediaTypeId"bigint,"Name"text)SERVERsqlite_server;CREATEFOREIGNTABLE

media_types テーブルを SELECT します。5レコード表示されます。

postgres=#SELECT*FROMmedia_types;MediaTypeId|Name-------------+-----------------------------1|MPEGaudiofile2|ProtectedAACaudiofile3|ProtectedMPEG-4videofile4|PurchasedAACaudiofile5|AACaudiofile(5rows)

media_types テーブルに レコードを 1件、追加します。SELECTで確認すると、レコードが追加されています。

postgres=#INSERTINTOmedia_typesVALUES(6,'TEXT file');INSERT01postgres=#select*frommedia_types;MediaTypeId|Name-------------+-----------------------------1|MPEGaudiofile2|ProtectedAACaudiofile3|ProtectedMPEG-4videofile4|PurchasedAACaudiofile5|AACaudiofile6|TEXTfile(6rows)

SQLiteでも、media_types テーブルを SELECT してみます。追加したレコードを確認できます。

sqlite>SELECT*FROMmedia_types;1|MPEGaudiofile2|ProtectedAACaudiofile3|ProtectedMPEG-4videofile4|PurchasedAACaudiofile5|AACaudiofile6|TEXTfile

次の動作確認のために、一度、media_types テーブルを DROP します。

postgres=#DROPFOREIGNTABLEmedia_types;

IMPORT FOREIGN SCHEMA で外部テーブルを一括して作成

1つ、2つのテーブルであれば、外部テーブルを作成しても気になりませんが、テーブルが11もあると、外部テーブル作成がイヤになりますよね。そこで、IMPORT FOREIGN SCHEMA で外部テーブルを一括して作成してみましょう。IMPORT FOREIGN SCHEMA は外部サーバ上に存在するテーブルの外部テーブルを作成します。

postgres=#IMPORTFOREIGNSCHEMApublicFROMSERVERsqlite_serverINTOpublic;IMPORTFOREIGNSCHEMA

外部テーブル一覧で確認すると、11の外部テーブルが作成されています。

postgres=#\dEListofrelationsSchema|Name|Type|Owner--------+----------------+---------------+----------public|albums|foreigntable|postgrespublic|artists|foreigntable|postgrespublic|customers|foreigntable|postgrespublic|employees|foreigntable|postgrespublic|genres|foreigntable|postgrespublic|invoice_items|foreigntable|postgrespublic|invoices|foreigntable|postgrespublic|media_types|foreigntable|postgrespublic|playlist_track|foreigntable|postgrespublic|playlists|foreigntable|postgrespublic|tracks|foreigntable|postgres(11rows)

外部テーブルでジョインを使った検索をやってみよう!

外部テーブルを使ったジョインを使った検索も可能です。
tracks テーブル、albums テーブル、artists テーブルでインナージョインで検索します。次のSQLは、artistid が 10 のレコードの Track 名、album 名、artist名を表示する SQL です。

postgres=#SELECT"TrackId",Tracks."Name"ASTrack,Albums."Title"ASAlbum,Artists."Name"ASArtistpostgres-#FROMTrackspostgres-#INNERJOINAlbumsONAlbums."AlbumId"=Tracks."AlbumId"postgres-#INNERJOINArtistsONArtists."ArtistId"=Albums."ArtistId"postgres-#WHEREArtists."ArtistId"=10;TrackId|track|album|artist---------+----------------------------------------------+--------------------------+--------------123|Quadrant|TheBestOfBillyCobham|BillyCobham124|Snoopy's search-Red baron                    | The Best Of Billy Cobham | Billy Cobham
     125 | Spanish moss-"A sound portrait"-Spanish moss | The Best Of Billy Cobham | Billy Cobham
     126 | Moon germs                                   | The Best Of Billy Cobham | Billy Cobham
     127 | Stratus                                      | The Best Of Billy Cobham | Billy Cobham
     128 | The pleasant pheasant                        | The Best Of Billy Cobham | Billy Cobham
     129 | Solo-Panhandler                              | The Best Of Billy Cobham | Billy Cobham
     130 | Do what cha wanna                            | The Best Of Billy Cobham | Billy Cobham
(8 rows)

外部テーブルを使っても問題なくインナージョインを使った検索が実行できました。

まとめ

SQLite FDW を使用して、PosgreSQL から SQLite データベース にアクセスしてみました。これまで、SQLite からデータを取り出して、PostgreSQLにロードして、使う必要がありましたが、SQLite FDW を使うと簡単にPostgreSQLからアクセスできました。手順も簡単なので気軽に使ってみて下さい。

もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。

PowerShell ファイルを作成するコマンド New-Item

$
0
0

目的

  • PowerShellでファイルを作成する時のコマンドを覚えるためにまとめる

書き方の例

  • 下記に新規ファイルを作成するコマンドを記載する。

    >New-Itemディレクトリパスファイル名

Kotlin入門:オブジェクト宣言

$
0
0

オブジェクト宣言

アプリの設定情報のように、
一つしかインスタンスを持たないクラスを用意したいことがあります。
このような場合に使用する仕組みをオブジェクト宣言と言います。

オブジェクト宣言の一般的な構文は以下の通りです。

objectname{ body }

name:オブジェクト名
body:オブジェクトの本体

以下は入力例です。

objectMyApp{varname="Kotlin"varauthor="Kotlin Project"funshow(){println("${name}:${author}")}}funmain(){MyApp.show()}

クラスではなくインスタンスそのものの宣言なので、
コンストラクターは持てません。

オブジェクト式

Androidのアプリ開発では、イベントリスナーの宣言など、
その場限りのクラスを定義したいということがよくあります。

オブジェクト式の一般的な構文は以下の通りです。

object:parent{body}

parent:基底クラスまたはインターフェース
body:クラス本体

入力例:

MainActivity.kt
btn.setOnClickListener(object:View.OnClickListener{overtirefunonClick(view:View){Log.v("Kotlin","Clicked!")}})

コンパニオンオブジェクト

クラス内部でのオブジェクト宣言のことです。
以下はインスタンス生成するためのマーケットメソッド(任意のメソッド名で可)を、
コンパニオンオブジェクトで定義する例です。

classPersonprivateconstructor(varname:String){companionobjectMarket{fungetInstance():Person{returnPerson("山田")}}overridefuntoString():String{return"Person:${this.name}"}}funmain(){valperson=Person.getInstance()println(person)}

実行結果は以下の通りです。

Person:山田

ここでPersonクラスをprivate宣言しているので、
クラス外部からはインスタンス化できません。
コンパニオンオブジェクトにはcompanionキーワードを付与するだけです。
コンパニオンオブジェクト配下のメンバーは「クラス名.メンバー名」で呼び出せます。

『Unity C# 個人用メモ』 オブジェクトをクリックした座標へ移動させる(ナビゲーション不使用

$
0
0

クリックした位置の座標を取得し移動させる

RayRaycastHitを使用してオブジェクトをクリックした座標へ移動させる
Rayをちゃんと理解してないから推測込み('ω')難しいのよね

前提として

プレイ画面(スクリーン座標)は2Dなのでそれをゲーム上の3D空間(ワールド座標)へ変換する必要がある

素材

public class NewBehaviourScript : MonoBehaviour
{
    //レイを使用するための宣言
    private Ray ray;

    //レイがヒットした情報を格納するために使う
    private RaycastHit hit;

    //移動先の座標格納用
    private Vector3 pos;

    //移動用
    private float step;

本文

    void Update()
    {
        //クリックされた時
        if (Input.GetMouseButtonDown(0))
        {
            //レイのスタート位置
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            //レイキャスト(スタート位置,方向 情報,距離)
            if (Physics.Raycast(ray, out hit, Mathf.Infinity))
            {
                //座標posへhitを変換
                pos = hit.point;
                pos.y = 1f;
            }
            //移動用
            step = 10f * Time.deltaTime;
        }
        //オブジェクトの移動
        transform.position = Vector3.MoveTowards(transform.position, pos, step);
    }
}

ray

そもそもray(レイ)ってなんぞやっていう疑問
特定の位置からセンサーを飛ばすって意味と推測してるけど実際どうなんだろう?

ray = Camera.main.ScreenPointToRay(Input.mousePosition);

rayを飛ばすスタート地点を宣言

Camera.main.ScreenPointToRay()
プレイ画面上のどこから飛ばすかを設定する
今回はマウスがクリックされた時のマウスの位置を取得しなければならないので
スタート地点はInput.mousePositionとなる

Raycast

if (Physics.Raycast(ray, out hit, Mathf.Infinity))
///Physics.Raycast(スタート地点, レイと飛ばす方向 レイが当たったオブジェクトの情報を格納, レイを飛ばす距離)

Physics.Raycast()はRaycastHitを使う際の決まり文句

rayはレイを飛ばすスタート地点のこと

outはどの方向にレイを飛ばすかということ
・補足:今回はoutなのでカメラの目線からout(奥側)となる(決まり文句でいいのかなと思う)

hitはレイキャストで飛ばしたレイが接触したオブジェクトの情報の格納先のこと
・補足:今回は変数hitに座標とか名前とか色々な情報が格納される

Mathf.Infinityは飛ばすレイの最大距離のこと{最大射程とか言った方が分かりやすい?}
・補足1:レイの飛ばす距離はfloat型であり、100f等とすれば範囲を制限できる
     (途方もなく遠い場所にあるオブジェクトに反応しないようにするため)
・補足2:逆に別に範囲を制限しないのであればMathf.Infinityと書けば距離は無限大になる

その後

pos = hit.point;
pos.y = 1f;

Vector3 poshit.point(hitの場所つまり座標)を変換して格納する
なおy軸は動いてほしくないのでオブジェクトの初期の設定値を入れる

step = 10f * Time.deltaTime;

これは移動速度の値10fにTime.deltaTimeを与えることでマシンスペックに関係なく処理速度を一定にする

Vector3.MoveTowards()

transform.position = Vector3.MoveTowards(transform.position, pos, step);
///transform.position = Vector3.MoveTowards(対象, 移動先, 速度);

Vector3.MoveTowards()で対象を移動先まで移動させることが出来る
今回は本体クリックされた座標へ設定された速度で移動させる。となる

プロキシ環境でDataiku DSSを利用する

$
0
0

プロキシ環境でDataiku DSSを利用する

はじめに

Dataiku Data Science Platform(Dataiku DSS)を利用する方法として、Dataiku DSSをVirtual Boxを使って利用する方法をご紹介しました。今回は、Proxy環境でDataiku DSSを利用する場合の設定方法について紹介します。

プロキシを設定するには

Dataiku DSSでは、Administrator画面でプロキシ情報を設定します。

1. 設定画面の表示

Dataikuにログインした後、画面右上のキューブアイコンをクリックして、[Administrator]メニューをクリックします。
image.png
その後、画面右上にある[Settings]タブをクリックしたあと、画面右側にある[Misc]をクリックします。
image.png

2. プロキシ情報の設定

次の2か所でプロキシ情報を設定します。

  • HTTP proxyでの設定
    HTTPやFTPでデータを外部から取得する場合や、プラグインやサンプルプロジェクトのダウンロードをする際に、ここで設定した内容が利用されます。
  • Code envs extra optionsでのpip installのオプション設定
    [Code Envs]で独自のPython環境を作成して利用する場合に 、ここで設定したオプションが利用されます。

2.1 HTTP proxyでの設定

次の項目にプロキシ情報を入力します。

  • HTTP proxy host:プロキシサーバのURLを設定します(例)xxx.co.jp
  • HTTP proxy port:プロキシサーバのポート番号を設定します(例)8080
  • HTTP proxy username:プロキシサーバで認証を行う場合に、認証ユーザ名を設定します。(例)username
  • HTTP proxy password:プロキシサーバで認証を行う場合に、パスワードを入力します。(例)password
    ※HTTP proxy username, およびHTTP proxy passwordはプロキシサーバで認証をしない場合は空欄のままします。

2.2 Code envs extra optionsでのpip installのオプション設定

[Extra options for 'pip install']欄で次のオプションを設定します。

--proxy=http://[username:password@]<proxy host>:<proxy port>

(例)
1. ユーザ認証がある場合
--proxy=http://username:password@xxx.co.jp:8080
2. ユーザ認証がある場合
--proxy=http://xxx.co.jp:8080

3. 保存する

プロキシ情報を設定した後、画面左側の[SAVE]ボタンをクリックして、設定内容を保存します。

image.png

さいごに

プロキシ環境でDataiku DSSを利用する場合の設定方法について紹介しました。
プロキシ環境のもとでDataiku DSSを利用される場合に、よろしければご参考ください。

Dataikuで独自のPython環境を利用する

$
0
0

Dataikuで独自のPython環境を利用する

はじめに

Dataiku Data Science Platform(Dataiku DSS)を利用する方法として、Dataiku DSSをVirtual Boxを使って利用する方法をご紹介しました。
Dataikuでは、pyenvやvirtualenvのような、Python環境を管理する仕組みが用意されています。今回は、Dataiku DSSで独自のPython環境を利用したいという場合に、その機能を利用して、独自のPython環境を作成する方法と、作成したPython環境をnotebookで使用する方法について紹介します。

独自のPython環境を作成する

1. Code Envs画面を表示します

Dataikuにログインした後、画面右上のキューブアイコンをクリックして、[Administrator]メニューをクリックします。
image.png
その後、画面右上にある[Code Envs]タブをクリックします。
image.png

2. 独自のPython環境を作成します

画面右上にある、[NEW PYTHON ENV]をクリックします。その後、表示される[New Python env]画面で、次の設定を行います。

  • Deployment type:Managed by DSS(recommended)
  • Name:(英数字で適宜入力します)
  • Python:必要なPythonバージョンを指定します。例えば、Python 3.6を用いる場合は、[Python 3.6 (from PATH)]を指定します。
  • Conda:チェックなしで大丈夫です。Condaを使用したい場合はチェックします。
  • Mandatory packages, Jupyter:いずれもチェックしたままとします。

image.png

設定が完了したら、[CREATE]ボタンをクリックします。独自のPython環境が作成されます。
image.png

留意点

  • Dataikuをインストールした環境において、[Python]で指定したバージョンのPythonはインストール済みで、かつそのバージョンの実行ファイルのパスが環境変数PATHに設定されている必要があります。Virtual Box版Dataikuアプライアンスを利用されている場合は、Python2.7とPython3.6がすでにインストールされていますので、そのバージョンは利用することができます。
  • プロキシ環境で独自のPython環境を作成する場合は、あらかじめDataikuのAdministrator画面でプロキシ情報を設定してください。詳細はこちらを参照してください。

独自のPython環境に新たなPythonライブラリをインストールする

1. ライブラリをインストールするPython環境を選択し、ライブラリインストール画面を表示します

Code Envsタブで表示されるPython環境一覧の中で、ライブラリをインストールするPython環境に該当する[Name]のリンクをクリックします。クリックした後、画面左側の[Packages to install]をクリックします。

2. インストールするライブラリを指定します

画面右下の[REQUESTED PACKAGES(PIP)]でインストールするライブラリを設定します。設定した後、[SAVE AND UPDATE]ボタンをクリックします。ライブラリがインストールされます。
image.png

インストールされているか確認するには、画面左側の[Installed packages]をクリックします。
image.png

補足
[ADD SETS OF PACKAGES]ボタンをクリックすることで、機械学習で用いる標準的なライブラリを指定してインストールすることもできます。
image.png

独自のPython環境をnotebookで利用する

Dataikuのnotebookで独自のPython環境を利用する場合は、次のようにします。

[New Python notebook]画面の[Code env]で独自のPython環境を指定します。
image.png

あるいは、notebookのメニュー[Kernel]>[Change kernel]から独自のPython環境を指定します。
image.png

さいごに

Dataiku DSSで独自のPython環境を作成し、notebookで利用する方法について紹介しました。
プロジェクトごとに独自のPython環境を利用したい場合に、よろしければご参考ください。


Cognos Analyticsのプロパティー設定とCase文を使う

$
0
0

前回の手順でIBM Cloud上のDb2テーブルが扱えるようになったので、種類豊富なグラフがダッシュボードにサクサクと定義が出来た!・・・までは良かったのですが、以下のような事が私にはすぐに分からなかったので共有させてください。

  1. 立て軸の範囲を変更したい
  2. グラフ色を任意に変えたい
  3. 範囲別の件数(個数)を数えたい

1.立て軸の範囲を変更したい

例えば以下のようなグラフがあったとします。
これを見てパット思いつくのは値のない0V~30Vを表示しなければ、「もっと折れ線グラフの上下差が分かり易そうだ」です。
img1-1.png

軸の範囲を変更するため「鉛筆」アイコン-->「変更したいグラフ」-->右上「プロパティー」アイコンの順にクリックします。(実はこの「プロパティー」アイコンの存在に全く気付きませんでした・・ハズカシイ・・)
img1-2.png
表示された「視覚化のプロパティー」メニューから「グラフ」を選択します
img1-3.png
「値軸に原点ゼロを表示」を非選択(オフ)にします。
img1-4.png
そうすると指定どおり「原点ゼロを表示」しなくなり、下図のようにいい感じに値が見える範囲で調整してくれます。
img1-5.png

2.グラフ色を任意に変えたい

見てくれを調整すると、色も変えたくなります。コレも最初「プロパティー」アイコンの存在を知らず時間を無駄にしました。先ほど同様に、「鉛筆」アイコン-->「変更したいグラフ」-->「プロパティー」アイコンの順にクリックします。
表示された「視覚化のプロパティー」メニューから「色」-->「プラス」アイコンの順にクリックします
img2-1.png
「パレット名」を指定し、任意の色を選択していきます。
img2-2.png
今回は4色あればよいので、余計な色は「ゴミ箱」アイコンで消した後「保存」しました。
img2-3.png

3.範囲別の件数(個数)を数えたい

一番困ったのはコレです。例えば0以上45未満、45以上48V未満、48以上50.2V未満の範囲での電圧個数(件数)をカウントしたかったのです。IFとか = < >記号とか使うとTrueとかFalseが返ってくるだけで「何か変!」。結局、I〇MのSEの方に以下のように教えて頂きました。(I〇Mの大先生様ありがとうございました。)

電圧を基に式で作ったカラムを追加するためデータモジュールでテーブルを右クリックし「計算」をクリックします。
img3-1.png
カラム「電圧」を「式」欄へドラッグ&ドロップします。
img3-2.png

0Vから45Vまでの電圧個数(件数)をカウントするには

case when V between 0.0 and 45.0 then 1 else 0 end

のように書きます。
式が正しいか「検証」アイコンをクリックし「式は有効です」が表示されればOKです。
img3-3.png

Railsチュートリアルメモ - 第8章

$
0
0

メモの目次記事はこちら

Railsチュートリアル8章へのリンク

第7章からだいぶ日にちが空いてしまった。。。
気を取り直して最後まで完走していく

第8章 基本的なログイン機構

8.1 セッション

cookieを利用したセッションの実現方法についての章

ポイント

  • ユーザー登録と違い、名前付きルートではなく、個別指定でルーティングを指定する
  • flash変数の設定後の画面表示をredirect_toではなく、renderにするとflashメッセージが消えないが、flash.nowにすると次のリクエストでメッセージが消える

8.2 ログイン

ポイント

  • Railsで事前定義済みのsessionメソッドが利用できる
    • session[:user_id] = user.id
  • User.find(session[:user_id])を使うと、userが存在しないときに例外が発生するので、User.find_by(id: session[:user_id])を使用する
  • helperにログイン用のメソッド、ログイン情報取得用のメソッドを追加し、どこからでも呼び出せるようにする
  • 余計なDBアクセスを避けるため、||=を使用して、非ログインのときのみDBアクセスが発生するようにする
  • test/fixtures/の中のymlに定義することで、都度DBに登録しなくても、DB登録ユーザーのようにユーザー情報のテストを行うことができる
  • ヘルパーメソッドはテストから呼び出せない

8.3 ログアウト

ポイント

ログアウトでやることは①sessionから:user_idを消す②@current_userインスタンス変数を消す(nilで上書く)の2つ

deflog_outsession.delete(:user_id)@current_user=nilend

8.4 最後に

割愛

【未経験転職】【① 3-4月編】2020年3月末でプログラマー目指して退職する31歳公務員がロードマップを立ててみた!

$
0
0

はじめに

みけた@プログラマー転職、公務員31歳です!

仕事をしていく中で「これじゃない感」が募っていく中、
無謀にもプログラマー転職を目指して、退職願を提出してしまいました!!!

とりあえず、5月からはプログラミングスクール「Dive into Code」さんに
お世話になる方向で検討中です。

が、しかし!
それまでの繋ぎの期間にスタートダッシュを切る必要があるということで、
そのロードマップを作成してみました。

プログラマー転職に向けてのロードマップ(3〜4月)

○ 学習計画

エクセルを使って、まとめてみました。
プログラミング学習スケジュール_page-0001.jpg
プログラミング学習スケジュール_page-0002.jpg

○ 学習時間

スケジュールを確認し、プログラミングのための学習時間を以下のように設定しました。
就業中であるため、3月の学習時間は甘めに見積もりました。

【勉強時間】
  3月  30時間
  4月 170時間

【Progate】
  HTML/CSS  20時間
  Javascript  22時間
  jQuery    12時間
  Ruby     7時間
  Ruby on Rails 65時間
  合計     126時間

 ※ 基本的にprogateは2周する予定です。
   Rubyについては既にやったことがあるので、1周のみの予定。
 ※ 所要学習時間については、progateに記載の修了時間を参考にしました。

【Railsチュートリアル】
  全14章を2周する 74時間
 (ただし、1周目は演習をせず、コードもコピペで済ます)

 ※ Railsチュートリアルの学習時間についてはQiitaのこちらの記事を参照しました。
   ただ、他のみなさんの反応を見ると、結構時間がかかっているようです。
  【Qiita】Railsチュートリアルの各章にかかった時間

○ 学習内容について

何を学習するかについては下記を参考にしました。

【Qiita】未経験からRuby on Railsを学んで仕事につなげるまでの1000時間メニュー
【Qiita】化学系研究者が完全未経験からWeb系自社開発企業に転職するまで
【プログラミングスクール】「Dive into Code」が事前学習として推奨している内容

なお、集中的に学んだ方が効率的であると感じていたため、
 ① ProgateでRailsのコースを終えた後
 ② 直ちにRailsチュートリアルへと移行する
以上のようなスケジュールで学習することとしました。

自社開発スクールへの就職実績に定評のあるポテパンキャンプでは、

キャリアコースの応募条件
「Railsチュートリアルと他Web開発の基礎を学習済み」であること
 参照元:POTEPAN CAMP コースについて

となっているので、Railsチュートリアルはいずれにしても避けて通れないのかなと。

とはいえ、
【Qiita】未経験からRuby on Railsを学んで仕事につなげるまでの1000時間メニュー
では、Bootstrapを使ったWebページ作成やSinatraを使ったWebアプリケーション作成を推奨しているようなので、モチベーションが上がらなくなれば、方向転換も検討していきます。

○ Qiitaへの技術記事投稿

とりあえず、Progateをやっていく中で疑問点等が出てきたら、Qiitaにまとめていきます。
また、Railsチュートリアルのノートも公開していく予定です。

転職にあたっても、これがアピールになるらしいです。
(動機は極めて不純です)

○ 100DaysOfCode

流行っている(いた?)らしいです!
本格的に学習を開始する、4月からツイッターで発信していきます。

また、3月も勉強をしたタイミングで適宜情報発信していきます。
ツイッターアカウントはこちら

Rのpaste()(paste0())

$
0
0
tags: rBasicLearning

paste()

1. paste()とは

paste()とは, ()の中の要素を文字型に変えて, 繋げて出力する関数です.

1-1. 具体例

paste("a","b",3)
>paste("a","b",3)[1]"a b 3"

平均を "mean : 4.6" のように出したい時には以下のように使える.

data<-c(1,2,4,7,9)meanData<-mean(data)paste("mean :",meanData)
>paste("mean :",meanData)[1]"mean : 4.6"

2. paste(sep="")

sep=""は, ","で区切っている間を" "で区切って出力するのではなく, その他の方法で区切ることを指定する.

2-1. 具体例

paste("a","b",3)paste("a","b",3,sep="-")
>paste("a","b",3)[1]"a b 3">paste("a","b",3,sep="-")[1]"a-b-3"

3. paste()とpaste0()の違い

paste0()は, ","で区切っている間を区切りなしで出力する関数.

3-1. 具体例

paste("a","b",3)paste0("a","b",3)
>paste("a","b",3)[1]"a b 3">paste0("a","b",3)[1]"ab3"

参考. paste0()をpaste()を用いて表す

paste0()の役割をpaste()で表すと, 以下のようになる.

paste(,sep="")paste0()

具体例

paste("a","b",3,sep="")paste0("a","b",3)
>paste("a","b",3,sep="")[1]"ab3">paste0("a","b",3)[1]"ab3"

周りに質問できる人がいなくて困った場合の便利サービス6選

$
0
0

プログラミングを勉強していると、質問できる環境がなくて困る場面が多々あるかと思います。
経験者に質問をすれば、瞬時に解決できるエラーでも、初学者の場合丸一日かけても解決せずに、
挫折してしまうことも・・・・・:sleepy:

そこで、私が普段利用している5つのサービスをご紹介させて頂きたいと思います:point_up:


①teratail

HP:https://teratail.com/
スクリーンショット 2020-02-26 23.14.23.png
一言でいうと、エンジニア版のYahoo知恵袋です。
いままで数十回質問をさせていただきましたが、返答がなかったことはありません:relaxed:


②Udemy

HP:https://www.udemy.com/

スクリーンショット 2020-02-26 23.15.07.png

オンライン動画学習教材です。購入した動画について無制限で質問することができます。
定期的にセールで9割引きになるので、そのタイミングを狙って購入するのがオススメです:ok_hand:


③TechPit

HP:https://www.techpit.jp/

スクリーンショット 2020-02-26 23.16.24.png

オンライン学習教材です。購入した動画について無制限で質問することができます。
インスタ風サイトやTinder風マッチングサイトを作成することができます:v:


④オンラインサロン

スクリーンショット 2020-02-26 23.28.05.png

私が、参加している勝俣健太様@poly_softの雑食系エンジニアサロンでは、
質問チャンネルがあります。
初心者向け質問チャネルがあるので、気兼ねなく質問できます:relaxed:


⑤もくもく会に参加する

スクリーンショット 2020-02-26 23.29.12.png

私は、定期的にもくもく会に参加するようにしています。
人脈も構築できますし、家で集中できない人もガッツリ集中できますね:clap:
作業中はslackをモニターに投影していることもあるので、
質問がしづらい時はslackを投げることもできます:clap:


⑥MENTA 

スクリーンショット 2020-02-26 23.25.33.png

HP:https://menta.work
 私は利用したことはありませんが、有料でメンターを探すことができるサービスです。
 困った時に相談できるメンターをつけて学習効率を上げることができます:relaxed:


最後に

いかがでしたでしょうか?有料・無料問わず様々な方法がありますね〜
質問をすることはとてもよいことですが、丸投げの質問は回答者目線がなくNGです。
※エラーがでました。どうすればいいでしょうか?等
自分でググったり、開発環境や試したことを記載して、
回答者が回答しやすい質問をこころがけましょう:relaxed:

Ruby on Rails チュートリアル学習記録 第3章

$
0
0

第2章については特に書く内容がなかったため学習記録は付けませんでした

3.1

heroku createを実行するとbash: heroku: command not foundというエラーメッセージ。
https://qiita.com/RyuGotoo/items/7d44f7aa51f7c90ad0b7
↑こちらの記事参考に
nvm install node
npm install -g heroku-cli
を実行後、あらためてheroku createを実行すると上手くいった。

3.2

特になし

3.3

特になし

3.4

特になし

3.5

特になし

3.6

特になし

Kotlin入門:Enumクラス

$
0
0

Enumクラス

Enumクラスを使用することで、特定の値から構成される型を表現できます。
Enumクラス(列挙型)はclassブロックにenum修飾子を付与して宣言します。

入力例:

enumclassSeason{SPRING,SUMMER,AUTUMN,WINTER}funmain(){valseason=Season.SPRINGprintln(season)println(seasonisSeason)}

実行結果は以下の通りです。

SPRINGtrue

Enumクラスの配下では定数を(,)カンマ区切りで列挙するだけです。
列挙値には「列挙型.列挙定数」でアクセスします。

プロパティ、メソッド

列挙型もクラスの一種なのでプロパティを持たせることができます。

enumclassSeason(valvalue:String){SPRING("春"),SUMMER("夏"),AUTUMN("秋"),WINTER("冬")}funmain(){valseason=Season.SPRINGprintln(season)println(season.value)}

実行結果は以下の通りです。

SPRING

Enumクラスは暗黙的にprivateとみなされます。
したがって、クラス外部から「SPRING("春")」のような呼び出しはできません。

以下はメソッドを持たせた例です。

enumclassSeasons{SPRING{overridefungetSeason():String="春"},SUMMER{overridefungetSeason():String="夏"},AUTUMN{overridefungetSeason():String="秋"},WINTER{overridefungetSeason():String="冬"};//セミコロンに注意//メソッドの定義abstractfungetSeason():String}funmain(){for(seasoninSeasons.values()){println(season.getSeason())}}

実行結果は以下の通りです。

Enumブロックの配下でメソッドを終了するには末尾を
(;)セミコロンで終了しなければなりません。


Dataiku Academyのユースケースを実施してみた。(Network Optimization編)

$
0
0

Dataiku Academyのユースケースを実施してみた。(Network Optimization編)

はじめに

Dataiku社から、データ分析の学習のためのコンテンツとして提供されている、Dataiku Academyで学習してみました。
英語ですが、ビジネスサンプルをベースにどのようにデータを分析し、業務に活かしていくのかを理解できるので、試しに実施してみたことを書いてみました。

ここでは、Network Optimizationという、レンタカー会社がレンタカーの需要を拡大するため、パートナーシップを組んでいる保険会社の情報を活用して、パートナーを組むガレージをどこにするかといったユースケースを実施した内容を掲載しています。
詳細は、こちらを参照してください。

ビジネスの背景

レンタカー会社が、保険会社とのパートナーシップをもとに新たな需要を満たすため、同社の代理店ネットワークを拡大していきたいと考えています。具体的には、次のようなことを目的にしています。

  • 現在の代理店ネットワークが、実際の需要と予想需要を踏まえて、適切であるかを理解する。
  • 各代理店の所在地での需要を予測することでレンタカーのローテーションのスケジュールを最適にする。
  • 代理店ネットワークを効率的に広げていくため、パートナーシップやその場所を評価する

データ

ここでは、次のデータを使用します。

  • Demand
    • 保険会社から提供されたデータ。4年間分の交通事故の記録。約25万件のレコード。
  • Network
    • 約350件のレンタカー代理店の所在地情報。
  • Parners
    • パートナー(ガレージ)候補の情報。HTML形式。

手順

大きくは次の手順になります。
1. データをアップロードします。
2. 日時情報をクレンジングしたり、緯度経度を算出したりします。
3. 事故発生場所からステーション(代理店やパートナー候補のガレージ)までの地理的な近さをもとにデータを結合します。
4. 地域毎、またはステーション毎にデータを集計して分析します。

前準備

Dataiku DSSをインストールする方法はこちらを参照してください。
Dataiku DSSをインストールした後、次のDataikuプラグインをインストールします。Dataikuプラグインのインストールの仕方はこちらを参照してください。

あと、Geocoder pluginを用いる場合は、Map QuestかBing Maps API keyが必要になります。
MapQuest API Keyを取得する場合は、次のサイドでアカウントを作成して、API keyを作成します。
https://developer.mapquest.com/
(Bing Mapsの方はセットアップの仕方がまずかったのか、エラーとなって正常に動作しませんでした。)

プロジェクトの作成

Dataikuのトップページで[+ NEW PROJECT]をクリックして、[Blank Project]を作成します。
image.png

データ準備

ここでは、3種類のデータを結合して1つのデータにします。

Demand データ

  1. accidents.zipを[Upload your files]でアップロードしてデータセットを作成します。これらのファイルはすべて項目が同じなので、複数ファイルをアップロードすることで自動的に1つのデータセットに統合されます。 image.pngimage.png
  2. データ分析できるようにPrepareレシピを利用してデータを加工します。

    • 日付と時刻の変換

      • yearを、Formulaを用いて西暦下2桁から4桁表示に変更します。下記コードを記載します。
      "20"+year
      
      • hrmnを、Formulaを用いて24時間形式に変更します。下記コードを書きます。
      if(length(hrmn) == 3,"0"+hrmn,
      if(length(hrmn) == 2,"00"+hrmn,
      if(length(hrmn) == 1,"000"+hrmn,hrmn)))
      

      image.png
      - Concatenate columnsを用いて、year,month,day,hrmnを-「ハイフン」で連結した値をもつdatetimeを作ります。
      image.png
      - Parse dateを用いて、datetimeをdate型に変換します。表示される画面で「yyyy-MM-ddZ」を選択して、[OK]ボタンをクリックします。
      image.png
      - Extract date componentsを用いて、datetimeからをdate型に変換します。表示される画面で「yyyy-MM-ddZ」を選択し、週番号であるweek of yearの項目を作成します。
      image.png

    • 地理情報の変換

      • latitude, longitudeの項目をWGS84座標系に変換します。そのために、まず、これらの項目の値を100,000で割って、その後、データ型をbigintからdoubleに変更します。
      • Create GeoPoint from lat/lonを用いてgeopointを作成します。
      • Remove rows where cell is emptyを用いて、geopointが空の行を削除します。
      • Filter rows/cells on valueを用いて、geopointがPOINT(0 0)の行を削除します。 image.png
      • Reverse-geocodeを用いて、geopointから、city(level8), department(level6), region(level4), country(level2)を作成します。その時、「_enName」のサフィックスがついている列ができるので、削除します。 image.png
      • Filter rows/cells on valueを用いて、countryが「France」以外の国の行は削除します。

    ここまでの操作が完了したら、[RUN]ボタンを押下します。これで、フランスの自動車事故の日付と時刻、地理情報のクレンジングが完了しました。

Networkデータ

rental_agencies.csv.zipをアップロードします。データセットの名前は、rental_agenciesとします。
ここでは、行ごとに住所と郵便番号に対応する緯度経度を作成します。

  1. Simpify textを用いて、addresscityを正規化(Normalize text)します。
  2. Concatenate columnsを用いて、addresszipcodecityを半角スペースで連結してaddress_fullを作成します。 image.png
  3. Geocodeを利用して、各レンタル代理店の緯度経度を作成します。ここでは、Map Quest Open APIを指定して緯度経度の情報を取得しています。 image.png注意 Geocoder pluginはプロキシには対応していないようです。。。プロキシのないネットワーク環境で実施してみてください。

ここまでの操作が完了したら、[RUN]ボタンを押下します。これで、代理店の地理情報のクレンジングが完了です。

Garageデータ

  1. garage_locations.csv.zipを[Upload your files]でアップロードします。 アップロードすると、ファイルフォーマットが認識できないというエラーが表示されるので、[FORMAT SETTINGS>]ボタンをクリックした後、[Type]で「One record per line」を選択します。データセットの名前は、garage_locationsにします。 image.png
  2. Prepareレシピを利用してデータを加工します。
    • まず、ガレージ名を抽出します。 Filter rows/cells on valueを用いて「line」という行を削除します。
    • 最初のセルを右クリックして[Show complete value]をクリックすると、値全体を見れます。ここでガレージ名を抽出するために、Split columnを用いて、次を指定します。
      • delimiterにh1 class=""""left"""">' + '
      • Trancateをチェック
      • Starting fromを「End」を指定 image.png
    • 次にline_0に対して、Split columnを用います。次を指定します。
      • delimiterに' + '
      • Trancateをチェック image.png
    • line_0を削除して、line_0_0の列名をnameに変更します。
    • ガレージ名を抽出するための処理をひとまとめにします。最後から4つのステップをチェックして、右クリックして表示される[Group]をクリックします。グループ名を「Parse garage name」とします。
    • 緯度経度の抽出も同じ要領で抽出します。 image.png
    • Create GeoPoint from lat/lonを用いてlatitude, longitudeからgeopointを作成します。
    • Reverse-geocodeを用いて、地理情報を取得します。ここでは、city(level8), department(level6), region(level4), country(level2)を取得します。「_enName」を含む列やlineを削除して必要な列のみ残します。 image.png

ここまでの操作が完了したら、[RUN]ボタンを押下します。これで、パートナー(ガレージ)の地理情報のクレンジングが完了です。

地理情報によるデータの結合

ここでは、自動車事故が発生した箇所から最寄りの代理店や提携可能性のあるパートナー(ガレージ)をもとに、ステーション(代理店とパートナー候補のガレージ)毎に必要とするレンタカー台数と、地域毎に必要とするレンタカー台数を見積もります。
これを行うために、3つのデータを統合します。
統合する際、事故の発生個所から最寄りの代理店、およびパートナー(ガレージ)候補を結びつけます。

  • PrepareレシピのGeo-joinプロセッサを用いて、データセットaccidents_database_preparedとrental_agencies_preparedを統合し、accidents_joinedを作成します。
  • 同様に、Geo-joinプロセッサを用いて、accidents_database_preparedとgarage_locations_preparedを統合します。 image.png

ここまでの操作が完了したら、[RUN]ボタンを押下します。データが統合されます。

分析とビジュアライゼーション

チャート

作成するチャートとして次があります。

チャート内容種類
Distribution of accidents by hour of the day日時毎の事故発生の分布histogram
Distribution of accidents by day of week and year曜日毎の事故発生の分布histogram
Weekly comparison of accidents count on the past 4 years過去4年間の事故発生数の週数毎の比較line chart
Geographic distribution of accidents, filtering out for low collision scores地図上での事故発生分布scatter map
Choropleth of number of accidents事故発生数のコロプレスマップadministrative map
Choropleth of average distance between accidents and agencies事故発生場所と代理店の間の距離の平均値のコロプレスマップadministrative map
Cumulative distribution of accidents based on distance to agencies (5 km bins)代理店までの距離に基づく事故の累積分布stacked bar chart

例えば、曜日毎の事故発生の分布のグラフは次のようになります。
image.png

代理店までの距離に基づく事故の累積分布のグラフを見ると、代理店から15km以上離れた場所で多くの事故が発生していることがわかります。
image.png

次に、パートナー(ガレージ)と組んだ場合にどのような効果が得られるか確認します。
具体的には、事故発生個所から最も近いのがパートナー(ガレージ)候補である場合、そことパートナーを組んだと仮定して、事故発生場所から、どれぐらい近い距離で対応できるかを見ます。

上記を進めるのに、accidents_joinedデータセットを選択して、画面右側の[LAB]ボタンをクリックして、分析をします。
Formulaを使って、次の2つの項目を作成します。

  • effective_network
    事故発生場所から最も近いのが代理店かパートナー(ガレージ)かを示すフラグ
if(station_join_distance > 15 && garage_join_distance < station_join_distance,
    "garage","station")
  • effective_distance最も近い代理店/パートナーから事故発生場所までの距離
if(effective_network=="garage",garage_join_distance,station_join_distance)

最も近い代理店/パートナーから事故発生場所までの距離をもとに、事故の累積分布のグラフを作成します。
パートナーを組むことで、事故発生場所からより近い位置から対応できるようになるのが分かります。例えば、15km以内で、パートナーを組まない場合は約40%のカバー率であるのに対し、パートナーを組むことによって約64%の事故をカバーできるようになることが分かります。
image.png

画面右上の[DEPLOY SCRIPT]ボタンをクリックすると、このデータ加工したデータがフローに登録されます。

Webapp

事故発生場所と代理店、またはガレージの間の距離を表示するデモをWebappで作成します。
Dataikuでは、デモアプリのための環境を準備しなくても、簡単にデモアプリを作成することができます。

  • 上部のバーから[</>]をクリックして、新しいWebアプリを作成します。
    • Code Webapp
    • Starter code for creating map visualizations
  • [Settings]タブでpreparedがつくデータセットに「Read data」権限をつける
  • HTMLタブで、次のコードを記載します。
<!-- Body of your app -->
<div class="container">
    <div class="row">
        <div class="col-md-9" id="map"></div>
        <div class="col-md-3"> <strong>Description</strong>
            <p>
                This geographic analysis shows the network of rental stations, the network of garages, and a sample of the accidents.
            </p>
        </div>
    </div>
</div>
  • JSタブで次のコードを記載します。もともと記載されているdataiku.fetchは削除してから、下記のコードを記載します。
    • 代理店を緑丸(半径15km)で表示します。
dataiku.fetch('rental_agencies_prepared', {
    sampling : "head",
    limit : 20000
  }, function (df) {

    // Add a map marker for each row on the dataset
    // Each marker is a circle. The size of the circle varies with the 'size' column values
    var nbRows = df.getNbRows();
    for (var i = 0; i < nbRows; i++) {
      var record = df.getRecord(i);

      // Replace by your own column names here
      var lat = parseFloat(record["geolat"]);
      var lon = parseFloat(record["geolon"]);
      var name = record["agency_name"];
      var city = record["city"];
      if(isNaN(lat) || isNaN(lon)) continue;

      // Radius of the marker is in meters
      var radius = 15000;

      var marker = new L.circle([lat, lon], radius, {
          color: 'green',
          fillColor: 'green',
          fillOpacity: 0.2
        }).bindPopup("Name: <strong>" + name + "</strong>");

        marker.addTo(map);
      };
});
  • ガレージを青丸(半径15km)で表示します。
dataiku.fetch('garage_locations_prepared', {
    sampling : "random",
    limit : 200
  }, function (df) {

    // Add a map marker for each row on the dataset
    // Each marker is a circle. The size of the circle varies with the 'size' column values
    var nbRows = df.getNbRows();
    for (var i = 0; i < nbRows; i++) {
      var record = df.getRecord(i);

      // Replace by your own column names here
      var lat = parseFloat(record["latitude"]);
      var lon = parseFloat(record["longitude"]);
      var name = record["name"];

      // Radius of the marker is in meters
      var radius = 15000;

      var marker = new L.circle([lat, lon], radius, {
          color: 'blue',
          fillColor: 'blue',
          fillOpacity: 0.2
        }).bindPopup("Name: <strong>" + name + "</strong>");

        marker.addTo(map);
      };
});
  • 事故発生場所を赤丸で表示します。
dataiku.fetch('accidents_database_prepared', {
    sampling : "random",
    limit : 10000
  }, function (df) {

    // Add a map marker for each row on the dataset
    // Each marker is a circle. The size of the circle varies with the 'size' column values
    var nbRows = df.getNbRows();
    for (var i = 0; i < nbRows; i++) {
      var record = df.getRecord(i);

      // Replace by your own column names here
      var lat = parseFloat(record["latitude"]);
      var lon = parseFloat(record["longitude"]);
      var collision = record["collision"];

      // Radius of the marker is in meters
      var radius = 1;

      var marker = new L.circle([lat, lon], radius, {
          color: 'red',
          fillColor: 'red',
          fillOpacity: 0.2
        }).bindPopup("Number of collisions: <strong>" + collision + "</strong>");

        marker.addTo(map);
      };
});

そうすると、代理店・ガレージの場所、および事故発生場所がマッピングされ、どの代理店・ガレージが15km以内でどの程度の事故をカバーできるか確認できます。
image.png

キャパシティプランニング

地域レベルでの分析

2012年より後のデータを用いて、月毎地域毎に代理店、またはガレージから事故発生場所までの距離がどのようになっているのか分析します。
[LAB]を使ってmonthregionをキーとして、代理店、ガレージから事故発生場所までの距離の平均値を算出し、可視化します。
これにより、「Bretagne」など1店舗当たりに網羅する事故数(capacity_ratio)が多い、上位7地域を確認することができます。これらの地域で積極的にパートナーを組んでいく必要があることが分かります。
image.png

[DEPLOY SCRIPT]ボタンをクリックして、この分析結果をフローに登録します。

ステーションレベルの分析

需要が多く負荷の高い代理店を見つけます。
具体的には、[LAB]を使ってmonthstation_agency_nameをキーとして、代理店、ガレージの月毎の負荷値と、その負荷値の3か月の移動平均を算出して確認します。

image.png

ダッシュボード

先ほど作成したグラフをダッシュボードに貼り付けて、他の人と分析結果を共有するためのダッシュボードを作成します。
image.png

また、Webappもダッシュボードに貼り付けて見せることができます。
image.png

さいごに

Dataikuを使って次のことをして、レンタカー会社がパートナーとするガレージを選定する際の材料となる情報を分析しました。

  • パートナーを組むことで、どの程度の効果があるか把握できるグラフを作成
  • どこの地域や代理店のレンタカー需要が多いか把握するためのダッシュボードやデモを作成

地理情報を活用して、事故発生場所から最も近い代理店やガレージを紐づけるなどのデータ加工や項目追加、データの統合が簡単にできるところ、またグラフやダッシュボード、デモアプリを簡単に作成できるところはDataikuのよさだと感じました。

よかったら、みなさんもDataikuを利用してみてください。

C#の単体テストは「Chaining Assertion」が便利

$
0
0

はじめに

C#の単体テストで期待値の確認は「Chaining Assertion」というライブラリがとても便利でお勧めです。
Chaining Assertion の公式サイトはこちら

他のテスト記述ライブラリとの比較

値が等しいことの確認

テスト記述ライブラリで有名なものとして「Fluent Assertions」があります。
Fluent Assertions の公式サイトはこちら
それを用いてテストする場合、以下のように書きます。
(標準のAssertクラスよりも書きやすいので、こちらのライブラリもとても素晴らしいと思います)

// Fluent Assertions で文字列が空文字であることを確認する例theString.Should().Be(string.Empty);

これに対して、Chaining Assertion は、Should().Be() でなく Is() だけで確認できるため、よりシンプルに記述できます。

// Chaining Assertion で文字列が空文字であることを確認する例theString.Is(string.Empty);

値が等しい以外(値が範囲内かなど)の確認

Fluent Assertions は期待値を確認するためのメソッド(BeNull、HaveLengthなど)をたくさん提供しています。これは一見すごく多機能で便利なのですが、実際にテストコードを書くときには適切なメソッドを調べることになるので意外と手間がかかります。
例えば、値が0以上10以下であることを確認しようと思った時に、範囲指定のメソッドがあるので、以下のように記述します。

// Fluent Assertions で対象の値が0以上10以下であることを確認する例theInt.Should().BeInRange(0,10);

Fluent Assertions の数値型の確認メソッドはこちら

それに対して Chaining Assertion は、シンプルに Is メソッドのみで期待値を確認します。Is の引数にラムダ式を書くことで、Is だけでどんな期待値も確認できます。以下のような感じです。

// Chaining Assertion で対象の値が0以上10以下であることを確認する例theInt.Is(value=>value>=0&&value<=10);

C#開発者は、ラムダ式を書き慣れているので、確認したい内容に合わせてメソッドを探すよりも、全部ラムダ式で書く方が楽だと思います。
(これに関しては個人の感想ですが、私のチームで両方のライブラリをそれぞれ一定期間使ってみたところ、いずれのメンバーも Chaining Assertion の書き方の方が気に入りました)

コレクションの確認

コレクションに関しては、Fluent Assertions はコレクション用のメソッドもいっぱいあります。適切なメソッドを探すのが少し手間です。Chaining Assertion 作者の河合さんが以下の記事で解説されているように、コレクションは慣れ親しんだ Linq to Objects で結果まで絞って True/Falseを判定する方が楽だと思います。
neue cc - メソッドチェーン形式のテスト記述ライブラリ

// Fluent Assertions でコレクションの要素に3より大きい値があることを確認する例// (何十個もあるコレクションのメソッドの中から適したメソッドを使う)collection.Should().HaveCountGreaterThan(3);// Chaining Assertion でコレクションの要素に3より大きい値があることを確認する例// (慣れ親しんだ Linq to Objects を使う)collection.Any(c=>c>3).Is(true);

その他の便利機能

Chaining Assertion の便利機能を紹介します。

プライベートメンバーへのアクセスが容易

期待値を確認するときに、privateメンバーにアクセスしたい場合があります。
その場合、PrivateObjectクラスを利用してアクセスします。ただ、PrivateObjectの実装は、PrivateObjectのインスタンスを作ってからそれを通してアクセスする必要があり、少し面倒です。
PrivateObjectクラスの実装例

Chaining Assertion なら、privateメンバーへのアクセスを簡潔に実装できます。
具体的には、object型の拡張メソッドであるAsDynamic()メソッドを利用することでprivateメンバーにアクセスできます。
例を以下に示します。

// privateメンバーを持つクラスpublicclassMyClass{privatestringPrivateMethod(intnumber){returnnumber;}}[TestClass]publicclassUnitTest{[TestMethod]publicvoidTestMethod(){varmyClass=newMyClass();// AsDynamic()の戻り値は dynamic型// AsDynamic()に続けて呼び出したいメンバーを書くことでリフレクションで実行されるintnumber=myClass.AsDynamic().PrivateMethod(3);number.Is(3);}}

再帰的な公開フィールド・プロパティの確認

あるインスタンスを複製するメソッドを作った場合、その複製されたインスタンスのフィールド値および、そのインスタンスが保持しているオブジェクトが複製元と一致するか確認したい場合があります。
Chaining Assertion なら IsStructualEqualメソッドを呼び出すだけで、複製したオブジェクトのフィールド値およびそれが保持するオブジェクトについて、参照をたどって再帰的に確認できます(publicなフィールドまたはプロパティを確認します)。
以下に例を示します。

// テスト対象クラスpublicclassMyClass{publicstringName{get;set;}publicMyClassChild{get;set;}publicMyClassClone(){// 複製する処理}}[TestClass]publicclassUnitTest{[TestMethod]publicvoidTestMethod(){// テスト対象クラスを作成するvarmyClass=newMyClass(){Name="Test",Child=newMyClass(),};// 複製するvarclone=myClass.Clone();// 参照しているChildのフィールド値も含めて一致することを確認clone.IsStructuralEqual(myClass);}}

ただし、相互参照している場合は無限ループとなるため注意が必要です。
そのあたりの挙動を変更することも可能です。Chaining Assertion はインストールするとDLLを参照するのでなく、ソースコードを1ファイル追加するだけなので、そのソースコードを変更することで、自前で挙動をカスタマイズすることもできます。

まとめ

Chaining Assertion は便利なのでお勧めです。

私は上記手法を用いて こちらのツールを作っています。

Twitterでも開発に役立つ情報を発信しています → @kojimadev

PHPで十進法->二進法に変換する

$
0
0

PHPで十進法->二進法に変換するコードを書いてみました。
decbin()関数があリますが。

binary.php
<?php$input=fgets(STDIN);$binary=array();while(true){$remainder=$input%2;$input=floor($input/2);$binary[]=$remainder;if($input==0||$input==1){$binary[]=$input;break;}}foreach(array_reverse($binary)as$bit){echo$bit;}}?>

Java言語で学ぶデザインパターン入門の2章のまとめ

$
0
0

お久しぶりです。白々です。
前回は、「Iteratorパターン」に関しての記事を作成しました。
前回の記事は、後述のappendixに記載しています。
今回は、「Adapterパターン」に関して記載したいと思います。
また、「Java言語で学ぶデザインパターン入門」には、サンプルプログラムも有りますが、著作権の都合上省かせて頂きます。御了承ください。

第2章 Adapter -皮かぶせて再利用

日本で使っている電化製品があると思います。
この電気製品を海外でコンセントを利用する時に、電圧が違うので、コンセントの変換器を持っていくと思います。
このように、すでに供給されている物をそのまま利用できない場合に、使うことができる形に変換することで利用できるようになります。
このような、変換を行うパターンをAdapterパターンと言うそうです。
「Java言語で学ぶデザインパターン入門」には、

「すでに提供されているもの」と「必要なもの」との「ずれ」を埋めるためのデザインパターン

と言う記載がありました。
このAdapterパターンは、Wrapperパターンとも呼ぶそうです。

なんでこんなパターンが必要なの?

「Java言語で学ぶデザインパターン入門」にも、記載がありましたが、必要なメソッドがあるなら追加で作ればいいという意見もあると思います。
ただ、全てのメソッドを一から作ると、テストの手間がものすごく増えてしまいます。

例えば、unixtimeを取得しint型で返すメソッドがあるとし、新しく時間を文字列型で返すメソッドを欲しいとします。
こんな簡単な例なら、メソッドの返り値を文字列型でキャストすれば問題ないですが、ここでは新しく時間を文字列型で返すメソッドを作成したとします。
この新しく作成したメソッドでエラーが発生した場合、時間を取得している部分で失敗しているのか、文字列型でキャストしている部分で失敗したかエラーが起きたという部分だけではわからないですよね?
ですが、既存のunixtimeを取得しint型で返すメソッドを使用し、新しく時間を文字列型で返すメソッドを作ってエラーが出た場合は、時間を取得する部分のエラーに関しては、既存のメソッドでないことを確認済みなので、int型から文字列型でキャストする時に失敗しているということがすぐに分かります。
また、メソッドを作成する時に、既存のメソッドを呼ぶだけで済むので簡単に実装することができます。
このように、Adapterパターンを使用することで、実装工数の短縮及び実装時に発生したエラー原因を減らすことができます。

既存のunixtimeを取得しint型で返すメソッドの返り値を文字列型でキャストするように修正する場合も考えてみましょう。
「Java言語で学ぶデザインパターン入門」にも、記載がありましたが、この場合でもAdapterパターンを使用した方が良いです。
理由としては、既存の実装を変更してしまうので、再度このメソッドを使用している部分をテストしなけばならないため、少しの改変でもテストの工数がかかってしまい無駄になります。

「Java言語で学ぶデザインパターン入門」にも、記載がありましたが、機能がかなり離れていたら新規でクラスを作るしかないです。
イメージとしては以下のような場合です。

交流100ボルトの電源を元にして水道の水を出すわけにはいかないですからね

Adapterパターンの種類

このAdapterパターンは、以下の2種類あるそうです。
・クラスによるAdapterパターン(継承を使用)
・インスタンスによるAdapterパターン(移譲を使用)
例に対してそれぞれのパターンで記載していきたいと思います。

インスタンスを作成した時間のunixtimeを取得しint型で返すメソッドを持つクラスを使用して、string型で返すAdapterクラスを作成することにします。

クラスによるAdapterパターン

クラス図

class.png

このクラス図は、PlantUMLというもので記載しています。
私が、書いたPlantUMLのコードは以下のGitHubに記載がありますのでReadMeを読んでお使いください。
該当ファイル名は、class.txtです。
https://github.com/sirajirasajiki/design_pattern_uml/blob/master/adapter/class.txt

PlantUMLのインストール方法と使い方に関しては、後述のappendixに記載しています。

クラス図を元にpythonで実装

以下に実装したコードを公開しています。python 3.7で実装しました。
https://github.com/sirajirasajiki/design_pattern_python/tree/master/Adapter/class_case

インスタンスによるAdapterパターン

クラス図

クラスによるAdapterパターンと異なるのは、GetTimeStrにてGetTimeの使い方が違います。
instance.png

このクラス図は、PlantUMLというもので記載しています。
私が、書いたPlantUMLのコードは以下のGitHubに記載がありますのでReadMeを読んでお使いください。
https://github.com/sirajirasajiki/design_pattern_uml/blob/master/adapter/instance.txt

クラス図を元にpythonで実装

以下に実装したコードを公開しています。python 3.7で実装しました。
https://github.com/sirajirasajiki/design_pattern_python/tree/master/Adapter/instance_case

まとめ

既存クラスと使用したい形式が違った場合のズレを吸収する物がAdapterパターンということが分かりました。

第2章感想

既存実装を使い新しいクラスを作ることによって、新規作成するよりも工数を減らすことができ、新規実装分でエラーが発生した場合、エラーの原因の範囲が少なくて済むので簡単に実装できると思いました。
また、返り値の型を変えるような簡単な修正でも既存実装に修正を加えてしまうとテストをやり直しになってしまうので、そのような場合にこのAdapterパターンは使うんだなということがわかりました。

最後に

何か間違っているところがあれば、ご指摘していただけると嬉しいです!

appendix

前回の記事

https://qiita.com/sirajirasajiki/items/55269e5d6c6e158de16e

PlantUMLに関するサイト

PlantUMLのインストールの時にお世話になったサイトは以下です。
https://qiita.com/kohashi/items/1d2c6e859eeac72ed926
PlantUMLを書くときにお世話になっているサイトは以下です。
https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48

brew install php@7.4を実行した時にエラーが出た話

$
0
0

目的

  • エラー解決の方法をまとめる

エラー概要

  • 下記コマンドを実行後エラーが出力された。

    $brew install php@7.4
    
  • エラー文を下記に記載する。

    xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    Error: The following formula
      [#<Dependency: "python" []>, #<Options: []>]
    cannot be installed as binary package and must be built from source.
    Install the Command Line Tools:
      xcode-select --install
    
  • エラー文の和訳を下記に記載する。

        xcrun:エラー:無効なアクティブな開発者パス(/ Library / Developer / CommandLineTools)、xcrunがありません:/ Library / Developer / CommandLineTools / usr / bin / xcrun
        エラー:次の式
          [#<依存関係: "python" []>、#<オプション:[]>]
        バイナリパッケージとしてインストールすることはできず、ソースからビルドする必要があります。
        コマンドラインツールをインストールします。
          xcode-select --install
        ```
    

原因

  • xcrunと言うものがないことが原因らしい。

解決方法

  1. 下記コマンドを実行して必要な物をインストールする。

    $xcode-select --install
  2. 下記のようなポップアップが表示されるので「インストール」をクリックする。

    スクリーンショット 2020-02-28 0.24.04.png

  3. 下記のウインドウが開いたら「同意する」をクリックする。

    スクリーンショット 2020-02-28 0.25.15.png

  4. インストールが開始されるので少々待つ。

    スクリーンショット 2020-02-28 0.25.26.png

  5. 下記のウインドウが開いたらインストールが完了している。「完了」をクリックする。

    スクリーンショット 2020-02-28 0.30.44.png

  6. 今一度下記コマンドを実行する。(下記のエラーが出ればOK、すでにインストールされているという内容のエラーである。)

    $xcode-select --install>xcode-select: error: command line tools are already installed, use "Software Update" to install updates
    
  7. 再度PHPをインストールするコマンドを実行する。

    $brew install php@7.4
    
  8. エラーコードは出なくなった。インストール時の出力を下記に記載する。

    ==> Installing dependencies for php: apr, apr-util, argon2, aspell, brotli, c-ares, libidn, libmetalink, libssh2, jansson, jemalloc, libev, libevent, nghttp2, openldap, rtmpdump, curl-openssl, libtool, unixodbc, freetds, libpng, freetype, libffi, pcre, gdbm, readline, sqlite, xz, python, glib, gmp, icu4c, jpeg, libpq, libsodium, libzip, oniguruma, tidy-html5, libtiff and webp
    ==> Installing php dependency: apr
    ==> Downloading https://homebrew.bintray.com/bottles/apr-1.7.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/27/277c42fcf2f5ca298a14279d1325f58da89ee4ec2132b3ccca9bf8dfdc354c48?__gda__=exp=1582818809~hmac=f2d3781a3f55ede73a8228a670fd4bb3
    ######################################################################## 100.0%
    ==> Pouring apr-1.7.0.catalina.bottle.tar.gz
    ==> Caveats
    apr is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT package contains apr.
    
    If you need to have apr first in your PATH run:
      echo 'export PATH="/usr/local/opt/apr/bin:$PATH"' >> ~/.bash_profile
    
    ==> Summary
    🍺  /usr/local/Cellar/apr/1.7.0: 59 files, 1.4MB
    ==> Installing php dependency: apr-util
    ==> Downloading https://homebrew.bintray.com/bottles/apr-util-1.6.1_3.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/42/425955a21c3fec8e78f365cd7fc4c6c4ec95d074f720a9b24e8237af90cc4dcc?__gda__=exp=1582818813~hmac=4d929232031855699c88b06a937ed7c1
    ######################################################################## 100.0%
    ==> Pouring apr-util-1.6.1_3.catalina.bottle.tar.gz
    ==> Caveats
    apr-util is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT package contains apr.
    
    If you need to have apr-util first in your PATH run:
      echo 'export PATH="/usr/local/opt/apr-util/bin:$PATH"' >> ~/.bash_profile
    
    ==> Summary
    🍺  /usr/local/Cellar/apr-util/1.6.1_3: 54 files, 785.7KB
    ==> Installing php dependency: argon2
    ==> Downloading https://homebrew.bintray.com/bottles/argon2-20190702_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/f8/f8e550c8597728bb9edc5a548497fd7b1219203932cd0f93ecc97a4fbf0bdad8?__gda__=exp=1582818817~hmac=4ee916b7082f81e1725d6316e61eab6c
    ######################################################################## 100.0%
    ==> Pouring argon2-20190702_1.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/argon2/20190702_1: 12 files, 599.2KB
    ==> Installing php dependency: aspell
    ==> Downloading https://homebrew.bintray.com/bottles/aspell-0.60.8.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/f3/f34a5b53fa80f6f0ea3cef83d04eceed93f918153463e0b77a596374a842249d?__gda__=exp=1582818821~hmac=7b4174d19afed7b3c48ca30adae637f8
    ######################################################################## 100.0%
    ==> Pouring aspell-0.60.8.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/aspell/0.60.8: 767 files, 322.4MB
    ==> Installing php dependency: brotli
    ==> Downloading https://homebrew.bintray.com/bottles/brotli-1.0.7.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/81/81be7d1d110787a534cd57cc1ec6bb5032d81e3928d9103ce1e654560c6848ca?__gda__=exp=1582818842~hmac=298075c6a3cd2d1c760e0d8995bc45e7
    ######################################################################## 100.0%
    ==> Pouring brotli-1.0.7.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/brotli/1.0.7: 25 files, 2.2MB
    ==> Installing php dependency: c-ares
    ==> Downloading https://homebrew.bintray.com/bottles/c-ares-1.15.0.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring c-ares-1.15.0.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/c-ares/1.15.0: 72 files, 487.1KB
    ==> Installing php dependency: libidn
    ==> Downloading https://homebrew.bintray.com/bottles/libidn-1.35.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/a7/a720f31e3d82a3e537ae2fbaf88bdfcf537b3452615a170c72714c111df4a661?__gda__=exp=1582818853~hmac=52687b3d0d6f43a4c1e222899d84f59a
    ######################################################################## 100.0%
    ==> Pouring libidn-1.35.catalina.bottle.tar.gz
    ==> Caveats
    Emacs Lisp files have been installed to:
      /usr/local/share/emacs/site-lisp/libidn
    ==> Summary
    🍺  /usr/local/Cellar/libidn/1.35: 72 files, 1.4MB
    ==> Installing php dependency: libmetalink
    ==> Downloading https://homebrew.bintray.com/bottles/libmetalink-0.1.3.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring libmetalink-0.1.3.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/libmetalink/0.1.3: 31 files, 182.9KB
    ==> Installing php dependency: libssh2
    ==> Downloading https://homebrew.bintray.com/bottles/libssh2-1.9.0_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/2c/2c4dcf8149663f9a133deac5bc42ce308d1ced90227cac391ca30b0ab2d381f9?__gda__=exp=1582818862~hmac=ab4aaaefec8fb67734e8b292b0ec9e82
    ######################################################################## 100.0%
    ==> Pouring libssh2-1.9.0_1.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/libssh2/1.9.0_1: 184 files, 941KB
    ==> Installing php dependency: jansson
    ==> Downloading https://homebrew.bintray.com/bottles/jansson-2.12.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring jansson-2.12.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/jansson/2.12: 11 files, 162.9KB
    ==> Installing php dependency: jemalloc
    ==> Downloading https://homebrew.bintray.com/bottles/jemalloc-5.2.1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/13/13080a13f5e1a0699adaed5ba9906616850c2e8a75a829f8be6a2e6183fb16e5?__gda__=exp=1582818871~hmac=bd6b81c3263bfa3ec7984d9e0e0bfe1a
    ######################################################################## 100.0%
    ==> Pouring jemalloc-5.2.1.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/jemalloc/5.2.1: 16 files, 2MB
    ==> Installing php dependency: libev
    ==> Downloading https://homebrew.bintray.com/bottles/libev-4.31.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring libev-4.31.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/libev/4.31: 12 files, 451.3KB
    ==> Installing php dependency: libevent
    ==> Downloading https://homebrew.bintray.com/bottles/libevent-2.1.11_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/9d/9d262f9ffb2268340a89c713826d8ca068bcac06c30baf49e6184ab4660d977a?__gda__=exp=1582818882~hmac=ff4a6fa9eac7556fad02a6429e4046de
    ######################################################################## 100.0%
    ==> Pouring libevent-2.1.11_1.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/libevent/2.1.11_1: 1,063 files, 5MB
    ==> Installing php dependency: nghttp2
    ==> Downloading https://homebrew.bintray.com/bottles/nghttp2-1.40.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/7d/7d8e5ffd4a51ee4c511f19b37d0285880d27239e0880113b6ad1412432aa9d11?__gda__=exp=1582818889~hmac=d17dd8c2d092360925cf7fec31cc91f2
    ######################################################################## 100.0%
    ==> Pouring nghttp2-1.40.0.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/nghttp2/1.40.0: 26 files, 2.7MB
    ==> Installing php dependency: openldap
    ==> Downloading https://homebrew.bintray.com/bottles/openldap-2.4.49.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/26/26efb37f53ae1a3815213adf9ab815c66b7197a3d212f994dd4e5b4140cf3e4e?__gda__=exp=1582818892~hmac=a1323e810a84f9db03ef763591a96981
    ######################################################################## 100.0%
    ==> Pouring openldap-2.4.49.catalina.bottle.tar.gz
    ==> Caveats
    openldap is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
    
    If you need to have openldap first in your PATH run:
      echo 'export PATH="/usr/local/opt/openldap/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/openldap/sbin:$PATH"' >> ~/.bash_profile
    
    For compilers to find openldap you may need to set:
      export LDFLAGS="-L/usr/local/opt/openldap/lib"
      export CPPFLAGS="-I/usr/local/opt/openldap/include"
    
    ==> Summary
    🍺  /usr/local/Cellar/openldap/2.4.49: 328 files, 6.7MB
    ==> Installing php dependency: rtmpdump
    ==> Downloading https://homebrew.bintray.com/bottles/rtmpdump-2.4+20151223_1.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring rtmpdump-2.4+20151223_1.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/rtmpdump/2.4+20151223_1: 20 files, 443.4KB
    ==> Installing php dependency: curl-openssl
    ==> Downloading https://homebrew.bintray.com/bottles/curl-openssl-7.68.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/c4/c4dd2e8a36d2e4487d9d8c483d42be8b2aa3c5a0a326c10b35aeca82fccd8c0f?__gda__=exp=1582818904~hmac=571f4b21636431a1d9ef06c557839443
    ######################################################################## 100.0%
    ==> Pouring curl-openssl-7.68.0.catalina.bottle.tar.gz
    ==> Caveats
    curl-openssl is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
    
    If you need to have curl-openssl first in your PATH run:
      echo 'export PATH="/usr/local/opt/curl-openssl/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find curl-openssl you may need to set:
      export LDFLAGS="-L/usr/local/opt/curl-openssl/lib"
      export CPPFLAGS="-I/usr/local/opt/curl-openssl/include"
    
    For pkg-config to find curl-openssl you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/curl-openssl/lib/pkgconfig"
    
    ==> Summary
    🍺  /usr/local/Cellar/curl-openssl/7.68.0: 456 files, 3.4MB
    ==> Installing php dependency: libtool
    ==> Downloading https://homebrew.bintray.com/bottles/libtool-2.4.6_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/38/38212486e78db33048438cffe38b6914f13553e7bb8c7d3d2fbecb18a6481d3c?__gda__=exp=1582818908~hmac=130c8c5a3f79ba8697226122d5728099
    ######################################################################## 100.0%
    ==> Pouring libtool-2.4.6_1.catalina.bottle.tar.gz
    ==> Caveats
    In order to prevent conflicts with Apple's own libtool we have prepended a "g"
    so, you have instead: glibtool and glibtoolize.
    ==> Summary
    🍺  /usr/local/Cellar/libtool/2.4.6_1: 71 files, 3.7MB
    ==> Installing php dependency: unixodbc
    ==> Downloading https://homebrew.bintray.com/bottles/unixodbc-2.3.7.catalina.bottle.1.tar.gz
    ==> Downloading from https://akamai.bintray.com/03/03ba378d971af98d07652f978548ffacb4c155ba11dd36af9d46af36e2d5674b?__gda__=exp=1582818912~hmac=efb8bc9f866a054e3cd679232d1cd0c3
    ######################################################################## 100.0%
    ==> Pouring unixodbc-2.3.7.catalina.bottle.1.tar.gz
    🍺  /usr/local/Cellar/unixodbc/2.3.7: 46 files, 1.9MB
    ==> Installing php dependency: freetds
    ==> Downloading https://homebrew.bintray.com/bottles/freetds-1.1.24.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/36/363d44ed3a0ec8f9768987bc6d873913dd30818933ea9bb9c290580dbd6d11ab?__gda__=exp=1582818915~hmac=6a75fe2584c3fdb8191aa24f792faa73
    ######################################################################## 100.0%
    ==> Pouring freetds-1.1.24.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/freetds/1.1.24: 66 files, 3.5MB
    ==> Installing php dependency: libpng
    ==> Downloading https://homebrew.bintray.com/bottles/libpng-1.6.37.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/c8/c8e74da602c21f978cd7ee3d489979b4fc6681e71f678a1d99012943ee3a909f?__gda__=exp=1582818919~hmac=65f5c5c989008e57fec50b0373e0d4fd
    ######################################################################## 100.0%
    ==> Pouring libpng-1.6.37.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/libpng/1.6.37: 27 files, 1.2MB
    ==> Installing php dependency: freetype
    ==> Downloading https://homebrew.bintray.com/bottles/freetype-2.10.1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/dd/ddd686141a969caec11ea248324e3736f6db50a54673187be103dde39cb01ebf?__gda__=exp=1582818922~hmac=b02f5e3ce47dc74d07c17a18141ee96c
    ######################################################################## 100.0%
    ==> Pouring freetype-2.10.1.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/freetype/2.10.1: 61 files, 2.2MB
    ==> Installing php dependency: libffi
    ==> Downloading https://homebrew.bintray.com/bottles/libffi-3.2.1.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring libffi-3.2.1.catalina.bottle.tar.gz
    ==> Caveats
    libffi is keg-only, which means it was not symlinked into /usr/local,
    because some formulae require a newer version of libffi.
    
    For compilers to find libffi you may need to set:
      export LDFLAGS="-L/usr/local/opt/libffi/lib"
    
    For pkg-config to find libffi you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"
    
    ==> Summary
    🍺  /usr/local/Cellar/libffi/3.2.1: 16 files, 300.7KB
    ==> Installing php dependency: pcre
    ==> Downloading https://homebrew.bintray.com/bottles/pcre-8.44.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/f8/f8ac266e04f984fa55091a43f0fdc39a40d57c2489d289a186c88ccedaba7eeb?__gda__=exp=1582818931~hmac=61228c226c610e48e353419df861e9e8
    ######################################################################## 100.0%
    ==> Pouring pcre-8.44.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/pcre/8.44: 204 files, 5.5MB
    ==> Installing php dependency: gdbm
    ==> Downloading https://homebrew.bintray.com/bottles/gdbm-1.18.1.catalina.bottle.1.tar.gz
    ######################################################################## 100.0%
    ==> Pouring gdbm-1.18.1.catalina.bottle.1.tar.gz
    🍺  /usr/local/Cellar/gdbm/1.18.1: 20 files, 602.8KB
    ==> Installing php dependency: readline
    ==> Downloading https://homebrew.bintray.com/bottles/readline-8.0.4.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/6a/6ae1c8e7c783f32bd22c6085caa4d838fed7fb386da7e40ca47b87ec9b1237d6?__gda__=exp=1582818942~hmac=ebac9456e17b393d45f7e9415ea5c5e3
    ######################################################################## 100.0%
    ==> Pouring readline-8.0.4.catalina.bottle.tar.gz
    ==> Caveats
    readline is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides the BSD libedit library, which shadows libreadline.
    In order to prevent conflicts when programs look for libreadline we are
    defaulting this GNU Readline installation to keg-only.
    
    For compilers to find readline you may need to set:
      export LDFLAGS="-L/usr/local/opt/readline/lib"
      export CPPFLAGS="-I/usr/local/opt/readline/include"
    
    For pkg-config to find readline you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"
    
    ==> Summary
    🍺  /usr/local/Cellar/readline/8.0.4: 48 files, 1.5MB
    ==> Installing php dependency: sqlite
    ==> Downloading https://homebrew.bintray.com/bottles/sqlite-3.31.1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/e0/e09e8c96db88178e4f47b0cdab6477c46fa582326900ec9309c3ce1b9f7ff9aa?__gda__=exp=1582818945~hmac=2c50e62518d35724bc04bdacbed29792
    ######################################################################## 100.0%
    ==> Pouring sqlite-3.31.1.catalina.bottle.tar.gz
    ==> Caveats
    sqlite is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides an older sqlite3.
    
    If you need to have sqlite first in your PATH run:
      echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find sqlite you may need to set:
      export LDFLAGS="-L/usr/local/opt/sqlite/lib"
      export CPPFLAGS="-I/usr/local/opt/sqlite/include"
    
    For pkg-config to find sqlite you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/sqlite/lib/pkgconfig"
    
    ==> Summary
    🍺  /usr/local/Cellar/sqlite/3.31.1: 11 files, 4MB
    ==> Installing php dependency: xz
    ==> Downloading https://homebrew.bintray.com/bottles/xz-5.2.4.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/5a/5aa90b77d5e772dacd38146bbb7ff2fa43f210e3779def2c0f16cbdae8589aa3?__gda__=exp=1582818949~hmac=0457e5b1e3c2479b062e105d9529557e
    ######################################################################## 100.0%
    ==> Pouring xz-5.2.4.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/xz/5.2.4: 92 files, 1MB
    ==> Installing php dependency: python
    ==> Downloading https://homebrew.bintray.com/bottles/python-3.7.6_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/38/3871ef8b53270576c46489ae397f245b84772c405085238790cf5faa1853b33a?__gda__=exp=1582818952~hmac=c9375e123cb128e1ffa60068e0065ded
    ######################################################################## 100.0%
    ==> Pouring python-3.7.6_1.catalina.bottle.tar.gz
    ==> /usr/local/Cellar/python/3.7.6_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.7.6_1/bin --install-lib=/usr/l
    ==> /usr/local/Cellar/python/3.7.6_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.7.6_1/bin --install-lib=/usr/l
    ==> /usr/local/Cellar/python/3.7.6_1/bin/python3 -s setup.py --no-user-cfg install --force --verbose --install-scripts=/usr/local/Cellar/python/3.7.6_1/bin --install-lib=/usr/l
    ==> Caveats
    Python has been installed as
      /usr/local/bin/python3
    
    Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
    `python3`, `python3-config`, `pip3` etc., respectively, have been installed into
      /usr/local/opt/python/libexec/bin
    
    You can install Python packages with
      pip3 install <package>
    They will install into the site-package directory
      /usr/local/lib/python3.7/site-packages
    
    See: https://docs.brew.sh/Homebrew-and-Python
    ==> Summary
    🍺  /usr/local/Cellar/python/3.7.6_1: 3,977 files, 61MB
    ==> Installing php dependency: glib
    ==> Downloading https://homebrew.bintray.com/bottles/glib-2.62.5.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/ff/ffe825b5349fa644019af75ab82581fe312c689ab4c6add223ee119e1f35733d?__gda__=exp=1582818975~hmac=15d55697b0725c34ea51e0782a75df0e
    ######################################################################## 100.0%
    ==> Pouring glib-2.62.5.catalina.bottle.tar.gz
    ==> Caveats
    Bash completion has been installed to:
      /usr/local/etc/bash_completion.d
    ==> Summary
    🍺  /usr/local/Cellar/glib/2.62.5: 435 files, 15.5MB
    ==> Installing php dependency: gmp
    ==> Downloading https://homebrew.bintray.com/bottles/gmp-6.2.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/2e/2e6acd6e62d1b8ef0800061e113aea30a63f56b32b99c010234c0420fd6d3ecf?__gda__=exp=1582818981~hmac=62c42e81972cc0a18886fea789616644
    ######################################################################## 100.0%
    ==> Pouring gmp-6.2.0.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/gmp/6.2.0: 20 files, 3.2MB
    ==> Installing php dependency: icu4c
    ==> Downloading https://homebrew.bintray.com/bottles/icu4c-64.2.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/e9/e9ae7bb5a76b48e82f56bc744eaaa1e9bdb5ca49ea6b5a2e4d52f57ad331f063?__gda__=exp=1582818985~hmac=7c3a12000919259856aca1456a11137e
    ######################################################################## 100.0%
    ==> Pouring icu4c-64.2.catalina.bottle.tar.gz
    ==> Caveats
    icu4c is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides libicucore.dylib (but nothing else).
    
    If you need to have icu4c first in your PATH run:
      echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile
    
    For compilers to find icu4c you may need to set:
      export LDFLAGS="-L/usr/local/opt/icu4c/lib"
      export CPPFLAGS="-I/usr/local/opt/icu4c/include"
    
    For pkg-config to find icu4c you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
    
    ==> Summary
    🍺  /usr/local/Cellar/icu4c/64.2: 257 files, 69.3MB
    ==> Installing php dependency: jpeg
    ==> Downloading https://homebrew.bintray.com/bottles/jpeg-9d.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/8f/8f7b82a952fb3937889c7f22da1403e5338cd320495917eb26b0c5b2e614791c?__gda__=exp=1582818991~hmac=f6095ad96f1524b71693e95daf53ae11
    ######################################################################## 100.0%
    ==> Pouring jpeg-9d.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/jpeg/9d: 21 files, 775.2KB
    ==> Installing php dependency: libpq
    ==> Downloading https://homebrew.bintray.com/bottles/libpq-12.2.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/64/64bab543c341a2e26246aa434c8ef27c48985f397996a975751f2c5ea91cd3c3?__gda__=exp=1582818995~hmac=e262fb3d2bd0116e4e047d1fcb36f28b
    ######################################################################## 100.0%
    ==> Pouring libpq-12.2.catalina.bottle.tar.gz
    ==> Caveats
    libpq is keg-only, which means it was not symlinked into /usr/local,
    because conflicts with postgres formula.
    
    If you need to have libpq first in your PATH run:
      echo 'export PATH="/usr/local/opt/libpq/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find libpq you may need to set:
      export LDFLAGS="-L/usr/local/opt/libpq/lib"
      export CPPFLAGS="-I/usr/local/opt/libpq/include"
    
    For pkg-config to find libpq you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/libpq/lib/pkgconfig"
    
    ==> Summary
    🍺  /usr/local/Cellar/libpq/12.2: 2,240 files, 23.8MB
    ==> Installing php dependency: libsodium
    ==> Downloading https://homebrew.bintray.com/bottles/libsodium-1.0.18_1.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/db/db372521cd0b1861a5b578bee22426f3a1f4f7cb3c382be1f842da4715dc65bd?__gda__=exp=1582819005~hmac=b1719932c78dd721b5c91e5e01cd0d0f
    ######################################################################## 100.0%
    ==> Pouring libsodium-1.0.18_1.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/libsodium/1.0.18_1: 73 files, 1012.8KB
    ==> Installing php dependency: libzip
    ==> Downloading https://homebrew.bintray.com/bottles/libzip-1.6.1.catalina.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring libzip-1.6.1.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/libzip/1.6.1: 135 files, 598.5KB
    ==> Installing php dependency: oniguruma
    ==> Downloading https://homebrew.bintray.com/bottles/oniguruma-6.9.4.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/05/05e25bc53db0cf338a7f765da76c66260972d6b4e259be415bc17807a8b60fe9?__gda__=exp=1582819014~hmac=4162f73fbfb682871a1591cd1ae35a3e
    ######################################################################## 100.0%
    ==> Pouring oniguruma-6.9.4.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/oniguruma/6.9.4: 17 files, 1.3MB
    ==> Installing php dependency: tidy-html5
    ==> Downloading https://homebrew.bintray.com/bottles/tidy-html5-5.6.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/fb/fb2134180fbdb92cc10f3fad33c769073adceb7796e465db7dbc3778f7d3547a?__gda__=exp=1582819017~hmac=11c55ddefda47fe9d139207d8f3f8be0
    ######################################################################## 100.0%
    ==> Pouring tidy-html5-5.6.0.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/tidy-html5/5.6.0: 14 files, 2.6MB
    ==> Installing php dependency: libtiff
    ==> Downloading https://homebrew.bintray.com/bottles/libtiff-4.1.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/44/449bd9123e73e4c4eab85b77322d769cc9df0f6adab05e9b9319b012d1215a68?__gda__=exp=1582819021~hmac=c5a5f7355528adb9b159a3501bcee6b2
    ######################################################################## 100.0%
    ==> Pouring libtiff-4.1.0.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/libtiff/4.1.0: 247 files, 3.7MB
    ==> Installing php dependency: webp
    ==> Downloading https://homebrew.bintray.com/bottles/webp-1.1.0.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/27/27c76a7054277ff5a2e844c5996fc731d8644acbaaa505d35dba42c4a48a0c51?__gda__=exp=1582819025~hmac=10924b18bf5bf57f77e57dfe35f6a184
    ######################################################################## 100.0%
    ==> Pouring webp-1.1.0.catalina.bottle.tar.gz
    🍺  /usr/local/Cellar/webp/1.1.0: 39 files, 2.1MB
    ==> Installing php
    ==> Downloading https://homebrew.bintray.com/bottles/php-7.4.3.catalina.bottle.tar.gz
    ==> Downloading from https://akamai.bintray.com/93/9370af1b117049783f81968fc800d1710224581cb8d9f396c38d9eef8aedf3ac?__gda__=exp=1582819028~hmac=03e1443c8f4e7eebc970641b392b094c
    ######################################################################## 100.0%
    ==> Pouring php-7.4.3.catalina.bottle.tar.gz
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set php_ini /usr/local/etc/php/7.4/php.ini system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set php_dir /usr/local/share/pear system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set doc_dir /usr/local/share/pear/doc system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set ext_dir /usr/local/lib/php/pecl/20190902 system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set bin_dir /usr/local/opt/php/bin system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set data_dir /usr/local/share/pear/data system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set cfg_dir /usr/local/share/pear/cfg system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set www_dir /usr/local/share/pear/htdocs system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set man_dir /usr/local/share/man system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set test_dir /usr/local/share/pear/test system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear config-set php_bin /usr/local/opt/php/bin/php system
    ==> /usr/local/Cellar/php/7.4.3/bin/pear update-channels
    ==> Caveats
    To enable PHP in Apache add the following to httpd.conf and restart Apache:
        LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so
    
        <FilesMatch \.php$>
            SetHandler application/x-httpd-php
        </FilesMatch>
    
    Finally, check DirectoryIndex includes index.php
        DirectoryIndex index.php index.html
    
    The php.ini and php-fpm.ini file can be found in:
        /usr/local/etc/php/7.4/
    
    To have launchd start php now and restart at login:
      brew services start php
    Or, if you don't want/need a background service you can just run:
      php-fpm
    ==> Summary
    🍺  /usr/local/Cellar/php/7.4.3: 517 files, 76MB
    ==> Caveats
    ==> apr
    apr is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT package contains apr.
    
    If you need to have apr first in your PATH run:
      echo 'export PATH="/usr/local/opt/apr/bin:$PATH"' >> ~/.bash_profile
    
    ==> apr-util
    apr-util is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT package contains apr.
    
    If you need to have apr-util first in your PATH run:
      echo 'export PATH="/usr/local/opt/apr-util/bin:$PATH"' >> ~/.bash_profile
    
    ==> libidn
    Emacs Lisp files have been installed to:
      /usr/local/share/emacs/site-lisp/libidn
    ==> openldap
    openldap is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
    
    If you need to have openldap first in your PATH run:
      echo 'export PATH="/usr/local/opt/openldap/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/openldap/sbin:$PATH"' >> ~/.bash_profile
    
    For compilers to find openldap you may need to set:
      export LDFLAGS="-L/usr/local/opt/openldap/lib"
      export CPPFLAGS="-I/usr/local/opt/openldap/include"
    
    ==> curl-openssl
    curl-openssl is keg-only, which means it was not symlinked into /usr/local,
    because macOS already provides this software and installing another version in
    parallel can cause all kinds of trouble.
    
    If you need to have curl-openssl first in your PATH run:
      echo 'export PATH="/usr/local/opt/curl-openssl/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find curl-openssl you may need to set:
      export LDFLAGS="-L/usr/local/opt/curl-openssl/lib"
      export CPPFLAGS="-I/usr/local/opt/curl-openssl/include"
    
    For pkg-config to find curl-openssl you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/curl-openssl/lib/pkgconfig"
    
    ==> libtool
    In order to prevent conflicts with Apple's own libtool we have prepended a "g"
    so, you have instead: glibtool and glibtoolize.
    ==> libffi
    libffi is keg-only, which means it was not symlinked into /usr/local,
    because some formulae require a newer version of libffi.
    
    For compilers to find libffi you may need to set:
      export LDFLAGS="-L/usr/local/opt/libffi/lib"
    
    For pkg-config to find libffi you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"
    
    ==> readline
    readline is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides the BSD libedit library, which shadows libreadline.
    In order to prevent conflicts when programs look for libreadline we are
    defaulting this GNU Readline installation to keg-only.
    
    For compilers to find readline you may need to set:
      export LDFLAGS="-L/usr/local/opt/readline/lib"
      export CPPFLAGS="-I/usr/local/opt/readline/include"
    
    For pkg-config to find readline you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/readline/lib/pkgconfig"
    
    ==> sqlite
    sqlite is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides an older sqlite3.
    
    If you need to have sqlite first in your PATH run:
      echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find sqlite you may need to set:
      export LDFLAGS="-L/usr/local/opt/sqlite/lib"
      export CPPFLAGS="-I/usr/local/opt/sqlite/include"
    
    For pkg-config to find sqlite you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/sqlite/lib/pkgconfig"
    
    ==> python
    Python has been installed as
      /usr/local/bin/python3
    
    Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
    `python3`, `python3-config`, `pip3` etc., respectively, have been installed into
      /usr/local/opt/python/libexec/bin
    
    You can install Python packages with
      pip3 install <package>
    They will install into the site-package directory
      /usr/local/lib/python3.7/site-packages
    
    See: https://docs.brew.sh/Homebrew-and-Python
    ==> glib
    Bash completion has been installed to:
      /usr/local/etc/bash_completion.d
    ==> icu4c
    icu4c is keg-only, which means it was not symlinked into /usr/local,
    because macOS provides libicucore.dylib (but nothing else).
    
    If you need to have icu4c first in your PATH run:
      echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
      echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile
    
    For compilers to find icu4c you may need to set:
      export LDFLAGS="-L/usr/local/opt/icu4c/lib"
      export CPPFLAGS="-I/usr/local/opt/icu4c/include"
    
    For pkg-config to find icu4c you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
    
    ==> libpq
    libpq is keg-only, which means it was not symlinked into /usr/local,
    because conflicts with postgres formula.
    
    If you need to have libpq first in your PATH run:
      echo 'export PATH="/usr/local/opt/libpq/bin:$PATH"' >> ~/.bash_profile
    
    For compilers to find libpq you may need to set:
      export LDFLAGS="-L/usr/local/opt/libpq/lib"
      export CPPFLAGS="-I/usr/local/opt/libpq/include"
    
    For pkg-config to find libpq you may need to set:
      export PKG_CONFIG_PATH="/usr/local/opt/libpq/lib/pkgconfig"
    
    ==> php
    To enable PHP in Apache add the following to httpd.conf and restart Apache:
        LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so
    
        <FilesMatch \.php$>
            SetHandler application/x-httpd-php
        </FilesMatch>
    
    Finally, check DirectoryIndex includes index.php
        DirectoryIndex index.php index.html
    
    The php.ini and php-fpm.ini file can be found in:
        /usr/local/etc/php/7.4/
    
    To have launchd start php now and restart at login:
      brew services start php
    Or, if you don't want/need a background service you can just run:
      php-fpm
    
Viewing all 21344 articles
Browse latest View live