コストパフォーマンスに優れたレンタルサーバー

自分でブログサイトを作りたい!WEBサイトを作りたい!

と思ってから、まず真っ先に悩むのがレンタルサーバー選びではないでしょうか。

ほんとたくさんありますよね。細かく比較するのも大変です。

悩まれる労力や時間は本当にもったいないです。

そこでいろんなレンタルサーバー業者を試してきた実績から1つ業者をおすすめします。

「ロリポップ」です。

まず間違いありません。

私自身もこの「ロリポップ」で20本ほどのサイトやブログを管理しています。

最初は「ロリコン」?みたいな名前で非常に怪しく警戒をしたことを覚えていますが、

運営元が「GMO」なので業者としては鉄板です。

ランニングコスト、安定性、セキュリティ、使いやすさ、すべてにおいて最強のレンタルサーバー

業者で間違いありません。

また、サイトを作る上でドメインを取得するケースが多々あると思いますが、その場合も

「ムームードメイン」と提携しているので比較的スムーズにドメイン取得からサイト構築までの

流れを作ることができるのもメリットかと思います。

「ロリポップ」はおすすめレンタルサーバー業者というよりは、恐らく最終的な選択肢が

「ロリポップ」しかないと言えるくらい最強の業者かと思います。

10日間の無料お試しもあるので悩まれている方がいらっしゃれば是非使ってみてください。

クリエイターがたくさん使ってる、ロリポップ!
独自ドメインやデータベース、PHP・CGI・SSIはもちろん 大人気Wordpressなどの簡単インストールをはじめ、
カート機能、cron、SSH、共有/独自SSLなど機能満載。
メールアドレスはいくつでも作成可能!
容量最大400GBで月額100円(税抜)から。

XPモードのデータをホストPCから取得する方法

Web関連とは関係ないが、最近WindowsのXPモードを使用していた端末のマザーボードが壊れてしまい、XPモード上で作成したファイルを急ぎで抜き取る必要があった為、その時に使用したトラブル対処方法を記載します。

XPモードで保存したファイルはホストOSからは見られない

マイコンピュータやエクスプローラーからではXPモードで保存したファイルを直接みることや取得することはできません。
理由は、XPモードから見たハードディスクの実態がWindows XP Mode.vhdファイルである為です。
このWindows XP Mode.vhdファイルの中に保存したデータやファイルがあるのですが、これをホストから直接触ることはできないんですね。

しかし、『ディスクの管理』を使用すればこのファイルをマウントすることができ、マウント後はXPモード上のデータを取得できるようになります。

ディスク管理からWindows XP Mode.vhdファイルをマウントする

まず、.vhdファイルの保存先ですが、基本以下のパス上に存在しているはずです。

C:\Users\<ユーザー名>\AppData\Local\Microsoft\Windows Virtual PC\仮想マシン

上記パス内にある.vhdファイルに対してディスクの管理からマウントしてやれば中身を見れるようになります。

ディスクの管理を起動

Windwosボタンからプログラム – Windowsの管理ツール – コンピューターの管理を選択してコンピュータの管理画面が起動します。

上図のコンピューターの管理画面から記憶域のディスクの管理を選択した状態で[操作] – [VHDの接続]を選択します。そうすると下図のようなパス指定の画面が起動するのでここで先ほどのファイルパスからWindows XP Mode.vhdファイルを指定してやれば、XPモードのディスクにマウントができ、中身をみれるようなります。

いちいち、XPモードを立ち上げてファイルをコピーする手間も省けますし、私のようにPCが壊れてしまった場合、ハードディスクを別のPCに接続してマウントし直して取得するなどといったこともできるようになり、大変便利な機能ですね。

覚えて損はないと思います。

【SQL Server】WHERE EXISTSの使い方

よくwhere existsの意味を勘違いしている方いるのでここでちょっとまとめて記事にしておきます。

例えば、以下のようなexistを使用したクエリがあったとします。

SELECT * FROM TBL_A
WHERE EXISTS (
   SELECT * FROM TBL_B
   WHERE col1 = ‘hoge’
)

一般的なEXISTSを使用したサブクエリを条件にしたものですが、EXISTS内のサブクエリ内の結果が「真」であれば、SELECT * FROM TBL_Aの結果を返す意味になります。
仮にサブクエリ内の結果が「偽」であればSELECT * FROM TBL_Aの結果はTBL_A内のレコード件数の有無に限らず、0件になります。

