底辺SE奮闘記

年収300万SEブログ

【Javascript】IEでのgetBoundingClientRectにはx,yがない件

題で完結し、MDNを確認すればすぐにわかることなのですが、

let hoge = fuga.getBoundingClientRect();
let piyo = hoge.x * 2; 
console.log(piyo);

みたいなコードを書こうものなら

NaN

ってなります。MDNに倣い

let hoge = fuga.getBoundingClientRect();
let piyo = hoge.left * 2; 
console.log(piyo);

としましょう。yの場合はtopですね。

お粗末様でした。

【PHP】meyfa/php-svg のススメ

PHPSVGを取り扱う際に便利なライブラリ「meyfa/php-svg」のご紹介です。

順次追記します

環境

下記の環境で試しております。

github.com

なお、gdは必須です。

インストール

composerで導入します。

composer require meyfa/php-svg

もちろん手動導入も可能です。詳しくは、上記githubから。

テキストを使用する場合は、gd以外にも

--with-freetype-dir=/usr

拡張設定が必要です。

phpenvの場合は、

(MAC)

$HOME/.phpenv/plugins/php-build/share/php-build/default_configure_options

に先ほどの拡張設定を追記して、

phpenv uninstall [PHPバージョン]
phpenv install [PHPバージョン]

としてPHPをインストールしなおすのが簡単で良いかと思います。

使用方法

オブジェクト生成

SVGオブジェクトは下記のようにSVGテキストから生成します。全ての始まりです。

<?php
use SVG\SVG;
$svg  = '<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500"></svg>';
$image = SVG::fromString($svg);

そのほか空のSVGオブジェクトを作成することも可能です。

ノードの追加

SVGオブジェクトに四角/円/テキストなどのノードを追加できます。

基本

ノードは概ね下記のように生成します。

<?php
$node = new SVGText('Hello World', 50, 50))
                   ->setFont($font)
                   ->setSize(40)
                   ->setStyle('fill', '#f00')

ノードのスタイルは、

<?php
$node->setStyle([スタイル名], [スタイル値]);

のように指定します。

主なスタイルは下記の通り、

スタイル名 スタイル値 概要
fill カラーコード(例:#FFFFFF) 塗りつぶし色
stroke カラーコード 枠線の色
stroke-width サイズ(例:2px) 枠線の太さ

直線

<?php
use SVG\Nodes\Shapes\SVGLine;
// $imageはSVGオブジェクト
$image->getDocument()->addChild(
    (new SVGLine(0, 0, 50, 50))
        ->setStyle('stroke', '#f00')
        ->setStyle('stroke-width', 5)
);

四角 矩形

<?php
use SVG\Nodes\Shapes\SVGRect;
// $imageはSVGオブジェクト
$image->getDocument()->addChild(
    (new SVGRect(0, 0, 50, 50))
        ->setStyle('fill', '#f00')
);

テキスト

フォントが必要になります。どこかから入手してきましょう。

<?php
use SVG\Nodes\Structures\SVGFont;
use SVG\Nodes\Texts\SVGText;
// $imageはSVGオブジェクト
$font = new SVGFont('IPAex明朝', "font/ipaexm.ttf");
$image->getDocument()->addChild($font);
$image->getDocument()->addChild(
    (new SVGText('Hello World', 50, 50))
        ->setFont($font)
        ->setSize(40)
        ->setStyle('fill', '#f00')
);

なお太字(font-weight:bold)には対応していないようです。

setStyle('stroke-width', '1px')などで無理やり対応できないこともない。

画像

<?php
use SVG\Nodes\Embedded\SVGImage;
// $imageはSVGオブジェクト
$image->getDocument()->addChild(
    new SVGImage("image.jpg", 0, 0, 50, 50)
);

SVG文字列の出力

SVGの中身を確認したい場合は下記の通り

<?php
// $imageはSVGオブジェクト
echo $image->toXMLString();

ラスタライズ

ラスタライズして画像に保存する場合は下記の通り。

<?php
// $imageはSVGオブジェクト
$rasterImage = $image->toRasterImage($w, $h);
imagepng($rasterImage, "test.png"));

円のアンチエイリアス

バージョン0.90現在、円にアンチエイリアスがかかっていません。

これはgdのimagefilledellipseがアンチエイリアスに対応していないためです。

meyfa/php-svgでは、SVGEllipseRenderer.phpの28行目の下記メソッドを書き換えることで、対応ができそうです。

