SQLの窓

2016年11月29日


Android Studio で Twitter4J で画像付きツイート

Twitter API は使用回数制限があるので、現在それほど魅力的なものではありませんが、BOT 的な使い道や、ログとして使うのならば、Java のサンプルとしては魅力的ではあると思います。特に、Twitter4J を使うと、いとも簡単にツイートは可能なのです。

ダウンロードしてインストール

ダウンロードリンクは Twitter4J にあります。解凍して Android Studio のプロジェクトの libs に twitter4j-core-4.0.4.jar と twitter4j-async-4.0.4.jar をコピーします。

この後、メニューから add as library でもかまいませんが、app の gradle が以下のようになればいいです
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile files('libs/twitter4j-core-4.0.4.jar')

}

twitter4j-async-4.0.4.jar は非同期処理に必要ですが、gradle に記述する必要はありません。

ちなみに、他のライブラリを全てコピーするとエラーになります(たぶん内容が重複してるとかかもしれません)

設定ファイル

twitter4j.properties が必要です。場所は app\src\main\resources です。

エクスプローラから作成してテキストファイルを作成して、自分の Twitter から、右下の『開発』をクリックして、My Apps で アプリを作るか既存のアプリからトークンをコピペして twitter4j.properties に書き込むだけです

このへんは、Twitter の API を使った人なら常識の範疇ですが、初めてでもインターネットでたくさん紹介されているので問題は無いはずです。
debug=true
oauth.consumerKey=*********************
oauth.consumerSecret=******************************************
oauth.accessToken=**************************************************
oauth.accessTokenSecret=******************************************

実行コード

画像は、あらかじめ用意しておいてパスを取得しておきます。カメラを使用するなら、ギャラリーに登録までした後のパスをそのまま使えばいいし、一時的に使うだけなら後から削除でいいですね(もちろん終了イベント後に削除)

カメラを起点とした画像データの処理 / Android

配布ページのサンプルコードは、タイプミスがあるので注意

▼ 実行
				// 入力テキストを取得
				EditText editText = (EditText) rootView.findViewById(R.id.tweetText);
				String text = editText.getText().toString();

				// 入力なしなら、テキストを作成
				if ( text.trim().equals("") ) {
					Calendar cal = Calendar.getInstance();
					SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
					text = String.format( "%s %s", sf.format(cal.getTime()), "に Android からツイートしました");
				}
				// デバッグ用
				Log.i("lightbox",text);

				// 非同期のリスナーを作成
				TwitterListener listener = new TwitterAdapter() {
					@Override
					public void updatedStatus(Status status) {
						System.out.println("Successfully updated the status to [" +
							status.getText() + "].");
					}

					@Override
					public void onException(TwitterException te, TwitterMethod method) {
						if (method == TwitterMethod.UPDATE_STATUS) {
							te.printStackTrace();
						} else {
							throw new AssertionError("Should not happen");
						}
					}

				};

				// 非同期の準備
				AsyncTwitterFactory factory = new AsyncTwitterFactory();
				AsyncTwitter asyncTwitter = factory.getInstance();
				// リスナーを登録
				asyncTwitter.addListener(listener);

				// StatusUpdate ノインスタンスを作成
				// ※ 画像ツイートに必要
				StatusUpdate statusUpdate = new StatusUpdate(text);
				// 画像のファイルオブジェクト
				File file = new File( mainActivity.getimagePath() );
				// 画像を設定
				statusUpdate.media(file);

				// ツイート
				asyncTwitter.updateStatus(statusUpdate);


何故か非同期のサンプルが世の中に無かったですが、Android でツイートしようなんて思う人がたぶんもういないのでしょう( 殆どメリットや魅力が無いので )

updatedStatus イベント内の注意

この中は UI スレッドでは無いようなので、成功の後画面処理する場合は、適宜必要な UI スレッド呼び出しを実装します。

runOnUiThread( android.app.Activity )
UIスレッドで指定されたアクションを実行します。 現在のスレッドがUIスレッドの場合、アクションは直ちに実行されます。 現在のスレッドがUIスレッドでない場合、アクションはUIスレッドのイベントキューにポストされます。
posted by lightbox at 2016-11-29 20:10 | 2016 Android Studio | このブログの読者になる | 更新情報をチェックする

2016年11月26日


Google Chrome のコンソールが、『いらすとや』のイラストでいっぱいになった日

Google Plus でデベロッパーツールを開けてコンソールを見たら、大きな文字が色つきで表示されていたので、console.log で css が使えると解りました。

で、画像を使えるならサイトのメッセージとして強力だなぁと思い試してみると・・・

かなり強力です。

最大表示 

console.log("%c%s",
"background: url('https://lh3.googleusercontent.com/-lpfmi9vuwOg/WDVegEds_SI/AAAAAAAAhxc/0DzXoBQQlJw_L7KXSIi2UY0hEJwjiNcHwCHM/s128/internet_kanki_woman1.png'); font-size: 1240px;"," ")
※ 表示エリアを確保するのに、漢字スペース使ってます。半角スペースだと、思ったようになりませんでした。

