コンテンツにスキップ

2019

【PHP】前月・翌月の末日を求めるときは慎重に

前月・翌月を求めるとき起算日や計算方法によっては、正確に求められないことがあります。

確認環境

  • PHP 7.3
<?php
// 10月31日の前月の末日を取得したい
echo date('Y-m-d', strtotime('2019-10-31 -1 month'));
// 想定:2019-09-30
// 実際:2019-10-01

// 10月31日の翌月の末日を取得したい
echo date('Y-m-d', strtotime('2019-10-31 +1 month'));
// 想定:2019-11-30
// 実際:2019-12-01

// 🤔🤔🤔

多分こんなからくり。

  • 2019-10-31の一月前 => 2019-09-31 => 9月に31日はないので繰り上げて2019-10-01。
  • 2019-10-31の一月後 => 2019-11-31 => 11月に31日はないので繰り上げて2019-12-01。

正確に求めたい場合は以下の指定をしましょう。

<?php
//=====================
// 前月
//=====================
// 一番スマート
echo date('Y-m-d', strtotime('2019-10-31 last day of previous month'));
// 2019-09-30

// 当月の初日を取得したあとに、1日マイナスする
$firstDayOfThisMonth = date('Y-m-d', strtotime('2019-10-31 first day of this month'));
echo date('Y-m-d', strtotime($firstDayOfThisMonth . '-1 day'));
// 2019-09-30

//=====================
// 翌月
//=====================
// スマート
echo date('Y-m-d', strtotime('2019-10-31 last day of next month'));
// 2019-11-30

【PHP】composerの使い方

composerはPHPのライブラリ管理ツールです。以前から存在は知っていたけど、ちゃんと使ったことがありませんでした。

最近、素のPHPを書く機会があり、ライブラリを使わないとかなりキツイことがあったので、調べたことをメモしておきます。

環境

  • vagrant
  • VirtualBox
  • CentOS7
  • PHP 5.6

composerのインストール

### セットアップ用PHPスクリプトをダウンロード
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

### セットアップ実行
$ php composer-setup.php

### スクリプトを削除
$ php -r "unlink('composer-setup.php');"

### どこでも使えるように/usr/local/binに移動
$ sudo mv composer.phar /usr/local/bin/composer

### 動作確認
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/

ライブラリのインストール

試しに、Guzzleをインストールします。

Guzzleとは、PHPのHTTPクライアントで、HTTPリクエストを簡単に実現することができるライブラリです。

その1

requireコマンドでインストールする。

$ composer require guzzlehttp/guzzle
Using version ^6.4 for guzzlehttp/guzzle
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 5 installs, 0 updates, 0 removals
  - Installing ralouphie/getallheaders (3.0.3): Loading from cache
  - Installing psr/http-message (1.0.1): Loading from cache
  - Installing guzzlehttp/psr7 (1.6.1): Loading from cache
  - Installing guzzlehttp/promises (v1.3.1): Loading from cache
  - Installing guzzlehttp/guzzle (6.4.1): Loading from cache
guzzlehttp/psr7 suggests installing zendframework/zend-httphandlerrunner (Emit PSR-7 responses)
guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
Writing lock file
Generating autoload files

その2

composer initを利用してインストールする。

### initで対話形式で、composer.jsonを作成します
### この辺の細かいことは分からないので割愛
$ composer init


  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [masashi/hoge]:
Description []:
Author [masashi <masashi6269>, n to skip]: n
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []:

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? yes
Search for a package: guzzlehttp/guzzle
Enter the version constraint to require (or leave blank to use the latest version):
Using version ^6.4 for guzzlehttp/guzzle
Search for a package:
Would you like to define your dev dependencies (require-dev) interactively [yes]?
Search for a package:

{
    "name": "masashi/hoge",
    "require": {
        "guzzlehttp/guzzle": "^6.4"
    }
}

Do you confirm generation [yes]?

Search for a package: のとこでguzzlehttp/guzzleを入力すると、composer.jsonrequireに追加してくれます。

これで準備完了。最後にcomposer installを実行してインストールします。

$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 5 installs, 0 updates, 0 removals
  - Installing ralouphie/getallheaders (3.0.3): Loading from cache
  - Installing psr/http-message (1.0.1): Loading from cache
  - Installing guzzlehttp/psr7 (1.6.1): Loading from cache
  - Installing guzzlehttp/promises (v1.3.1): Loading from cache
  - Installing guzzlehttp/guzzle (6.4.1): Loading from cache
guzzlehttp/psr7 suggests installing zendframework/zend-httphandlerrunner (Emit PSR-7 responses)
guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
Writing lock file
Generating autoload files

