SQLの窓

2015年06月28日


Eclipse で、文字列内のファイルのパスの \ 記号を \\ にする方法


 

このチェックボックスをオンにすると、"" の中にクリップボードから文字列を貼り付ける場合に、" や \ の後になんらかの文字が続いている場合は、" が \" に \ が \\ になります。

この為、Windows のパスをそのまま "" の中に貼り付けると、全ての \ が \\ となり、そのまま使用可能になります。

※ " や \ を単独で貼り付けても変化はしません。
※ コメント内は対象になりません

既に \ で作成されている文字列は、範囲を選択して SHIFT + DEL で削除して、再度貼り付けるといいです。

※ この場合、SHIFT + INS で貼り付けるとキー操作は最速になります。


posted by lightbox at 2015-06-28 21:43 | Java | このブログの読者になる | 更新情報をチェックする

2015年06月27日


Android の ListView をカスタマイズする為のテスト用の TestArrayAdapter クラスを作成しました。getView を外に出したので、継承して getView を Override する必要がありません

tools.jar

(Tools/Tools2/TestArrayAdapter)



tools.jar には、以下のサンプルコードで使用している、テストを楽にする static メソッドを持った、Tools クラスと Tools2 クラスと、TestArrayAdapter がカタログされています。tools.jar で動かすのもいいですが、どうせテスト目的なので、ソースで実装したほうが面白いかもしれません。
TestArrayAdapter

コンストラクタの第三引数で、OnGetViewListener を渡して、コンストラクタ作成部分で、内部の getView 情報をもらって、カスタムの行画面に対してデータをセットしようというものです。( 通常処理に戻すには、第三引数は null にします )
package jp.android.work;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

/**
 * Created by lightbox on 2015/06/27.
 */
public class TestArrayAdapter<T> extends ArrayAdapter<T> {

	public interface OnGetViewListener {
		abstract public View onGetViewListener(int position, View convertView, ViewGroup parent);
	}

	private OnGetViewListener listener = null;

	public TestArrayAdapter(Context context, int resource,OnGetViewListener listener) {
		super(context, resource);
		this.listener = listener;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if ( listener != null ) {
			return listener.onGetViewListener(position, convertView, parent);
		}
		return super.getView(position, convertView, parent);
	}
}


使用サンプル

Tools や Tools2 のメソッドでできる限りソースを簡潔に書けるように努力しています。

getView 内のお約束の処理に関しては、一応 Android Developer のサンプルコードで該当するものをチェックしました。

LayoutInflater の取得に関しては、getSystemService を使うものと、getLayoutInflater を使うものと両方がありましたが、LayoutInflater の説明ではどちらでもいいような記述でした。ただ、目立ってたので getSystemService を使いました。
package sample.lightbox.simplelistview;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;

import com.google.gson.Gson;

import jp.android.work.TestArrayAdapter;
import jp.android.work.Tools;
import jp.android.work.Tools2;


public class MainActivity extends Activity {

	// Livedoor の お天気Webサービス用 (配列データ用)
	class PinpointLocation {
		String link;
		String name;
		public PinpointLocation(String myLink, String myName) {
			name = myName;
			link = myLink;
		}

		@Override
		public String toString() {
			return name;
		}
	}
	// Livedoor の お天気Webサービス用 (JSON用)
	class Weather {
		PinpointLocation[] pinpointLocations;
	}

	// 専用アダプター
	TestArrayAdapter<PinpointLocation> adapter = null;

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

