忍者ブログ
  ちゃんとカテゴリ分けされておりませんので、 記事をお探しならブログ内検索が便利です。 ご活用くださいませー+.(≧∀≦)゚+.゚
Admin*Write*Comment
[1]  [2]  [3]  [4]  [5]  [6]  [7

過去にもちょこちょこっとお世話になったことがあるsqlite3さん。
でも本格的にプログラムで使用したことがないから、一時的にちょこっと使用したときとかに便利。
というより、その程度しか使用したことがないのよねー。
な・の・で・・・すぐに忘れてしまう鳥頭のためのいつもの落書きです^^;

# sqlite3 の入手
https://www.sqlite.org/download.html

# 実行
# sqlite3.exe をダブルクリックで起動

-- データベースの作成
-- 作成しなかった場合はin-memoryで作成されている
-- (つまり必要がない)
.open dbname.sqlite3

-- テーブルの作成、普通にIF EXISTS も使える
-- 型は以下の通り
-- http://www.sqlite.org/datatype3.html
--    TEXT
--    NUMERIC
--    INTEGER
--    REAL
--    BLOB

CREATE TABLE IF NOT EXISTS tbl_test(t text, n numeric, i integer, r real ,b blob);
INSERT INTO tbl_test VALUES('hoge"ho''ge', 1234.567890, 1234.567890, 1234.567890, 'blob');

-- いまひとつ数字系とtext, blobの違いが判りません・・・
SELECT * FROM tbl_test;

-- INDEXも作れます!
CREATE INDEX tbl_test_i ON tbl_test(i);
CREATE UNIQUE INDEX tbl_test_t ON tbl_test(t);

-- 日付系
SELECT date('now');
SELECT datetime('now');

-- テーブルダンプ(標準出力)
.dump

-- 出力先きりかえ、そしてダンプ(バックアップ)
.output ./db_test.dmp
.dump

-- 標準出力へ戻す
.output

-- テーブル破棄
-- これもEXISTS使えました^^
DROP TABLE IF EXISTS tbl_test;

-- リストア
.read ./db_test.dmp

-- メタコマンド一覧
.help

-- データベースの一覧
.databases

-- テーブルの一覧
.tables

-- INDEXの一覧
.indexes

-- VACUUM
VACUUM;

-- SELECTの表示を少しでも見やすく
.mode column
SELECT * FROM tbl_test;

-- CSV形式
.mode csv
SELECT * FROM tbl_test;
-- ファイル出力
.output tbl.test.csv
SELECT * FROM tbl_test;
.output

-- TSV形式
.mode tabs
SELECT * FROM tbl_test;
-- ファイル出力
.output tbl.test.tsv
SELECT * FROM tbl_test;
.output

-- INSERT形式
-- 主に別システム移行用ではないかと
.mode insert
SELECT * FROM tbl_test;
-- ファイル出力
.output tbl.test.sql
SELECT * FROM tbl_test;
.output

拍手

PR




久しぶりにPHPでコーディングして、不満があったので、憂さ晴らしです(ぇ

【5C問題】
よく知られたSJISの問題ですね。
これは仕方ないカナ?
Unicodeの実装をあきらめ、PHP6をすっ飛ばしてPHP7をリリースしようとしている心意気だけ評価してあげます。
がんばればaddslashes()やlocale系でたいていゴリ押しできますし。

【fgetcsv()の第二引数にstringを渡すと無視される】
これはひどいです。。。
第二引数は最大行長を指定するのですが、長さなので当然int型が正しいです。
ドキュメントにもそうありますし。。。
ですが、実際はどうでしょう?
それなりに動いているではありませんか!!!
行長を調整してみると、どうもデフォルトで動いているような気がします。。。

<?php
$fp = fopen(__file__, "rb");
while(($line=fgetcsv($fp, ','))!==false){
    var_dump($line);
}

気が振れているとしか思えません。。。
おそらくstringがintにcastされてその結果が0だったので、そういう挙動になったんだと思います。
文字長があるのだからせめて1になるのが正しい気がしますが。。。
(それなら早く気付けるし。。。)

<?php
var_dump((int)',');

腕がわるいと言われれば反撃できないのですが、これはPHPを使っているだけでバグを作っているような気がします。。。
コーダーが関数の仕様を勘違いしていたら一生気づかないし、こういうバグってコーダーが退職後に出やすいんです。
そして、今まで動いていたのが動かないってことはみんなまず最初にINPUTデータを怪しみます。
そしてトコトン現場に混乱をもたらして初めてPHPが仕掛けたトラップに気づくのです。
恐ろしい子なんです、PHPって子は…

【feof() が無限ループになることがある】
オブジェクト指向なクラスが増えたとはいえ、まだまだ手続型言語のPHP。
なのに・・・
無限ループの可能性があるなんて…
言わんとすることはわかります。
たしかに関数としての動きもそうですけど、でも無限ループは怖いので、そこはFatalで落ちてほしかったです。
今後はSplFilreObject()に期待したいですね。。。

と、いうことで皆さんは気を付けてくださいね^^

検索タグ
php5.6

拍手




少し記事が古いですが、こんなのを見かけました。
可変変数と可変関数の使いどころがわからない'
可変関数っていうんだ~へぇ(^^;)

私はよく使いますよ^^
こんな感じで(笑)

analyze.php
<php?
$html = file_get_contents('http://php.net/');

$module_dir = implode(DIRECTORY_SEPARATOR, array(dirname(__FILE__), 'modules'));
if(!is_dir($module_dir)) Exception('No such directory.');
$dh = opendir($module_dir);
$php_files = array();
while(($file=readdir($dh))!==false){
        $l = strlen($file);
        if(substr($file, $l-4, 4) !== '.php') continue;
        $php_modules[] = substr($file, 0, $l-4);
}

libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHtml($html);
$dom = new DOMXpath($doc);
libxml_use_internal_errors(false);

$ret = array();
foreach($php_modules as $module){
        require_once(implode(DIRECTORY_SEPARATOR, array($module_dir, $module.".php")));
        $ret[$module] = $module($dom);
}
var_dump($ret);

module/leatest_version.php
<php?
$xpath = '//*[@id="intro"]//a[1]/text()';

function latest_version($dom){
        global $xpath;
        $ret = array();
        foreach($dom->query($xpath) as $elem){
                $ret[] = $elem->nodeValue;
        }
        return $ret;
}

外部ファイルを読み込んでそれに対して解析をかけています。
解析をかける関数名はファイル名と一緒にしておき、
ディレクトリの中に格納しておきます。
解析対象が何百とあり、かつ複数人で作業するときには
バッティングも起きにくいですし、対象が増えても
requre元のファイルに変更がないのがうれしいのです。
減らすのも簡単ですしね(^_^;)

と、いう感じで私は結構用途があったとさ。

余談ですが、これPythonでやるとimport_module()を
こねくり回さないといけないのでPHPってその辺に
便利さを痛感します。。。

拍手




便利そうで、そうでもなさそうな外部データラッパー。
何とか便利なシーンを探しています。
とりあえず備忘録です。

Foreign data wrappers
F.14. file_fdw
PostgreSQL: playing with foreign data wrappers (1)

拍手




redmineサーバのディスク容量がひっ迫してきたので、過去にアップロードして不要になったファイルを削除しよう!
みたいな話が出てきました。
それで何千とあるチケットの中からどうにかして、添付をしているチケット、並びにそのサイズを割り出せないか?
ということでいろいろ調べてみました。

まず、バックアップ方法を調べる。
http://redmine.jp/faq/system_management/backup/
これによりますと、
Redmineインストールディレクトリ以下のfilesディレクトリチケットやWikiに添付されたファイルが格納されています。

と、あります。
ではこれでファイルサイズがわかるわね。
でもファイルはなんだか暗号のよう。
ファイルとチケットの結びつけは、普通に考えればDBに格納されているはず!
でもまずは確定させるところから…
他に読み進めていくと。。。
添付ファイル以外の全ての情報がデータベースに格納されています。

と、あります。
ということは、やはりチケットとファイルの結びつけはDBを見ればわかるはず!!!
そこでshow tablesしてみると、、、
思ったよりテーブル数は少ない。。。
みたまんま、Issuesがチケットテーブルなのはわかるけど、、、
ここからはERもなしにたどり着くのは正直つらい…
と涙が出そうになったところで、attachmentsテーブルを発見!
見てみるとアップロードしたファイルに関する情報が!
でもそのファイルがどこに添付されたものなのかはカラム名からは推測が難しい…

かくなる手段は!
実際に添付されているチケットのページにアクセスしたときに発行されるSQLをみる!!!
と、いうことでクエリログを取ってみる。。。

attachments テーブルを使用しているログを見てみたところ、、
HITしましたぁ(*^ ^*)
container_id と container_type で引き抜いているみたいです。

  container_id: チケットのID
container_type: Issue(固定)

ちなみに attachments テーブルには filesize カラムがあるのでディスクを直接見なくても大きなサイズのファイルがすぐにわかりました。
これをもとにチケットを確認し、不要な添付ファイルの削除がなんとかできましたとさ。

そもそもメールで添付できない大きいファイルだからってなんでもかんでもRedmineを中継するような体質は何とかした方が…
とは言えないのでした…

Redmine version  2.6.0.stable

拍手




これまたすぐに忘れてしまう、ポスグレでのカラム追加です。

ALTER
TABLE [table] ADD COLUMN [column_name] [data_type];

ex.)
ALTER TABLE table_a ADD COLUMN new_field varchar(255);

データ型を変えたい場合はこちら

検証)
PostgreSQL 9.3.5

