ORマッパーを作成して、
INDEXの存在確認方法を調べたのでまとめておきます。
【PostgreSQL】
select indexname from pg_indexes where tablename = ‘テーブル名’;
【MySQL・MariaDB】
SELECT INDEX_NAME FROM information_schema.STATISTICS WHERE table_name = ‘テーブル名’;
→whereに「TABLE_SCHEMA」を追加すれば、データベース名も条件に加えられる。
【SQLite3】
select name From sqlite_master where type = ‘index’;
→インデックス名の一覧がとれるから、そこから検索すればよい。
【H2】
select index_name from information_schema.indexes where table_name = ‘テーブル名;
→大文字小文字を区別している場合、テーブル名は大文字にする必要がある。
→大文字小文字を区別している場合、結果セットは大文字になるので、注意する。
→CREATE INDEX IF NOT EXISTS index_name ON table_name (column_name1, column_name2);
という形で、IF NOT EXISTS構文もサポートしている。
以上
投稿日時:2015年08月14日 16:08
カテゴリー:
rdb
websocketで、回線を抜くなどの切断をしたとき、
即座にcloseハンドラで受け取れないみたい。
TCP自体の仕様を細かく確認してみる必要はあるが。。
ライブラリによっては、
再接続時に一旦closeハンドラを呼び、
滞留中のコネクションを破棄したうえで、
openハンドラをコールするものもあるようにみえる。。
なので、再接続時にcloseが呼ばれるケースもある、
ということを考慮しておいた方がよい場合もあると思います。
投稿日時:2015年08月03日 15:42
カテゴリー:
websocket
redshiftからクエリーを引くのが遅い。。
そして、アナウンスなしにマイナーバージョンアップが多い。。。
データの格納庫としては、
とても優れているけど、
データの引っ張る際は、
直接クエリーで引いてもよくないな。。
RDB側へサマリーしておいて、
それを引いたほうがいいかも。。
今後に期待。
投稿日時:2015年08月03日 15:40
カテゴリー:
aws
phpにも、pythonやrubyと同じようにインタラクティブシェルがあるんですね。。
最近知りました。。。
php -a
とやるみたい。。
投稿日時:2015年07月14日 13:13
カテゴリー:
php
6月12日にphp7-alphaがリリースされていた。
予定では、11月に正式版になるとのこと。
言語の書き方という面において、
個人的には、
- 関数の戻り値型の指定
- スカラー型によるタイプヒンティング
の導入は良いかなと思う。
たださ、なんかjavaにどんどん近づいているよね?
そのうち、javaのコレクションに相当するものが出てきそう。
httpdの組み合わせによる利用が一般的だから、
どんだけパフォーマンスでるんだろうね?
webサービスの場合、javaで書いたほうがよくね??
と個人的には思ってしまうよ。。
投稿日時:2015年06月25日 15:18
カテゴリー:
php
windows8.1
cygwinでphpビルトインサーバを用いて、
phalconフレームワークを動かしてみた。
予めやっておくことは、
- ビルドできる環境
- phpおよび関連モジュールのインストール
- phalconのインストール(linuxの方法でcygwinもできます)
です。
そして、
サンプルのinvoをダウンロードして、
公開ディレクトリに移動して、
php -S localhost:8000 routing.php
をたたけば起動する。
ここで、あらかじめ以下2点を対応しておく。
①invoのapp/config/config.iniのbaseUriを「/」に変更しておく
②公開ディレクトリ直下にrouting.phpを作成する。
<?php
$route = parse_url ( substr ( $_SERVER [ "REQUEST_URI" ], 1))[ "path" ];
if ( is_file ( $route )) {
if ( substr ( $route , -4) == ".php" ){
require $route ;
exit ;
}
return false;
} else {
$_GET [ "_url" ] = "/" . $route ;
require "index.php" ;
}
|
で、おしまい。
routing.phpについては、phpの公式ページに書いてあるのを、
phalconようにちょろっと修正しただけです。
投稿日時:2015年06月16日 17:36
カテゴリー:
php
新しいネタがないので、
過去の小ネタを。
phpでデーモンプログラムを組んで、
そこで、pdoを使う場合、
fetchを使うと処理が落ちる。
fetchAllでないとダメ。
理由は、、、忘れた。。
投稿日時:2015年06月16日 09:37
カテゴリー:
php
負荷試験をやっていると、
他人の状態を保持して、
その状態に応じて処理を行うということがある。
たとえば、
- AさんがBさんに友達の申請をする
- BさんがAさんの友達申請を許可する
という場合など。
これをjmeterで試験する場合、
「BさんがAさんの友達申請を許可する」という処理は、
「AさんがBさんに友達の申請をする」が完了していないと成功しない。
そのためには、BさんはAさんの状態を取得する必要がある。
ここで、
AさんのIDを1
BさんのIDを2
とし、
jmeterのBSF(javascript)を使うと、
<(PostProcesser)AさんがBさん友達申請をする>
var my_id = 1;
var other_id = 2;
var key = "appley-to-" + other_id;
var value = my_id;
props.put(key, value);
|
<(PreProcesser)BさんがAさんの友達申請を許可する>
var my_id = 2;
var other_id = 1;
var key = "appley-to-" + my_id;
while ( true ) {
var value = props.get(key);
if (value != void(0)) {
break ;
}
}
|
という具合になる。
注意点としては、
jmeterが起動中は、
propsの値は常に保持されるので、
不要になったら、removeしておく必要がある。
もしくは、初期化処理でremoveしてから利用するなど。
もう1つ注意点としては、
永久ループで待機する場合は、
スレッドを停止しても処理が停止しないので、
何回かループしたら止めるとかを入れておいた方がよい。
あとは、カウンタとか、forEachループなどを組み合わせることで、
もっと複雑な処理が可能になる。
以上です。
まあ、小ネタだね。
投稿日時:2015年05月27日 10:38
カテゴリー:
jmeter
実行可能warをmavenで作る場合、
warパッケージの直下にmainファイルを配備する必要がある。
しかし、warアプリケーションをpackageすると、
WEB-INF/classes以下にmainファイルも配備されてしまう。
そのため、maven3では、
antrunプラグインを用いて、mainファイルを移動する必要がある。
pom.xmlはこんな感じかな。
< plugin >
< groupId >org.apache.maven.plugins</ groupId >
< artifactId >maven-antrun-plugin</ artifactId >
< executions >
< execution >
< id >move-main</ id >
< phase >prepare-package</ phase >
< configuration >
< tasks >
< move todir = "target/${project.build.finalName}" >
< fileset dir = "target/classes" >
< include name = "app/AppMain.class" />
</ fileset >
</ move >
</ tasks >
</ configuration >
< goals >
< goal >run</ goal >
</ goals >
</ execution >
</ executions >
</ plugin >
|
これにより、warファイル直下に実行可能クラスが配備される。
また、jettyなどのembedを組み込む場合、
一緒に依存関係も持って行ってやる必要がある。
こんな感じ。
< plugin >
< groupId >org.apache.maven.plugins</ groupId >
< artifactId >maven-dependency-plugin</ artifactId >
< executions >
< execution >
< id >jetty-classpath</ id >
< phase >prepare-package</ phase >
< goals >
< goal >unpack-dependencies</ goal >
</ goals >
< configuration >
< includeGroupIds >org.eclipse.jetty,javax.servlet,javax.websocket</ includeGroupIds >
< excludes >META-INF/ECLIPSEF.*</ excludes >
< outputDirectory >${project.build.directory}/${project.build.finalName}</ outputDirectory >
</ configuration >
</ execution >
</ executions >
</ plugin >
|
そして、mainファイルはこんな感じ。
package app;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
import java.net.URL;
public class AppMain {
public static void main(String[] args) throws Exception {
int port = 8080 ;
System.setProperty( "prefix" , "/" );
Server server = new Server(port);
URL warUrl = AppMain. class .getProtectionDomain().getCodeSource().getLocation();
String warLocation = warUrl.toExternalForm();
WebAppContext context = new WebAppContext();
context.setWar(warLocation);
context.setContextPath( "/" );
context.setServer(server);
WebSocketServerContainerInitializer.configureContext(context);
server.setHandler(context);
server.start();
server.join();
}
}
|
上記が非常に重要。
これで、websocketのendpointをServletContextListener側で指定してやるとうまくいく。
package app;
import websocket.WebsocketIndex;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.websocket.DeploymentException;
import javax.websocket.server.ServerContainer;
public class AppInitializeListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
ServerContainer wsContainer = (ServerContainer) sce.getServletContext().getAttribute(ServerContainer. class .getName());
System.out.println(String.format( "wsContainer => %s" , wsContainer));
if (wsContainer != null ) {
wsContainer.addEndpoint(WebsocketIndex. class );
}
} catch (DeploymentException e) {
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
|
実行可能jarでwebsocketを作成する場合、
mainクラス内でendpointを設定してやればよいのだが、
実行可能warの場合、
mainクラスが実際のwebsocketのendpointのクラスの配備位置が異なるため、
クラスのロードが出来ない状態となる。
そのため、上記のような方法で、動的に指定してやることで、
実行可能warにおいて、websocketが利用できる。
【参考】
・実行可能warの生成の詳細がかかれています。
http://qiita.com/k_ui/items/1d3bbbd7993c4c9adf71
・実行可能jarでのwebsocketの設定方法が書かれています。
https://github.com/jetty-project/embedded-jetty-websocket-examples/blob/master/javax.websocket-example/src/main/java/org/eclipse/jetty/demo/EventServer.java
以上
投稿日時:2015年05月15日 09:19
カテゴリー:
java,
websocket
ちまたでは、chefやらansibleといった
インフラ構成ツールが流行っている。
しかし、個人的にはどっちもめんどくさい。
ドキュメントは充実しているが、
それなりに扱うには独自の書き方を習得する必要がある。
そこで、以下のように考えてみた。
- ssh接続でコマンドを発行できる
- ssh接続でファイルを操作し、部分置換・全体置換・追記ができる
以上があれば十分で、あと必要なものは、
ってくらいだろうか。。
そして、「冪等性」ってのを保つのは非常に重要。
これらを踏まえつつ、
基本的にはシェルスクリプトを作成し、
WEBベースで、実行・管理できればよいかなと思っている。
そんなツールに着手してみようかな。。
投稿日時:2015年04月16日 10:40
カテゴリー:
server