		// リストビュー(PinpointLocation)用のテスト用アダプターを作成
		adapter =
			new TestArrayAdapter<PinpointLocation>(
				MainActivity.this,
				android.R.layout.simple_list_item_1,
				// 内部からこの OnGetViewListener 内の onGetViewListener を呼び出しています
				new TestArrayAdapter.OnGetViewListener() {
					@Override
					public View onGetViewListener(int position, View convertView, ViewGroup parent) {
						// 行処理のお約束
						// ▼ getView を使ったカスタムのサンプル
						// developer.android.com/samples/DataLayer/Application/src/com.example.android.wearable.datalayer/MainActivity.html
						View rowView = convertView;
						if (rowView == null) {
							// developer.android.com/reference/android/view/LayoutInflater.html
							LayoutInflater inflater = (LayoutInflater)MainActivity.this.getSystemService
								(Context.LAYOUT_INFLATER_SERVICE);
							rowView = inflater.inflate(R.layout.layout_items, null);
						}

						// 外側の自分自身を参照して、内部の PinpointLocation を取得
						PinpointLocation pl = adapter.getItem(position);
						// useView を使用して直接値をセット
						Tools2.<TextView>useView(rowView,R.id.text1).setText(pl.name);
						Tools2.<TextView>useView(rowView,R.id.text2).setText(pl.link);
						Tools2.<TextView>useView(rowView,R.id.text3).setText(Integer.toString(position+1));

						return rowView;
					}
				}
			);

		// ボタンイベントの作成
		Tools2.useButton(MainActivity.this, R.id.button, new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// データをセット
				Tools.callHttpGet(
					"http://weather.livedoor.com/forecast/webservice/json/v1?city=270000",
					"utf-8",
					new Tools.OnAsyncTaskListener() {
						@Override
						public void onAsyncTaskListener(String s) {

							Gson gson = new Gson();
							Weather weatherData = gson.fromJson(s, Weather.class);

							adapter.clear();
							adapter.addAll(weatherData.pinpointLocations);
							// リストビューに適用
							Tools2.<ListView>useView(MainActivity.this, R.id.listView)
								.setAdapter(adapter);

						}
					}
				);
			}
		});
	}

}


画面定義
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="20dp">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/text1"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:textSize="20dp"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/text2"
        android:layout_below="@+id/text1"
        android:layout_alignParentStart="true"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/text3"
        android:layout_below="@+id/text2"
        android:layout_alignParentStart="true"/>
</RelativeLayout>



posted by lightbox at 2015-06-27 23:20 | Android Studio 2 | このブログの読者になる | 更新情報をチェックする

2015年06月25日


jQuery の css メソッドの引数に、$.get で外部から取得した値をセットして表示を変更する( JSON を Google ドライブに置いて使います )

jQuery の css メソッドは、文字列を一つのペアで渡すか、オブジェクトの内部を css のプロパティと一致させて複数の指定を一度に処理できます。ですから、その部分の定義を JSON 文字列で外部に保存しておいて、$.get で取得して利用するという運用が可能です。
{
    "background-color": "pink",
    "color": "red",
    "padding": "10px",
    "border": "solid 1px #000000",
    "border-radius": "8px"
}

その際、ページと違ったドメインにファイルを置く場合、そのままではセキュリティエラーになる為、参照されるドメイン側で、『access-control-allow-origin:*』を返す必要がありますが、Google ドライブにWEBページを作成する方法 でファイルを置いておけば、もともとそのような設定になっているのですぐ使う事ができます。

 

『Google ドライブ内の css.json』

※ Drive Notepad等の編集アプリで作成して変更する運用が必要になるので注意して下さい


▼ 実際に読み込んで実行しています



$.get は、このサンプルの使い方の場合、【第三引数 ※説明ありにデータの種類を指定できますが、Google ドライブに正しく保存して公開すると、『content-type:application/json』となるのでこの場合は指定する必要がありません。
<style>
.entry input {
    background-color: white;
    color: black;
    padding: 2px;
    border: solid 1px #dddddd;
    border-radius: 0px;
}
</style>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function(){

	$("#button").click(function(){
			$.get("https://96c122600b0451b70cd6e48fcec8f876331f788b.googledrive.com/host/0B9Jymqpro6gSflBRZktqSVRqaHA3M2R1S1lIb05NdGNNckFENXJmbGRkX3hsRnZOR1laTG8/css.json", function(data){
			$(".entry input").css( data );
			
		});
	});

	$("#button_reset").click(function(){
		$.get("https://96c122600b0451b70cd6e48fcec8f876331f788b.googledrive.com/host/0B9Jymqpro6gSflBRZktqSVRqaHA3M2R1S1lIb05NdGNNckFENXJmbGRkX3hsRnZOR1laTG8/css_default.json", function(data){
			$(".entry input").css( data );
			
		});
	});
});
</script>
<input type="button" value="CSS適用" id="button">