では、以下のクエリの場合はどうでしょうか?

SELECT * FROM TBL_A
WHERE EXISTS (
   SELECT *  FROM TBL_B
   WHERE col1 = ‘hoge’
)
AND col_a = ‘foo’

この場合、EXISTS内のサブクエリの外条件に対してEXISTS内のサブクエリで存在チェックを返すことに注意です。

EXISTS使用は速度改善に繋がるのか?

よく、速度改善としてEXISTSを使用すると言われていますが、結論から言うと「NO」です。
むしろ遅くなります。

参照するテーブルのレコード数にもよりますが、数万件、数100万件以上のレコードをもつような大きなテーブルを扱う場合は、速度遅延も顕著になってきます。

例えば以下クエリの例で考えてみましょう。
※以下の2つのテーブルを使用するものとします。
STAFF_MST・・・社員マスタ
KINTAI ・・・勤怠テーブル(過去の出勤データ)

SELECT * FROM STAFF_MST As S
WHERE EXISTS(
     SELECT * FROM  KINTAI As K
     S.STAFF_CD = K.STAFF_CD
 WHERE K.DTE >= ‘2017-04-01’
)

一見、見やすさという観点できれいにまとまったクエリになっていますが、実際はどうでしょうか?

極端な話、上記クエリの場合では最大STAFF_MSTのレコード数 ☓ KINTAIテーブルのレコード数分の比較チェック処理が走る構造になっています。比較するお互いのテーブル内レコード数が多くなれば多くなるほど、処理能力は重くなっていきます。正直、速度改善を目的としてEXISTSを利用するメリットはあまりありません。

では、EXISTSを使用せずに速度改善する方法は他にあるのか?

よく、目にするLEFT JOIN もしくはINNER JOIN の方が遥かに優秀です。
見た目は複雑になりますが、速度という観点では実はEXISTSよりも早いです。

上記クエリをINNER JOIN に置き換えた場合

SELECT * FROM STAFF_MST As S
INNER JOIN (
     SELECT * FROM KINTAI As K
     WHERE K.DTE >= ‘2017-04-01’
} ON S.STAFF_CD = K.STAFF_CD

理由はわかりますでしょうか?

まず、上記のクエリの場合ではINNER JOIN内の処理が優先されます。
つまり、KINTAIテーブルの絞り込みが先に行われた上でSTAFF_MSTとの結合が行われることになります。EXISTSのサブクエリを使用するより、INNER JOIN で結合して比較する方が比較対象件数を減らすことで速度の改善が見込めるというわけです。

当然ながら、その威力を体感するにはレコード件数の多いテーブルを相手にする必要がありますが、日頃から、EXISTSで書けるものはINNER JOIN やLEFT JOIN に置き換えられるという事実、速度改善も見込めるという事実、この2つを覚えておいても損はないと思います。

EditTextに自動でカーソルをあてたくない場合の対処法

特に考慮せず、Activityのレイアウトを作成するとAndroidは自動認識で一番初めのEditTextにカーソルをあてる動作をします。この機能は非常に便利ではありますが、時と場合によっては避けたいケースがあります。そんな時の対処法の紹介です。

左図のように画面起動時にAndroidの初期動作として画面一番初めのEditTextにカーソルがあたってしまう。どうにかしてカーソルがあたらない状態で画面を起動したい。

EditTextにカーソルやフォーカスを適用させない方法は非常に簡単でxmlファイルの記述だけで済みます。以下のようにandroid:cursorVisibleとandroid:focusableInTouchModeを「false」にすることで
Androidの自動認識でEditTextにカーソルやフォーカスがあたることを防ぐことができます。

しかし、ここで大きな問題点があります。

xmlファイルで上記設定をしてしまうと該当EditTextには二度とカーソルやフォーカスが適用できなくなってしまいます。カーソルやフォーカスが適用されないことを仕様とする場合は上記設定だけでいいわけですが、そうでない場合は困ります。

自動認識のカーソルやフォーカス適用だけ防ぎ、任意で適用させる為にはActivity側のjavaコードで対応することができます。簡単に言うと、EditTextのタッチイベントでフォーカスを有効にしてあげればいいわけですね。

こんな感じで記述します。

edt1 = (EditText)findViewById(R.id.edt1);

