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するときに複数カラムを同時に見てソートするって出来るんでしょうかね?
で、苦労の末に出来上がったクエリがこれです。
  1. select  
  2.  *  
  3. from  
  4.  hoge  
  5. order by  
  6.  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)のコンパイルは後日紹介します。

  1. extern "C" {  
  2. #include "lua.h"  
  3. #include "lualib.h"  
  4. #include "lauxlib.h"  
  5. }  
  6.   
  7. int main(int argc, char* argv[])  
  8. {  
  9.   
  10.  // LuaのVMを生成  
  11.  lua_State *const L = lua_open();  
  12.   
  13.  // Luaの標準ライブラリを開く  
  14.  luaL_openlibs(L);  
  15.   
  16.  while (true) {  
  17.   // luaファイルを指定して実行する  
  18.   if (luaL_dofile(L, "test.lua")) {  
  19.    // エラー内容の取得  
  20.    printf("error:%s\n", lua_tostring(L, -1));  
  21.    lua_pop(L, 1);  
  22.    return 0;  
  23.   }  
  24.   
  25.   // 直接コードを指定する  
  26.   if (luaL_dostring(L, "print('hello lua world')")) {  
  27.    // エラー内容の取得  
  28.    printf("error:%s\n", lua_tostring(L, -1));  
  29.    lua_pop(L, 1);  
  30.    return 0;  
  31.   }  
  32.   
  33.   printf("\n");  
  34.   printf("hit any key...\n");  
  35.   printf("0 is exit\n");  
  36.   const char c = getchar();  
  37.   if (c == '0') {  
  38.    break;  
  39.   }  
  40.  }  
  41.   
  42.  // LuaのVMを閉じる  
  43.  lua_close(L);  
  44.   
  45.  return 0;  
  46. }  
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参照型にすることができるんですね、今日知りました。
参照型にすると次のようなメリットがありますね
  • コピー処理が実行されないのでループ処理が速くなる
  • 配列内の各要素に処理をするのが楽
逆にデメリットは
  • 参照であるがゆえにプログラマが意図しない処理となってしまう場合がある
ってとこですかね
簡単なコード例を用意しました。
  1. $num_array = array(1,2,3,4,5);  
  2.     foreach ($num_array as &$value) {  
  3.         $num += 1;  
  4.     }  
  5.     unset($value);  
  6.     print_r($num_array);  

2010年7月14日水曜日

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

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

愛をください。


ソースコードはこんな感じです。
JScript
  1. <script type="text/JScript">  
  2. <!--  
  3. function clipText(_id) {  
  4.     var El = document.getElementById(_id);  
  5.     var text = El.innerText;  
  6.     clipboardData.setData("Text", text);  
  7.     alert("クリップボードにコピーしました");  
  8. }  
  9. //-->  
  10. </script>  
HTML
  1. <span id="clip">愛をください。</span>  
  2. <input onclick="clipText('clip');" type="button">  

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を超える数値を扱う場合の注意点

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

  1. $a = 123456789;  
  2.  $b = $a * 100;  
  3.  print_r($b);  
  4.  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

2010年7月8日木曜日

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

◆関数定義時のピリオド「.」とコロン「:」の違い
コロンで定義した場合はselfが使用できます
ピリオドで定義した場合は引数にself(C++でいうところのthis)を取るとselfに自信が代入されます

test = {
 name = "yamada"
}

-- コロン
function test:printName() 
 print(self.name) -- selfにtestが入っている
end

-- ピリオドでselfの引数をもつ
function test.printName2(self)
 print(self.name) -- selfにtestが入っている
end

-- ピリオドでselfなし
function test.printName3()
-- print(self.name) -- selfは使用できない
 print("yamada")
end

2010年7月7日水曜日

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

◆クラス

---------------------------------------
--Characterクラスの定義
---------------------------------------
Character = {} --Characterクラス

--newメソッド
function Character:new(_character)

 obj = {}
 --メンバ変数の定義と初期化
 if _character then
  --コピーコンストラクタ的な処理
  obj.name = _character.name
  obj.age = _character.age
 else
  --デフォルトコンストラクタ適な処理
  obj.name = ""
  obj.age = 0
 end

 --Characterのメソッドをobjに設定
 --継承みたいな感じ
 self.__index = self
 setmetatable(obj, self)
 return obj
