URIとURLの違い

 

先日、PHPカンファレンスで購入した「Webを支える技術」を読んでいて、
URIとURLの違いを今更あんまり理解できてないとわかったので、まとめてみます。

URLとURIの意味は?

  • URL …Uniform Resource Locator(統一リソース位置指定子)
  • URI …Uniform Resource Identifier(統一リソース識別子)

もう一つ似た言葉があります!

  • URN …Uniform Resource Name(統一リソース名)

 

URLとは?

リソースの場所を示すもの。

 

URNとは?

ドメイン名に依存しない、独立したリソース名。URLがドメイン更新切れだったり、サーバの障害でアクセスできないときに、恒久的にIDを振るための仕様。

しかし、URLは永続的にアクセスできるべきという考えから、URNは使うまではないことが多くなり、普及していない。

 

URIとは?

リソースを識別するもの。

URIが位置的なものを示したい時はURL、URIが名前を示したいときはURN

→URIは、URLとURNの両方の意味を含むもの

まとめ

  • URL⇄URIと読み替えても、だいたいはok。
  • 詳しく言うと、URLはURIであり、URNもURIである。
  • URIの方が広い意味で使えるので便利だし、技術者っぽい

 

参考:https://qiita.com/Zuishin/items/3bd56117ab08ec2ec818

PHPカンファレンス2019に行ってきましたレポート

さっそくですが、先日PHPカンファレンス2019に参加してきたので、超簡単にダイジェストをお送りします。

今年のPHPカンファレンスは、どこの地方も参加できてなかったので、久々のカンファレンスで高まりました!!!

今年も、会場は大田区産業プラザ PiOでした。毎年同じ場所だと東京の土地勘がないわたしにはとてもありがたいです!

毎回思いますが、人多いですね!

セッション「PHPの今とこれから2019

PHP8.0

  • 2021.9くらいにでる予定らしい
  • JIT(Just-in-time)
  • multiple(union) typeの型指定をint|stringって書けるようになる

今までは、PHPDocのアノテーションでいい感じにしてた。

class Hoge
{
  /**
   * @param int|string
   */
  public function foo($value): void
  {
    var_dump($value);
  }
}

$hoge = new Hoge;
$hoge->foo(1);           //int(1)
$hoge->foo('one');  //string(3)

PHP8から、こうやってかけるようになるらしい

class Hoge
{
  public function foo(int|string $value): void
  {
    var_dump($value);
  }
}

PHP7.4

 

参考:https://www.amitmerchant.com/union-types-php/
参考:https://qiita.com/rana_kualu/items/ba312d2789bd228f887a
参考:https://kinsta.com/jp/blog/php-7-4/

セッション「コミュニティアップデート powered by GMOインターネット

PHPの地方コミュニティのいろいろを聞けました。

  • 勉強会やイベントでの自己紹介って結構大事らしい
  • 山陰ぺちぱーずという、地元に割と近いコミュニティがあるのを知った

 

セッション「思想と理想の果てに — クリーンアーキテクチャのWEBフレームワークを作ろう」

https://nrslib.com/phpcon-2019-proposal/

  • ヘキサゴナルアーキテクチャ(初耳)
  • スキャフォールディング機能(初耳)

 

セッション「PHPUnit: Past, Present and Future 」

PHPUnitの生みの親、セバスチャンさんの登壇でした!
全部英語です。こういう時に毎回英語頑張っておけばよかったと思います😂

心から言いたいことは「PHPUnitを作ってくれて、ありがとうございます🙏」

セッション「脆弱性から学ぶ Webセキュリティ Part2」

https://speakerdeck.com/hypermkt/study-web-security-from-vulnerability2

  • 脆弱性の怪しい匂いに気付こう
  • 根本的解決>保険的対策
  • ディレクトリトラバーサル対策
    • ファイルパスで判定してるやつとかは怪しい臭い
  • OSコマンドインジェクションの対策
    • シェル呼び出し機能関数を使わない
    • escape shell art
  • セッション管理の不備
    • 攻撃例
      • セッションハイジャック
      • セッションIDの固定化
    • 対策法
      • XXS対策
      • セッションIDを推測困難なものにする
      • セッションIDはクッキーのみで保持する
      • php.iniの確認(デフォルトで🙆‍♂️)
        • session.use_trans_sid = 0 [URLにセッションIDを保持しない]
        • session.use_only_cookies = 1
        • session.use_cookies = 1
      • 認証が成功したら新しいセッションを開始する

 