edt1.setOnClickListener(new OnClickListener() {
      @OverRide
      public void onClick(View v) {
           v.setFocusable(true);
           v.setFocusableInTouchMode(true);
           v.requestFocus();
    
           InputMethodManager  im = 
                  (InputMethodManager)setSystemService(Context.INPUT_METHOD_SERVICE);
           if (null != im) {
                   im.showSoftInput(v,0);
           }
     }
});

InputMethodManagerの記述は入力用キーボードを表示させる為に必要なコードです。

以上で画面起動時のカーソルやフォーカスの適用を防ぐ方法、および必要な時にカーソル、フォーカスを適用させる方法の解説となります。

EditTextの入力制御

EditTextを数値のみ許可する

EditTextで数値のみに対応したいケースがよくありますよね。
そんな時の対応方法です。(キーボード入力も数値のみの対応)

基本的にアクティビティデザインのxmlファイル内の記述ですべて対応が可能です。

<EditText
android:id="@+id/startCnt"
android:layout_width="wrap_content""
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:digits="01234567890"
android:gravity="right"
android:inputType="number"
android:maxLength="5"
android:text="0" />

■EditTextに数値のみ入力を可能にしたい制御は以下の記述で対応が可能です。

android:digits=”01234567890″

■キーボード入力で数値のみ対応した場合は以下の記述が必要になります。

android:inputType=”number”

■EditTextへの入力桁数の制御も以下の記述で対応可能になります。

android:maxLength=”5″   ※この場合は5桁対応。

今回は数値のみの入力制御対応でしたが、inputTypeを利用することによりいろんなタイプの入力制御を行うことが可能です。以下に一覧をまとめておきますの参考にどうぞ。

inputType 内容説明
text テキスト入力
textCapCharacters 大文字入力
textCapWords 先頭文字を大文字にする場合
textCapSentences 文章の先頭を大文字にする場合
textAutoCorrect 文字入力を自動修正させる場合
textAutoComplete 文字の補完入力に対応させる場合
textMultiLine 複数行入力させる場合
textUri URLを入力させるさせる場合
textEmailAddress メールアドレスを入力させる場合
textEmailSubject メール件名を入力させる場合
textShortMessage ショートメッセージを入力させる場合
textLongMessage ロングメッセージを入力させる場合
textPersonName 人名を入力させる場合
textPostalAddress 住所を入力させる場合
textPassword パスワードを入力させる場合
textVisiblePassword パスワード入力を表示させて入力する場合
textWebEditText THMLを入力させる場合
textFilter 他のデータでフィルタされた文字を入力する場合
textPhonetic 発音記号を入力させる場合
numberSigned 符号付きの数値を入力させる場合
numberDecimal 少数入力をさせる場合
phone 電話番号を入力させる場合
datetime 日時を入力させる場合
date 日付を入力させる場合
time 時刻を入力させる場合

Google Mapsを利用したアプリ開発 (開発準備)

何かと便利でアプリサービスの拡張性も高いGoogle Map。
そんなGoogle Mapを利用したアプリ開発の手順を準備段階から紹介していきたいと思います。

Google Map開発までの流れ、および概要

SHA1のコードはAndroid開発環境にユニークで存在するキーコードでGoogle Maps APIを入手する際に必要になるコードです。このキーコードとGoogle Maps APIキーをひもづけることでGoogle Mapが利用できる仕組みになっています。

Webサイト Google APIsに接続しGoogle Maps APIを生成します。
生成したコードを開発環境にコピーして使用します。

以下の3つのコンポーネントをAndroid Studioにインストールしなければなりません。
・Google APIs(ARM System Image)
・Google Play services
・Google Repository

ターゲットとするAndroidバージョンをGoogle APIsに指定してアクティビティーの種類をGoogle Maps Activityでプロジェクトを作成します。

Google APIsに対応したAVDを作成します。

SHA1フィンガープリントの生成

フィンガープリントのコードは、debug.keystoreファイルに保存されていますが、WindowsのOSによって保存先が異なります。

■Windows XPの場合
C:\Documents and Settings\\.android\

■Windows 7の場合
C:\Users\\.android\

■Windows 10の場合
C:\Users\\.android\

また、フィンガープリントの取得はJDKが持つkeytool.exeを使用してコマンドプロンプトによって行います。下図のような感じで…

JDKのkeytool.exeが保存されているディレクトに移動できたら、実際にフィンガープリントを生成してみましょう。
フィンガープリントを生成するには以下のようにコマンド入力を行います。
※ユーザー名のところは使用されている環境のユーザー名を入力してください。