ライブラリの利用

オートローダーを読み込んだあとに、普通に使うだけ。

<?php // autoloadを読み込むと、ライブラリを個別にrequire,includeしなくても使えます
require dirname(__FILE__). '/vendor/autoload.php';

$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
echo $response->getStatusCode() . PHP_EOL; # 200
echo $response->getHeaderLine('content-type') . PHP_EOL; # 'application/json; charset=utf8'
echo print_r(json_decode($response->getBody()), true); # '{"id": 1420053, "name": "guzzle", ...}'

これだけでだいぶ楽になりました!

Bronze Oracle Database 12cSQL基礎に合格しました

結論

問題を解きまくってなれるしかない。暗記だけで合格するのは難しい。

利用した参考書・サイト

学習法

  1. 参考書を2回解く

仕事でSQLを書く機会をある程度経験しているので、あまり時間を書けず学習しました。けっこう考える問題が多いので、1問あたりにかける時間は多め。

full outer joinは意味分からん。

結果

正解率:78% 合格ライン:65%

感想

12c SQL基礎(1Z0-061)は難しいとの噂だったので、けっこうビクビクしながら受験しましたが、実務などで慣れている人であれば、この難しさは気にならないと思いました。絶対受かりたい人はBronze SQL基礎I(1Z0-017)を受験しましょう。

絶対おさえたいポイントは

  • SQL関数
  • 結合
  • 暗黙の型変換
  • fm修飾子
  • 制約
  • SQL行制限

です。この辺はよくでる印象があります。

また、1,2問初見の問題が出てびっくりしましたが、75問もあるので影響はありませんでした。もしかしたら、ping-tや別の参考書には載っていたかもですが、無視して良いレベルです。

【PHP】空配列を=== []で判定する

TwitterでPHPのempty関数を安易に使うのは良くない趣旨のツイートを見ました。普段からemptyを使っていて何の疑問も持たなかったので、へーって思ってツイートを眺めてました。

こんなチェックをするそうです。

if ($a === [])

チェック内容が明確なので可読性がよいです。

if (empty($a))

この場合、$aがarrayの空配列チェックなのか、stringの空文字チェックなのか1文だけでは分かりません。あと、NULLの場合の挙動が先述のコードとは異なるので、なんとなく危ないですね。

今度からもう少しこういうところに気をつかって書いていく良いきっかけとなりました。

※PHPマニュアルのPHP 型の比較表から確認できるように、emptyの挙動はけっこうトリッキー。気をつけましょう!

Bronze Oracle Database DBA 12c合格しました

LPIC Level1 Ver5.0に合格してから2ヶ月ほど立ちましたが、次はOracle社が行っている認定試験制度Bronze Oracle Database DBA 12cを受け合格しました。

結論

オラクルマスター教科書 Bronze Oracle Database DBA 12cは割と有効。

これに出題されている問題が数個出題されました。

利用した参考書・サイト

学習法

  1. Ping-tを解く

  2. オラクルマスター教科書 Bronze Oracle Database DBA 12cの解説編を読む

  3. オラクルマスター教科書 Bronze Oracle Database DBA 12cの練習問題を解く

  4. 2-3を繰り返す

Ping-tのプレミアムコンテンツにOracle Master 12c Bronze DBAの問題集があるので、ちょこちょこ解きました。あまり進捗が良くないまま期限が来てしまい不完全燃焼でした。

あまり理解度が良くないと思ったので、オラクルマスター教科書の練習問題の前に解説編を読み、雰囲気を頭に入れました。

あとはひたすら練習問題です。練習問題でなかなか理解しにくい部分があれば解説編と合わせてしっかり読み込みます。

結果

合格

正解率:84% 合格ライン:70%

感想

冒頭にも書きましたが、オラクルマスター教科書 Bronze Oracle Database DBA 12cに出題されている問題が数個出題されました。練習問題を覚えるのは合格するための有効な手段だと思います。

出題問題に関しては

  • Oracle データベースの基本構造
  • インスタンスの起動/停止とメモリコンポーネントの管理
  • ユーザーおよびセキュリティの管理
  • データベースの監視とアドバイザの使用
  • バックアップおよびリカバリの実行

あたりが多く出題されていた印象です。この辺を集中的にやるといいかも。

次はSQL基礎をちゃちゃっと片付けてOracle Master Bronzeを取りたいと思います。

vagrant + gitbookで共有フォルダ内でbuildしたらno such file or directoryが出て困る