<?php
//中略
protected function renderFill($image, array $params, $color)
{
    imagefilledellipse($image, $params['cx'], $params['cy'], $params['width'], $params['height'], $color);
}

ですが、それも手間なので楽をしたい場合は、画像にしてしまうか、テキストで●を書くといいと思います。

その他仕様

transformには未対応

下記のようなコードには対応していないようです。残念。

<svg>
<g transform="translate(100,100)">
~~~
</g>
</svg>

【GAS・スプレッドシート】コピーしたスプレッドシートに結びついているGASでのSpreadsheetApp.getActive()は何が取得できるのか

スプレッドシートAをコピーした場合(A'とする)、

それに結びついているGAS(Gaとする)は、

  1. A'とも結びつく
  2. GaのコピーGa'が生成される

のどちらかという問題。

これの解は2なのですが、同名でコピーされてしまうため、非常にわかりにくいですよね。

せめて「Gaのコピー」のような名前になるとわかりやすいのですが・・・

従って、タイトルの、

「SpreadsheetApp.getActive()は何が取得できるのか」

という問題の解は、「ちゃんとA'が取得できる」となります。

お粗末様でした。

【Laravel】CPIサーバにおける.htaccessの記述例

自分用メモ

publicフォルダ削除時

publicフォルダを削除し、html/[プロジェクトフォルダ]の構成時。htmlフォルダ直下に下記を記述。

# PHPのバージョン指定
AddHandler x-httpd-php5619a .php
<IfModule mod_rewrite.c>
    # .envファイルに直接アクセスすることを禁ずる
    <Files ~ "\.(env)$">
        deny from all
    </Files>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    Options +SymLinksIfOwnerMatch
    RewriteEngine on
    # phpMyAdminにログインできなくなることの回避
    RewriteCond %{REQUEST_URI} !^.*/_phpMyAdmin5/
    # 無限ループの回避
    RewriteCond %{REQUEST_URI} !^/[プロジェクトフォルダ]/
    RewriteRule ^(.*) /[プロジェクトフォルダ]/$1
</IfModule>

【PHP】meyfa/php-svgでSVGをPNGにして保存する(テキスト付き)

追記

↓でもう少し詳し目の記事を描きました。

uma-no-kawa.hateblo.jp

環境

github.com

meyfa/phpの導入

composerで導入します。

composer require meyfa/php-svg

テキストを使用する場合は、gd以外にも

--with-freetype-dir=/usr

拡張設定が必要です。

phpenvの場合は、

(MAC)

$HOME/.phpenv/plugins/php-build/share/php-build/default_configure_options

に先ほどの拡張設定を追記して、

phpenv uninstall [PHPバージョン]
phpenv install [PHPバージョン]

としてPHPをインストールしなおすのが簡単で良いかと思います。

利用方法

<?php
use SVG\SVG;
use SVG\Nodes\Texts\SVGText;
use SVG\Nodes\Structures\SVGFont;

//SVGオブジェクトの準備
//文字列から生成の他、ファイルから、空の状態からなどあります。
$svg = '<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500">
    <circle cx="150" cy="200" r="100" fill="#06f"></circle>
    </svg>';
$image = SVG::fromString($svg);

//文字を表示する場合
$font = new SVGFont('IPAex明朝', "font/ipaexm.ttf");
$image->getDocument()->addChild($font);
$image->getDocument()->addChild(
    (new SVGText('こんにちは', 50, 50))
        ->setFont($font)
        ->setSize(30)
        ->setStyle('fill', '#f00')
    );

//イメージのラスタライズ
$rasterImage = $image->toRasterImage(500, 500);

// ブラウザ上に表示する場合
echo $image->toXMLString();

// 保存する場合
imagepng($rasterImage, "my-image.png");

使用フォントについて

フォントは下記サイトより、DLさせていただきました。

ipafont.ipa.go.jp

【Laravel・PHP・うっかり】FileのMax Validateionがうまく動かない件

当たり前なのですが、php.iniなどに

post_max_size = 8M

などと設定されているのに、

<?php
//中略
$this->validate($request, [
    "file" => "required|file|max:8000"
]);

などと最大サイズを指定しても、validation.php

<?php
//中略
'max' => [
    //....
    'file' => 'The :attribute may not be greater than :max kilobytes.',
    //....
],

この部分には引っかかりません。

先にphp.iniの方に引っかかるからですね。

当たり前ですね。お恥ずかしや。

php.iniの方に引っかかった場合は、

<?php
'uploaded' => 'The :attribute failed to upload.',

こちらですね。