■フィンガープリント取得コマンド
keytool -v -list -alias androiddebugkey -keystore C:¥Users¥ユーザー名¥.android¥debug.keystore -storepass android -keypass android

証明書のフィンガプリントに記載されている「SHA1」のコードがキーコードとなりGoogle Maps APIキーを取得する際に使用することになります。
この一連のコマンド操作を覚えておいて損はありませんが、実はAndroid Stuidoを使用している場合、プロジェクト作成時にアクティビティをGoogle Maps Activityを選択して作成すると自動で生成されるgoogle_maps_api.xmlファイルにSHA1のキーコードが勝手に取得され記述してくれるので先にプロジェクトを作成してからAPIキーを取得する方が早かったりもします。

Google Maps APIの入手

次にフィンガープリントを生成して得たコードをもとにGoogle Maps APIキーを取得していきます。
下記、Googleコンソールサイトに接続してAPIを入手します。
サイト接続にはGoogleアカウントでのログインが必要ですのであらかじめ登録をしておいてください。(Gmailアカウントで大丈夫です)

以下ログイン後の作業手順です。

1.APIプロジェクトを作成する
下図の「+プロジェクト作成」をクリック、任意のプロジェクト名を入力して作成ボタンにてプロジェクトを作成します。このプロジェクトにこれから取得するAPIキーを管理していきます。

2.Google Maps API作成

下図APIとサービスから「Google Maps Android API」を選択してクリックします。

下図遷移画面で「Google Maps Android API」を有効にします。
有効にすることで先ほど作成したプロジェクトにAPIの基本情報が作成されます。

有効にしただけではこのAPIは使用することはできません。
下図画面に遷移するのでここで「認証情報を作成」をクリックして先に進んでください。

次遷移画面で「必要な認証情報」をクリックして進みます。

次遷移画面でランダムなAPIキーが生成されるので「完了」ボタンにて作成を完了します。

認証情報にGoogle MapsのAPIキーが作成されるのでこのAPIキーに対してフィンガープリントで生成取得したSHA1のコードを紐づけていきます。

下図遷移画面で作成されたAPI情報をクリックします。

API取得の最終作業です。
次遷移画面でSHA1コードと紐づけを行います。

アプリケーションの制限で「Androidアプリ」を選択
パッケージ名にアンドロイド開発環境のパッケージ名を入力
SHA-1証明書のフィンガープリントに開発環境で取得したフィンガープリント上のコードを入力

最後に「完了」ボタンで終了です。

SDKツールのインストール

WEB上においてAPIキーの取得およびSHA1コードとの紐づけが終了したわけですが、次に開発環境でGoogle Mapアプリを開発するにあたり必要なツールをインストールしていきます。

インストールが必要なツールは以下の3つです。
・Google APIs(ARM System Image)
・Google Play services
・Google repository

インストールする方法は、Android Studioの[ツール]-[Android]-[SDKマネージャー]から行います。

Google APIsは、SDKプラットフォームタブからインストール。
Google Play servicesとGoogle repositoryはSDKツールタブからインストール。

対象のツールにチェックをつけて適用ボタンを押せばインストールが開始されます。

Google Maps専用プロジェクトの作成

Google Mapアプリ専用のプロジェクトを新規に作成します。

プロジェクト作成にあたり注意する点としては、Minimum required SDKでプロジェクトが対象とする最小のバージョンをAPI9以上で選択する必要があります。
API8以外の場合、警告メッセージが表示されてしまいます。
また、プロジェクト名は、Google Maps APIを作成した時に指定したプロジェクト名称と同一にする必要があります。もし、異なる名称をプロジェクト名としてしまった場合、作成するGoogle Mapアプリは正常に動作しませんので注意してください。

これらの注意事項を踏まえて、

・プロジェクト名にはAPIキー作成時に登録したプロジェクト名と同一のもの指定する
・Phone and Tabletにチェックする。
・最小ターゲットにはAPI9以上を選択する。
・アクティビティはGoogle Maps Activityを選択する。

以上、設定内容で新規プロジェクトを登録します。

新規プロジェクトを登録すると下図のようなgoogle_maps_api.xmlファイルが自動的に開きます。
次にこのファイルに対して修正を行います。