<form class="entry">
<input type="text" name="sei" id="sei" value="山田"><br>
<input type="text" name="mei" id="mei" value="太郎"><br>
<input type="text" name="simei" id="simei"><br>
</form>

<input type="button" value="解除" id="button_reset">
オンライン実行



タグ:AJAX jquery
posted by lightbox at 2015-06-25 15:17 | jQuery + Ajax | このブログの読者になる | 更新情報をチェックする

【3大手法】 PHP で変数を埋め込んだ画面定義を外部ファイルにして、ループ内で展開する

外部ファイルを読み込む手段としては二つあって、一つは一般的な require で行います。もう一つはテキストファイルとして file_get_contents を使用します。

以下のサンプルソースの実行時の環境としては、データベースに対して接続した後、select 文を実行して行データをループで取得しているという前提です。

require 使った標準的な手法

この方法は PHP のあたりまえの記述で、想定通りの結果になる手法です。ただ、外部ファイルの埋め込み方法の記述も一般的になる為、変数埋め込みの記法が面倒で、画面作成やメンテナンスに時間がかかりますし、他の目的への転用は全くできません。
// 画面作成
print "<table>";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// 行の繰り返し
	require("view_row.php");

}
print "</table>";

<tr>
	<td class="left"><?= $row["社員コード"] ?></td>
	<td class="right"><?= $row["氏名"] ?></td>
</tr>


file_get_contents 使った手法

この方法は、画面定義用の文字列を単純に外部ファイルにして、テキストデータ内の変数を eval を使って置き換える手法です。この場合、変数部分以外も単純な文字列なので、正規表現による置換や単純な置換の対象となりますし、利用方法はいろいろな場面であらわれると思います。( SQL 文の定義にも有効です )

ただ、変数の記述部分のルールとして、連想配列部分の文字列はシングルクォートで書く必要があります
// 画面作成
print "<table>";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// 行の繰り返し
	$view_row = file_get_contents("view_row.txt");
	$view_row = str_replace('"', '\\"', $view_row );
	eval("\$view_row = \"$view_row\";");
	print $view_row;

}
print "</table>";

<tr>
	<td class="left">{$row['社員コード']}</td>
	<td class="right">{$row['氏名']}</td>
</tr>



require の中で、ヒアドキュメントを使う方法

この方法が一番簡単で単純で、本来のヒアドキュメントの目的をしっかり使ったものです。難しい問題は全く無く、自然に使える方法です。

ここでは、print を外に出して使っていますが、view_row.php 内で print してしまってもかまいません。
// 画面作成
print "<table>";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// 行の繰り返し
	require("view_row.php");
	print $view_row;

}
print "</table>";

<?php
$view_row = <<<VIEW_ROW
<tr>
	<td class="left">{$row["社員コード"]}</td>
	<td class="right">{$row["氏名"]}</td>
</tr>
VIEW_ROW;
?>

いずれも関数化する事は可能ですが、テキストを外部に定義して管理するという目的においては、file_get_contents を使う方法が最も優れています。( 画面作成の場合、文字列を取得するだけで後で使うという選択肢のほうが現実的です )

require は、その場で書いてしまう場合において、一般的なメンテナンス性が向上するはずです。

関数化する場合は、埋め込む変数にスーパーグローバルの $GLOBALS を使うといいです。


タグ:PHP
posted by lightbox at 2015-06-25 11:14 | PHP | このブログの読者になる | 更新情報をチェックする