セッション「REST 6+4の制約」

https://speakerdeck.com/koriym/rest-6-plus-4falsezhi-yue

  • RESTにとって、URIは重要ではない
  • v1とか、バージョニングは含めたらrestではない
  • REST =Hypermedia API
  • クライアントはサーバーが何の言語かしらなくていい
  • キャッシュ スケールのため、🙅‍♀️パフォーマンス
  • RFC7234に対応:Kevinrob/guzzle-cache-middleware

質問の時に、おっしゃられてた「技術に対しての背景を理解しよう」というのが、印象的でした。

自分が使っている言語やフレームワークを作ってくれた人って、相当尊敬してるのに名前知らないなーって痛感したので、もっと歴史とか人物とか関係性とかってスルーしてたので、興味持とうって思いました。(偉人紹介ブログ描こうかな😎)

 

入手品

入手品一覧

  • elePHPant(買ってもらった😆)
  • 電子メモパット(アンケート答えてもらった)
  • メルカリノート、SIMケース、ステッカー(無条件のもらった)
  • スマホスタンド(ちょー便利)、チョコ
  • 粗品タオル
  •  食べログの人になれるやつ(ガチャはずれたけどくれた😆)

 


(新幹線で読むように買ったけど、疲れて10ページくらいしか読めんかった・・・。通勤の肥やしにしよう。)

郡山さんのセッションを聞く前に、この本で予習しておけばもっと理解できたなあって思いました😭

 

 

いろんな方のセッションが聞けたのと、お話もできたのでいい機会でしたー!

次はPHPerKaigi2020

これからももっと勉強して、いいコードかけるようになりたいという気持ちになりました^^

 

\スタッフの皆さん、ありがとうございました🙇‍♂️/

 

SpotifyAPIでクイックプレイリスト作成ツールを作ってみた

 

お久しぶりです。長いことサボってました…😓
ちょっと怠けてる今日この頃です、、
残りの2019年気を引き締めて頑張ります🙌

 

サボってる間、何をしていたかというと、ただただライブに行きまくってました。
ライブのはしごとかもしちゃってました!疲れましたけど、幸せでした😇

行くライブは対バンが多かったので、ライブ前の予習にプレイリストを作ってました。(ライブ後に作ることもありますが)
わたしは横着なので、そのプレイリストを作ることさえ面倒でした。
そこで、アーティスト名を入力するだけで、Spotifyプレイリストを作成してくれるツールを作りましたー!✨

https://dj-kin29.herokuapp.com/

 

ぜひ対バンや小さめのフェス前に、全出演アーティストを入力してサクっとプレイリスト作って楽しんじゃってください✊!!

 

使い方

  1. https://dj-kin29.herokuapp.com/にアクセスし、各項目の入力をする。
    • アーティスト名 ( 必須 ) [5個まで入力可]
    • プレイリスト名 ( 任意 ) [default: dj-kin29-日時]
    • cookie使用の許可 ( 必須 )

  2. (初回のみ)Spotifyログインをし、アクセス許可を同意する。
  3. プレイリスト(非公開)が作成されます!!!
    リンクより、プレイリストに飛ぶことができます。

 

※ アーティスト名検索は、ヒットした一番上のものとするので意図しないアーティストでプレイリストが作成されることがありますので、ご注意ください ⚠️

 

余談ですが、ここで入力したアーティストは、今私がはまっているアーティストさん達です☺️
ぜひ聞いてみてください🎧⚡️

 

使ったもの

参考

 

SpotifyAPIの使い方や、実装内容はまた別記事で書きたいと思います!

 

可変長引数(可変個引数)とは?

 

どうも!

名古屋に越してきてまだ3ヶ月ばかりですが、早くも県内で引っ越すことになりました、面倒ですねええ、引っ越し😩

 

本題

PHP(JSでもみたことあるような気がする)で、

function method(...$params){}

みたいに関数の引数に使われてる「…」があると思うんですが、何してんのか分からないので調べてみました!

 

 

...$params」の正体

調べてみたら、可変長引数(可変個引数)というものだそうです。