このファイルのYOUR_KEY_HEREの箇所を取得したAPIキーに書き換えます。(上図の赤枠の箇所

Google Maps専用AVD作成

最後に動作検証を行うためのAVDを作成します。

AVD作成は、Android Studioの[ツール]-[Android]-[AVDマネージャー]で行います。

注意点としては、ターゲットを先ほどインストールしたGoogle APIsのバージョンに合わせてください。Google APIsのバージョンに合わせないとGoogle Mapが正常に動作しません。

下図の例の場合、Google APIsをAPIターゲット26で行っています。
downloadとなっているターゲットは、各APIレベルのGoogle APIsがインストールされていない状況を表しています。

以上を踏まえてAVDの作成を行ってください。

以上でGoogle Mapアプリ開発の基本的な環境作りは終了となります。

実際に作成したAVDに対して動作テストを実行してみてください。
正常にGoogle Mapが表示されれば環境づくりは成功です!!

それでは、楽しいGoogle Mapアプリ開発をお楽しみください。

IF文を1行で書く

多分岐の条件を必要とせずにある条件をもとに簡単な処理を追加したい場合などで、毎回IF文を{}で括って改行していたりとするとソースコード上汚くなってしまいます。
簡潔にまとめられるところは極力まとめる形が望ましいです。

特にIF文はよく利用される構文でもあり、その利用頻度の高さから1行でまとめる効果は絶大です。

 

IF文の基本形

if ( 条件式 ) {
     // 条件 = 真の場合に行う処理
else {
    // 条件 = 偽の場合に行う処理
}

例として以下の条件式があった場合

If ( $language == ”Jp’) {
    echo  ‘こんにちわ’;
else {
    echo  ‘Hello’;
};

IF文を1行でまとめる

●こんにちわを出力する

if ( $language == ”Jp’ ) echo ‘こんにちわ’;

●Helloを出力する

if ( !$language == ”Jp’ ) echo ‘Hello’;

※IFではなく、三項演算子で書く場合

IFではありませんが、三項演算子を使ってもコードを綺麗にまとめることができます。

 $msg = ( $language == ‘Jp’) ? ‘こんにちわ’ : ‘Hello’;

IF文で「こんにちわ」も「Hello」もカバーして1行でコードをまとめたいような場合は、
上記のような三項演算子を使用する手段もあります。

Linuxでpingが止まらない・・・

LinuxでのPingの止め方

Windowsのコマンドプロンプトと違いLinux上でのpingは永遠とピンを飛ばしてしまいます。

ピンを飛ばされている相手にはまったくの迷惑・・・。

そんな止まらないPingを止めたい時、

止めたいところでCtrl + Cで止めることができます。

Linuxの勉強でpingを飛ばしてみたが、止まらないと焦ってしまった方、落ち着いてCtrl + Cで

対処しましょう。

Selectでフォントサイズの設定が反映しない時の対処法

border設定でフォントサイズが反映

CSSでSelectの属性にフォントサイズを設定しても反映しない場合があります。

そんな時、対処法としてSelectに対してborderを設定してあげるとフォントサイズの設定が

反映します。

×フォントサイズが反映しない
Select {
font-size:14px;
}

〇フォントサイズが反映する
Select {
border: 1px solid #999;
font-size:14px;
}

同現象が出ている方は一度試してみてください。

 

【Android開発基礎】 端末回転時の画像内容を保存する

Android端末では画面を回転させると画面リサイズとともに表示されていた内容が初期化されてしまう望ましくない内部事情があります。
初期化されてしまえば、それまで入力していた大事なデータが消えてしまうわけなので、アプリを利用するユーザーにとっては非常に好ましくない事情となり、クレームにもつながります。
画面回転自体をNGにしてしまえば特に気にすることはありませんが、そうでない場合には、不測の事態にそなえてかならず以下の対応策を施すようにしておくことが通例です。

【画面回転時における初期化を防ぐ方法】

以下の2つのメソッドを記述していくことで回避することができます。
※メソッド内の保存情報、復元情報は製作アプリの情報と置き換えてください。

onSaveInstanceState

onRestoreInstanceState



具体的な記述内容としては以下を参考にしてください。

onSaveInstanceState

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    TextView txtBackUp = (TextView)findViewById(R.id.txtTmp);
    outState.putString("txtBackUp",txtBackUp.getText().toString());
}

onRestoreInstanceState

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    TextView txtRestore = (TextView)findViewById(R.id.txtTmp);
    txtRestore.setText(savedInstanceState.getString("txtBackUp"));
}