PHPでスペースで区切った検索をできるようにする

今回は、PHPでスペースで区切った検索をできるようにする実装について書いていきます。

実装する機能は
1. preg_replaceで全角スペースを半角スペースに変換する
2. explodeで半角スペースごとに分割して配列にする
3. array_filterで空白の配列を削除
4. array_valuesで配列番号を整える
です。

では今回使うイカれた関数を紹介するぜ!
1. preg_replace
第一引数で正規表現パターンを、第二引数で置換後の文字列を、第三引数で置換対象の文字列を指定します。
今回はスペースが全角だった場合に半角に置換するために使います。

例
$str = "ガングニール 天羽々斬 イチイバル アガートラーム";
$replace = preg_replace("/( | )/", " ", $str);
//$replaceの中身
"ガングニール 天羽々斬 イチイバル アガートラーム"

2.explode
第一引数で区切り文字を、第二引数で対象の文字列を指定します。
1.で置換した文字列を配列にしてforeachで回せるように加工します。

例
$str = "ガングニール 天羽々斬 イチイバル アガートラーム";
$explode = explode(" ", $str);
//$explodeの中身
array [
0 => "ガングニール"
1 => "天羽々斬"
2 => "イチイバル"
3 => "アガートラーム"
]

通常であれば1と2で事足ります。
しかし、通常の範囲外の入力がされるかもしれません。
動作の不具合の原因になるかもしれないので、想定される通常の範囲外の入力にも対応できるような実装をしていきます。

3. array_filter
指定した引数の空白が入ったvalueを削除します。
トチ狂ったかのように文字と文字の間にスペースを入れられることを想定して、空白が入ったvalueがないようにするために使用します。

例
$str = "ガングニール      天羽々斬   イチイバル       アガートラーム";
$explode = explode(" ", $str);
$filter = array_filter($explode);
//$explodeの中身
array:17 [
  0 => "ガングニール"
  1 => ""
  2 => ""
  3 => ""
  4 => ""
  5 => ""
  6 => "天羽々斬"
  7 => ""
  8 => ""
  9 => "イチイバル"
  10 => ""
  11 => ""
  12 => ""
  13 => ""
  14 => ""
  15 => ""
  16 => "アガートラーム"
]
//$filterの中身
array:4 [
  0 => "ガングニール"
  6 => "天羽々斬"
  9 => "イチイバル"
  16 => "アガートラーム"
]

空白が入ったvalueのkeyは消えましたが、配列番号が飛び飛びになってしまいます。
そこでarray_valuesの出番です。

4. array_values
配列番号を整えます。

例
$str = array_values($filter);
//$strの中身
array:4 [
  0 => "ガングニール"
  1 => "天羽々斬"
  2 => "イチイバル"
  3 => "アガートラーム"
]

以上だ!

今回紹介した関数を使えばforeachで回せるいい感じの配列になるはずです。
後はSQLをいい感じに構築して、必要な箇所に変数をぶち込んでください。

Laravelで画像のアップロードと削除を実装してみる

地獄からの使者、スパイダーマッ!
ということで9/7(金)にスパイダーマンのゲーム(PS4)が発売されましたね。
スパイダーマンになった気分になれるゲームでめちゃくちゃ面白いです。
f:id:hand28:20180927112443j:plain
f:id:hand28:20180927112452j:plain

Marvel's Spider-Man move

Marvel's Spider-Man action

移動もアクションも爽快で止め時がわからなくなります。

けれど、このUIが分かりにくくてここだけマイナスポイントです。
f:id:hand28:20180927130545j:plain
「続ける」も「リトライ」も今プレイしているモードをやり直して続けると捉えられるので、一瞬考える時間が生まれてしまうのが良くないかな〜っと思ったり思わなかったり(エンジニア脳)。

そろそろトロコンしそうなのでクリアしたら冬に発売されるKH3に向けて、キングダムハーツHD1.5+2.5リミックスをプレイしていこうと思ってます。

==========================================

さて、本題に。
Laravelで画像のアップロードと削除を実装してみます。筆者の環境ではLaravelのバージョンは5.5です。
仕様としては画像が既にアップロードされている場合に更に画像をアップロードする場合は、既にアップロードされている画像を削除するようにしています。

画像のアップロードに関してはこちらを元に実装しています。
Laravelで画像ファイルアップロードをする簡単なサンプル


フォームの作成
画像をアップロードするフォームを作成します。
基本的には参考にした記事通りですが、削除ボタンが追加されています。
元記事と同じくresources/views/home.blade.phpに記述していきます。

