2011年4月22日金曜日

客の要求+αのα

それは物事を先読みして客の為に何が出来るか、客の立場になって考えると答えが出てくるのであった・・・

2010年11月16日火曜日

2010年8月13日金曜日

SmartyでPHPの関数を呼ぶ

Smartyで配列の数を取得するにはどうすればいんだろうと、調べていたら
{$array|@count}
  • $array:配列
  • @:$arrayが配列ですよと指定している
  • count:PHPのcount関数
で出来ると言うことがわかりました。
そんでもってcount()はPHPの関数で、それはつまりSmartyからPHPの関数を呼び出すことが出来るってことです。しらなかったぁ~

2010年7月27日火曜日

photoshopで移動とかするときにグリッドや端に張り付かないようにする

え~PhotoShopってかなり出来る子なんで、選択して移動とかするときグリッドや画像の端っことかにかってに張り付いてくれますよね、でもね
「よけーなことすんじゃねぇ」って思うときがたまにあるんですよね、
こう、マウステクを駆使してちょっとだけ、ほんの1pxだけとか移動したいのにグイってなっちゃうんですよね。そんなときは
上段メニューの[ビュー]にある[スナップ]のチェックをハズします。(photshop 6.0の場合)
これです。
これで移動とかするときスナップされなくなって微調整ができます。

2010年7月24日土曜日

order byで激はまり


今日はクエリのorder byで激はまりしました
SQL SERVERだったんですけど
table hoge
idnonum
12100
21200
3NULL300
4NULL400
これを

table hoge
idnonum
3NULL300
4NULL400
21200
12100
こう並べたかったんですけど、条件としては
  • noがNULLである行が最優先
  • noがNULL以外の中でnumの値を降順でソートする
もしかしたらすごく簡単なのかもしれませんが、スキルが低くてかなりはまりました。
order byするときに複数のカラムを同時に見てソートするって出来るんでしょうかね?
で、苦労の末に出来上がったクエリがこれです。
select
 *
from
 hoge
order by
 no / no * num * -1;

2010年7月23日金曜日

タクティクスオウガ~運命の輪~

15年ぶりに当時のスタッフでミメイクしているみたいですね。
公式HPはここです。
私は、前からやってみたいなと思いつつもやらずじまいなのですが発売から15年たっても色あせない魅力を感じていますしHPの音楽聞いてほんのりぞわぞわってきましたw。
PSP本体は持ってないんですけど「タクティクスオウガ~運命の輪~」が発売されたら本体と同時に買ってしまうかもしれませんw

とはいえHPも出来たばかりで、発売日、価格共に未定なので気長に待つ方がよさげですね。

2010年7月21日水曜日

あまりやりたくない、憂鬱な仕事をこなすにはどうするか?

やりたくない仕事だからってやらないといけないわけで・・・
退屈な仕事でもやらないと終わらないわけで・・・
終わりそうもない仕事でもやらないと終わらないわけで・・・
そんなときやる気を出すための方法をいくつか列挙してみる
  1. 目標をつくってみる
  2. ご褒美を用意してみる
  3. その仕事をやってなにか得るものはないかと考えてみる
  4. 仕事が楽しくなる方法は無いかと考えてみる
  5. とりあえず楽しいことを考えてみる
  6. 誰かと競争してみる
  7. わくわくするような何かを探してみる
  8. 誰かの為にがんばってみる
  9. 自分の為にがんばってみる
  10. 自分を褒めてみる

C++プログラマがLuaを勉強してみる第14回