最近、仕事でこそこそgitbookを使っています。vscodeでmarkdownを書きたいので共有フォルダを設定してホストOS側で編集したあと、ゲストOSでbuildしてます。

環境構築時、buildするとエラー(no such file or directory)になってしまいました。ファイルあるのに。。。 でも、gitbookのライブラリっぽいファイルを修正することで解決できたので備忘として残します。

[vagrant@localhost hoge]$ gitbook build
info: 8 plugins are installed
info: 5 explicitly listed
info: loading plugin "search-pro-kui"... OK
info: loading plugin "highlight"... OK
info: loading plugin "sharing"... OK
info: loading plugin "fontsettings"... OK
info: loading plugin "theme-default"... OK
info: found 5 pages
info: found 22 asset files

Error: ENOENT: no such file or directory, stat '/vagrant/hoge/_book/gitbook/gitbook-plugin-fontsettings/fontsettings.js'

環境

  • Windows10(ホストOS)
  • centos7(ゲストOS)
  • vagrant 2.2.5
  • VirtualBox 6.0.12
  • GitBook 3.2.3

Vagrantfile

  # synced folder
  config.vm.synced_folder ".", "/vagrant", type: "nfs"

対応方法

copyPluginAssets.js内のメソッドの戻り値を変更する。

  1. copyPluginAssets.jsを探す
    $ find / -name "copyPluginAssets.js"
    
  2. ファイルが見つかるはずなので、vi等で開く
  3. copyAssetsメソッドを探す。(45行目あたり)
  4. 戻り値のconfirmの値をfalseに変更。
  5. copyResourcesメソッドを探す。(78行目あたり)
  6. 戻り値のconfirmの値をfalseに変更。
  7. 保存。

参考サイト

  • https://kuttsun.blogspot.com/2018/06/gitbook-no-such-file-or-directory.html

SDKMANを使ってkotlinをインストール

SDKMANはJVM言語のインストールができて、バージョンも指定できるツールです。

https://sdkman.io/

SDKMANは以下をサポートしているそう。

  • Mac OSX
  • Linux
  • Cygwin
  • Solaris
  • FreeBSD

SDKMANのインストール

$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
$ sdk version
SDKMAN 5.7.3+337

kotlinのインストール

9月末時点の最新バージョン(1.3.50)をインストールします。

$ sdk list kotlin
Available Kotlin Versions
================================================================================
     1.3.50              1.2.50              1.1.4               1.0.1-2
     1.3.41              1.2.41              1.1.3-2             1.0.1-1
     1.3.40              1.2.40              1.1.3               1.0.1
     1.3.31              1.2.31              1.1.2-5             1.0.0
     1.3.30              1.2.30              1.1.2-2
     1.3.21              1.2.21              1.1.2
     1.3.20              1.2.20              1.1.1
     1.3.11              1.2.10              1.1
     1.3.10              1.2.0               1.0.7
     1.3.0               1.1.61              1.0.6
     1.2.71              1.1.60              1.0.5-2
     1.2.70              1.1.51              1.0.5
     1.2.61              1.1.50              1.0.4
     1.2.60              1.1.4-3             1.0.3
     1.2.51              1.1.4-2             1.0.2

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================


$ sdk install kotlin 1.3.50

Downloading: kotlin 1.3.50

In progress...

######################################################################### 100.0%

Installing: kotlin 1.3.50
Done installing!


Setting kotlin 1.3.50 as default.

REPLで動作確認

kotlincをコマンドで打つと対話モードになります。