2015年06月23日


PHP で pathinfo と mime 情報やその他を合体した、get_finfo 関数を使って、opendir からファイル一覧を出力

ファイルの一覧から、ファイル情報を配列でまとめたものを一括で取得できるようにしました。

※ Windows では、php.ini の extension=php_fileinfo.dll を有効にする必要があります
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

print "<pre>";

$target = ".";
print realpath($target) . "\n";

$dir_handle = @opendir($target);
if ( $dir_handle ) {
	// ディレクトリハンドルの取得成功

	while (false !== ($entry = readdir($dir_handle))) {
		// 対象外は読み飛ばし
		if ( $entry == '.' || $entry == '..' ) {
			print  "対象外=>{$entry}\n";
			continue;
		}

		print  "{$entry}\n";
		print_r( get_finfo($target.DIRECTORY_SEPARATOR.$entry) );


	}
}

print "</pre>";

function get_finfo($path) {

	$finfo = finfo_open(FILEINFO_MIME);
	$mime = finfo_file($finfo, $path);
	$mime2 = explode( "; ", $mime );
	$mime3 = explode( "=", $mime2[1] );
	$pathinfo = pathinfo(realpath($path));
	$path_parts = pathinfo($pathinfo["dirname"]);
	$pathinfo["parent"] = $path_parts["basename"];
	$pathinfo["mime"] = $mime2[0];
	$pathinfo["charset"] = $mime3[1];
	if ( $pathinfo["charset"] == "" ) {
		unset($pathinfo["charset"]);
	}
	$pathinfo["size"] = filesize($path);
	if ( $pathinfo["mime"] == "directory" ) {
		unset($pathinfo["size"]);
	}
	$pathinfo["full"] = realpath($path);

	return $pathinfo;

}

?>


▼ 以下は、Windows での実行サンプルです。
C:\user\web\basic
対象外=>.
対象外=>..
db_update
Array
(
    [dirname] => C:\user\web\basic
    [basename] => db_update
    [filename] => db_update
    [parent] => basic
    [mime] => directory
    [full] => C:\user\web\basic\db_update
)
dir_test.php
Array
(
    [dirname] => C:\user\web\basic
    [basename] => dir_test.php
    [extension] => php
    [filename] => dir_test
    [parent] => basic
    [mime] => text/x-php
    [charset] => utf-8
    [size] => 1457
    [full] => C:\user\web\basic\dir_test.php
)
log.zip
Array
(
    [dirname] => C:\user\web\basic
    [basename] => log.zip
    [extension] => zip
    [filename] => log
    [parent] => basic
    [mime] => application/zip
    [charset] => binary
    [size] => 1589
    [full] => C:\user\web\basic\log.zip
)
php.exe
Array
(
    [dirname] => C:\user\web\basic
    [basename] => php.exe
    [extension] => exe
    [filename] => php
    [parent] => basic
    [mime] => application/x-dosexec
    [charset] => binary
    [size] => 59392
    [full] => C:\user\web\basic\php.exe
)
php5.dll
Array
(
    [dirname] => C:\user\web\basic
    [basename] => php5.dll
    [extension] => dll
    [filename] => php5
    [parent] => basic
    [mime] => application/x-dosexec
    [charset] => binary
    [size] => 5949440
    [full] => C:\user\web\basic\php5.dll
)
tool_html_150517214638.htm
Array
(
    [dirname] => C:\user\web\basic
    [basename] => tool_html_150517214638.htm
    [extension] => htm
    [filename] => tool_html_150517214638
    [parent] => basic
    [mime] => text/html
    [charset] => utf-8
    [size] => 603
    [full] => C:\user\web\basic\tool_html_150517214638.htm
)
_img.jpg
Array
(
    [dirname] => C:\user\web\basic
    [basename] => _img.jpg
    [extension] => jpg
    [filename] => _img
    [parent] => basic
    [mime] => image/jpeg
    [charset] => binary
    [size] => 133801
    [full] => C:\user\web\basic\_img.jpg
)