引数に「...$params」を含む関数のように、引数が可変する関数ことを可変個引数関数というみたいです。

PHP5.6以降から使用できるようになり、PHP5.5以前の場合は func_num_args()func_get_arg() および func_get_args() で代用するとのことです。

 

参考:https://www.php.net/manual/ja/migration56.new-features.php#migration56.new-features.variadics

 

 

使い方

php.netに聞いてみると、、、

引数リストに … トークンを含めることで、 その関数が可変長の引数を受け取ることを示せます。 引数は、指定した変数に配列として渡されます。

参照:https://www.php.net/manual/ja/functions.arguments.php#functions.variable-arg-list

 

 

使ってみる。

testKahenChoArg.php

<?php

function echoList($listName, ...$items)
{
  echo $listName . PHP_EOL;

  foreach($items as $item) {
    echo '- [ ] ' . $item . PHP_EOL;
  }
}

echoList('引っ越しのtodo', '転出届を出す', '転入届を出す', '免許証の住所変更', 'クレカの住所変更');
echoList('購入リスト', 'カーテン',  'トイレットペーパー');

実行結果

$ php testKahenChoArg.php
引っ越しのtodo
- [ ] 転出届を出す
- [ ] 転入届を出す
- [ ] 免許証の住所変更
- [ ] クレカの住所変更
購入リスト
- [ ] カーテン
- [ ] トイレットペーパー

 

なるほど〜😇引数を配列にして関数に渡してくれるんですね。

引数の数が明確でない時とかに使えそうですね!!!

おそらく使うことはあまりないと思うのですが、フレームワークなどを読んでる時にこの「…」がでてきて何をしているのか分からなかったので、スッキリしました^^

 

npxで電子名刺つくったよ!

 

先週、Nagoya.php#17でLTをしていた方がnpxを使った電子名刺で自己紹介をしていて、

めちゃくちゃカッコよくて真似して作ってみました!

 

 

ターミナルで

$ npx kin29

って打ってみてください^^

 

多分、これが出てくるはずです!

https://www.npmjs.com/package/kin29

business-card

 

 

仕組み

npx <user-name>を実行すると、

該当のnpmパッケージを落としてきて、package.jsonにある"main": "/bin/card.js"を実行する(テキストファイルをconsole.logする)とのこと。

package.json

