ささきしき

チラシ

jQueryのslim_buildにはanimate()も入ってない

表題がすべてですが、念のため確認。

背景

Semantic-UI のモーダルを使いたかったので、こんな感じで呼んでいた

<!doctype html>
<html lang="ja">
<head>
<!-- 略 -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.css" />
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.js"></script>
</head>
<body>

<!-- 略 -->

<button onclick="$('#Modal').modal('show'); return !1;">push</button>
<div id="Modal" class="ui modal">

<!-- 略 -->

そしたら妙な挙動を起こしてエラー吐いて止まるんですね。エラーは以下。

Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: animated

はて何ぞやと確認して回ったら、jQuery の slim build には Ajax のほかに effects (animate) も入ってないのが原因と発覚。
改めて普通のに差し替えたら何事も無く動きましたとさ。

- <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
+ <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

参考

You can also use the slim build, which excludes the ajax and effects modules:

https://jquery.com/download/

HTTPステータスコードを返すだけのサービスつくれなかった

social.mikutter.hachune.net

http-response.net はHTTPレスポンスコードを返すだけのサービスです。

【指定方法】下記いずれか
- ***.http-response.net
- http-response.net/***
【対応コード】
- 200 - 402 - 404
- 410 - 451 - 500

つかいかた

  1. 404 が欲しいな
  2. http://404.http-response.net/ にアクセスしよう!
  3. おわり

FAQ

Q. なんそれ

A. 欲しいねーって

そうは問屋が卸さないよって事らしく、 Mastodon の看取りには使えないらしい。 とりあえず直接叩けばステータス返すだけのサービスになった。

そのうちちゃんと勉強して、できない理由もしっかり理解したい。

Mastodon サーバーはサービス停止時にステータス 410 を返すことが実装上求められていますが、サーバーを止めたのにステータスを返すためだけにサーバーを用意しないといけないのはダルいよね、って声があったので、たまには社会貢献しようかなって。各種 DNS サービスでこのドメインに対して CNAME 書いてくれれば多分動くんじゃないですかね(しらん)。

Q. あれ足して

A. 気分で足すから声かけて

Q. この環境では正しく動作しないが?

A. すまぬ…すまぬ…

気が向いたら直すので声かけてください。直し方知ってるなら教えてくれたら尚嬉しい。

【化石】PHPUnitでtraitのprivateメソッドをテストする(3版;2018-11-06)

片方ずつの話ならググればすぐ出てくるんですけど両方一気にやってるのを見かけなかったので、まぁ組み合わせればいいだけなんですけど備忘録がてら書いておきます。

利用バージョンは以下。

  • PHPUnit 7.3.5
  • PHP 7.1.9
  • Composer/autoload で名前解決してます

setUP()で対応する場合

// MyTrait.php
trait MyTrait
{
  private function privateMethod($arg)
  {
    return true;
  }
}
// traitTest.php
use \PHPUnit\Framework\TestCase;
use MyTrait;

final class MyTreatTest extends TestCase
{
  public function setUp()
  {
    $this->mock  = $this->getMockForTrait(MyTrait::class);
    $this->class = new \ReflectionClass($this->mock);
  }

  public function testPrivateMethod()
  {
    $method = $this->class->getMethod("privateMethod");
    $method->setAccessible(true);

    $argument = "hogefuga"; // optional
    $this->assertTrue($method->invoke($this->mock, $argument));
  }
}

setUpBeforeClass()で対応する場合

trait側は同じなので省略。

// traitTest.php
use \PHPUnit\Framework\TestCase;
use MyTrait;

final class MyTreatTest extends TestCase
{
  protected static $mock;
  protected static $class;

  public static function setUpBeforeClass()
  {
     self::$mock = (new class extends TestCase {})->getMockForTrait(MyTrait::class);
     self::$class = new \ReflectionClass(self::$mock);
  }

  /**
   * @dataProvider dp_PrivateMethod
   */
  public function testPrivateMethod($argument)
  {
    $method = self::$class->getMethod("privateMethod");
    $method->setAccessible(true);

    $this->assertTrue($method->invoke(self::$mock, $argument));
  }

  public function dp_PrivateMethod()
  {
    $mock = $this->getMockForTrait(MyTrait::class);
    $class = new \ReflectionClass(self::$mock);
    $method = $class->getMethod("anotherPrivateMethod");
    $method->setAccessible(true);

    return [
      "argument #1" => $method->invoke($mock, 1),
      "argument #2" => $method->invoke($mock, 2)
    ];
  }
}