拍手




pythonのseleniumでWEBのテストを行う方法です。
Firefoxに関する記事はいっぱいあるし、特にseleniumさえ導入できればすぐに使えるので問題ないのですが、Chromeになると情報が少ないので載せておきます。

大前提としてChromeさんをインストールしておいてね。

次に、ドライバをインストール。
zipを解凍して出てくる「chromedriver.exe」を任意のディレクトリに配置します。

前支度はこれくらい。
意外と簡単でした。

ユーザエージェントとプロキシを変更して、ハンドリングする場合のサンプルを掲載しておきます。

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--user-agent=Mozilla/5.0 (Linux; Android 4.2.2; SHL24 Build/S2040) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36")
options.add_argument("--proxy-server=localhost:8080")
options.add_argument("--disable-prompt-on-repost")
driver = webdriver.Chrome(r'C:\chromedriver.exe', chrome_options=options) 
driver.get("https://www.google.co.jp/")

add_argument()はおそらくみたとおり、chrome.exeの起動オプションがそのまま使えそうです。


参考文献
http://www.ericdlarson.com/misc/chrome_command_line_flags.html
http://www.mazn.net/blog/2014/07/08/1371.html
http://yuichi.tea-nifty.com/blog/2008/12/googlechrome-c0.html
http://www.yoheim.net/blog.php?q=20130402