{
...
  "main": "/bin/card.js",
  "bin": {
    "kin29": "./bin/card.js"
  },
...
  "scripts": {
    "prepublish": "npm run build",
    "build": "node build.js",
    "dev": "npm run build && node ./bin/card.js",
    "lint": "standard",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
...

"scripts"にあるように、build.jsを自分用に修正をして、
npm run buildすると、出力ファイルである./bin/outputができます。
npm run dev で、 npx * のシュミレーションができます。

bin/card.js

#!/usr/bin/env node
// 👆 Used to tell Node.js that this is a CLI tool

'use strict'

const fs = require('fs')
const path = require('path')
const output = fs.readFileSync(path.join(__dirname, 'output'), 'utf8')
console.log(output)  // bin/output に出力テキストがある

 

そもそも、npxとは?

公式サイト:https://www.npmjs.com/package/npx

npm5.2.0以上が導入されていれば、npxコマンドも使えるそうです。

指定されたnpmパッケージがローカルに存在しない場合には、インストールをしてコマンド実行するものだそうです。

npmと違うのは、たとえローカルにインストールされていなくてインストールすることになっても、一時的にしかインストールせず実行後は削除されるらしいです。

ローカルを汚さずにすみますね😄

 

npmとnpxを比較してみた💡

● npm

:~/test-npm$ ls //まだローカルには何もない

:~/test-npm$ npm install eslint
...
+ eslint@6.3.0
added 119 packages from 75 contributors and audited 176 packages in 5.246s
found 0 vulnerabilities

:~/test-npm$ ls   //ローカルにインストールされた!
node_modules package-lock.json

:~/test-npm$ node_modules/.bin/eslint --version
v6.3.0

●npx

:~/test-npx$ ls

:~/test-npx$ npx eslint --version
npx: 119個のパッケージを4.678秒でインストールしました。
v6.3.0

:~/test-npx$ ls //ローカルにインストールされてないよ^^

 

npmに公開する

npxを使った電子名刺を公開するためには、npmで公開する必要があります。

やりかた

  1. https://www.npmjs.com/ にアカウントを登録する。
  2. $ npm adduser でログイン(1の登録情報を使う)する。
  3. GitHubリポジトリを作成し、masterにpushする。
  4. $ npm publish でnpmに公開をする。
    // タグをつけてpushする。
    $ git tag -a v1.0.0
    $ git push origin tags/v1.0.0
    
    // npmに公開する。
    $ npm publish ./
  5. npx <user-name> を試して、確認する。

 

さいごに

composerにもnpxみたいな機能ないんかな?って思って、

「composer npx」でググったら、https://github.com/composer/composer/issues/7272

↑でなんか、あるよー的な雰囲気なことを書いてると私の英訳力では感じたのですが、本当にできるのかよくわからんです 😅

 

 

 

参考:

[Qiita]npm 5.2.0の新機能!「npx」でローカルパッケージを手軽に実行しよう

[Qiita]npxでnodeモジュールを実行する

[Qiita]初めてのnpm パッケージ公開

 

GASのユニットテストを書いてみる

お久しぶりです。
ネタが尽きてきたのと、サボってました…

名古屋にきて、名古屋飛ばしはあるものの
宮崎にいた時よりも行きたいアーティストのライブがありふれていて金欠の日々です。
(適度な副業あれば、ください^^)

 

今回の本題に入ります!

7月にテストをきちんと書いているとてもいい会社に転職しました。
フロントエンドでもきちんとテストに向き合っていて刺激的な毎日です。

そこで、わたしの大好きなGASでもテストかけないかなーってふいに思い、
ググってみると、、、、ある!!!

 

その名は、

\  QUnit for Google Apps Script  /

QUnit for Google Apps Script is an experimental fork of QUnit that enables developers to test their Google Apps Script code.

QUnitの実験的なGAS用ユニットテストのようです。
そもそも、QUnitを知らない不束者です…

 

使い方

参考:https://qiita.com/yooo_gooo/items/07c9513a87f6633e40c1

一. QUnitライブラリを追加

qunit/gas/README.md を参考にしてみます。

  1. Select “Resources” > “Manage Libraries…” in the Google Apps Script editor.
  2. Enter the project key (MxL38OxqIK-B73jyDTvCe-OBao7QLBR4j) in the “Find a Library” field, and choose “Select”.
  3. Select the highest version number, and choose QUnit as the identifier. (Do not turn on Development Mode unless you know what you are doing. The development version may not work.)
  4. Press Save. You can now use the QUnit library when writing your tests. You can see a list of available functions by typing QUnit followed by a dot. Alternatively, read the API docs.
  1. スクリプトエディタを開いて、リソース>ライブラリを選択する。
  2. ライブラリを追加の欄に、「MxL38OxqIK-B73jyDTvCe-OBao7QLBR4j」を入れて追加ボタンを押す
  3. QUnitの一番大きいバージョンを選択する。(詳しくない限り、デベロッッパーモードは有効にしない) ※今回はバージョン4を選びました。
  4. 保存ボタンを押下する。これでQunitライブラリを使えるようになりました。使用可能なQunit関数は API docs.を読んで。

QUniyライブラリの追加

 

 

二. テストを書く

README通り、 API docs.>QUnit (version 4) を参考にしました。

function doGet( e ) {
  QUnit.urlParams( e.parameter );
  QUnit.config({ title: "Unit tests for my project" });
  QUnit.load( isPublicHolidayTest );
  
  return QUnit.getHtml();
};

QUnit.helpers(this);

 

/**
 * テストコード
 */
function isPublicHolidayTest() {
  test('isPublicHoliday Test', function(assert) {
    var date = '2019-08-11';
    assert.ok(isPublicHoliday(new Date(date)), date +' は休日');

    var date = '2019-08-20';
    assert.ok(!isPublicHoliday(new Date(date)), date +' は休日ではない');

    var date = '2019-01-01';
    assert.ok(isPublicHoliday(new Date(date)), date +' は休日');
  });
}

 

/**
 * テスト対象の関数
 * (祝日であればtrue、そうでなければfalseを返す)
 */
function isPublicHoliday(data){
  //日本の祝日のカレンダーID
  var holidayCalId = "ja.japanese#holiday@group.v.calendar.google.com";
  var holidayCal = CalendarApp.getCalendarById(holidayCalId);

  return holidayCal.getEventsForDay(data).length > 0
}

 

▼assert.ok(value[, message])

を使ったことがなかったんですが、valueがtrueであれば「okay(message)」をechoするっぽいです。

assert.ok(true);                            //okay
assert.ok(true, 'okokok!!!');      //okokok!!!

参考:https://nodejs.org/api/assert.html#assert_assert_ok_value_message

 

 

三. テストを実行

スクリプトエディタの
公開 > ウェブアプリケーションとして導入 > 「最新のコードでテスト」のリンク
へ飛ぶとテストが実行され、結果がみれます。
※アプリケーションにアクセスできるユーザー:「自分だけ」にできます。

QUnitのテスト結果

 

 

感想

うーん、clasp使って、CIでテストさせたいですよねー
毎回、スクリプトエディタでテスト実行するのは面倒 😄

フロントのテストって書いたことがないのですが、
GASだったらセル依存となると思うので、テストを書くの難しそうだなあと感じました。。。

 

 

ラズパイにOSMCを入れてYouTubeを見る、そしてiPhoneから遠隔操作する!

PS3の調子が悪くても、chromecastなんて買わなくても、PCをつながなくても、テレビでYouTubeが見れるんです!
(そのほかにもSoundCloud/AmazonPrime/DAZN…すごい数のサービス有)
そして、テレビのリモコンでも操作できる(※REGZA LINK使用)し、iPhoneでも操作できる!
ラズパイがあれば!!!ラズパイってやっぱすごいなって思いました。

 

 

今回使うものが、

\ OSMC (Open Source Media Center) /

今回は、一般的なRaspbianOSイメージを使わず、OSMC専用イメージを使いました。
(apt-getでの導入も可能らしいです、重すぎて私は断念しました…)

 

kodiなのかosmcなのか、よくわからんくってググるの大変でした。
– ラズパイにいれるOSのイメージ   :OSMC_TGT_rbp1_20190623.img
– 遠隔操作(リモコン)用のアプリ名 :Official Kodi Remote
ですもん…

あ、よく見ればちゃんと書いてました。

https://osmc.tv/about/より
>OSMC (Open Source Media Center) is a free and open source media player based >on Linux. Founded in 2014, OSMC lets you play back media from your local >network, attached storage and the Internet. OSMC is the leading media center in >terms of feature set and community and is based on the Kodi project.

(ざっくり感覚英訳)
OSMCとは、「Open Source Media Center」の略で、
無料のオープンソースメディアプレーヤーだよ、Linuxをベースに作っているよ!
2014年設立、….. OSMCは、….Kodiプロジェクトをベースに作ってるよ!

 

 

使ったもの

– ラズパイ1
– SDカード(16GB)
– キーボード  ←初期設定時のみ必須
– マウス   ←キーボードがあればいらないかも
– HDMI
– デスクトップ(テレビでもできます〜)
– 電源アダプター
– 無線LAN(USBポートでさせるタイプ)

作り方

1.SDカードにOSMCのイメージを入れる

書き込む前にフォーマットする必要があります。
(前回の記事の「1-2. SDにRaspbian(OS)を焼く」を参考にしてください。)

OSMCのイメージがあるところ:https://osmc.tv/download/
(windows/mac用もあります)

 

2. ラズパイにSDカードを差し込んで起動→初期設定

起動すると初回設定画面が出てきます。
ネットワーク設定(Wi-Fi)や、言語設定、TimeZone設定を行います。
初期設定での操作に、マウスとキーボードを使いました。
私は、タイムゾーンはAsia,Tokyoにしましたが、言語設定はEnglish(US)にしました。[理由:かっこいいから]

!!!ポイント!!!
– 日本語の文字化けを直すために、
settings > Interface > Skin より、 Fonts を 「Arial based」にする。
– wifiの接続に成功すると、3. iPhoneをリモコンにするで使うIPが表示されます。
– Setting > Service > Controlより以下の許可を設定する。
Web Server > Allow remote control via HTTP
Application Control > Allow remote control from applications on other systems
↑これをしないと、3. iPhoneをリモコンにするができません。

 

3. iPhoneをリモコンにする

iPhoneで遠隔操作をするために、アプリ「Official Kodi Remote」を使用します。
(Android用もあるらしいです。)

iPhoneのwifi接続を、2で設定したwifiと同じものにしてください。

アプリ「Official Kodi Remote」を開き、
REMOTE CONTROL > Add Hostより、
wifi接続で成功した際でてくるIP(portは80)を入力し、Find Kodiを押下してください。
初期設定で特に設定しなければ、usernameとpasswordは空白でも繋がります。
KodiRemoteの設定画面 

 

4. Video-add-onよりYoutubeを追加

Settings > Add-on browser > install from repository > Video add-onsより、
Youtubeをインストールします。

ここを見ると、多種多様のサービスが導入できることがわかります。
こんなにいっぱいあるの?ってめちゃ夢広がった瞬間でした。

インストールが終わったら、Video > Video add-ons に Youtubeが増えています。
Youtube > Searchとか適当に選ぶと、二段階認証必要ですみたいなアラートが出てくるので、それに従います。
二回コードを入力し終わると、Youtubeが見れるようになります!(Googleアカウントが必要です。)
ラズパイでYouTubeを見る

 

 

メモ

– OSMCのUIがちょっとわかりにくい、特に設定関係の
有効の場合□が明るくなる、無効の場合□が暗い部分とか

– キーボード操作の場合、戻るボタン = エスケープ()
– 初回は音量が小さいので、iPhoneのリモコンから音量あげないと音声が聞こえない

 

 

参考サイト(とっても感謝しています!)

 

 

感想

もうこのラズパイあれば、ほぼAmazonPrime見るためにしか使ってないPS3売っちゃてもいいんじゃないかなって気持ちになりました。

ラズパイってほんとなんでもできますねえ、すごい。

 

Composerでrequireしたときのエラー解決法

 

どうも!名古屋生活満喫してます。
大須が好きで毎週行ってしまってます。
ただ、友達がいないので一人で大体いってますw
名古屋で遊んでくれる友達欲しい。。。

今回の記事は、
PHPerなら、とても助かっているであろうComposerについてです。
いろんなパッケージ使おうとrequireしてたら、なんか導入できない!
英語でわかわからんってなって諦めてました。
そろそろ次に進めなければと思い、私が問題解決を行った方法をまとめます。

 

composerコマンドだけで、できる方法はありそうなので見つけたら教えてください!
私も見つけたら書きます\(^^)/

 

Composerとは…

公式サイト:https://getcomposer.org/

PHPで何かを作るときに、
既存のライブラリやパッケージを導入/更新するときに使います。
そのとき、依存管理もしてくれるツールです。
JavaScriptでいうnpm的なやつだと思っています。

Composerの公式サイトに飛んだときに気づいたのですが、
ロゴのおじさん、いろんなカラーパターンがある!!!
リロードするたびに変化するのでぜひ遊んでみてください!

composer_uncle

(多分5パターン)

 

 

本題に入ります。

例えばこんな例

hautelook/alice-bundleをdev環境に導入する時….
下記のエラーで導入できなかった例です。

$ composer require hautelook/alice-bundle --dev
Using version ^2.5 for hautelook/alice-bundle
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for hautelook/alice-bundle ^2.5 -> satisfiable by hautelook/alice-bundle[2.5.0].
    - hautelook/alice-bundle 2.5.0 requires doctrine/orm ^2.5.11 -> satisfiable by doctrine/orm[2.5.x-dev, 2.6.x-dev, 2.7.x-dev, v2.5.11, v2.5.12, v2.5.13, v2.5.14, v2.6.0, v2.6.1, v2.6.2, v2.6.3] but these conflict with your requirements or minimum-stability.


Installation failed, reverting ./composer.json to its original content.

 

日本語でざっくり訳すと(わたしの解釈です)

hautelook/alice-bundleのv2.5.0(バージョン指定してないので最新版をインストールしようとします)は、
doctrine/ormのv2.5.0以上が必要です。

 

 

ということは、doctrine/ormが今v2.5.0以下なんです。
いざ、確認!!!

$ composer show doctrine/orm    //導入中のpackage(doctrine/orm)詳細を表示
name     : doctrine/orm
descrip. : Object-Relational-Mapper for PHP
keywords : database, orm
versions : * v2.4.7
...

 

エラー警告通りで、doctrine/ormのバージョンは、2.5.0以下の2.4.7でした。
ということで、現状のパッケージ群のままでhautelook/alice-bundleを導入する想定で問題解決していきたいと思います。

そんなとき使うのが、「packagist 」です!
packagistでは、composerで導入できるパッケージ群が管理されていて検索ができてバージョンごとの詳細も確認できます。

そこで導入したいパッケージ(hautelook/alice-bundle)を検索して、左側のバージョン選択欄からバージョンを下げながら見ていって、
導入ができない原因のパッケージ(doctrine/orm)のバージョン(現在v2.4.7)が通る導入したいパッケージ(hautelook/alice-bundle)のバージョンを見つけます。

\日本語下手でごめんなさい…/

packagist検索結果

 

この方法により
hautelook/alice-bundlev1.4.1であれば、
doctrine/orm: ^2.4doctrine/ormv2.4以上なので
導入できることがわかりました!

 

したがって、hautelook/alice-bundleを最新版ではなくv1.4.1をバージョン指定で導入してみます。

$ composer require hautelook/alice-bundle:1.4.1 --dev
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
  - Installing fzaninotto/faker (v1.8.0): Downloading (70%)
  ....

いけましたー!!!

$ composer show hautelook/alice-bundle
name     : hautelook/alice-bundle
descrip. : Symfony2 Bundle to manage fixtures with Alice and Faker.
keywords : Fixture, alice, faker, orm, symfony
versions : * v1.4.1
...

 

便利なComposerコマンド一覧

参考:https://qiita.com/KEINOS/items/86a16b06af6e936a1841

インストール済みのパッケージ情報の一覧を取得

$  composer show -i
You are using the deprecated option "installed". Only installed packages are shown by default now. The --all option can be used to show all packages.
...
phpunit/phpunit                    7.5.12   The PHP Unit Testing framework.

 

パッケージ名指定もできます。

$ composer show [vendor]/[package]
$ composer show phpunit/phpunit
name     : phpunit/phpunit
descrip. : The PHP Unit Testing framework.
keywords : phpunit, testing, xunit
versions : * 7.5.12
type     : library
license  : BSD 3-Clause "New" or "Revised" License (BSD-3-Clause) (OSI approved) https://spdx.org/licenses/BSD-3-Clause.html#licenseText
source   : [git] https://github.com/sebastianbergmann/phpunit.git 9ba59817745b0fe0c1a5a3032dfd4a6d2994ad1c
dist     : [zip] https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9ba59817745b0fe0c1a5a3032dfd4a6d2994ad1c 9ba59817745b0fe0c1a5a3032dfd4a6d2994ad1c
path     : /path/vendor/phpunit/phpunit
names    : phpunit/phpunit
...

 

まとめ

英語のエラーって怖いって思いがちですが、
問題解決方法だったりヒントを表示してくれるだけでほんと助かるなーって気持ちに改めてなりました。

phpenvでいろんなPHPバージョンを操る

 

どうも、PHP大好きなんでPHPの記事ばっかで、すみません。

PHPってバージョンごとに書き方違うし、
レガシーな業務ではPHP5系だけど、個人ではPHP7系使いたいってことがよくあります。
そんなとき、composerで管理しちゃえばいいんですが、phpenv使ってバージョン切り替えできるとpsyshでも試せるので良いです!
そこで、phpenvでのバージョン切り替え方法をいっつも忘れてしまうので備忘録として書きます。

phpenvとphp-buildの導入

以下の記事を参考に導入しました。
phpenvとは別に、php-buildが必要なのを知らず私は導入に手こずりました^^;
https://qiita.com/ispern/items/97e3e6d910eb98b5de75

PHPのバージョンを切り替える

今回はグローバルのPHPバージョンを切り替える方法を記載します。
ローカルの場合はglobalの部分をlocalに置換すれば大体行けると思います。(多分)

▼現在のバージョンを確認

$ php -v
PHP 7.1.30 (cli) (built: Jul  4 2019 21:55:42) ( NTS )
...

 

▼現在適用されているphp.ini(設定ファイル)の確認
現在、phpenvで7.1.30が適用されいることがわかります。

$ php --ini
Configuration File (php.ini) Path: /Users/use_name/.phpenv/versions/7.1.30/etc
Loaded Configuration File:         /Users/use_name/.phpenv/versions/7.1.30/etc/php.ini
Scan for additional .ini files in: 
...

 

▼phpenvでインストールされているバージョン一覧と適用中バージョンの確認
*がついているのが、現在適用中のバージョンになります。
7.1.30の他に7.2.20を導入しています。

$ phpenv versions
  system
* 7.1.30 (set by /Users/user_name/.phpenv/version)
  7.2.20

 

▼phpenvでインストール可能なバージョンリスト一覧を表示

$ phpenv install -l
Available versions:
  5.2.17
...
  7.3.6
  7.3.7
...

 

▼バージョンを指定して、インストールをする。
今回は新たに、v5.6.1を入れます。
!!!時間かかります!!!

$ phpenv install 5.6.40
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
...

 

インストールし終わったら、、、
▼インストール済みの一覧にあるか確認します。
5.6.1が新しく追加されています。

$ phpenv versions
  system
  5.6.1
* 7.1.30 (set by /Users/user_name/.phpenv/version)
  7.2.20

 

▼hashの更新をします。
!!!rehash忘れがちなので、忘れずに!!!

$ phpenv rehash

 

▼グローバルのPHPバージョンを切り替えます。

$ phpenv global 5.6.1

 

▼現在のバージョンを確認します。
見事に5.6.1に切り替えれています\(^^)/

$ phpenv versions
  system
* 5.6.1 (set by /Users/user_name/.phpenv/version)
  7.1.30
  7.2.20
$ php -v
PHP 5.6.1 (cli) (built: Jul 14 2019 18:29:23)
...

参考:https://www.aiship.jp/knowhow/archives/25452

まとめ

phpenvってpyenvって打ち間違えますよね!!!?
わたしだけですか?
(多分、みんなそうなはず)

 

これほしい!

DateTime::modifyに気をつける

 

どうも!実は、
この一ヶ月有給消化と言う名の
ニートしてまして、
明日から社会人に戻ります。。。
遅刻しないかとかすっごい心配です^^
新しい環境にdkwk(ドキドキワクワク)してます!

ちょっと遅刻に絡めて、
DateTime::modify
を使用する上で、気をつけるべきところを
備忘録として書いておきます。

 

※知ってる人は知ってるであろうことですし、
まあ、そりゃそうでしょって思う方もいると思います。

DateTime::modifyは使うたびに、
タイムスタンプを変更しています。
なので、何度も何度も使用すると予期せぬことに…

参考:https://www.php.net/manual/ja/datetime.modify.php

 

test.php

<?php

$d = new DateTime();
echo "{$d->format('Y-m-d')} \n";
// 本日、2019-06-30が起点になる

echo "{$d->modify('+1 days')->format('Y-m-d')} \n";
// 予想: 2019-06-30の1日後の「2019-07-01」

echo "{$d->modify('+1 month')->format('Y-m-d')} \n";
//予想: 2019-06-30の1ヶ月後の「2019-07-30」
$ php test.php
2019-06-30
2019-07-01
2019-08-01  //実は、2019-07-01の1ヶ月後になる!

$d->modify(‘+1 month’)の前に、
$d->modify(‘+1 days’)を実行しているために
このような結果になっています。

 

 

予想通りにしたいときは、
newし直したり、cloneしなおすといい感じになります。

<?php

$d = new DateTime();
echo "{$d->format('Y-m-d')} \n";
// 本日、2019-06-30が起点になる

echo "{$d->modify('+1 days')->format('Y-m-d')} \n";
// 予想: 2019-06-30の1日後の「2019-07-01」

/* ここから変更 */
$d_1 = new DateTime(); //newし直す
echo "{$d_1->modify('+1 month')->format('Y-m-d')} \n";
//予想: 2019-06-30の1ヶ月後の「2019-07-30」
$ php test.php
2019-06-30
2019-07-01
2019-07-30  //2019-06-30の1ヶ月後になる!(予想通り)

 

 

date_modify — DateTime::modify() のエイリアス

っていうのは、知らなかったです・・・。
時間を操るって癖があって難しいですねー
っていうことで、明日から遅刻しないように頑張ります!!!