テーブルは常に参照型です(キリッ
数値は参照型ではありません。
文字列は参照型かもしれませんが文字列を直接編集する事はできないので特に意識する事は無いと思います。

2010年7月20日火曜日

C++プログラマがLuaを勉強してみる第13回

◆C/C++からLuaを呼び出すためのライブラリをコンパイルしてみる
さて、今回はLua5.1.4とVisual Studio 2008を使ってライブラリをコンパイルしてみます。

STEP 1:ソースをダウンロード
まずはここからソースをダウンロードして解凍します。

STEP 2:Visual Studio 2008でプロジェクト作成
VC++でWin32プロジェクトを作成します。

 次にアプリケーションの設定をスタティックライブラリに設定します。

 完了します。

 STEP 3:srcの取り込み
ダウンロードしたlua-5.1.4.tar.gzを解凍してsrcフォルダSTEP 2で作成したプロジェクトの有るフォルダにコピーします。
srcフォルダ内の.cファイルと.hファイルをプロジェクトに取り込みます。
このとき下記のファイルは必要有りません。
  • lua.c
  • luac.c
  • print.c




STEP 4:プロジェクトの設定
プリプロセッサの定義に_CRT_SECURE_NO_DEPRECATEを追加します。

えーっとプロジェクトの設定とかあまり詳しくないので過不足あったらすいません。

STEP 4:ビルド

2010年7月19日月曜日

C++プログラマがLuaを勉強してみる第12回

◆C/C++からLuaを実行する
C++からLuaのコードを実行するサンプルをつくりました。
C++からLuaのコードを実行するためのライブラリ(lib)のコンパイルは後日紹介します。

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

int main(int argc, char* argv[])
{

 // LuaのVMを生成
 lua_State *const L = lua_open();

 // Luaの標準ライブラリを開く
 luaL_openlibs(L);

 while (true) {
  // luaファイルを指定して実行する
  if (luaL_dofile(L, "test.lua")) {
   // エラー内容の取得
   printf("error:%s\n", lua_tostring(L, -1));
   lua_pop(L, 1);
   return 0;
  }

  // 直接コードを指定する
  if (luaL_dostring(L, "print('hello lua world')")) {
   // エラー内容の取得
   printf("error:%s\n", lua_tostring(L, -1));
   lua_pop(L, 1);
   return 0;
  }

  printf("\n");
  printf("hit any key...\n");
  printf("0 is exit\n");
  const char c = getchar();
  if (c == '0') {
   break;
  }
 }

 // LuaのVMを閉じる
 lua_close(L);

 return 0;
}
getchar()のところでtest.luaを編集ご実行すると編集内容が反映されます。

2010年7月18日日曜日

LIBCMT.libとMSVCRTD.libの競合

Luaのライブラリを利用しようとしたら出たエラーです。
ライブラリ(lib)がVC2005でコンパイルされていたので
VC2008のReleaseモードでコンパイルしたらでなくなりました。

LIBCMT.lib(_file.obj) : error LNK2005: ___iob_func は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
LIBCMT.lib(tidtable.obj) : error LNK2005: __encode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(tidtable.obj) : error LNK2005: __decode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(crt0.obj) : error LNK2005: _mainCRTStartup は既に MSVCRTD.lib(crtexe.obj) で定義されています。
LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(setlocal.obj) : error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(dosmap.obj) : error LNK2005: __errno は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(lconv.obj) : error LNK2005: _localeconv は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(atox.obj) : error LNK2005: _atoi は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMT.lib(strtol.obj) : error LNK2005: _strtoul は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LINK : warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。

2010年7月17日土曜日

相手の意見を頭ごなしに否定しない

誰しも有ると思いますが、相手よりも優位に立ちたい、自分の評価を上げたい等の心理からついつい相手の意見を否定したり、あらを探したりしてしまいがちですがそれだと仕事、人間関係ともにうまくいかない場合が多いのではないでしょうか?
そこで、相手の意見は出来るだけ否定せずに意見をよく理解してメリットデメリットを述べ、その上で自分の持っている意見を提示するのが良いのではないでしょうか。

2010年7月16日金曜日

PHPのforeachで$valueを参照型にする

PHP5以降foreachの$valueを参照型にすることができるんですね、今日知りました。
参照型にすると次のようなメリットがありますね
  • コピー処理が実行されないのでループ処理が速くなる
  • 配列内の各要素に処理をするのが楽
逆にデメリットは
  • 参照であるがゆえにプログラマが意図しない処理となってしまう場合がある
ってとこですかね
簡単なコード例を用意しました。
$num_array = array(1,2,3,4,5);
    foreach ($num_array as &$value) {
        $num += 1;
    }
    unset($value);
    print_r($num_array);

2010年7月14日水曜日

WEBベージ上のテキストデータをクリップボードへコピーする(IE)

IE限定ですがJScriptをつかってWEBページ上のテキスト情報をクリップボードにコピーすることができます。

愛をください。


ソースコードはこんな感じです。
JScript

HTML
愛をください。

2010年7月13日火曜日

SQL Serverでハイフンを含んだ文字列のソートが変

 なんか、SQL Serverでハイフンを含んだ文字列のソートがうまくいかなくて困ったんですけど

A-10
A-30
A20

って並んでほしぃのに


A-10
A20
A-30

って並んでしまうんです。
んでいろいろ調べてみたんですがSELECTするときに「COLLATE Japanese_BIN」をつけるとうまくいきました。

select * from  aaa order by name COLLATE Japanese_BIN

こんな感じです

EXCELで重複する行(レコード)を非表示にする

EXCELで重複する行(レコード)を非表示にするには

1.列を選択する

2.メニュー[データ]→[フィルタ]→[フィルタオプションの設定]を起動する

3.「重複するレコードは無視する」にチェックを入れる

でOK

2010年7月12日月曜日

EXCELで奇数の行だけ色をかえる

EXCELで奇数の行だけセルの色を変更するには
  1. 適用するセル範囲を選択する
  2. メニューから「条件付き書式の設定」を起動する
  3. 「数式が」を選し「=MOD(ROW(),2)=1」を入力する
  4. 書式を設定する
でok

2010年7月11日日曜日

PHPで32bitを超える数値を扱う場合の注意点

今日しごとで出た問題なんですけど、PHPのintval()って環境に関係なく32bitで丸められるみたいなんですよね。
下記のコードを実行してみてください

$a = 123456789;
 $b = $a * 100;
 print_r($b);
 print_r(intval($b))

正しく表示されてたらすいません。
未確認ですが、intval()だけじゃなくてsprintf()などの%dも同様の問題が有るみたいです。、

2010年7月10日土曜日

C++プログラマがLuaを勉強してみる第11回

◆コルーチンによるタイマスレッドみたいなの
を作ってみました。
で、こんなの使うのだろうか。。。よくわかりませんw

isTimeout = false

--タイムアウトハンドラ
function timeOutHandler(_limit)
 isTimeout = true
end

--タイマコルーチン用関数
function timer(_limit, callBack)
 local limit = _limit --リミット
 local startTime = os.time() --開始時間
 local latest = os.time() --前回の時間
 local countDown = _limit --カウントダウン用

 print(countDown)
 while true do
  local time = os.time()
  if startTime + limit <= os.time() then
   break
  elseif latest < time then
   print(coroutine.status(co))
   latest = time
   countDown = countDown - 1
   print(countDown)
  end
  coroutine.yield() --コルーチンを中断して処理をもどす
 end
 callBack(limit) --コールバック関数を呼ぶ

end

co = coroutine.create(timer) --コルーチンの生成
print(coroutine.status(co)) --ステータスの表示

--メインループ
repeat
 coroutine.resume(co, 10, timeOutHandler) --コルーチンの開始と再開
until isTimeout

print(coroutine.status(co))
print("time out")

2010年7月9日金曜日

C++プログラマがLuaを勉強してみる第10回

◆Luaでテンプレートメソッドパターン
今回はLua初心者のくせにテンプレートメソッドパターンに挑戦してしまいました。
テンプレートメソッドパターンについてはここ参照
無理矢理感が否めないので、ぜんぜんちっげーよ!ってコメント待ってます!

まずは、簡単にクラス図の説明を書きます。
なんかどっかでみたよーな命名ですが気にしない気にしない
   CaffeineBeverageクラス(Superクラス)
               △
                |
   ----------------
   |                        |
Coffeeクラス      Teaクラス


以下ソースコード
CaffeineBeverage.lua
----------------------------------------
--CaffeineBeverageクラス
----------------------------------------
CaffeineBeverage = {}

-- new
function CaffeineBeverage:new(_caffeineBeverage)
 local obj = {}
 -- field
 if _caffeineBeverage then
  obj.name = _caffeineBeverage.name
 else
  obj.name = ""
 end

 self.__index = self
 setmetatable(obj, self)
 return obj
end

-- property
function CaffeineBeverage:set(_name)
 self.name = _name
end


-- __tostring over ride
function CaffeineBeverage:__tostring()
 return "name:"..self.name
end

-- clone
function CaffeineBeverage:clone()
 return CaffeineBeverage:new(self)
end

-- prepareRecipe
function CaffeineBeverage:prepareRecipe()
 CaffeineBeverage:boilWater()
 CaffeineBeverage:brew()
 CaffeineBeverage:pourInCup()
 CaffeineBeverage:addCondiments()
end

-- boilWater
function CaffeineBeverage:boilWater()
 print("お湯を沸かす。。。")
end

-- brew()
function CaffeineBeverage:brew()
 error("have to override")
end

-- pourInCup
function CaffeineBeverage:pourInCup()
 print("カップに注ぐ。。。")
end

-- addCondiments
function CaffeineBeverage:addCondiments()
 error("have to override")
end


Coffee.lua
dofile("CaffeineBeverage.lua") -- C/C++で言うところの#include

----------------------------------------
--Coffeeクラス
----------------------------------------
Coffee = {}

-- new
function Coffee:new(_coffee)
  obj = {}
 -- field
 if _coffee then
  obj = CaffeineBeverage:new(_coffee)
 else
  obj = CaffeineBeverage:new()
 end

 -- clone (override)
 obj.__index.brew = function()
  return Coffee:new(self)
 end

 -- brew (overrice)
 obj.__index.brew = function()
  print("コーヒーをドリップする")
 end

 -- addCondiments (override)
 obj.__index.addCondiments = function()
  print("砂糖とクリープを加える")
 end

 return obj
end


Tea.lua
dofile("CaffeineBeverage.lua")
----------------------------------------
--Teaクラス
----------------------------------------
Tea = {}

-- new
function Tea:new(_tea)
  obj = {}
 -- field
 if _tea then
  obj = CaffeineBeverage:new(_tea)
 else
  obj = CaffeineBeverage:new()
 end

 -- clone
 obj.__index.brew = function()
  return Tea:new(self)
 end

 -- brew
 obj.__index.brew = function()
  print("ティーバッグをお湯に浸す")
 end

 -- addCondiments
 obj.__index.addCondiments = function()
  print("砂糖とレモン")
 end

 return obj
end

main.lua
dofile("Coffee.lua")
dofile("Tea.lua")

----------------------------------------
-- main
----------------------------------------
function main()
 print("--コーヒーの生成")
 a = Coffee:new()
 a:set("コーヒー")
 print(a)
 a:prepareRecipe()

 print("\n")

 print("--紅茶の生成")
 b = Tea:new()
 b:set("紅茶")
 print(b)

 b:prepareRecipe()

 print("\n")

 print("--コピーコンストラクタの使用")
 c = Tea:new(b)
 print(c)
 c:set("レモンティ")
 print(c)
 print(b)

 print("\n")

 print("クローン")
 d = c:clone()
 print(d)
 d:set("レモンの紅茶")
 print(d)
 print(c)
end

-- call main
-- try catchみたいなの使ってます。
-- error()ってメソッドがthrowに相当します。
local status, err = pcall(main)
if status then
 -- do nothing
else
 print(err)
end