一夜あけて、さらに調べてみると

Facebook の出力方法だけ特殊だったので、JavaScript のコードを拾ってみると、通常では右上に実行したスクリプトと行が出るようになってるのですが、それを消す実行方法が以下になります
setTimeout(console.log.bind(console,"%c%s",
"background: url('https://lh3.googleusercontent.com/-lpfmi9vuwOg/WDVegEds_SI/AAAAAAAAhxc/0DzXoBQQlJw_L7KXSIi2UY0hEJwjiNcHwCHM/s128/internet_kanki_woman1.png'); font-size: 1240px;"," "))

このコードが入っていたのが以下になります
'Chromedome',
['fbt'],
(function a(b, c, d, e, f, g, h) {
    if (c.__markCompiled) c.__markCompiled();
    g.start = function(i) {
        if (i.off || top !== window || !/(^|\.)facebook\.(com|sg)$/.test(document.domain)) return;
        var j = i.stop || h._("STOP\uff01"),
        k = i.text || h._("\u3053\u308c\u306f\u958b\u767a\u8005\u5411\u3051\u306e\u30d6\u30e9\u30a6\u30b6\u6a5f\u80fd\u3067\u3059\u3002Facebook\u6a5f\u80fd\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u307e\u305f\u306f\u8ab0\u304b\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u30cf\u30c3\u30ad\u30f3\u30b0\u3059\u308b\u305f\u3081\u306b\u3001\u3053\u3053\u306b\u4f55\u304b\u3092\u30b3\u30d4\u30fc\u30fb\u8cbc\u308a\u4ed8\u3051\u3059\u308b\u3088\u3046\u306b\u8a00\u308f\u308c\u305f\u5834\u5408\u3001\u305d\u308c\u306f\u7b2c\u4e09\u8005\u304c\u3042\u306a\u305f\u306eFacebook\u30a2\u30ab\u30a6\u30f3\u30c8\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u5f97\u308b\u305f\u3081\u306e\u8a50\u6b3a\u30fb\u4e0d\u6b63\u884c\u70ba\u3067\u3059\u3002"),
        l = i.more || h._("\u8a73\u7d30\u306f{url}\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002", [h.param('url', 'https://www.facebook.com/selfxss')]);
        if ((window.chrome || window.safari) && !i.textonly) {
            var m = 'font-family:helvetica; font-size:20px; '; [[j, i.c1 || m + 'font-size:50px; font-weight:bold; ' + 'color:red; -webkit-text-stroke:1px black;'], [k, i.c2 || m], [l, i.c3 || m], ['', '']].map(function(s) {
                setTimeout(console.log.bind(console, '\n%c' + s[0], s[1]));
            });
        } else {
            var n = ['', ' .d8888b.  888                       888', 'd88P  Y88b 888                       888', 'Y88b.      888                       888', ' "Y888b.   888888  .d88b.  88888b.   888', '    "Y88b. 888    d88""88b 888 "88b  888', '      "888 888    888  888 888  888  Y8P', 'Y88b  d88P Y88b.  Y88..88P 888 d88P', ' "Y8888P"   "Y888  "Y88P"  88888P"   888', '                           888', '                           888', '                           888'],
            o = ('' + k).match(/.{35}.+?\s+|.+$/g),
            p = Math.floor(Math.max(0, (n.length - o.length) / 2));
            for (var q = 0; q < n.length || q < o.length; q++) {
                var r = n[q];
                n[q] = r + new Array(45 - r.length).join(' ') + (o[q - p] || '');
            }
            console.log('\n\n\n' + n.join('\n') + '\n\n' + l + '\n');
            return;
        }
    };
})
※ 後半の 8 が並んでる文字列は、Chrome と Safari 以外で使用されます。(要するにアスキーアートですね。)

IE は無視されてました。Firefox は、出てます。



※ Google Chrome で表示中ならば、F12 で見てみて下さい。出してみました

posted by lightbox at 2016-11-26 12:08 | Google Chrome | このブログの読者になる | 更新情報をチェックする

汎用型 : Firebase に置いたデータで履歴書(作りかけ)のフォームを出力するサンプル



デモページ

Firebase データ

ごく一般的なデータから罫線(含連続)・BOX・テキスト・画像を出力して単票のフォームを作成します。特別な内容ではありませんが、Firebase 使うと結構汎用性も出るのでは無いかと思います。

印字部分
<?php
// ************************************************
// セッションとキャッシュなし
// ************************************************
session_cache_limiter('nocache');
session_start();

require_once("print.php");

// ************************************************
// フォーマットデータ
// ************************************************
$url = "https://freebase-654b7.firebaseio.com/tcpdf.json";
$file = @file_get_contents($url);
if ( $file !== false ) {
	// 連想配列形式で返す
	$result = json_decode( $file, true );

	if ( $result == null ) {
		// テキストのサイズ変更
		$pdf->SetFont('meiryo001', '', 20);
		// テキストの色
		$pdf->SetTextColor(255, 0, 0);
		user_text( $pdf, 10, 10, 'データが存在しません' );
		$pdf->Output("test_output.pdf", "I");
		exit();
	}

}