タグ:PHP
posted by lightbox at 2015-06-23 23:12 | PHP | このブログの読者になる | 更新情報をチェックする

2015年06月22日


Android Studio のテストのコード記述を少し簡潔にする static メソッドをまとめた Tools2 クラス

tools.jar

(Tools/Tools2/TestArrayAdapter)

何をテストするにもボタンですし、画面上のコントロールの操作ではインスタンスを取得する事になるので、ジェネリックメソッド のサンプルとしての useView メソッドが役に立つかもしれません
package jp.android.work;

import android.app.Activity;
import android.view.View;
import android.widget.Button;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * Created by lightbox on 2015/06/19.
 */
public class Tools2 {

	// 汎用型コントロール参照
	public static <T> T useView(Activity context,int id) {
		T view = null;
		view = (T)context.findViewById(id);
		return view;
	}

	// ボタン用コントロール参照( イベント引数付き )
	public static Button useButton(Activity context,int id,View.OnClickListener listener) {
		Button button = (Button) context.findViewById(id);
		if ( listener != null ) {
			button.setOnClickListener(listener);
		}
		return button;
	}

	// ボタン用コントロール参照( イベントなし )
	public static Button useButton(Activity context,int id) {
		Button button = (Button) context.findViewById(id);
		return button;
	}

	// テキストファイル( プライベート書き込み )
	public static void saveText( Activity context,String name, String text ) throws Exception  {

		FileOutputStream outStream = context.openFileOutput(name, android.content.Context.MODE_PRIVATE);
		OutputStreamWriter writer = new OutputStreamWriter(outStream);
		writer.write(text);
		writer.flush();
		writer.close();

	}

	// テキストファイル( 読み込み )
	public static String loadText( Activity context,String name ) throws Exception {

		FileInputStream fis = context.openFileInput(name);
		int size = fis.available();
		InputStreamReader isr = new InputStreamReader( fis );
		BufferedReader br = new BufferedReader(isr);
		StringBuffer all_string = new StringBuffer( size );
		String str = null;
		while((str = br.readLine()) != null){
			// 初回以外は前に改行を挿入する
			if ( !all_string.toString().equals("") ) {
				all_string.append("\n");
			}
			all_string.append(str);
		}
		br.close();

		return all_string.toString();

	}
}


利用サンプル
package jp.android.work;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class MainActivity extends Activity
		implements View.OnClickListener {

	class LinkFormat {
		String link;
		String name;
	}

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

		// コントロールのインスタンスを変数で保持せずに直接使用
		Tools2.<Button>useView(MainActivity.this, R.id.button)
			.setText("クリックして下さい");
		Tools2.<TextView>useView(MainActivity.this, R.id.textView)
			.setText("こんにちは");

		// コントロールのインスタンスを変数で保持せずに
		// ボタン専用メソッドでイベント作成
		Tools2.useButton(MainActivity.this, R.id.button, new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				Log.i("lightbox", "Tools2.useButton");
				Log.i("lightbox", Tools2.<TextView>useView(MainActivity.this, R.id.textView).getText().toString());
				Tools2.useButton(MainActivity.this, R.id.button).setText("今クリックされました");

				String json = null;
				try {
					json = Tools2.loadText(MainActivity.this,"OneUrl.json");
					Log.i("lightbox", json);
				} catch (Exception e) {
					e.printStackTrace();
					Tools.messageBox(MainActivity.this,"ファイルを読み込めませんでした",null);
				}

			}
		});

		// コントロールのインスタンスを変数で保持せずに
		// 汎用メソッドでイベント作成
		Tools2.<Button>useView(MainActivity.this, R.id.button2)
			.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {

					Log.i("lightbox", "Tools2.useView");
					Tools2.<Button>useView(MainActivity.this, R.id.button2).setText("今クリックされました");

					// 文字列作成
					String json = null;
					String result = null;
					json = "";
					json += "{";
					json += 	"\"link\":\"http://www.yahoo.co.jp/\",";
					json += 	"\"name\":\"Yahoo! JAPAN\"";
					json += "}";

					// JSON 文字列をオブジェクトに変換して、整形しなおした JSON 文字列を取得する
					Gson gsonPretty = new GsonBuilder().setPrettyPrinting().create();
					LinkFormat lf = gsonPretty.fromJson(json,LinkFormat.class);
					String jsonPrettyString = gsonPretty.toJson(lf);

					// ファイルに書き込み
					try {
						Tools2.saveText(MainActivity.this,"OneUrl.json",jsonPrettyString);
					} catch (Exception e) {
						e.printStackTrace();
						Tools.messageBox(MainActivity.this,"書き込みに失敗しました",null);
					}

				}
			});

		// Activity にイベントを引き渡す