end

--setメソッド
function Character:set(_name, _age)
 self.name = _name
 self.age = _age
end

--__tostringメタメソッドのオーバーライド
function Character:__tostring()
 return "name:"..self.name.."\n".."age:"..self.age
end

--cloneメソッド
function Character:clone()
 return Character:new(self)
end

----------------------------------------
--クラスの使用
----------------------------------------
c = Character:new() --オブジェクトの生成
c:set("suzuki", 12) --データの設定
d = Character:new(c) --コピーコンストラクタの使用

print("--c--")
print(c)
print("--d--")
print(d)
print("\n")

c:set("suzuki_2", 24)
d:set("yamada", 55)
print("==c==")
print(c)
print("==d==")
print(d)
print("\n")

e = d:clone()
d:set("takeda", 77)
print("##d##")
print(d)
print("##e##")
print(e)

2010年7月6日火曜日

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

◆関数

--基本
function f(_arg)
    print(_arg)
end
f("Hello World")

f2 = function()
   print("Hello World2")
end
f2()

--数の合わない引数
function fu(_arg1, _arg2)
    print("_arg1:", _arg1)
    print("_arg2:", _arg2)
end
fu("Hello")
fu("Hello", "World")
fu("Hello", "World", "Hi")

--可変長引数
function fun(...)
    args = {...}
    for index, value in ipairs(args) do
        print(index, ":", value)
    end
end
fun("Hello", "World")

2010年7月5日月曜日

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

◆制御構文

fouループ
for i = 1, 10 do
    print(i)
end

whileループ
while true do
    str = io.read()
    if str == "exit" then
        break
    else
        print(str)
    end
end

repeatループ
repeat
    i = i + 1
    print(i)
until 5 < i
if分岐
a = io.read() 
if a == 1 then
    a = a + 10
    print(a) 
elseif a == 2 then
    a = a + 20
    print(a) 
else
    print(a)
end

2010年7月4日日曜日

出した指示を相手が把握しているか確認する

「逆に私に作業指示をだしてください」
「これからの作業について説明してください」

部下や同僚に作業指示を出した後、相手が把握しているかを確認するとき
「把握しましたか?」
「わかりましたか?」
「できますか?」

とついつい聞いてしまいがちですが、この確認の仕方だと相手は把握していてもしていなくても
「はい、大丈夫です」
のような「yes」の返事がほとんどだと思います。
これだと、相手が把握していなかった場合工数が無駄になってしまいます。

そこで、
 「逆に私に作業指示をだしてください」
「これからの作業について説明してください」
という聴き方で相手が作業内容を把握しているか確認します。
この方法によって指示をもらった人自身が、自分が把握している部分、していない部分を明確にすることができますし、指示を出した方も作業内容を再度確認することが出来ます。

2010年7月3日土曜日

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

◆連装配列

生成
t = {}
t = {["name"] = "apple", ["class"] = "mage", ["job"] = "blacksmith"}
t = {name = "apple", class = "mage", job = "blacksmith"}

追加
t = {}
t.name = "apple"
t.class = "mage"
t.job = "blacksmith"

削除
t.name = nil

反復(なめる)
for key, value in pairs(t) do
    print(value)
end

2010年7月2日金曜日

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

◆配列

生成
t = {}
t = {"apple", "orange", "banana"}

追加
t[1] = "apple"
t[2] = "orange"
t[3] = "banana"
※Luaの添え字は「1」から始まります。

末尾に追加(push)
table.insert(t, "apple")
table.insert(t, "orange")
table.insert(t, "milk")

挿入
table.insert(t, 1, "apple")
table.insert(t, 2, "orange")
table.insert(t, 3, "orange")

削除
table.remove(t, index)

末尾から削除(pop)
table.remove(t)

サイズ(アイテム数)を取得する
#t
table.getn(t)

区切り文字で連結
table.concat(t) --> appleorangebanana
table.concat(t, ",") --> apple,orange,banana
table.concat(t, ",", 2, 3) --> orange,banana

ソート
function s(_a, _b)
    return _a < _b
end
table.sort(t, s)

反復(なめる)
t = { "apple", "orange", "banana"}
for index, value ipairs(t) do
    print(value)
end

for i = 1, #t do
    print(t[i])
end