VueJS + canvas でレスポンシブなcanvasの生成でつまずいた時

環境:

vue@2.6.12

konva@7.1.1

 

dialog内でcanvas生成時、width, height を指定するのでその値をリアクティブに取得したいがdialogのtoggle等でDOM生成前に値を0で取得してしまい、うまくcanvas が描画できない場合

mounted() {

  this.resizeStage()

  this.$nextTick(() => {

    this.loadKonva()

  })

}

method: {

  resizeStage() {

    this.stageSize.width = document.getElementById("canvas").clientWidth

    this.stageSize.height = this.stageSize.width  / this.aspectRatio

  },

  f:id:monteecristoo:20201010000253p:plain

  以降割愛

}

 

dialogを一回目に開いたときは、mountedからのresizeStage()により正常に動作するが、一度閉じた後また開くと、正しい値が取得できず0をstageSize.widthに指定してしまう。

 

solution)

watch: {} を使って値の変化をリスニングしてそれに応じたFuncをコール

 

watch() {

  'dialogStatus'() {

    this.resizeStage()

  },

  'stageSize.width'() {

    if(this.stageSize.width) {

      this.loadKonva()

    }

  }

}

ref:

monteecristoo.hatenablog.comtorisky.com

Vue.js&Nuxt.js超入門

Vue.js&Nuxt.js超入門

 

 

 

vue-router のナビゲーションガードによる昔の twitter like な modal の実装

updated: 2020/10/16

 

環境:

vue@2.6.12

vuex@3.5.1

vue-router@3.4.6

 

Goal:

あるユーザーのポストにダイレクトにアクセス時、

modal を閉じると当該ユーザーのプロフィールページに移行。

また、タイムラインからあるユーザーのポストにアクセス時、

modal を閉じるとタイムラインにバック。

 

solution)

beforeRouteEnter()でroutingの状態をstateに保存し、modalを閉じたときの挙動を保存した状態に応じて制御。

 

beforeRouteEnter(to, from, next) {

  next(vm => {

    vm.router_setStatus({from from, to: to})  // router_setStatus はstateに保存するvuex action とする。ここでは割愛。

  })

}

 

closeModal() {

  if(this.$store.state.router.from) {

    this.$router.go(-1)  // fromがある→direct access ではないので前のページに戻る

  } else {

    this.$router.push('USER_PROFILE_PAGE')  // ユーザーのプロフィールページへ移行

 

**need fix)

modal の背景をダイレクトアクセスとそれ以外できりかえることは可能だが、beforeRouteEnterが都度コールされないので初めに定義したcomponentでしか表示されない。妥協して背景は表示しないこととした。

 

下記のようにmodal以外にnamed router-view を指定するとinitialアクセス時は意図したようにconditionalが機能するが、以降のアクセスはnamed router-viewが再定義されない。

<router-view></router-view>

<router-view name="modal"></router-view>

<router-view name="profile"></router-view>

 

 

beforeRouteEnter(to, from, next) {

f:id:monteecristoo:20201009080645p:plain

↑↑

<router-view>で使用するcomponentを定義している。

ref:

router.vuejs.org

github.com

Vue.jsのツボとコツがゼッタイにわかる本

Vue.jsのツボとコツがゼッタイにわかる本

 

 

  }

}

Laravel 6.x から 7.x へアップグレード with jenssegers / laravel-mongodb

環境:

php@7.2

laravel@6.18.35

mongodb@4.0.1

ext-mongodb@1.6

 

jenssegers / laravel-mongodb が laravel7.x に対応するようになったのでそれへの対応について。

composer.json のlaravel の dependency だけ書き換えて composer update するとエラー

が出るので jenssegers / laravel-mongodb も同時にアップグレードする必要がある。

f:id:monteecristoo:20200929204559p:plain

ext-mongodb をアップグレードする必要がある。

sudo pecl install mongodb