//		Tools2.<Button>useView(MainActivity.this, R.id.button).setOnClickListener(MainActivity.this);
//		Tools2.<Button>useView(MainActivity.this, R.id.button2).setOnClickListener(MainActivity.this);
		Tools2.<Button>useView(MainActivity.this, R.id.button3).setOnClickListener(MainActivity.this);

	}

	@Override
	public void onClick(View v) {

		if ( v.getId()  == R.id.button ) {

			Log.i("lightbox", "ボタン1がクリックされました");

		}
		if ( v.getId()  == R.id.button2 ) {

			Log.i("lightbox", "ボタン2がクリックされました");

		}
		if ( v.getId()  == R.id.button3 ) {

			Log.i("lightbox", "ボタン3がクリックされました");

		}

	}

}

関連する記事


posted by lightbox at 2015-06-22 18:22 | Android Studio 2 | このブログの読者になる | 更新情報をチェックする

PHP : http 経由でファイルのサイズを取得する file_size 関数と ファイルサイズを付加した get_imagesize 関数

getimagesize は、ファイルのサイズが取得されません。あまり大きいサイズは事前に排除したいので、ファイルサイズを付加すれば便利だろうと思い、まず file_size 関数を作成しました。



※ getimagesize( get_imagesize ) は、画像以外だとエラーになります。
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

if ( $_SERVER["REQUEST_METHOD"] == "POST" ) {

	if ( $_POST["send"] == "テスト送信" ) {
		$result = @getimagesize( $_POST["url"] );
		if ( $result !== false ) {
			$view = print_r( $result, true );

			$header = get_headers( $_POST["url"] );
			$view .= print_r( $header, true );

			$size = implode( "\n", $header );
			$view .= $size;

			if (preg_match('/Content-Length: (\d+)/', $size, $matches)) {
				$contentLength = (int)$matches[1];
				$view .= "\n\niamge size : {$contentLength}";
			}

		}
		else {
			$view = "{$_POST["url"]} を読み込めません";
		}
	}

	if ( $_POST["send"] == "get_imagesize" ) {
		$result = get_imagesize( $_POST["url"] );
		if ( $result !== false ) {
			$view = print_r( $result, true );
		}
		else {
			$view = "{$_POST["url"]} を読み込めません";
		}
	}

	if ( $_POST["send"] == "fle_size" ) {
		$result = fle_size( $_POST["url"] );
		if ( $result !== false ) {
			$view = "filesize : $result";
		}
		else {
			$view = "{$_POST["url"]} を読み込めません";
		}
	}
}

function get_imagesize($url) {

	$result = @getimagesize($url);
	if ( $result !== false ) {
		$view = print_r( $result, true );

		$size = fle_size($url);
		if ( $size !== false ) {
			$result["size"] = $size;
		}
		return $result;
	}
	else {
		return false;
	}

}