メモ

  • たぶんこれで動くと思うんですが、適当に抜き出したので万一動かなかったら大変申し訳ない。言われたら直します。
  • getMockForTrait()
  • ReflectionClass()
  • getMockForTrait()PHPUnitReflectionClass()PHPの標準機能
    • getMockForTrait()は文字通りTraitを受け取ってクラスっぽく展開するメソッド。ただしpublicスコープしか利用できない
    • ReflectionClass()はクラスを受け取ってリバースエンジニアリングできたりするクラス。クラスが持ってるプロパティ・メソッドの一覧を出したり、本件みたいにprivateメソッドを外部から叩いたりできる
  • テストしたいメソッドが1つだけならReflectionMethod()ってクラスのほうが楽そう。というかそっちを紹介する投稿のほうが多い。なんでだろうか
  • setUp()で初期化しないでsetUpBeforeClass()でやりたいものだが、staticメソッドゆえ$thisが生えないので断念
    • 無名クラスを生やしてその場で殴ればselfに代入できる。黒魔術感はある。好みっぽい
    • __construct()でやりたいものだが、なんか失敗した()ので断念
    • テスト件数増えてくるとこの辺所要時間に響くかもしれない。要検討

編集履歴

  • 6 Nov. 2018
    • dataProvider()の仕様についての話題を修正。
  • 23 Sep. 2018
    • setUpBeforeClass()でもできたので追記。
    • dataProvider()での挙動を追記。
  • 21 Sep. 2018
    • 初版

以上

オフ会(≒レセプション)開催に係る、QoR向上のススメ

Quality of Reception.

オフ会って言うと極端な話、ネットで知り合った人間2人がペアチケ当ててライブに出向くのも該当するけれど、そうではなく、「十数人~数十人の人間が、集団として何らかの目的を持って、有志によって開催されたイベントに参加する」くらいの規模のレセプション・パーティーについて語っていると思ってくだしあ。 いまいち想像がつかない方は、そうだなぁ、アニメやマンガで見るような「立食パーティー」ってイメージの、もっと小規模な寄合っぽい、なんかそういうものを想像してみてください。多分。

というわけで、そういうレセプションのスタッフ(ホスト)として参加したときに、何に注意したらより良いものになるのか(なりそうなのか)、という意見を、思いつく限りメモしておこうと思います。

箇条書き結論

  • 連絡方法は1つだけ用意する
  • 会場を下見して、イベント時の人の流れを大まかに把握する
  • 名簿は確実に用意する
  • 金銭の話をするときに「とりあえず」は厳禁
  • 現地機材の徹底確認(できる限り下見しろ)
  • 環境依存性の高いデータは用意しない
  • 私はお前じゃないし、お前は私じゃない
  • 必ずしも参加者全員が味方ではない
  • 必ずしも参加者全員は味方ではない
  • 参加を断る権利も、参加しない権利もある

おわりに・免責

いろいろ思いつくままに書き連ねましたが、あくまで私個人の意見感想であり、所属する企業・団体、ホスティングサーバーの運営企業とは関係なく、特定の政治的思想、宗教的価値観を奨励・批判するものでもありません。また一部明示した箇所を除き、特定の企業・団体や個人、イベント等について言及されたものではありません(お定まりの定型句)。 あくまで「私がホスト側でイベントを興すならこれくらいしたいし、できれば他人がホストになったときにもしていて欲しいけれど、まァ理想論ね。理想論。」という程度の話です。

この文章を大真面目に肯定的に捉えて実践しようとしなくていいし、この文章を大真面目に批判的に捉えて義憤に駆られなくていいです。

以下本旨

続きを読む