log_out(null);

$pdf->SetFont('meiryo001', '', 14);

$pdf->AddPage();

// ************************************************
// 印字コマンド実行
// ************************************************
foreach( $result['format'] as $obj ) {

	if ( $obj['type'] == 'image' ) {
		$pdf->Image($obj['f'], $obj['x'],$obj['y'],$obj['w'],$obj['h']);
		continue;
	}

	if ( $obj['type'] == 'text' ) {
		$pdf->SetFont('meiryo001', '', $obj['s']);
		user_text( $pdf, $obj['x'],$obj['y'], $obj['t'] );
		continue;
	}

	if ( $obj['type'] == 'rect' ) {
		$pdf->Rect($obj['x'],$obj['y'],$obj['w'],$obj['h']);
		continue;
	}

	if ( $obj['type'] == 'line' ) {
		$pdf->Line($obj['x'],$obj['y'],$obj['x']+$obj['w'],$obj['y']);
		continue;
	}

	if ( $obj['type'] == 'vline' ) {
		$pdf->Line($obj['x'],$obj['y'],$obj['x'], $obj['y']+$obj['h']);
		continue;
	}

	if ( $obj['type'] == 'lines' ) {

		$row = $obj['y'];
		
		for( $i = 0; $i < $obj['n']; $i++ ) {
			$pdf->Line($obj['x'], $row, $obj['x']+$obj['w'], $row);
			$row += $obj['p'];
		}

		continue;
	}

}


// ブラウザへ PDF を出力します
$pdf->Output("test_output.pdf", "I");
?>


TCPDF 依存部分(print.php)
<?php
define ('K_PATH_FONTS', "tcpdf/");
require_once('tcpdf/tcpdf.php');

// ************************************************
//   P or PORTRAIT(縦:既定)
//   L or LANDSCAPE(横))
// ---------------------------
//   pt: ポイント
//   mm: mm(既定)
//   cm: cm
//   in: インチ
// ---------------------------
//   用紙サイズ
// ---------------------------
// boolean $unicode = true
// ---------------------------
// String $encoding = 'UTF-8'
// ---------------------------
// boolean $diskcache = false
// ---------------------------
// PDF/A モード
// ---------------------------
// 
// 全てデフォルトなので $pdf = new TCPDF("L") でもOK
// ************************************************
$pdf = new TCPDF("P");
/*
$pdf = new TCPDF(
	"L",
	"mm",
	"A4",
	true,
	"UTF-8",
	false,
	false
);
*/

// ************************************************
// 設定
// ************************************************
$pdf->setFontSubsetting(false);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetAutoPageBreak(false);


function log_out( $text ) {

	if ( $text == null ) {
		file_put_contents("log.txt","");
		return;
	}

	file_put_contents("log.txt", $text . "\n", FILE_APPEND );

}

# **********************************************************
#  テキスト印字
# **********************************************************
function user_text( $pdf, $x, $y, $text, $w=1, $h=0, $p="L" ) {

	text( $pdf, $x, $y, $text, $w, $h, $p );

	return $y;

}

# **********************************************************
# 位置指定印字
# ※ 改行コードで自動改行
# ※ ページあふれで自動改ページ
# ※ 内部印字位置は保存( 元に戻す )
# **********************************************************
function text( $pdf, $x=0, &$y=0, $txt='', $w=1, $h=0, $p="L" ) {

	$a = $pdf->GetX();
	$b = $pdf->GetY();

	$hm = $pdf->getPageHeight( );
	$dm = $pdf->getPageDimensions();
	$tm = $dm['tm'];
	$bm = $dm['bm'];

	$txt = str_replace( "\r","", $txt );
	$data = explode("\n", $txt );
	if ( count( $data ) > 1 ) {
		for( $i = 0; $i < count($data); $i++ ) {
			if ( $i == 0 ) {
				$pdf->SetXY( $x, $y );
			}
			else {
				$y += $pdf->getLastH();
				if ( $y >= ( $hm - $tm - $bm ) ) {
					$pdf->AddPage();
					$y = $tm;
				}
				$pdf->SetXY( $x, $y );
			}
			$pdf->Cell($w, $h, $data[$i], 0, 0, $p);
		}
	}
	else {
		$pdf->SetXY( $x, $y );
		$pdf->Cell($w, $h, $txt, 0, 0, $p);
	}
	$y += $pdf->getLastH();

	$pdf->SetXY($a,$b);

}


?>


関連する記事

1会話・IFRAME(TCPDF)テンプレート : jQuery + Bootstrap(css) + mmenu + Firebase + TCPDF + PHP




タグ:Firebase TCPDF PHP PDF
posted by lightbox at 2016-11-26 02:26 | PHP + PDF | このブログの読者になる | 更新情報をチェックする
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 終わり