このチェックボックスをオンにすると、"" の中にクリップボードから文字列を貼り付ける場合に、" や \ の後になんらかの文字が続いている場合は、" が \" に \ が \\ になります。
この為、Windows のパスをそのまま "" の中に貼り付けると、全ての \ が \\ となり、そのまま使用可能になります。
※ " や \ を単独で貼り付けても変化はしません。
※ コメント内は対象になりません
既に \ で作成されている文字列は、範囲を選択して SHIFT + DEL で削除して、再度貼り付けるといいです。
※ この場合、SHIFT + INS で貼り付けるとキー操作は最速になります。
2015年06月28日
Eclipse で、文字列内のファイルのパスの \ 記号を \\ にする方法
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>
2015年06月25日
【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
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
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がクリックされました"); } } }
関連する記事
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>
※ ボタン画像
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。 Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。 また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。 ※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです 対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。 ※ エキスパートモードで表示しています アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります<% if:page_name eq 'archive' -%> アーカイブページでのみ表示される内容 <% /if %> <% if:page_name eq 'category' -%> カテゴリページでのみ表示される内容 <% /if %> <% if:page_name eq 'tag' -%> タグページでのみ表示される内容 <% /if %>この記述は、以下の場所で使用します
|