Pages

2017年6月12日月曜日

JSの書き方(1)

 お久しぶりです、例の新人です。

 今回はJavaScriptの記述方法、特にjQueryの書き方について学んだことを記述します。

 jQueryは、JavaScriptライブラリ(JavaScriptの使用頻度の高い機能や効果などのプログラムを再利用できる形にまとめたもの)の1つで、主にWebブラウザや小〜中規模のWebアプリケーションに利用されています。

①jQueryのセレクタ
 セレクタ(セレクターとも)とは、HTML上の要素を選ぶ記述のことです。処理を実行したい要素のIDやクラス等を記述することで、その要素に対して処理を実行することができます。セレクタの使い方は、CSSのそれとよく似ています。
 セレクタの記述方法は、以下のものが基本となっているようです。

 (1)基礎部分
  基礎となる書き方は、以下のような$から始まるものです。
 $(【セレクタ】).【実行したい処理】;

 (2)IDセレクタ
  シャープ(#)で始まるセレクタは、IDから要素を選択する場合のものであり、以下のように記述します。
 $("#【選択する要素のID】").【実行したい処理】;

 (3)クラスセレクタ
  ドット(.)で始まるセレクタは、クラス名から要素を選択する場合であり、以下のように記述します。
 $(".【選択する要素のクラス名】").【実行したい処理】;

 (4)要素セレクタ
  「div」や「p」等、要素のタグ名がそのまま記述されるセレクタは、そのタグ名の要素全てを選択する場合のものであり、以下のように記述します。
 $("【選択する要素のタグ名】").【実行したい処理】;
  また、要素セレクタとクラスセレクタを合わせることで、以下のように特定の要素の中から特定のクラスを選択して処理を実行する記述もできます。
 $("【選択する要素のタグ名】.【選択する要素のクラス名】".【実行したい処理】;

 (5)属性セレクタ
  「type」、「name」等、要素の属性名から選択する場合のものであり、以下のように記述します。
 $("[【選択する要素の属性名】]").【実行したい処理】;
  また、こちらもクラスセレクタと同様に要素セレクタと合わせることで、以下のように特定の要素の中から特定の属性を選択して処理を実行する記述もできます。
  $("【選択する要素のタグ名】[【選択する要素の属性名】]").【実行したい処理】;

 (6)属性=値セレクタ
  属性セレクタの発展型で、選択したい属性から更に値を指定して要素を選択する場合のものであり、以下のように記述します。
 $("[【選択する要素の属性名】='【選択する属性の値】']").【実行したい処理】;
  また、属性セレクタと同様の記述方法で、以下のように特定の要素の中から特定の値の属性を選択して処理を実行させることができます。
 $("【選択する要素のタグ名】[【選択する要素の属性名】='【選択する属性の値】']").【実行したい処理】;

 (7)子孫セレクタ
  「div」の中の「p」のような、子孫要素を選択する場合のものであり、以下のように記述します。
 $("【選択する子孫要素の親要素】 【選択する子孫要素】").【実行したい処理】;
  親要素と子孫要素の間には空白が入ることに注意してください。

 (8)全称セレクタ
  アスタリスク(*)のセレクタは、全ての要素を選択する場合のものであり、以下のように記述します。
 $("*").【実行したい処理】;

 (9)複数のセレクタ
  複数のセレクタがカンマ(,)で区切られて記述されているセレクタは、複数の要素をまとめて選択する場合のものであり、以下のように記述します。
 $("【セレクタ】,【セレクタ】,...,【セレクタ】").【実行したい処理】;

②要素を非表示にする際のjQueryの「hide()」と「css()」の違い
 ある要素を非表示にする際のjQueryの記述の仕方には、「hide()」を使う方法と「css()」を使い「visibility」属性を非表示に設定する方法があります。それぞれの記述方法と特徴は以下の通りです。

 (1)「hide()」を使う場合
 $("【非表示にしたい要素のセレクタ】").hide();
  非表示にした要素のあった領域は、要素が非表示になった分だけ他の要素が詰められます。
  また、このjQueryの記述はCSSにより以下の記述で代替できます。
 【非表示にしたい要素のセレクタ】{
  display: none;
 };

 (2)「css()」を使う場合
 $("【非表示にしたい要素のセレクタ】").css("visibility","hidden")
  非表示にした要素のあった領域は確保されたまま非表示になります。つまり、2つの要素に挟まれた要素を非表示にした場合、非表示になった要素の分だけ2つの要素の間には空白が出来ます。
  また、このjQueryの記述はCSSにより以下の記述で代替できます。
 【非表示にしたい要素のセレクタ】{
  visibility: hidden;
 };

 次回はイベントについて記述します。

2017年5月9日火曜日

PostgreSQLのシーケンス操作

しばらくぶりです。例の新人です。

今回は、PostgreSQLのシーケンス操作について学んだことを記述します。

シーケンスは、PostgreSQLで連番を自動発生させるための仕組みであり、シーケンスオブジェクトともシーケンスジェネレータとも呼ばれます。この仕組みにより、INSERT文でデータを入力する際に、シーケンス設定がされているカラムは自動的に連番の値を取得して登録されます。

例えば、以下のような表があるとします。

TABLE 花
ID   |色   |値段
ーーーーーーーーーーーーーーーーーー
1   |赤   |300
ーーーーーーーーーーーーーーーーーー
2   |白   |250
ーーーーーーーーーーーーーーーーーー

これに対し、以下のようなINSERT文でデータを追加します。

INSERT INTO 花 (色, 値段) VALUES (黄, 350)

すると、表は以下のようになります。

TABLE 花
ID   |色   |値段
ーーーーーーーーーーーーーーーーーー
1   |赤   |300
ーーーーーーーーーーーーーーーーーー
2   |白   |250
ーーーーーーーーーーーーーーーーーー
3   |黄   |350
ーーーーーーーーーーーーーーーーーー

新しく追加した350円の黄色の花のIDに、3が割り当てられました。これは、この表においてIDがシーケンス設定されているためです。プライマリキー制約を設定することで、シーケンスは自動的に作成されます。

シーケンスは、以下のようなSELECT文から情報を確認することができます。

SELECT * FROM [シーケンス名]

シーケンスのカラムは、以下のようになっています。

  sequence_name  | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
-----------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 花_id_seq     |           3 |                1 |                   1 | 9223372036854775807 |         1 |           1 |       1 | f         | t


「last_value」の値が現在の値であり、上記の表のIDにおけるシーケンスでは3が入ることなになます。また、「increment_by」は増分値、つまり次の番号に対して現在の値に追加する分の数値であり、上の表の場合は1、2、3と1ずつ追加されているため1ということになります。

以下のようなALTER文を使い、「increment_by」の数値を2にしてみましょう。

ALTER SEQUENCE 花_id_seq INCREMENT BY 2

この後に、以下のINSERT文からデータを追加します。

INSERT INTO 花 (色, 値段) VALUES (青, 300)

すると、表は以下のようになります。

TABLE 花
ID   |色   |値段
ーーーーーーーーーーーーーーーーーー
1   |赤   |300
ーーーーーーーーーーーーーーーーーー
2   |白   |250
ーーーーーーーーーーーーーーーーーー
3   |黄   |350
ーーーーーーーーーーーーーーーーーー
5   |青   |300
ーーーーーーーーーーーーーーーーーー

前回のIDの値3に2増加し、IDが5になりました。それでは、以下のように「increment_by」の数値を1に戻し、INSERT文からデータを追加してみましょう。

ALTER SEQUENCE 花_id_seq INCREMENT BY 1

INSERT INTO 花 (色, 値段) VALUES (ピンク,250)

すると、表は以下のようになります。

TABLE 花
ID   |色   |値段
ーーーーーーーーーーーーーーーーーー
1   |赤   |300
ーーーーーーーーーーーーーーーーーー
2   |白   |250
ーーーーーーーーーーーーーーーーーー
3   |黄   |350
ーーーーーーーーーーーーーーーーーー
5   |青   |300
ーーーーーーーーーーーーーーーーーー
6   |ピンク |250
ーーーーーーーーーーーーーーーーーー

もとどおり、IDの値が前回から1増加した6になりました。

このように、シーケンスの増分値を変更することで、奇数でつけていく、5の倍数でつけていくといった連番のつけ方が可能になります。

次に、現在の値の変更方法を見てみましょう。現在の値を変更するには、SETVAL関数を使います。

SETVAL関数は、シーケンスの現在値を設定するための関数で、以下のような2つのパラメータを持たせたSELECT文形式で使用します。

SELECT SETVAL([シーケンス名],[変更させたい値])

変更させたい値として任意の数値を入れることにより、現在の値と次に割り振られる値を変更させることができます。例えば、以下のようなSELECT文から現在値を7にしてみます。

SELECT SETVAL('花_id_seq',7)

こうすると、次回に割り振られる花のIDは7の次の値である8になります。

しかし、ここで注意しなければいけないことがあります。それは、現在値を1にする方法です。

例えば、上のように以下のやり方で現在値を1にした場合、次に割り振られる花のIDは2になります。

SELECT SETVAL('花_id_seq',1)

これは、シーケンスのカラムの1つである「is_called」が「true」になっているためです。

「is_called」は「last_value」が既に呼ばれたかどうかのフラグで、呼び出されている場合は真(true)、まだ呼び出されていない場合は偽(false)になります。

シーケンスが連番を発生させるためには現在値を知る必要がありますので、連番を作成する時点でシーケンスは「last_value」を呼び出します。際初期段階においては、ここで「is_called」が真になります。「is_called」が偽の場合とは、シーケンスがまだ連番を発生させていない状態、すなわちまだ連番になるデータがない状態を意味します。

つまり、同じ現在値(「last_value」)が1の場合でも、「is_called」の真偽で最初期状態か1の値が割り振られたデータがある状態かに分かれます。

シーケンスの連番を新たに1から始め直すには、以下のSETVAL関数に3つのパラメータを持たせたSELECT文を使用します。

SELECT SETVAL('花_id_seq',1,false)

こうすることで、「is_called」が「false」になり、次回に割り振られる花のIDは1になります。ちなみに、falseの代わりにtrueを持たせた場合は、パラメータが2つの場合と同じ結果になります。

2017年4月17日月曜日

cron操作

しばらくぶりです。例の新人です。

今回は、備忘録としてcronの使い方について学んだことを記述します。

cronは、ジョブ(1つ以上のコマンド(プロセス)が動いてひとまとまりの処理になっている場合の基本単位)、スクリプト(ソースコードを記述したら即座に実行できるようなプログラム)を自動実行するためのデーモン(UNIX系OSにおける、メモリに常駐して様々なサービスを提供するソフトウェア)プロセスです。

cronの状態は、以下のコマンドで確認できます。

ps aux | grep cron

psコマンドは、Linuxで現在実行しているプロセスを表示するコマンドであり、auxは端末操作のプロセス(a)、CPUやメモリの使用率(u)、端末操作以外のプロセス(x)を表示するオプションです。また、grepコマンドは指定したパターンにマッチする行を表示するコマンドです。この2つをパイプ(|)を使って併用し、cronが起動しているかどうかを確認できます。

また、以下のコマンドでもcronの状態を確認することができます。

/etc/init.d/cron status
または
service cron status

cronが動作していない場合は、以下のコマンドでcronを起動させます。

service cron start

cronの編集は、crontabコマンドから行います。オプションには、以下のものがあります。

-u (ユーザ名):指定したユーザのcrontabファイル操作。管理者ユーザでのみ使用可能。
-l:crontabファイルの内容を表示。
-l > (作成するファイル名):crontabファイルの内容を、指定したファイル名でコピーする。
-e:crontabファイルを編集する。操作方法はviコマンドと同様。
-r:crontabファイルを削除。上の「-e」オプションのeキーのすぐ隣である上に、削除時に一切警告がされないため、編集する際に誤ってこのオプションに設定してコマンドを実行しないように注意。

上述の通り、操作ミスで編集するつもりが削除してしまったという事態になることを避けるため、編集する際は「crontab -l > (作成するファイル名)」であらかじめバックアップを取っておく方がいいようです。

crontabファイルの書式は、以下の通りです。

(分) (時) (日) (月) (曜日) (コマンド)

(分):分を0〜59で指定し、指定した分ごとに実行します。*を指定すると、毎分ごとに実行します。
(時):時刻を0〜23で指定し、指定した時刻ごとに実行します。*を指定すると、毎時ごとに実行します。
(日):日を1〜31で指定し、指定した日ごとに実行します。*を指定すると、毎日実行します。
(月):月を1〜12、またはjan〜decで指定し、指定した月ごとに実行します。*を指定すると、毎月実行します。
(曜日):曜日を0〜7(0と7は日曜日)またはsun〜satで指定し、指定した曜日ごとに実行します。*を指定すると、毎日実行します。
(コマンド):実行したいコマンドやシェル(主にそれらのフルパス)を指定します。

また、これらは以下のように特殊な指定をすることができます。
リスト指定:カンマで区切った指定ごとに処理を実行します。例えば、(分)の指定において「0,10,20,30,40,50」と指定すると、10分おきに実行します。
範囲指定:ハイフンで繋いだ値の期間で処理を実行します。例えば、(曜日)の指定において「1-5」と指定すると、月曜日から金曜日に処理を実行します。
間隔指定:範囲指定直後のスラッシュの後ろに指定した値の間隔で処理を実行します。例えば、(月)の指定において「4-8/2」と指定した場合、4月、6月、8月に実行します。リスト指定の「4,6,8」と同意です。

使用例
0-55/5 9-18 * 7,8 1-4 /home/testowner/test.php

上の例では、7月と8月の毎日、月曜日から木曜日までの間、午前9時から午後6時まで5分ごとに「test.php」を実行します。

2017/0705 crontabコマンドによるcron編集の説明が「cronの編集は、cronコマンドから行います。オプションには、以下のものがあります。」となっていたため、crontabコマンドに修正

2017年3月17日金曜日

SQLの外部参照制約の削除について

こんにちは、例の新人です。

今回は、SQLの外部参照制約の削除の仕方について学習したことを記録します。

まずは、外部参照制約がどういうものなのかを記述します。

外部参照制約は、ある表のある列の値は、別の表のある列のある列の値と必ず一致しなければならない時に使います。例えば、50メートル自由形参加選手の選手名は、水泳大会参加選手の選手名と一致しなければいけません。

そういった時に、以下のような構文で外部参照制約を追加できます。

ALTER TABLE 50メートル自由形参加選手 ADD FOREIGN KEY(選手名) REFERENCES 水泳大会参加選手(選手名);

こうすることで、50メートル自由形参加選手の選手名は水泳大会参加選手の選手名と一致するものでなければいけない制約をかけられます。例えば50メートル自由形参加選手にINSERT文で「追加ためす」さんを追加しようとしても、水泳大会参加選手の選手名には「追加ためす」さんの名前はありませんので、このデータ更新は無効となります。

この制約を削除するためには、まず制約の名前を知る必要があります。

SQLサーバがメタデータ(あるデータに付随するデータ)取得のために提供する方法の一つである情報スキーマビューに、TABLE_CONSTRAINTSビューがあります。これは、現在のユーザが所有するテーブルに属するすべての制約があります。これに、参照のための標準インターフェイスであるINFORMATION_SCHEMAを加え、以下の構文で外部参照制約の情報を表示できます。

SELECT * FROM  INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = ’FOREIGN KEY’ AND TABLE_NAME = ’50メートル自由形参加選手’;

ここから50メートル自由形参加選手の外部参照制約の情報を表示できます。そして、「CONSTRAINT_NAME」が制約の名前になります。

そして、削除するには以下のような構文を用います。

ALTER TABLE 50メートル自由形参加選手 DROP CONSTRAINT 「制約の名前」;

以上が外部参照制約を削除する方法です。

2017年3月13日月曜日

PostgreSQLのEXTRACT関数の進展

 こんにちは、いつもの新人です。

 「EXTRACT(EPOCH FROM [時刻])」の構文でマイクロ秒を含んだUNIXTIMEを取得するには、1度マイクロ秒と切り離してみる必要があるようです。

 そのために使うのがDATE_TRUNC関数です。これは、日付の値をどの精度まで表示するのかを選択し、選択したもの以下の情報は0(月、日の場合は1)として出力する関数です。例えば、hour(時)を選択すると何年何月何日何時までを正確に表示し、後の情報は0を出力します。

SELECT EXTRACT(EPOCH FROM DATE_TRUNC('second',[マイクロ秒を含んだTIMESTAMP])),TO_CHAR([マイクロ秒を含んだTIMESTAMP],'US') FROM
 [テーブル];

 上のようなSELECT文の場合、マイクロ秒を含まない日時の情報をUNIXTIMEにしたものと、マイクロ秒のみの値が出力されます。

 出力されたその2つを小数点で繋げるようにパラメータを設定すれば、TIMESTAMPと同じマイクロ秒情報のUNIXTIMEを取得できます。

2017年3月10日金曜日

PostgreSQLのEXTRACT関数に苦戦中

 こんにちは、例の新人です。

 PostgreSQLのEXTRACT関数の設定で苦戦しています。

 PostgreSQLでは、「EXTRACT(EPOCH FROM [時刻])」の構文で1970-01-01 00:00:00からの秒数、つまりUNIXTIMEを取得できるのですが、この設定の場合どうやらマイクロ秒が正確に表示できないようです。

 例えば、次のような構文で「2017-03-10 16:55:26.114877」というマイクロ秒を含んだ時刻をUNIXTIME化してみます。

SELECT EXTRACT(EPOCH FROM TO_TIMESTAMP('2017-03-10 16:55:26.114877','YYYY-MM-DD HH24:MI:SS.US'));

 結果は以下のようになります。

    date_part  
------------------
 1489132526.11488

 マイクロ秒部分「114877」の小数点以下第6位が四捨五入されてしまいました。これを、以下の構文からTIMESTAMPに直してみます。

SELECT TO_TIMESTAMP(1489132526.11488) AT TIME ZONE 'UTC';

 結果は以下の通りになります。

         timezone        
---------------------------
 2017-03-10 07:55:26.11488

 元々の時間より、0.000003秒遅くなってしまいました。最初の時刻とUNIXTIMEにしたものを戻した時刻を同じにしたいため、このままではいけません。

 下のようなTIMESTAMPをUNIXTIMEに直した後またTIMESTAMPに直す動作をひとまとめにした構文では、元の時刻とUNIXTIMEをTIMESTAMPに復元した時刻が一応は一致します。しかし、この設定は実際の作業では使えません。

SELECT TO_TIMESTAMP(EXTRACT(EPOCH FROM TO_TIMESTAMP('2017-03-10 16:55:26.114877','YYYY-MM-DD HH24:MI:SS.US')  AT TIME ZONE 'UTC')) ;

 結果は以下の通りになります。

         to_timestamp        
-------------------------------
 2017-03-10 16:55:26.114877+09

 同一の時刻としてUNIXTIMEを取得する方法を模索中です。

2017年3月9日木曜日

UNIXTIMEを扱う上でのPHPとPostgreSQLのタイムゾーン情報指定

 どうも、こんにちは。

 今回は、UNIXTIMEを扱う上でのPHPとPostgreSQLのタイムゾーン情報の指定について学習したことを記述します。

 タイムゾーンは同じ標準時を利用する地域や区分のことで、原子時計を元に修正定義されたUTCが現在の世界標準時となっています。有名なイギリスのグリニッジ天文台を標準とするGMTは地球の潮汐作用により自転速度が劣化することから、世界標準時にはなっていません。

 日本はUTCにくらべ9時間ほど遅いため、UNIXTIMEのようなUTCを基準にした時間表現では本来の時間より9時間ずれた情報が取得されてしまうことがあります。

 これを防ぐためには、タイムゾーンの情報を任意のプログラムに指定できる必要があります。

 PHPにおいてそれを行うのが、date_default_timezone_set関数です。

 この関数を使用することにより、例えば次のようなプログラムを実行することができます。

echo date('Y-m-d G:i:s',time());

 デフォルトのタイムゾーンがUTCになっている場合、日本で上記のプログラムを実行すると、現在時刻より9時間前の時間を取得してしまいます。

そこで、date_default_timezone_set関数でタイムゾーンを日本のものにしてみます。

date_default_timezone_set(Asia/Tokyo);
echo date('Y-m-d G:i:s',time());

 こうすると、現在時刻を取得できます。

 関数のかっこ内のパラメータには、タイムゾーンの標準となる場所を指定します。これは、PHPマニュアルサイトの「サポートされるタイムゾーンのリスト」から確認できます。

 PostgreSQLの場合には、AT TIME ZONE構文を利用します。

SELECT TO_TIMESTAMP(1489066731);

 タイムゾーンの設定が日本になっている場合、上記のSELECT文を実行すると以下のようになります。

      to_timestamp      
------------------------

 2017-03-09 22:38:51+09

 +9というのは、UTCより9時間プラスされている、ということです。現在時刻のUNIXTIME値が1489066731の場合、9時間遅い時間が取得されてしまっていることになります。
 AT TIME ZONEで、タイムゾーンをUTCに変更します。

SELECT TO_TIMESTAMP(1489066731) AT TIME ZONE('UTC');

 これを実行すると、以下のようになります。

     timezone       
---------------------

 2017-03-09 13:38:51

 先ほどよりも、9時間早い時間を取得できました。

 このように、タイムゾーン情報を指定することで、UNIXTIME時間などの取り扱いがスムーズになります。