拍手




Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
MySQL :: MySQL 4.1 リファレンスマニュアル :: A.2.5 Host '...' is blocked エラー

MySQLでよく見るエラーです^^
私はバッチ系の人なので、並列処理をうまくできなかったり、サーバのスペックを見誤ると大量に出たりします。

いつもはまってしまうことが2店あります++。

このエラーはクライアント側で見ることができます。
ですのでmysqladminコマンドはクライアント側でやってしまいがちですが、サーバ側で実施しましょう^^

も一つ、マニュアル通り'mysqladmin flush-hosts'をじっしするとたいていエラーになります。
これは'mysql'と同じくログインを必要とするため、たいていは下記のようになります。
mysqladmin flush-hosts -uroot -p

拍手




5.5.15リリースの記事を書いている間に5.4.31もリリースなんてことになっていました。。。
http://php.net/archive/2014.php#id2014-07-24-2

なんとなく、悔しいのでこちらもコンパイルしてみます。
http://notebook.mor-maid.info/server/language/php/5.4.31.html

まったく同じようにコンパイルが通りました^^

拍手




PHP 5.5.15がリリースされたみたいですemoji
http://php.net/archive/2014.php#id2014-07-24-1

ということで早速コンパイルしてみましたーemoji
http://notebook.mor-maid.info/server/language/php/5.5.15.html

例によってそれだけの話です
リリース概要とか日本語訳してみたかったけど、それほど誤訳力あるわけじゃないし、
このあたりが限界なのです…emoji

拍手



ブログ内検索
カレンダー
06 2018/07 08
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
カウンター
最新コメント
最新トラックバック
プロフィール
+ハンドル+
y_ayamori(purple)
+職業+
IT系エンジニア
+すまい+
さいたま
バーコード
ブログパーツ
アバター
Copyright © アナログを愛するデジタル生活館 All Rights Reserved.
photo by Kun material by Atelier Black/White Template by Kaie
忍者ブログ [PR]