- 投稿日:2019-03-07T23:58:48+09:00
三項演算子と??(ハテナハテナ)と?:(ハテナ:)
はじめに
この記事では、三項演算子とnull合体演算子(??),そしてエルビス演算子(?:)についてまとめています。
それぞれの違い
まずは、実際にコードをみてみます。
$x = null; $y = 0; $z = 1; // 三項演算子 $a = $x ? 'true' : 'false'; // 'false' $b = $y ? 'true' : 'false'; // 'false' $c = $z ? 'true' : 'false'; // 'true' $abc = $xyz ? 'true' : 'false'; // Notice Undefined variable // エルビス演算子(実は三項演算子) $a = $x ?: 'false'; // 'false' $b = $y ?: 'false'; // 'false' $c = $z ?: 'false'; // 1 $abc = $xyz ?: 'false'; // Notice Undefined variable // null合体演算子 $a = $x ?? 'false'; // 'false' $b = $y ?? 'false'; // 'false' $c = $z ?? 'false'; // 1 $abc = $xyz ?? 'false'; // falseエルビス演算子と三項演算子は
三項演算子, エルビス演算子
この二つは、条件式が真の場合に評価される値が条件式そのものか、そうでないか、という点で異なっているだけです。
これらは、条件式がtrueかfalseか、が重要です。
条件式がundefinedの場合には、Noticeエラーが発生します。// 三項演算子 【条件式】 ? 【trueの場合に評価される式】 : 【falseの場合に評価される式】 // エルビス演算子(二項演算子) 【条件式(trueの場合に評価される式)】 ?: 【falseの場合に評価される式】null合体演算子
null合体演算子の場合に重要なのは、条件式がnullであるかどうかです。
undefinedの場合もnullという判定になるのでNoticeエラーが発生せずに値が返ってきます。【条件式(nullでない場合に評価される式)】 ?? 【nullの場合に評価される式】
- 投稿日:2019-03-07T23:11:41+09:00
PHPで複数の値をreturnする[備忘]
やりたい事
- 複数の値を一回のreturnにまとめたい
環境
- PHP 7.2.6
- CakePHP 3.6.13
サンプルコード
- 生のPHPコードの場合
private function samples() { $fruits1 = 'apple'; $fruits2 = 'banana'; return [$fruits1, $fruits2]; // もしくは、array($fruits1, $fruits2); } list($fruits1, $fruits2) = $this->samples(); echo $fruits1; // => apple echo $fruits2; // => banana解説
samplesアクション
- $fruits1と$fruits2を定義
- returnする時に配列にする
list関数
list — 配列と同様の形式で、複数の変数への代入を行う
引用元:http://php.net/manual/ja/function.list.php
- list関数を使用し、samplesアクションの返り値を受け取る
所感
- 1回のreturnで済む事は気持ちいい
- functionに切り出す程でもないけど、2つの値をそれぞれ呼び出し元に返したい場合の解消手段になり得る
- 見慣れないせいか、直感的なコードの可読性はそこまで高くない?
- 世間一般的に、こういう手法を使うのだろうか?
おまけ
Twitterやってます!外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います!@Tatsuo96
ブログ始めました!
https://note.mu/tatsuo_iriyama
- 投稿日:2019-03-07T22:43:07+09:00
初めてPHPを使ってサービスを作った話。
サービスってもんはな、ユーザーがいないと忘れるもんだよ....。
はじめに
ではまず最初に、なんで僕がこのサービスを作ろうと思ったのかということですが、このサービスを作る前にLINEのAPIで遊んでいて、その続きでTwitterAPIを触っていて、どうせならTwitterAPI使って何か作るかと思って作りました。
(需要ないとかいうのやめて((()どういうサービス?
最後にツイートしたツイートの情報が見れるサービスです。
キャッチコピーはあなたが一番最後にツイートした内容はなんだったのか、ツイ廃の人はわかってるかもしれません。でも普通の人ならあまり覚えていないはず....。
このサービスは直前のツイート一件の情報を取得して表示します。あなたは最後に何をツイートしたのでしょうか?
僕自身なんでこんな文が思いついたのかわかりません(おい
まぁ、なんか作りたかったからとりあえずこれにしようって思ってたら結局このままになりました。Qiita途中まで書いてたんですけど、下書きのまま放置してたら忘れちゃってその間に色々サービス変わってました。
これが今のキャッチコピー?です↓
このサービスは最新のツイートから100ツイート遡ったツイート一件の情報を取得して表示します。LastTweetViewerはここからどうぞ。
あ、言っとくとこの間のリニューアルでバグ発生して表示されなくなったので無意味です。使ってるサービスとかツールとか
- GitHub
- Heroku
- TwitterAPI
- IntelliJ IDEA
- Postman
まあいたって普通の構成ですね。
苦労したとこ
PHPをまず触ったことがなかったので、これが本当に一番最初。
だからバグばっかよかったところ
一般公開した時は結構ユーザー来てくれた
その他
詳しいのは暇あったら書きます。はい ←
また忘れるやつ(((
- 投稿日:2019-03-07T22:40:54+09:00
GitHubからさくらのレンタルサーバに自動デプロイ
はじめに
GitHubからさくらのレンタルサーバーに自動デプロイしたいな、と思って調べたら記事が何個かあった。しかし少し変わった部分があったので再まとめ的な感じ。
参考記事は最後に貼っておく。gitの導入
SSHログイン
ssh アカウント名@アカウントのドメイン.sakura.ne.jpBashに変更
bashcurl-develのインストール
こいつが無いと、httpsでのcloneができなかった。
curl Downloadより。
ここでは7.64.0作業ディレクトリは
$HOME/local/src。インストール先は$HOME/local。mkdir -p $HOME/local/src cd $HOME/local/src wget https://curl.haxx.se/download/curl-7.64.0.tar.gz $ tar zxvf curl-7.64.0.tar.gz $ cd curl-7.64.0. $ ./configure -prefix=$HOME/local $ make $ make installgitのインストール
まずGoogle Code Archive git-coreにてgitのソースコードの確認。ここでは
1.9.0を使用する。
./configureにオプションを少々追加する。cd $HOME/local/src wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/git-core/git-1.9.0.tar.gz tar zxvf git-1.9.0.tar.gz cd git-1.9.0 ./configure -prefix=$HOME/local -with-curl=$HOME/local --enable-pthreads=-pthread gmake all gmake installパスの追加
別のディレクトリにインストールしたらスルー。
cd ~/ vim .shrcpathに追記。
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/local/bin $HOME/bin )GitHubからcloneする
cloneするディレクトリは
$HOME/www/test/cd ~/www/test git clone https://github.com/*******/*******.gitデプロイ用php作成
masterブランチをpullする場合。deploy.php<? exec('git -C /home/アカウント名/www/test pull origin master', $op); echo "<pre>"; var_dump($op); echo "</pre>"; ?>webhook設定
GitHubのリポジトリ設定にて
URLに作成したphpファイルのURLを指定。trigger設定
今回は
Releasesのみにチェックを入れた。
みなさんのお好みで。ここにも書いてあるけど、セキュリティには気をつけなければ…
参考
- 投稿日:2019-03-07T18:03:15+09:00
Macにcomposerをinstall
$ curl -sS https://getcomposer.org/installer | php All settings correct for using Composer Downloading... Composer (version 1.8.4) successfully installed to: /Users/{user}/Documents/src/composer.phar Use it: php composer.phar $ sudo mv composer.phar /usr/local/bin/composer $ composer -V Composer version 1.8.4 2019-02-11 10:52:10 $ which composer /usr/local/bin/composer
- 投稿日:2019-03-07T15:19:14+09:00
Laravel mailTrapでメール送信テスト 備忘録
本記事で達成できること
Laravelでmailtrapを利用したメール送信テストを実装できるようなる。
mailtrapとはメールを送信しても実際の宛先には飛ばさず、Webサイトから確認できるというサービス。開発環境
cloud9
php 7.0 ※バージョン確認コマンドphp -v
Laravel 5.3.31 ※バージョン確認コマンド
php artisan --version
mailTrapでユーザー登録
以下の記事を参考に登録を行う。
メールの絡む開発にはmailtrapがおすすめLaravel側の設定
.envファイルを開き、以下の初期値を変更する。変更前:
MAIL_DRIVER=smtp MAIL_HOST=mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null変更後:
MAIL_DRIVER=smtp MAIL_HOST= smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=[MailtrapのUsername] MAIL_PASSWORD=[MailtrapのPassword] MAIL_ENCRYPTION=null上記の
MAIL_USERNAMEとMAIL_PASSWORD=の項目はmailTrapから情報を参照。
メール送信のスクリプト
以下コマンドでメーう送信のために必要なクラスを生成。
php artisan make:mail SendMailcloud9上の以下のディレクトリ配下にファイルが生成されていることを確認。
app/Mail/SendMail.php以下のようなファイルが生成される。
SendMail.php<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Queue\ShouldQueue; class SendMail extends Mailable { use Queueable, SerializesModels; /** * Create a new message instance. * * @return void */ public function __construct() { // } /** * Build the message. * * @return $this */ public function build() { return $this->view('view.name'); } }build()メソッドに変更を加える。
public function build() { return $this ->from('example@example.com') ->subject('テスト送信完了') ->view('emails.test'); }※ 変更を加えた
view('emails.test');にてメールテンプレートを作成するように記述しているが、テンプレート作成方法に関しては割愛させていただきます。生成したファイルをインスタンス化してメールを送信するために、
とりあえずroutingは以下のように設定した。web.php// つまり "TestMailController" の sendメソッド を利用してメールを送信する Route::get('/mail','TestMailController@send');cloud9上の以下のディレクトリ配下に,
app/Http/ControllerTestMailControllerファイルを作成。
TestMailController.phpuse Illuminate\Http\Request; use Illuminate\Support\Facades\Mail; use App\Mail\TestMail; class TestMailController extends Controller { public function send(){ return Mail::to('ryoma@gmail.com')->send(new SendMail()); } }sendメソッドを発火させればmailTrapのダッシュボード上で
メールを受信できていることを確認できる。以上
参考にした記事:MailtrapでLaravelの簡単メール送信テスト
- 投稿日:2019-03-07T14:16:13+09:00
PHPで日付取得する方法、指定した日付から曜日を取得する方法
- 投稿日:2019-03-07T13:56:14+09:00
php-master-changes 2019-03-06
今日はテストの不要コード削除、実質的に ZPP の挙動テストとなっているだけの過剰なテストコードの削除、truecolor の画像を GIF 出力する際にインタレースフラグが無視される問題の修正、ドキュメントの更新、符号付整数をシフトし過ぎて未定義挙動になっていた箇所の修正、コンパイラの条件式の整理 / 関数分離のリファクタがあった!
2019-03-06
carusogabriel: Remove unnecessary check for always available extension
- https://github.com/php/php-src/commit/e907fbaf7cde03628a09f632a771dfcb16d72874
- [7.4~]
- ext/mbstring のテストで、PCRE 拡張(常にある前提)の存在チェックを削除
nikic: Remove more zpp error tests
- https://github.com/php/php-src/commit/10b41136383c3245507ccbca51ac07384592acc6
- [7.4~]
- 昨日に引き続き ZPP の実装をテストしているに過ぎないテストを削除
cmb69: Fix #77700: Writing truecolor images as GIF ignores interlace flag
- https://github.com/php/php-src/commit/41fb0eaa116da34fa531437d5b87ca73089e4944
- [7.2~]
- ext/gd で、truecolor の画像を GIF 出力する際にインタレースフラグが無視される問題の修正
cmb69: Prolong my extension maintainership
- https://github.com/php/php-src/commit/76d60a90404e03c3c8edeeda0b5fa29973591857
- sqlite3 と gd の自分のメンテナ期間の記載を 2019 年に延長
smalyshev: Update maintainership years
- https://github.com/php/php-src/commit/433fc322fc43e09279201bce43e0c465fc19378a
- gmp と intl の自分のメンテナ期間の記載を 2019 年に延長
smalyshev: Fix shifting signed values too far
- https://github.com/php/php-src/commit/db777e9199a94f95416ea16baf82a7d10a0bbe51
- [7.4~]
- 符号付整数をシフトし過ぎて鼻から悪魔だった箇所の修正
- UBSan で検知された奴らしい
rjhdby: Cleanup some checks in zend_compile.c
- https://github.com/php/php-src/commit/1be120f6815ff5424583ef6b4cd4e1205345b962
- コンパイラの条件式の整理 / 関数分離のリファクタ
- PR:3846
- 最近この人コンパイラ寄りの部分のリファクタで数回見るようになった
nikic: More zpp error/variation test removals
- https://github.com/php/php-src/commit/8c62c69265817bfd736ac77745cf7686a48d280c
- [7.4~]
- ZPP の実装をテストしているに過ぎないテストをもっと削除
- 投稿日:2019-03-07T12:42:03+09:00
PhpStorm でファイル作成時にコードテンプレート使うと少し捗るよ (IntelliJ とかも同じはず。)
PhpStorm (IntelliJとかも) に、 Project Tree などから、コンテキストメニューを呼び出し、そこから指定のファイルを作成する機能があります。(あるいは、
cmd + n)こんなやつ。
例えば、 "PHP Class" を選べば、以下のようなダイアログが出てきます。
この画像の例は laravel を使った Project なので、 composer.json から適切に NameSpace 等を読み込んで事前に入力済み状態になっています。
で、例えば、
NameにHogeControllerと入力してOKを押すと以下のようなファイルが生成されます。<?php /** * Created by PhpStorm. * User: hokutoasari * Date: 2019-03-07 * Time: 12:28 */ namespace App\Http\Controllers; class HogeController { }これはこれで良いのですが、 Code Template を使うことで、もうちょっと便利になります。
Code Template を設定して使ってみる
Preferences->Editor->File and Code Templatesを開きます。で、例えば、 "PHP Class" を以下のように編集します。
<?php declare(strict_types=1); #if (${NAMESPACE}) namespace ${NAMESPACE}; #end final class ${NAME} { }こうしておくと、さっきの
cmd + nから "PHP Class" を選択して生成されるコードが以下になります。<?php declare(strict_types=1); namespace App\Http\Controllers; final class HogeController { }
declare(strict_types=1);を先頭に入れて、namespaceを入れて、 class にはfinal修飾子を付けて、といった具合に Code Template に指定した内容に従って生成されます。他にも使える値が Code Template の設定画面に書いてあるので、お好みの設定にすると捗る。
ご参考までに
ちなみに、僕は以下の設定を行っています。
PHP File
<?php declare(strict_types=1);PHP Class
<?php declare(strict_types=1); #if (${NAMESPACE}) namespace ${NAMESPACE}; #end final class ${NAME} { }PHP Interface
<?php declare(strict_types=1); #if (${NAMESPACE}) namespace ${NAMESPACE}; #end interface ${NAME} { }PHP Trait
<?php declare(strict_types=1); #if (${NAMESPACE}) namespace ${NAMESPACE}; #end trait ${NAME} { }PHPUnit Test
<?php declare(strict_types=1); #if (${NAMESPACE}) namespace ${NAMESPACE}; #end #if (${TESTED_NAME} && ${NAMESPACE} && !${TESTED_NAMESPACE}) use ${TESTED_NAME}; #elseif (${TESTED_NAME} && ${TESTED_NAMESPACE} && ${NAMESPACE} != ${TESTED_NAMESPACE}) use ${TESTED_NAMESPACE}\\${TESTED_NAME}; #end use Tests\Unit\TestCase; final class ${NAME} extends#if(${NAMESPACE}) TestCase #else PHPUnit_Framework_TestCase #end{ }
./tests/Unit/TestCase.phpを用意して、 Unit Test に必要そうな便利メソッドをここに書いてるので、use Tests\Unit\TestCase;して、extends TestCaseとなるように書いてます。デフォルトの laravel Project 状態なら
use Tests\TestCase;で良いんじゃないかな。おまけ
cmd + nで表示させて状態で、おもむろに "php" とか入力するとインクリメンタルサーチになって便利ですよ。
- 投稿日:2019-03-07T12:19:01+09:00
PHPのCarbonで特定の日付の曜日を日本語で表示する
- 投稿日:2019-03-07T09:54:07+09:00
【PHP】Gmail APIでメールを取得する
はじめに
Gmail APIのリファレンスが全部英語なので読むのに時間がかかり、苦労したので日本語メモ用に残しておきます
公式ドキュメント
Gmail API
Class Google_Service_Gmail_Message
↑いろんなクラスがあるので、欲しいメソッドが既に存在しているかもしれません。まずは欲しい機能が実装済みでないか調べましょう。前準備
- PHP5.4 以上
- Composer が利用可能である
- Gmailが使えるGoogleアカウントがある
クイックスタート
1. [ENABLE THE GMAIL API] ボタンをクリック
クリックすると以下のようなウィンドウがでてくるので、 [DOWNLOAD CLIENT CONFIGURATION]
というボタンをクリック
credentials.jsonというファイルがダウンロードされるので、作業ディレクトリにファイルを移動する。2. Google Clientライブラリをインストール
$ composer require google/apiclient:^2.03. サンプル作成
- 作業ディレクトリに
quickstart.phpというファイルを作成- そのファイルにgithubのサンプルコードをコピペ → https://github.com/gsuitedevs/php-samples/blob/master/gmail/quickstart/quickstart.php
4. サンプル実行 && アカウント認証
$ php quickstart.php4-a. ターミナルにリンク先が表示されるので、コピペしてブラウザで表示
4-b. 画面に従いアカウント認証をする
4-c. 認証コードが表示されるので、コピーする
4-d. ターミナルに貼り付け、Enter5. 認証成功! ラベル一覧が表示されます
以降は、作業ディレクトリに追加されている
token.jsonを読み込んで認証するので、いちいちGoogleアカウントの認証をする必要はありません。
試しにphp quickstart.phpと再度実行するとすぐにメールのラベル一覧が表示されます。6. メール一覧を取得する
quickstart.php// さっき認証に使用した quickstart.php に追記します。 // 検索条件を追加することができます。 $optParams = array( 'maxResults' => '最大取得件数', 'labelIds' => 'ラベルのID', // ラベルのidはlistUsersLabels()で取得可能。 'pageToken' => 'ページトークン', // Gmailのメール検索時の形式で条件を指定できます。 'q' => 'from:someuser@example.com after:2018-02-20', ); // 条件に当てはまるメールの一覧を取得します。 $messages = $service->users_messages->listUsersMessages($user, $optParams); // メッセージIDからメールの内容を取得します。 foreach($messages->getMessages as $message) { $message_id = $message->getID(); $message_contents = $service->users_messages->get($user, $message_id); print_r($message_contents); }7.メモ
メールの本文は上記のコードだと
$message_contents['payload']['body']['data']にありますが、URLセーフ処理がかけられているためデコードする必要があります。$body = $message_contents['payload']['body']['data']; $body = str_replace(array('-', '_'), array('+', '/'), $body); $body = base64_decode($body);でデコードできます。
- 投稿日:2019-03-07T09:04:07+09:00
無限ループ∞最短選手権
さぁみんな無限ループしよう。
最近、無限ループが流行りらしいので
各プログラミング言語(その辺にあった10個の言語)の
無限ループを比べてみます。
果たしてどの言語が1位に輝くのか!?※改行は1文字としてカウント。
(一応、全て実行してチェックしています)C (24文字)
int main(void){for(;;);}C⋕ (37文字)
class a{static void Main(){for(;;);}}C++ (20文字)
int main(){for(;;);}D (22文字)
void main(){for(;;){}}Go (31文字)
package main func main(){for{}}Java (54文字)
class a{public static void main(String[] a){for(;;);}}JavaScript (8文字)
for(;;);PHP (14文字)
<?php for(;;);Python (9文字)
while 1:0Ruby (11文字)
while 1 end【優勝】JavaScript
チャンピオンは"JavaScript"でした。さすが"JS"。
"JavaScript"は無限ループ界において最有力候補であると考えられますね。???「JSが優勝だと思っていたのか。」
【真の優勝】Ruby ※追記
Ruby(6文字)loop{}Ruby、6文字で無限ループが出来るとは……。
恐るびー最後に
もっと文字数減らせるよ!とか
もっと文字数が少ない言語あるぜ!最強だぜ!などなどありましたらコメントまたは編集リクエストでお願い致します。
- 投稿日:2019-03-07T09:04:07+09:00
?♀️無限ループ∞最短選手権?♂️
さぁみんな無限ループしよう。
最近、無限ループが流行りらしいので
各プログラミング言語(その辺にあった10個の言語)の
無限ループを比べてみます。
果たしてどの言語が1位に輝くのか!?※改行は1文字としてカウント。
(一応、全て実行してチェックしています)C (24文字)
int main(void){for(;;);}C⋕ (37文字)
class a{static void Main(){for(;;);}}C++ (20文字)
int main(){for(;;);}D (22文字)
void main(){for(;;){}}Go (31文字)
package main func main(){for{}}Java (53文字)
class a{public static void main(String[]a){for(;;);}}JavaScript (8文字)
for(;;);PHP (14文字)
<?php for(;;);Python (9文字)
while 1:0Ruby (11文字)
while 1 end【優勝】JavaScript
チャンピオンは"JavaScript"でした。さすが"JS"。
"JavaScript"は無限ループ界において最有力候補であると考えられますね。???「JSが優勝だと思っていたのか。」
【真の優勝】Ruby ※追記
Ruby(6文字)loop{}Ruby、6文字で無限ループが出来るとは……。
恐るびー???「6文字ごときが優勝だと思っていたのか。」
【本当の真の優勝】L00P ※追記(番外編)
L00P(0文字)0文字……圧巻です。
言語名からして、無限ループ界の頂点に君臨していると思われる風貌をしてますね……。このように上記で比べていた10個の言語以外の言語では、もっと文字数が少ないものがありました。
無限ループは奥が深い。最後に
もっと文字数減らせるよ!とか
もっと文字数が少ない言語あるぜ!最強だぜ!などなどありましたらコメントまたは編集リクエストでお願い致します。










