53ningen.com

@gomi_ningen's Website

PHPの private なメソッドを無理やりテストする方法

Java の package プライベートとかほんと素晴らしい仕組みだと思うのですが、他言語はなかなかないですね...。最近だと Swift2 でようやく @testable import などという形で、モジュールプライベート的なメソッドをテストできるようになっていますが、まだまだ Java に比べると柔軟ではない感じはあります。そもそも、Swift1 系はアクセス修飾子の設計普通にミスってるんじゃないかと思いますが、まあ言語を作っている方々は自分よりもはるかに知識がある方々だと思うので、いろいろあったのかな...という感想。自分はコードを読み書きするときにアクセス修飾子を基準にどこから読み進めるかとか、このメソッドは重要だなとかを判断するので、やっぱりこのあたりの機能が柔軟な言語のほうが好き。

本題。PHP の private メソッドを無理やりテストする方法。まあリフレクションしかないですよね。ということで、以下のような具合(自分のための備忘録)。

        $model = テスト対象のインスタンス;
        $method = new Refl...
Read More

AWS Lambda を用いた Amazon SNS のエンドポイント整理

Amazon SNS の Application に紐付いているエンドポイントには Enabled という Attribute がついています。文字どおり、有効なエンドポイントかどうかを表すものです。Amazon SNS は賢いので APNSGCM からのフィードバックを受けて、プッシュトークンが無効になった場合に自動的に false にしてくれます。しかし、基本的には Enabledfalse になったエンドポイントは不要です。したがって、これらを自動的に削除するような仕組みがあったほうがよさそうです。そこで、この記事では AWS Lambda を用いて、それを実現する方法について説明します。

AWS Lambda で動かすスクリプト