現時点でext-mongodb@1.8がインストールされた。

f:id:monteecristoo:20200929205905p:plain

ref:

www.php.net

composer update

f:id:monteecristoo:20200929210844p:plain

パッケージのダウンロードとともにエラー

Laravel の公式Docに従って app/Exceptions/Handler.php を編集

f:id:monteecristoo:20200929211017p:plain

report と render の引数を Throwable に。頭に use Throwable; も忘れずに。

composer update

f:id:monteecristoo:20200929211207p:plain

ref:

www.youtube.com

 

 

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

環境:

ec2: ubuntu@18.04.06

 

インストール済みのPHPのバージョンを確認

php -v

インストールされているPHPのリストを見る

sudo update-alternatives --lsit php

標準で仕様するphpの切り替え

sudo update-alternatives --set php /usr/bin/php7.2

 

 ref:

laboradian.com

thishosting.rocks

docs.aws.amazon.com

Ubuntuサーバー徹底入門

Ubuntuサーバー徹底入門

 

 

Laravel : Canvas Data を Laravel Storage にアップロードする

環境:

Laravel@6.18.35

 

HTMLCanvasElement.toDataURL()でフロントから送られたデータのサーバー側の処理に関して。

//ヘッダに「data:image/png;base64,」が付いているので、それは外す

if (preg_match('/data:image\/(gif|jpeg|png);base64,(.*)/i', $product['dataImage'], $matches)) {
  $imageType = $matches[1];

//残りのデータはbase64エンコードされているので、デコードする

  $imageData = base64_decode($matches[2]);

//まだ文字列の状態なので、画像リソース化

  $image = imagecreatefromstring($imageData);

  $filename = md5($imageData) . '.' . $imageType;

  imagepng($image, public_path('storage/UPLOAD_DIRECTORY/' . $filename));

  >>> Storage ファサードが使えないので(imagepngを使う必要があるため)、public_path('/storage~~')でパスを指定する必要がある。

}

 

storage directory 等のパーミッションの設定については下記参照

stackoverflow.com

docs.aws.amazon.com

ref:

laracasts.com

am-yu.net

 

PHPフレームワーク Laravel実践開発

PHPフレームワーク Laravel実践開発

 

 

 

Laravel error: file_put_contents() failed to open stream: Permission denied

updated: 2021/10/4

 

f:id:monteecristoo:20200925133254p:plain

環境:

Laravel@8.62.0

ubuntu@20.0.4

 

事象:

ファイルアップロードコードを書いている途中、laravel/storage のパーミッション

sudo chown -R ubuntu:web-content storage にしたあたり?

 

solution:

ディレクトリのパーミッションを変更

chmod -R 775 storage

応急処理:

/storage/framework/sessions 内のファイルを削除(一応コピーを残して)

 

ref:

stackoverflow.com

stackoverflow.com

docs.aws.amazon.com

 

はじめてのLaravel6入門 ~ AWS Cloud9で学ぶ ~

はじめてのLaravel6入門 ~ AWS Cloud9で学ぶ ~

 

 

Laravel Cashier: StripeのダッシュボードからデフォルトのpaymentMethodを設定すると返値が変わる

環境:

laravel@6.18.35

laravel-cashier@12.3.1

 

LaravelからデフォルトのpaymentMethodを設定した場合

f:id:monteecristoo:20200917062426p:plain

 

Stripeのダッシュボードからデフォルトを別のpaymentMethodに設定すると…

f:id:monteecristoo:20200917071619p:plain

f:id:monteecristoo:20200917065054p:plain

PaymentMethod object ではなく、 Card object を返すようになってしまうのでダッシュボードからデフォルトの payment を設定した後は必ず laravel 側で再度 updateDedaultPaymentMethod() をコールし直して paymentMethod object を返すように統一する。

 

$id = $user->defaultPaymentMethod()->id

$user->updateDefaultStripePaymentMethod($id)