$ kotlinc
Welcome to Kotlin version 1.3.50 (JRE 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
Type :help for help, :quit for quit
>>> println("hello world!")
hello world!

quit

めちゃくちゃ簡単に導入できました!

サクラエディタからShibaを起動する

サクラエディタでmarkdownを書くときプレビュー画面がないのでShibaというmarkdownプレビューアプリを使っています。

https://github.com/rhysd/Shiba

Shiba.exeを自分で叩いて、ファイルを読み込ませるのが面倒なのでサクラエディタから起動させるようにしました。

方法

ツール > 外部コマンド実行でウィンドウを開きます。 「名前」のところに【ShibaのexeファイルのPath $F】を入力して実行ボタンを押します。

C:\Program Files\Shiba-win32-x64\Shiba.exe $F

LinuxLiteでGoogleドライブを使う!

Googleドライブがネットワークドライブとなって、ローカルでマウントして使えるようにするのがgoogle-drive-ocamlfuseです。便利。

# リポジトリの追加
sudo add-apt-repository ppa:alessandro-strada/ppa

# インストール
sudo apt-get update
sudo apt-get install -y google-drive-ocamlfuse

# Google認証
google-drive-ocamlfuse

# マウントディレクトリを作成
mkdir ~/Documents/googledrive

# マウント実行
google-drive-ocamlfuse ~/Documents/googledrive

参考

astrada/google-drive-ocamlfuse

LinuxでGoogleドライブを使えるようにしてみたのでメモ残しておく

LinuxLiteにPeerCast

Linux インストールするたびにやってることのまとめ。あくまで視聴するために必要なものを入れます。

色々インストール

前提条件

ディレクトリ構造は以下とします。

~/
├── Desktop
│   ├── Untitled-1.md
│   ├── computer.desktop
│   ├── helpmanual.desktop
│   ├── network.desktop
│   ├── recyclebin.desktop
│   ├── settings.desktop
│   └── userfiles.desktop
├── Documents
├── Downloads
├── Music
├── Peca ←★今回の作業ディレクトリ
├── Pictures
├── Public
├── Templates
└── Videos

PeerCastStation

http://www.pecastation.org/

いつも開発版を使っているのでそっちをダウンロードします。好みなのでお好きなようにどうぞ。

cd ~/Peca
curl -O http://www.pecastation.org/files/PeerCastStation-2.7.2.1.zip
unzip PeerCastStation-2.7.2.1.zip

mono

mono は Linux で PeerCastStation を使用するためのツールです。apt を使ってインストールできますが、バージョンに違いなのか大体うまくいかないので最新版のソースをダウンロードしてビルドします。

※2019/9/21 時点の最新バージョンは 6.0.0.334 でした。各バージョンのソースはここから取得できます。

cd ~/Peca
sudo apt install -y git autoconf libtool automake build-essential gettext cmake python curl
curl -O https://download.mono-project.com/sources/mono/mono-6.0.0.334.tar.xz
tar xvf mono-6.0.0.334.tar.xz
cd mono-6.0.0.334
./configure
make    # 30分以上かかりました
sudo make install

QPeerCastYP

QPeerCastYP は PeerCast 補助ツールです。配信の一覧を表示したりするツールです。

cd ~/Peca
sudo apt install -y build-essential libqt4-dev
git clone https://github.com/bookdraft/QPeerCastYP.git
cd QPeerCastYP
./configure
make
sudo make install

これでMenuマルチメディアに QPeerCastYP が表示されるはずです。

PurePlayer

PurePlayer*は、Linux 用のメディアプレイヤーおよび PeerCast 視聴プレイヤーです。QPeerCastYP と連携して視聴できるようにします。

cd ~/Peca
sudo apt install -y mplayer qt4-default g++
git clone https://github.com/nelkana/PurePlayer_As.git
cd PurePlayer_As
qmake
make

動作確認

ターミナルでPeerCastStation.exeがあるディレクトリに移動して以下コマンドを実行。

mono PeerCastStation.exe

ブラウザからhttp://localhost:7144にアクセスしてきちんと表示されれば OK。

QPeerCastYP の設定

QPeerCastYP 起動後、設定 > プレイヤに移動します。各項目に対して色々設定します。

項目
プログラム /home/{ユーザー名}/Peca/PurePlayer_As/pureplayer
種類 wmv|ogm|nsv|flv
引数 $STREAM_URL

配信の一覧から配信者のリンクを押したらPurePlayerが開き、配信が写れば OK。

おまけ

中山さん(@mrnakayama)作の PeerCast 補助ツールも紹介します。

epcyp

ダウンロードから起動まで。

cd ~/Peca
wget https://github.com/mrhorin/epcyp/releases/download/v1.2.0/epcyp_v1.2.0_linux.zip
unzip epcyp_v1.2.0_linux.zip
cd epcyp-linux-x64
./epcyp

起動したら歯車アイコンを押して設定画面を開きます。

PeerCast タブ

項目
PeerCast 本体 /home/{ユーザー名}/Peca/PeerCastStation-2.7.2.1/PeerCastStation.exe
mono を使用して起動する ON

YP タブ

名前 URL
SP http://bayonet.ddo.jp/sp/
TP http://temp.orz.hm/yp/

プレイヤー

項目
タイプ(正規表現) WMV|FLV
再生プレイヤー /home/{ユーザー名}/Peca/PurePlayer_As/pureplayer
引数 "$x"

全部設定したら OK ボタン押して保存します。

配信の一覧を読み込み直すと SP と TP の一覧が出ます。ダブルクリックするとプレイヤーが起動して視聴できます。

参考

Kubuntu16.04 で peercast

新しいバージョンの Mono をインストールする方法