function fle_size($url) {

	$header = @get_headers($url) ;
	if ( $header !== false ) {
		$size = implode( "\n", $header );
		if (preg_match('/Content-Length: (\d+)/', $size, $matches)) {
			$contentLength = (int)$matches[1];
			return $contentLength;
		}
		else {
			return false;
		}
	}
	else {
		return false;
	}

}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<style>
* {
	font-size: 16px;
	font-family: "Hiragino Kaku Gothic ProN", "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
}
</style>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function(){

});
</script>
</head>
<body>

<form method="post" target="_self">
	URL => <input type="text" name="url" style="width:800px;" value="<?= $_POST["url"] ?>">
	<br>

	<input type="submit" name="send" value="テスト送信">
	<input type="submit" name="send" value="get_imagesize">
	<input type="submit" name="send" value="fle_size">
</form>
<pre>
<?= $view ?>
</pre>
</body>
</html>

※ ボタン画像


posted by lightbox at 2015-06-22 14:26 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2015年06月20日


PHP : unset によるオブジェクトのプロパティの削除と配列の要素の削除の検証

最初、配列関数の中を見ていても無いのでたぶんこういう事なんだろうと思って検証してみると、その通りでした。( 日本語は UTF-8 です )

Run code で検証

※ 日本語のプロパティなので、$obj->{"手当"} というように参照します
$format1 = <<<FIELD
{
    "社員コード": "",
    "氏名": "",
    "フリガナ": "",
    "所属": "",
    "性別": "",
    "作成日": "",
    "更新日": "",
    "給与": "",
    "手当": "",
    "管理者": "",
    "生年月日": ""
}
FIELD;

print "\n-----------------------------------";
print "\nJSON文字列\n";
print $format1;

print "\n-----------------------------------";
print "\nオブジェクトに変換したもの\n";

$obj = json_decode($format1);
print_r($obj);

print "\n-----------------------------------";
print "\n『手当』プロパティを削除\n";
unset($obj->{"手当"});

print_r($obj);

print "\n-----------------------------------";
print "\n配列に変換したもの\n";

$array = get_object_vars( $obj );
print_r( $array );

print "\n-----------------------------------";
print "\n配列の要素を削除\n";

unset($array["所属"]);
    
print_r( $array );


実行結果
-----------------------------------
JSON文字列
{
    "社員コード": "",
    "氏名": "",
    "フリガナ": "",
    "所属": "",
    "性別": "",
    "作成日": "",
    "更新日": "",
    "給与": "",
    "手当": "",
    "管理者": "",
    "生年月日": ""
}
-----------------------------------
オブジェクトに変換したもの
stdClass Object
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [手当] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
『手当』プロパティを削除
stdClass Object
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
配列に変換したもの
Array
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
配列の要素を削除
Array
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)


タグ:PHP
posted by lightbox at 2015-06-20 14:21 | PHP | このブログの読者になる | 更新情報をチェックする

2015年06月19日


選択した文字列を Google 翻訳で翻訳するブックマークレット( 選択が無い場合はページごと翻訳 )

選択した文字列を新しいウインドウに Google 翻訳を開いて翻訳完了状態にします。選択が無い場合は、同じく Google 翻訳でページ全体を翻訳します。


▼ 訳してみました
Open the Google translated the selected string to a new window and the translation is complete state. If the selection is not, it will translate the entire page in the same Google translation.
ブックマークレットに関する記事


posted by lightbox at 2015-06-19 00:55 | ブックマークレット | このブログの読者になる | 更新情報をチェックする

2015年06月18日


jQuery でページを 斜めにして影を付けて 紹介画像として使うブックマークレット

以下のように、ただそのままキャプチャするより良く見えるかもしれません


上のリンクをクリックして、メッセージボックスの OK ボタンをクリックすると、このページを斜めにします。

斜めになっても、WEBページである事にはかわりは無いので、テキスト選択もできますし、リンクも生きています。

ブックマークレットに関する記事
関連する記事


posted by lightbox at 2015-06-18 23:56 | ブックマークレット | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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


Windows
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり