SQLの窓

2017年05月29日


PHP : MastodonOAuthPHP の HttpRequest.php の http_request を public に書き換えて、ファイルアップロード

MastodonOAuthPHP

HttpRequest.php の http_request は、file_get_contents を使用した通信処理です。とてもいいサンプルですし、ソースも簡単に読めます。HttpRequest.php のみ upload_file.php と同じディレクトリに置いて実行します。

以下は http_request メソッドを public にして普通に使えるサンプルです。

upload_file.php
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: text/html; charset=utf-8" );

// **********************************************
// クラス定義の読み込み
// **********************************************
require_once("HttpRequest.php");

// **********************************************
// 【クラスの参照】
// HttpRequest の別名を Http として使用
// **********************************************
use \theCodingCompany\HttpRequest as Http;

$file_name = "./img.jpg";

$data = file_get_contents($file_name);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_buffer($finfo, $data);
finfo_close($finfo);

$body = <<<DATA
-----------------------------7da1c519203ca
Content-Disposition: form-data; name="target"; filename="img.jpg"
Content-Type: {$mime}

{$data}
-----------------------------7da1c519203ca
Content-Disposition: form-data; name="send"

送信
-----------------------------7da1c519203ca--
DATA;

// バイト数
$size = strlen($body);

$header = array(
	"Content-Type" => "multipart/form-data; boundary=---------------------------7da1c519203ca",
	"Content-Length" => $size
);

// **********************************************
// アップロード
// **********************************************
$result = Http::http_request(
	"POST",
	"https://ドメイン/demo/file_upload.php", 
	$header, 
	$body
);

print_r( $result );

?>

※ データ区切りの boundary は、以前にダンプした実データのものを使用しています。
※ name="target" でアップロードしています。なので、受けの PHP では固定で処理しました。

file_upload.php
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: application/json; charset=utf-8" );


if ( $_SERVER['REQUEST_METHOD'] == "POST" ) {
 
	$upload = realpath ( './image' );
	$upload .= ( DIRECTORY_SEPARATOR . $_FILES['target']['name'] );
	if ( move_uploaded_file(
		$_FILES['target']['tmp_name'], $upload ) ) {
		$_POST['result']  = "アップロードに成功しました";
	}
	else {
		$_POST['result']  = "アップロードに失敗しました";
	}

}
else {
	$_POST['result']  = "POST メソッドを使用して下さい";
}

$_POST['files'] = $_FILES;

print json_encode($_POST, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );
?>


関連する記事

MastodonOAuthPHP の HttpRequest.php の解説

WindowBuilder(Swing) で、WEBカメラを使用して画像を保存して okhttp で WEBサーバへアップロードする



タグ:通信 PHP
posted by lightbox at 2017-05-29 23:52 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2017年05月28日


Android Studio : エミュレータで Notification(通知)のテスト



こんな感じで結果的には表示されます。単なる動作確認のテストなので、MainActivity でボタンをクリックしたイベント内で呼び出しています。呼び出す前のステータスバーは、以下のようになります。



ボタンをクリックすると、以下のようになります。



このステータスバー(通知領域)から、下にドラッグ(エミュレータなので)すると通知画面が開きます。開いた通知をクリックすると、設定しておいた Google のドキュメントページをブラウザで開きます


Develop > API Guides > 通知

   public void notification(View view) {

        Log.i("lightbox", "notification");
        Notification.Builder builder = new Notification.Builder(getApplicationContext());

        // 通知内容の作成
        builder.setSmallIcon(android.R.drawable.ic_dialog_info);
        builder.setContentTitle("通知テスト");
        builder.setContentText("通知内容");
        builder.setSubText("説明");
        builder.setContentInfo("右下");
        builder.setPriority(Notification.PRIORITY_DEFAULT);
        builder.setAutoCancel(true);

        // 通知から呼び出される処理の作成
        Uri uri = Uri.parse("https://developer.android.com/guide/topics/ui/notifiers/notifications.html?hl=ja");
        // ブラウザ呼び出し
        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
        // 通知に情報を与える PendingIntent の作成
        PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0, intent,PendingIntent.FLAG_CANCEL_CURRENT);
        // 通知にアクションを設定
        builder.setContentIntent(pendingIntent);

        // NotificationManager で通知
        NotificationManager manager = (NotificationManager)MainActivity.this.getSystemService(NOTIFICATION_SERVICE);
        // 第一引数は、アプリケーション内でユニークな通知の識別子
        manager.notify(0, builder.build());

    }

ボタンは今回は、単純に Button の属性で指定しています。public void メソッド(View view) な定義ならなんでもいいです。







posted by lightbox at 2017-05-28 15:44 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする

2017年05月26日


Android Studio : BroadcastReceiver を Anonymous Inner Class で使用し、バッテリーの状態をエミュレータで簡単にテスト