{!! Form::open(['url' => '/upload', 'method' => 'post', 'files' => true]) !!}
@if (session('success'))
    <div class="alert alert-success">{{ session('success') }}</div>
@endif
@if($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach($errors->all() as $error)
            <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

<div class="form-group">
    @if($user->avatar_filename)
    <p>
        <img src="{{ asset('storage/avatar/' .$user->avatar_filename) }}" alt="avater" />
    </p>
    @endif
    {!! Form::label('file', '画像アップロード', ['class' => 'control-label']) !!}
    {!! Form::file('file') !!}
</div>
<div class="form-group">
    {!! Form::submit('アップロード', ['class' => 'btn btn-default']) !!}
</div>
{!! Form::close() !!}

//元記事からの追加点、削除ボタンを追加しています。
{!! Form::open(['url' => '/delete', 'method' => 'post']) !!}
{{ method_field('DELETE') }}
    <button class="btn btn-danger">削除</button>
{!! Form::close() !!}   


Routeを追加
uploadの他にdeleteも追加します。routes/web.phpに記述していきます。

Route::post('/upload', 'HomeController@upload');
Route::delete('/delete', 'HomeController@delete');

Controllerに記述
画像のアップロードと削除の機能を実装していきます。

public function upload(Request $request)
    {
        $this->validate($request, [
            'file' => [
                'required', 'file', 'mimes:jpeg,png'
            ]
        ]);
        if ($request->file('file')->isValid([])) {
            $filename = $request->file->store('public/avatar');
            $user = User::find(auth()->id());
    //画像アップロード時に既に他の画像がアップロードされている場合に既存の画像を削除する処理
            Storage::disk('local')->delete('public/avatar/'.$user->avatar_filename);

            $user->avatar_filename = basename($filename);
            $user->save();

            return redirect('/home')->with('success', '保存しました');
        } else {
            return redirect()->back()->withInput()->witherrors(['file' => '画像がアップロードされてないか不正なデータです。']);
        }
    }

    public function delete(Request $request)
    {
        $user = User::find(auth()->id());
        //ファイルがアップロードされてない場合に削除ボタンをクリックした時の挙動を制御
        if (is_null($user->avatar_filename)) {
            return redirect('/home')->with('error', '削除するファイルがありません');
        }
        Storage::disk('local')->delete('public/avatar/'.$user->avatar_filename);
        $user->avatar_filename = null;
        $user->save();
        return redirect('/home')->with('success', '削除しました');
    }


実装時の挙動の動画を載せようと思いましたが、時間がないので割愛します。

基本的な画像のアップロードと削除はできましたが、今時のUIだと画像を選択するとアップロードする前に選択した画像が表示されるのが当たり前だと思うので、そちらの方もいつかはやってみたいかなとは思っています。

いずれまた一つ頼もう

Node.jsやらnpmって一体何だ?何なのだ?

はじめに
お仕事で「Node.jsとnpmをインストールしといてー」と言われ、ターミナルにコマンドをぶち込んでインストールしました。
その後、こいつらが一体何者なのかという疑問がふつふつを湧いてきたので、ヤホーで調べたものをまとめたいと思います。

1.Node.jsとは
Node.jsとは、ライアン・ダール(Ryan Dahl)氏によって作成されたサーバーサイドのjavascript実行環境のことです。
フレームワークでもライブラリでもないそうです。
ちなみにロゴが緑と黒の配色が好きな僕にドストライクで、ロゴのステッカーかT-シャツが欲しくなるレベルです。(特に上二つ)

f:id:hand28:20180816123219p:plain
https://nodejs.org/en/about/resources/

Node.jsの使うメリット
なんと言っても メモリの消費量が少なく速いのが特徴です。
非同期処理のノンブロッキングI/Oで接続台数が1万台を超えても遅くならないそうです。
ちなみに2018年6月現在でユーザー登録者数が2100万人を突破したソーシャルゲーム、「グランブルーファンタジー」でも使われているみたいです。

Node.jsのバージョン管理ツールについて
Node.jsのバージョン管理ツールは色々あって、今までに「nodebrew」や「n」を使ったことがありました。
しかし、Node.jsのバージョン管理ツールって何を使えばいいんだ?と思って調べてみると、下記のサイトが疑問の答えの一つのような気がします。
Node.js のバージョン管理ツール n を使ってみました


2.npmとは
npm(node package manager)とは、その名の通りNode.jsのパッケージ管理システムです。
パッケージ管理システムと聞いていまいちパッとしませんでしたが、
前からHomebrewを使っているのでHomebrewのNode.js版なんだなという感じで捉えてます。

パッケージ管理システムなので、例えば

npm install パッケージ名

でパッケージがインストールできますし、

npm info パッケージ名

でパッケージの情報を確認できます。

Homebrewの

brew install パッケージ名

brew info パッケージ名

に記述方法が似ている気がします。

npmのコマンドはまだまだありますが、その紹介は割愛します。


おわりに
これでざっくりですが、Node.jsとnpmについて知ることができたと思います。
これから使っていきながら発見することもあると思うので、これから仲を深めていきたいです。

























P.S.
緑と黒の配色で特に好きなものはこちら
f:id:hand28:20180816145447j:plain
f:id:hand28:20180816150621j:plain

MySQLでtimestamp型のカラムを検索してみる

timestamp型は形式として’YYYY-MM-DD HH:MM:SS'となっています。
そこで年月までだとか年月日まで検索したいな〜っと思った時があったので、その時使ったSQL文を載せておきます。

1.年月で検索したい場合

SELECT * FROM table_name WHERE timestamp_column LIKE '2018-07%';

2.年月日で検索したい場合

SELECT * FROM table_name WHERE timestamp_column LIKE '2018-07-31%';

whereのlike句の後方一致で検索できます。

しかし、timestamp型の落とし穴があります。

SELECT * FROM table_name WHERE timestamp_column BETWEEN '2018-07-01' AND '2018-07-31';

とすると、2018年7月1日から2018年7月31日ではなく、2018年7月1日から2018年7月30日の範囲で検索されてしまいます。
その理由として、timestamp型で上記のように年月日で記述すると、勝手に00:00:00が補完されるみたいです。

なので、2018年7月1日から2018年7月31日のデータを検索したい場合は、

SELECT * FROM table_name WHERE timestamp_column BETWEEN '2018-07-01' AND '2018-08-01';

とする必要があります。

brew doctorがめっちゃ警告してくる

インストールの問題のチェックを行うコマンドである「brew doctor」。
Homebrewでインストールしたパッケージが上手く挙動しなかったので、試しにターミナルに打ち込んでみました。
そしたら大量の警告が出てきて気持ちが悪かったので、一つずつ解決したことを備忘録として残しておきたいと思います。
目指せ、「Your system is ready to brew.」!


まずはbrew doctorでエラーの確認。

Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: The following directories are not writable:
/usr/local/lib/pkgconfig

This can happen if you "sudo make install" software that isn't managed
by Homebrew. If a formula tries to write a file to this directory, the
install will fail during the link step.

You should change the ownership of these directories to your account.
  sudo chown -R $(whoami) /usr/local/lib/pkgconfig

Warning: A newer Command Line Tools release is available.
Update them from Software Update in the App Store.


Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  libpng
  freetype
  glib
  webp
  unixodbc
  mysql
  pcre
  jpeg
  libzip

Warning: Homebrew's sbin was not found in your PATH but you have installed
formulae that put executables in /usr/local/sbin.
Consider setting the PATH for example like so
  echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profile

Warning: Your Xcode (9.3) is outdated.
Please update to Xcode 9.4 (or delete it).
Xcode can be updated from the App Store.

めっちゃ警告してきてます。
警告は計5つあるようです。


警告1つ目

Warning: The following directories are not writable:
/usr/local/lib/pkgconfig

This can happen if you "sudo make install" software that isn't managed
by Homebrew. If a formula tries to write a file to this directory, the
install will fail during the link step.

You should change the ownership of these directories to your account.
  sudo chown -R $(whoami) /usr/local/lib/pkgconfig

/usr/local/lib/pkgconfigに書き込み権限が無いようです。
「sudo chown -R $(whoami) /usr/local/lib/pkgconfig」で解決できるとのこと。
エラーの解決方法を教えてくれるなんてHome brew優しすぎるぜ…!
$(whoami)は現在ログインしてるusernameにすれば良いです。
僕はここで少しハマりました。
$(whoami) == usernameなのか(whoami) == usernameなのかwhoami == usernameなのかが初見殺しすぎる…
(正解は$(whoami) == username)


警告2つ目

Warning: A newer Command Line Tools release is available.
Update them from Software Update in the App Store.

書いてあるまま、App StoreでCommand Line Toolsを更新すれば解決できました。以上。
ソフトウェア自体をアップデートしても構わないみたいです。
エラーの解決方法を教えてくれるなんてHome brew優しs(ry


警告3つ目

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  libpng
  freetype
  glib
  webp
  unixodbc
  mysql
  pcre
  jpeg
  libzip

一部のツールがunlinkになっているとのこと。
こちらの警告も書いてあるまま、brew link (ツール名)でずらりと並んでいるツール名を下記のように片っ端から打ち込めば解決。
エr(ry

$ brew link libpng
Linking /usr/local/Cellar/libpng/1.6.34... 18 symlinks created
$ brew link freetype
Linking /usr/local/Cellar/freetype/2.9.1... 8 symlinks created
$ brew link glib
Linking /usr/local/Cellar/glib/2.56.1... 146 symlinks created
$ brew link webp
Linking /usr/local/Cellar/webp/1.0.0... 26 symlinks created
$ brew link unixodoc
Error: No such keg: /usr/local/Cellar/unixodoc
$ brew link unixobdc
Error: No such keg: /usr/local/Cellar/unixobdc
$ brew link unixodbc
Linking /usr/local/Cellar/unixodbc/2.3.6... 37 symlinks created
$ brew link pcre
Linking /usr/local/Cellar/pcre/8.42... 133 symlinks created
$ brew link jpeg
Linking /usr/local/Cellar/jpeg/9c... 18 symlinks created
$ brew link libzip
Linking /usr/local/Cellar/libzip/1.5.1... 127 symlinks created


警告4つ目

Warning: Homebrew's sbin was not found in your PATH but you have installed
formulae that put executables in /usr/local/sbin.
Consider setting the PATH for example like so
  echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profile

/usr/local/sbinにpathが通っていないようなので、

$ echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profile

でpathを通して、

$ source ~/.bash_profile

で変更を反映すればいいみたいです。


警告5つ目

Warning: Your Xcode (9.3) is outdated.
Please update to Xcode 9.4 (or delete it).
Xcode can be updated from the App Store.

Xcodeのバージョンが古いとのことなので、App StoreでアップデートすればOK。
Xcodeのアップデートに数十分かかったのにはビビりました。


全てのエラーの原因を解決した上で再び「brew doctor」を実行!

$ brew doctor
Your system is ready to brew.

ということで警告は全て消え去りました。
スゲーッ爽やかな気分だぜ 新しいパンツをはいたばかりの正月元旦の朝のよーによォ~~~~~~~~~~ッ

これで少しはHome brewの扱いには少し慣れたような気がします。
Home brewのエラーは親切でありがたい限りです。


参考にしたサイト
brew doctorでのWarningを解決してみた(for Mac)
コマンドラインでbrew doctorすると警告だらけになっちゃった助けて
Homebrewのエラーを治す

フロントサイドのプログラムを触り始めてからの日常生活への影響

ここ1ヶ月ほどは研修でほぼずっとフロントサイド(HTML, CSS, jQuery)のプログラムを書いてました。

フロントサイドのことを学んだことによって、日常生活でWebサイトの見え方が前までと少し変わってしまったように感じます。

 

例をいくつか紹介していきたいと思います。

・レイアウトをこうした方がもっと使いやすくなるんじゃないかと考えてしまう。

(画面を遷移して表示するんじゃなくてモーダルで表示して画面を遷移をしない方が使いやすいんじゃないか等)

 

CSSでどんなスタイルを指定しているのかを考えてしまう。

(この文章はtext:align: centerを使っているのかなとか、このボタンはbackground-colorで背景色を指定してcolorで文字の色も変えていてborder-radiusで角を丸くしているなとか)

 

・クリックしたらイベントが発生する時に連打するとどんな挙動をするのかを試してしまう。

(クリックしたら要素がスライドして見え隠れする時、連打したらクリックした回数見え隠れしてしまうのか等) 

 

着々と技術力がついてきているんだなと感じる一方、これは職業病だなと感じ複雑な気分になります。

入社して3週間ちょっとの中で感じた1つのこと

今回は、入社してからまだ1ヶ月も経たない今日ですが、研修の中で感じたことをちょっと書いていきたいと思います。

システムエンジニアに関する研修の中で、見積書作成、UI設計、データベース設計を行いました。

当たり前ですがどれも未経験のことで大分頭を悩ませながら課題に取り組んでいました。

課題に取り組んでいる時に、あれはどうしたらいいこれはああした方がいいかと考えれば考えるほど、どんどん考えが膨れ上がっていって収拾がつかなくなる時もありました。

 

そんな中考える時は、どうすると相手が喜ぶのか、嬉しいのかを考えることが大事なんじゃないかと感じました。

見積書だと、お客さんが見ただけで理解しやすく納得できるような項目や説明になっているのかどうか。

UI設計だと、ユーザーが見ただけで使いやすいユーザーフレンドリーな設計であるかどうか。

データベース設計だと、ユーザーがデータベースを使う目的に必要な設計であるかどうか。

 

 という視点が、もし自分がSEになって業務にあたっていく時に大切なことなんじゃないかなーと感じました。