コード自体は非常に簡単で以下のような形です。AWS Lambda Function を素早く立ち上げるとしたら本来は pythonnode.js のほうが良いかと思いますが、今回の作りたいものに関してはそれほど即時性を求められるようなものではないと思うので、好きな言語(もちろん Lambda ...

Read More

Immutable パターン

<p>結城先生のデザパタ本マルチスレッド編 第2章のまとめ</p> <h2>問題</h2> <p>複数のスレッドがインスタンスを共有しているが、インスタンスの状態は変化しない。 このときに、何も考えず <code>Single Threaded Execution</code> パターンを使うとスループットが落ちてしまいます。</p> <h2>解決方法</h2> <p>インスタンスが状態変化しないのであれば <code>Single Threaded Execution</code> パターンを使う必要はありません。 その場合は意図しない状態変化を防ぐためにフィールドが変化しないようにする <code>Immutable</code> パターンを用います。 不変性を保つのは大変なので、気をつけて実装する必要があります。またドキュメントにクラスが不変であることを明示する方が良いでしょう。</p> <h2>関連するパターン</h2> <ul> <li>状態を変更するスレッドが参照するスレッドの数よりも少ないときは、<code>Read-Write Lock</code> パター...Read More

Single Threaded Executionパターン

結城先生のデザパタ本マルチスレッド編 第1章のまとめ

問題

複数のスレッドがインスタンスを共有している状態で、 それぞれのスレッドがインスタンスの状態を勝手に変更すると、インスタンスの安全性が失われます。

解決方法

そこで、そのままではインスタンスが不定な状態に陥ってしまう範囲を定めます。 これをクリティカルセクションと呼びます。 このクリティカルセクションを synchronized を用いて1つのスレッドだけが実行できるようにガードします。 このようなパターンを Single Threaded Execution パターンと呼びます。

関連するパターン

  • インスタンスの状態が変化しないときには Immutable パターンを使うことにより、スループットを向上させることができる
  • インスタンスの状態を参照するスレッドと変更するスレッドが分かれている場合は Read-Write Lock パターンを使うことにより、スループットを向上させることができる

以下のようなカウンターがあったとします

c...
Read More

Java言語で学ぶデザインパターン 〜マルチスレッド編〜 読書メモ (1)

結城先生のデザパタ本マルチスレッド編がサクッと読めそうだったので読み進めているので、自分用メモ。ほとんど知っている内容ではあったけど、体系的に知識が入っていなかったので、よい確認になる...。

Java 言語のスレッド

スレッドの起動方法

スレッドを起動する方法は2つある

  1. Thread クラスのサブクラスのインスタンスを使ってスレッドを起動する
  2. Runnable インターフェースの実装クラスのインスタンスを使ってスレッドを起動する
class ThreadSubclass extends Thread {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    public void run() {
        IntStream.range(0, 10).forEach(i -> logger.info(Integer.toString(i)));
    }

}

class RunnableImpl imp...
Read More

PHPのスコープについて

自分用メモ。PHP の block はスコープの単位とならない。この特徴を示す単純なコードは以下のようなもの。

try {
    $a = "a";
} catch(Exception $e) {
    // do something
}

echo $a;

つまり以下のようなコードは冗長だということになる(ただ、個人的には上のコードわかりづらいと思う...)。

$a;
try {
    $a = "a"
} catch (Exception $e) {
    // do something
}
echo $a;

他言語を書きながら、ふと PHP を書くと混乱するのでメモ。 ...

Read More

無効になったSNSのエンドポイントを削除してくれる AWS Lambda コードを書いた

無効になったSNSのエンドポイント、別に放っておいてもよいのですが、定期的にお掃除したほうがよさそうだったので、お掃除用のAWS Lambdaコードを書きました。Amazon SNSは、アプリケーション(SNSのデバイストークンが登録できるやつ)に紐付いているエンドポイントの状態が変化したときに通知してくれる機能があります。その状態変化通知を受け取るトピックを適当に作っておいて、AWS Lambda コードがそいつを購読するようにしてあげればよいことになります。

ソースコード

...

Read More

Amazon Simple Notification Service(SNS)の基本的な仕組み

<p>用語や概念が少し分かりづらい部分があるため、最初に基本的な仕組みや用語の説明を自分用にまとめました。</p>

[amazon template=wishlist&asin=4839952337]

<h2>通知を送る方法</h2> <p>Amazon SNSを用いて、モバイルPUSH通知を実現するためには、 トピックを利用した通知 と デバイスを直接指定した通知(直接アドレス指定) の 2 種類の方法があります。</p> <h3>トピックを利用した通知</h3> <ul> <li>Amazon SNSには 通知を送りたいクライアント(Publisher)と通知を受け取りたいクライアント(Subscriber)の間に入る トピック という概念が存在します。 <ul> <li>通知を送りたいクライアント(Publisher)は、トピック に対してメッセージを送信します。</li> <li>通知を受け取りたいクライアント(Subscriber)は、トピック を購読(Subscription)します。</li> </ul></li> <li>通知を受け取るクライアントが利用でき...Read More

AWS SDK for PHP を用いた Amazon SNS の操作

AWS Lambda, SQS, HTTP/S, Email, SMS, モバイルデバイスなどに対して PUSH 通知を送ることができる Amazon SNS を PHP の SDK から操作する方法についてざっくりと見ていきます。

SNS クライアントのインスタンス化

Amazon SNS の操作をするためのクライアントクラスは、以下のように直感的にインスタンス化できます。

require_once('./vendor/autoload.php');
use Aws\Sns\SnsClient;

$client = new SnsClient([
    'version' => 'latest',
    'region' => 'us-east-1', # 各自の利用しているregionを指定
    'profile' => 'default',  # ~/.aws/credentials 下に credential を置く
]);

デバイストークンの登録

APNS や GCM などから発行されたデバイストークンは [`SnsCli...

Read More

Cの基本的なコードとアセンブリコード

if 文

int abs(int i) {
    if (i > 0) {
        return i;
    } else {
        return -1 * i;
    }
}

絶対値を返す簡単な関数について見てみる。まずは最適化なし(-O0

_abs:                                   ## @abs
    push rbp
    mov  rbp, rsp
    mov  dword ptr [rbp - 8], edi ## 引数をdword ptr [rbp-8]領域へ格納
    cmp  dword ptr [rbp - 8], 0   ## 0と比較
    jle  LBB0_2 ## 0と同じかそれ以下だったら LBB0_2 ラベルへジャンプ
## BB#1:
    mov  eax, dword ptr [rbp - 8] ## eax レジスタへdword ptr [rbp-8]領域の値をロード
    mov  dword ptr [rbp - 4], ...
Read More

関数呼び出しとアセンブリコード

関数呼び出しとアセンブリコード

次のような簡単な関数について見ていく。return_twotwice 関数を呼び出している。

int twice(int i) {
     return i * 2;
}

int return_two() {
    return twice(1);
}

こいつはどのようなアセンブリコードになるのだろうか。とりあえず clang -S -mllvm --x86-asm-syntax=intel call.c をしてみる。

.globl _twice
 .align 4, 0x90
_twice:                                 ## @twice
 push rbp
 mov  rbp, rsp
 mov  dword ptr [rbp - 4], edi
 mov  edi, dword ptr [rbp - 4]
 shl  edi, 1
 mov  eax, edi
 pop  rbp
 ret

 .globl _return_two
 .align 4, 0x...
Read More

グローバル変数とローカル変数とアセンブリコード

次のようなグローバル変数がどのように扱われるかを確認する

int a = 10;

int add() {
    return a * 2;
}

clang -S -mllvm --x86-asm-syntax=intel global.c で以下のようなコードが生成される。

.section __TEXT,__text,regular,pure_instructions
 .macosx_version_min 10, 11
 .globl _add
 .align 4, 0x90
_add:                                   ## @add
 .cfi_startproc
## BB#0:
 push rbp  ## いつもの
Ltmp0:
 .cfi_def_cfa_offset 16
Ltmp1:
 .cfi_offset rbp, -16
 mov rbp, rsp ## いつもの
Ltmp2:
 .cfi_def_cfa_register rbp
 mov eax, dword ptr [rip + _...
Read More

定数を返すだけの関数のアセンブリコード

いろいろあって、必要に迫られアセンブラの勉強を始めた。基本的に知識が全くないので非常に低レベルな自分用のまとめです。

定数を返すだけの関数

とりあえず定数を返すだけの関数を定義してみる。

int one() {
    return 1;
}

clang -S -mllvm --x86-asm-syntax=intel const.c で生成されたファイルが以下のような具合。

.section __TEXT,__text,regular,pure_instructions
 .macosx_version_min 10, 11
 .globl _one
 .align 4, 0x90
_one:                                   ## @one
 .cfi_startproc
## BB#0:
 push rbp
Ltmp0:
 .cfi_def_cfa_offset 16
Ltmp1:
 .cfi_offset rbp, -16
 mov rbp, rsp
Ltmp2:
 .cfi_def_cfa_regi...
Read More

Copyright © 53ningen.com