▼ log.i の出力
I/lightbox: android.intent.action.BATTERY_CHANGED
I/lightbox: level : 10 ( / 100 )
I/lightbox: GOOD
I/lightbox: android.intent.action.BATTERY_CHANGED
I/lightbox: level : 50 ( / 100 )
I/lightbox: GOOD
I/lightbox: android.intent.action.BATTERY_CHANGED
I/lightbox: level : 100 ( / 100 )
I/lightbox: GOOD
内部クラスや、サブクラスで実装してもいいですが、内容としてはあまりしょっちゅう行うものでも無いし、テストとしては、telnet で adb に power capacity するほうが重要なのでこのような感じになりました。 BroadcastReceiver に代入する処理は、通常のイベント作成と同じく、new の後で CTRL+SPACE で候補を表示させて、BroadcastReceiver を選択すれば自動的に public void onReceive が作成されるので、その中に処理を記述するたけです。
package com.example.lightbox.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private BroadcastReceiver broadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("lightbox", "onResume");

        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                String action = intent.getAction();
                Log.i("lightbox", action);

                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,-1);
                int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE,-1);
                Log.i("lightbox", String.format("level : %d ( / %d )",level,scale));
                int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH,-1);
                switch( health ) {
                    case BatteryManager.BATTERY_HEALTH_COLD:
                        Log.i("lightbox", "COLD");
                        break;
                    case BatteryManager.BATTERY_HEALTH_DEAD:
                        Log.i("lightbox", "DEAD");
                        break;
                    case BatteryManager.BATTERY_HEALTH_GOOD:
                        Log.i("lightbox", "GOOD");
                        break;
                    case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
                        Log.i("lightbox", "OVER_VOLTAGE");
                        break;
                    case BatteryManager.BATTERY_HEALTH_OVERHEAT:
                        Log.i("lightbox", "OVERHEAT");
                        break;

                }

            }
        };

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(MainActivity.this.getIntent().ACTION_BATTERY_CHANGED);
        // レシーバーを登録
        MainActivity.this.registerReceiver(broadcastReceiver,intentFilter);

    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("lightbox", "onPause");

        MainActivity.this.unregisterReceiver(broadcastReceiver);
    }
}

実際には switch 部分すら必要ありませんが、Android のドキュメントを覘くためのヒントとして使っています。

1) BatteryManager
2) BatteryManager.EXTRA_LEVEL

adb.exe がある場所

Android Studio で実行して、エミュレータ上で実行されたら、タスクマネージャでプロセスを表示してから、イメージ名をクリックしてソートすると、adb.exe がほぼ一番上に表示されるので、右クリックから『ファイルの場所を開く』を選択すると、でエクスプローラで開く事ができます



さらに、エクスプローラでそのフォルダを選択して SHIFT キーを押しながら右クリックして、『コマンドウインドウをここで開く』を選択します。

telnet を使えるように

既に使用している場合は必要無いですが、昨今めったに使う事が無いので Windows で使用できないようになっています。『プログラムと機能』の左サイドにある『Windows の機能の有効化または無効化』で開いたツリーで telnet を有効にします



コマンドプロンプトより adb にアクセス

まず、adb devices をコマンドプロンプトで実行して、現在のエミュレータの id を確認します。
List of devices attached
emulator-5554   device
次に、telnet localhost 5554 を実行して、telnet で adb にアクセスします。
Android Console: Authentication required
Android Console: type 'auth ' to authenticate
Android Console: you can find your  in
'C:\Users\lightbox\.emulator_console_auth_token'
ここで、まず auth コマンドでトークンを入力する必要があります。表示された場所にある、.emulator_console_auth_token をテキストエディタで開いてトークンを取得し、auth コマンドで実行します。
auth トークン文字列
Android Console: type 'help' for a list of commands
OK
これでコマンドが使えるようになるので、help と入力して確認します
help
Android console command help:

    help|h|?         print a list of commands
    event            simulate hardware events
    geo              Geo-location commands
    gsm              GSM related commands
    cdma             CDMA related commands
    crash            crash the emulator instance
    kill             kill the emulator instance
    network          manage network settings
    power            power related commands
    quit|exit        quit control session
    redir            manage port redirections
    sms              SMS related commands
    avd              control virtual device execution
    qemu             QEMU-specific commands
    sensor           manage emulator sensors
    finger           manage emulator finger print
    debug            control the emulator debug output tags
    rotate           rotate the screen clockwise by 90 degrees

try 'help ' for command-specific help
使用するのは、power コマンドです。
power
allows to change battery and AC power status

available sub-commands:
    display          display battery and charger state
    ac               set AC charging state
    status           set battery status
    present          set battery present state
    health           set battery health state
    capacity         set battery capacity state
power capacity 10 のようにして、バッテリーの量を変更するコマンドをクリップボードにコピーしておいて、貼り付けて実行してみて下さい。エミュレータの右上のバッテリーアイコンの量の表示が変わります。 すると、LogCat にも表示されるはずです
posted by lightbox at 2017-05-26 21:58 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり