리눅스(osx) tip

터미널 alias 설정


  1.  vi ~/.bash_profile
  2. alias 별칭='명령어'
  3. 저장
  4. source ~/.bash_profile 
  5. 완료
ssh 터미널 rsa키 설정( mac 터미널 -> 우분투 터미널)

  1. ssh keygen으로  생성
  2. scp ~/.ssh/id_rsa.pub ssh접속주소:~/id_rsa.pub
  3. 우분투 터미널에서
    $ mkdir ~/.ssh
    $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    $ rm ~/id_rsa.pub

vi 사용법
  • i 입력
  • :q 종료
  • :qw 저장 종료

by tomochan | 2017/10/19 16:37 | 트랙백 | 덧글(0)

Mongodb C# dbhelper

C# 몽고디비 헬퍼를 만들어 보았다.

현재 진행중인 사이트는 빅데이터는 필요없지만 무료 디비를 사용해야 해서

겸사겸사 몽고디비로 밀어 붙였다.

버젼은 3.4 

이전 버젼과 많은게 변했다. async 도 생기고 오랜만에 다시 C# 드라이버를 공부 했네.

소스는 아래와 같다.




using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;

namespace Bottleshop.Api.Lib
{
public class MongodbHelper
{
private static MongoClient client = new MongoClient("mongodb://localhost:27017");
private static IMongoDatabase database = client.GetDatabase("thebottleshop"); // db명
///
/// Insert One
///

///
///
///
public static void InsertOneModel(T instance, string collectionName) where T : class
{
try
{
var collection = database.GetCollection(collectionName);
collection.InsertOne(instance);
}
catch(Exception ex)
{
new Log().Error(ex);
}
}

public static void InsertManyModel(List instance, string collectionName) where T : class
{
try
{
var collection = database.GetCollection(collectionName);
collection.InsertMany(instance);
}
catch (Exception ex)
{
new Log().Error(ex);
}
}

///
/// Update
///

///
///
///
///
///
public static long Update(FilterDefinition filter, UpdateDefinition update, string collectionName) where T : class
{
long count = 0;
var collection = database.GetCollection(collectionName);
var result = collection.UpdateMany(filter, update);
if (result.IsModifiedCountAvailable)
{
count = result.ModifiedCount;
}
return count;
}

public static long ReplaceOne(FilterDefinition filter, T instance, string collectionName) where T : class
{
long count = 0;
var collection = database.GetCollection(collectionName);
var result = collection.ReplaceOne(filter, instance, new UpdateOptions { IsUpsert = true });
if (result.IsModifiedCountAvailable)
{
count = result.ModifiedCount;
}
return count;
}

///
/// Delete
///

///
///
///
///
public static long Delete(FilterDefinition filter, string collectionName) where T : class
{
long count = 0;
var collection = database.GetCollection(collectionName);
var result = collection.DeleteMany(filter);
count = result.DeletedCount;
return count;
}

public static T FindOne(FilterDefinition filter, string collectionName) where T : class
{
var collection = database.GetCollection(collectionName);
var document = collection.Find(filter);
if(document.ToList().Count > 0)
{
return collection.Find(filter).First();
}
else
{
return null;
}
}

public static List Find(FilterDefinition filter, string collectionName) where T : class
{

var collection = database.GetCollection(collectionName);
var document = collection.Find(filter).ToList();
return document;
}

public static List FindSort(FilterDefinition filter, SortDefinition sort, string collectionName) where T : class
{
var collection = database.GetCollection(collectionName);
var document = collection.Find(filter).Sort(sort).ToList();
return document;
}

///
///
///

///
///
///
///
///
/// Rows
///
public static MongoPagingResult FindPaging(FilterDefinition filter, SortDefinition sort, string collectionName, int start, int rows) where T : class
{
MongoPagingResult result = new MongoPagingResult();

var collection = database.GetCollection(collectionName);
var document = collection.Find(filter).Sort(sort).ToList();
result.Count = document.Count();

result.Result = collection.Find(filter).Sort(sort)
.Skip(start)
.Limit(rows)
.ToList();

return result;
}
}

public class MongoPagingResult
{
public long Count { get; set; }
public List Result { get; set; }
}
}



사용법은 아래와 같다. 클래스를 넘겨서 bsondocument을 받는다. 요게 핵심. 이게 참 편하다. 클래스 선언해서 던지면 거기에 알아서 넣어주니.


여러개를 Insert


for(int i=0; i< 100; i++)
{
Promotion ca = new Promotion();
ca.PromotionCode = i.ToString();
ca.Send = true;
list.Add(ca);

}
MongodbHelper.InsertManyModel(list, "Promotion");


한개를Insert



Promotion ca = new Promotion();
ca.PromotionCode = i.ToString();
ca.Send = true;

MongodbHelper.InsertOneModel(ca, "Promotion");


update


var filter = Builders.Filter.Eq("Name", "0");
var update = Builders.Update.Set("num", list);
count = MongodbHelper.Update(filter, update, "Member");


Delete


long count = 0;
var filter = new BsonDocument(); //Builders.Filter.Eq("Pwd", "1111");
count = MongodbHelper.Delete(filter, "Member");


Find one


var filter = new BsonDocument();
var document = MongodbHelper.FindOne(filter, "Member");


Find


var filter = new BsonDocument();
var document = MongodbHelper.Find(filter, "Member");


Find Sort


var filter = Builders.Filter.Eq("OrderStatus", 0);
var sort = Builders.Sort.Descending("OrderDate");
var collection = MongodbHelper.FindSort(filter, sort, "Order");


Find Paging, 페이징 처리


int rows = 20;
int sidx = ((page - 1) * rows);
var filter = FilterDefinition.Empty;
if (name != "")
{
filter = filter & Builders.Filter.Regex("PromotionCode", new BsonRegularExpression(name, "i"));
}
if (orderid != "")
{
filter = filter & Builders.Filter.Regex("Uid", new BsonRegularExpression(orderid, "i"));
}
if (id != "")
{
filter = filter & Builders.Filter.Regex("Uid", new BsonRegularExpression(id, "i"));
}
var sort = Builders.Sort.Descending("OrderDate");
MongoPagingResult result = MongodbHelper.FindPaging(filter, sort, "Order", sidx, rows);


result.Count 에는 총갯수, result.result 에는 클래스 리스트가 반환된다.


by tomochan | 2016/12/28 10:00 | 트랙백 | 덧글(0)

이니시스 빌링시스템 개발 과정 및 후기.

맨붕이 몇차례 되기도 하며 개발을 미치곤 내 머리속의 메모리는 쓰레기이기에 정리하며 기록을 남깁니다.

일단 .NET으로 개발을 하였고 서버는 카페24 웹호스팅. (그러나 이니시스 모듈 지원)

정기결제를 기반으로 해야만 하는 상황이기에 일반 결제 모듈은 필요가없어지게됨.

처음에는 둘다 비슷하게 속성만 다른줄 알았으나 그게 아니었음.


일단 웹과 모바일 웹 을 진행함. 샘플페이지는 빌링용이 따로 있음. 이는 다운받을 수 없고 요청해야만 줌.

개발환경을 위해 INIpay41.dll 라는 놈을 com+ 등록해야함. assmebly도 마찬가지.
이때 이 dll 이 있는경로에 key라는 폴더에 안에 상점아이디 폴더안에 키파일을 넣어야함.
그리고 log 폴더도생성 해줘야함.


일반 결제는 사용자 입력페이지 -> pg사 모듈 호출 -> 되돌려주는 페이지에서 전문 받고 키파일 이용해 해석해서 OK 남.

그러나 빌링(정기결제)는 그렇지않음.


단계는 아래와 같음.

  • 사용자 이니시스 모듈 띄움( 이때 카드번호 등등 넣고 인증함.) 
  • return Page 로 돌려줌. 
  • 이때 moid 즉 이니시스와 거래한 유일키여기에다가 빌링키를 돌려줌.
  • 이빌링키를 디비에 저장.
  • TX모듈에 빌링키를 태우면 정기결제 됨. (TCP 통신을 한다함)

그러면 추후에 기간에 도래했을때 이 빌링키로 다시 TX모듈을 태우면 결제가 됨.

이게 검색을 해도 구글링도 나오지를 않아 2틀 뻘짓하면서 드디어 머리에 들어옴.

여담 

근대 문제에 봉착. 우리는 웹호스팅을 받고 있음. 정기결제를 탈려면 하루에 한번은 서비스를 돌려서 기간 만료가 되는 시점의 
사용자 결제를 해야하는데 이걸 수동으로 해야하나...윈도우 서비스 하나 만들면 간단한데....흠..

이걸 검색하신 분이라면 기타등등 보다 빌링키 받는 부분, tX부분의 소스가 궁금할거임. 

내가 보여줄게요

빌링키 받는 부분. 
이니시스 샘플소스의 INIStdPayBill 부분의 offerPeriod 부분을 월단위 또는 년 단위로 설정.
INIStdPayReturn 이 페이지는 이니시스에서 결제가 되고 돌려주는 페이지 여기에서 빌링키를 받음.


NameValueCollection parameters = Request.Params;        IEnumerator enumerator = parameters.GetEnumerator();        StringBuilder sb = new StringBuilder("paramMap : ");        while (enumerator.MoveNext())        {            // get the current query parameter            string key = enumerator.Current.ToString();            // insert the parameter into the url            sb.Append(string.Format("{0}={1}&", key, HttpUtility.UrlEncode(parameters[key])));        }        //Console.WriteLine(sb.ToString());        //#####################        // 인증이 성공일 경우만        //#####################        if ("0000".Equals(parameters["resultCode"]))        {            //Response.Write("####인증성공/승인요청####");            //Response.Write("<br/>");            //Console.WriteLine("####인증성공/승인요청####");            //############################################            // 1.전문 필드 값 설정(***가맹점 개발수정***)            //############################################            String mid = parameters.Get("mid");					        // 가맹점 ID 수신 받은 데이터로 설정            String signKey = "cnl4dktVbk5YcnYxeGdOT0JCM0RIZz09";	    // 가맹점에 제공된 키(이니라이트키) (가맹점 수정후 고정) !!!절대!! 전문 데이터로 설정금지            string timeTemp = "" + DateTime.UtcNow.Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds;            string[] artime = timeTemp.Split('.');            String timestamp = artime[0];            String charset = "UTF-8";								    // 리턴형식[UTF-8,EUC-KR](가맹점 수정후 고정)            String format = "JSON";								        // 리턴형식[XML,JSON,NVP](가맹점 수정후 고정)            String authToken = parameters.Get("authToken");			    // 취소 요청 tid에 따라서 유동적(가맹점 수정후 고정)            String authUrl = parameters.Get("authUrl");				    // 승인요청 API url(수신 받은 값으로 설정, 임의 세팅 금지)            String netCancel = parameters.Get("netCancelUrl");			// 망취소 API url(수신 받은 값으로 설정, 임의 세팅 금지)            String mKey = ComputeHash(signKey);	                        // 가맹점 확인을 위한 signKey를 해시값으로 변경 (SHA-256방식 사용)                        //#####################            // 2.signature 생성            //#####################            String signParam = "authToken=" + @authToken + "&timestamp=" + timestamp;            String signature = ComputeHash(signParam);            //#####################            // 3.API 요청 전문 생성            //#####################            System.Collections.Generic.Dictionary<String, String> authMap = new System.Collections.Generic.Dictionary<String, String>();            authMap.Add("mid"           , mid);			            // 필수            authMap.Add("authToken"     , HttpUtility.UrlEncode(authToken));	// 필수 - 반드시 urlencode 해서 전달.            authMap.Add("timestamp"     , timestamp);	            // 필수            authMap.Add("signature"     , signature);	            // 필수                        authMap.Add("charset"       , charset);		            // default=UTF-8            authMap.Add("format"        , format);		            // default=XML            authMap.Add("mkey"          , mKey);		            // default=XML                        //Console.WriteLine("##승인요청 API 요청##");            try            {                //#####################                // 4.API 통신 시작                //#####################                String authResultString = "";                authResultString = processHTTP(authMap, authUrl);                //############################################################                //5.API 통신결과 처리(***가맹점 개발수정***)                //############################################################                //Response.Write("## 승인 API 결과 ##");                String strReplace = authResultString.Replace(",", "&").Replace(":", "=").Replace("\"", "").Replace(" ", "").Replace("\n", "").Replace("}", "").Replace("{", "");                System.Collections.Generic.Dictionary<string, string> resultMap = parseStringToMap(strReplace);         //문자열을 MAP형식으로 파싱                //Response.Write("<pre>");                //Response.Write("<table width='565' border='0' cellspacing='0' cellpadding='0'>");                /*************************  결제보안 추가 START ****************************/ 				Dictionary<String , String> secureMap = new Dictionary<String, String>();				secureMap.Add("mid"			, mid);							//mid				secureMap.Add("tstamp"		, timestamp);					//timestemp				secureMap.Add("MOID"		, resultMap["MOID"]);			//MOID				secureMap.Add("TotPrice"	, resultMap["TotPrice"]);		//TotPrice								// signature 데이터 생성 				String secureSignature = makeSignatureAuth(secureMap);				/*************************  결제보안 추가 END ****************************/                if ("0000".Equals((resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "null")) && secureSignature.Equals(resultMap["authSignature"]))	//결제보안 추가                {                    /*****************************************************************************                    * 여기에 가맹점 내부 DB에 결제 결과를 반영하는 관련 프로그램 코드를 구현한다.  				                         [중요!] 승인내용에 이상이 없음을 확인한 뒤 가맹점 DB에 해당건이 정상처리 되었음을 반영함                              처리중 에러 발생시 망취소를 한다.                    ******************************************************************************/                    System.Collections.Generic.Dictionary<string, string> checkMap = new System.Collections.Generic.Dictionary<string, string>();                    checkMap.Add("mid"          , mid);			// 필수                    checkMap.Add("authToken"    , HttpUtility.UrlEncode(authToken));	// 필수 - 반드시 urlencode 해서 전달.                    checkMap.Add("applDate"     , (resultMap.ContainsKey("applDate") ? resultMap["applDate"] : "null"));		// 필수					                    checkMap.Add("applTime"     , (resultMap.ContainsKey("applTime") ? resultMap["applTime"] : "null"));		// 필수	                    checkMap.Add("timestamp"    , timestamp);	// 필수                    checkMap.Add("signature"    , signature);	// 필수                                checkMap.Add("charset"      , charset);		// default=UTF-8                    checkMap.Add("format"       , format);		// default=XML                    //Response.Write("<tr><th class='line' colspan='2'><p></p></th></tr>");                    paybill = resultMap.ContainsKey("CARD_BillKey") ? resultMap["CARD_BillKey"] : "";                    orderid = resultMap.ContainsKey("MOID") ? resultMap["MOID"] : "";                    result = "S";					new Dac_Cart().OrderBillKey(orderid, paybill);                    //new Dac_Cart().OrderStatusUpdate(resultMap.ContainsKey("MOID") ? resultMap["MOID"] : "", "S");                    //new Dac_Cart().OrderBillKey(resultMap.ContainsKey("MOID") ? resultMap["MOID"] : "", resultMap.ContainsKey("CARD_BillKey") ? resultMap["CARD_BillKey"] : "");                    //Response.Write("<tr><th class='td01'><p>거래 성공 여부</p></th>");                    //Response.Write("<td class='td02'><p>성공</p></td></tr>");                    //Response.Write("<tr><th class='line' colspan='2'><p></p></th></tr>");                    //Response.Write("<tr><th class='td01'><p>결과 코드</p></th>");                    //Response.Write("<td class='td02'><p>" + (resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "null") + "</p></td></tr>");                    //Response.Write("<tr><th class='line' colspan='2'><p></p></th></tr>");                    //Response.Write("<tr><th class='td01'><p>결과 내용</p></th>");                    //Response.Write("<td class='td02'><p>" + (resultMap.ContainsKey("resultMsg") ? resultMap["resultMsg"] : "null") + "</p></td></tr>");                }                else                {                    orderid = resultMap.ContainsKey("MOID") ? resultMap["MOID"] : "";                    result = "F";                                   }            }            catch (Exception ex)            {                BottleShop.OSIO.Log(ex.Message);            }        }        else        {           //알아서        }

일부로  정리안하고 올립니다. CARD_BillKey 이걸 디비에 저장합니다.

그리고 이키를 TX모듈에 태웁니다.

아래와 같아요

/*1. 객체 생성*/ INItx41 INIpay = new INItx41(); /*2. 인스턴스 초기화*/ int intPInst = INIpay.Initialize(""); /*3. 거래 유형 설정*/ INIpay.SetActionType(ref intPInst, "REQREALBILL"); /*4. 정보 설정*/ INIpay.SetField(ref intPInst, "pgid", "INIpayBill");//PG ID(고정) INIpay.SetField(ref intPInst, "spgip", "203.238.3.10");//예비 PG ID(고정) INIpay.SetField(ref intPInst, "uip", "203.238.3.10");//예비 PG ID(고정) INIpay.SetField(ref intPInst, "mid", "bthebottle");//상점 아이디 INIpay.SetField(ref intPInst, "admin", "1111");//키 패스워드 (상점아이디에 따라 변경) INIpay.SetField(ref intPInst, "url", "http://thebottleshop.co.kr");//홈페이지 주소 (URL) INIpay.SetField(ref intPInst, "paymethod", "Card");//지불방법 INIpay.SetField(ref intPInst, "cardquota", "00");//할부기간 (변경시에만 설정) INIpay.SetField(ref intPInst, "price", "20000");//가격 (변경시에만 설정) INIpay.SetField(ref intPInst, "currency", "WON");//화폐단위 (변경시에만 설정) //INIpay.SetField(ref intPInst, "quotainterest", "1");//무이자할부 여부(1:Yes, 0:No) INIpay.SetField(ref intPInst, "billkey", billkey); //BillKey /*01:비인증 (공인인증으로 인증받은 빌키를 이용하는 경우, 비밀번호 + 주민번호 필요없음.) *00:인증 (공인인증서로 인증받지 않은 경우, 비밀번호 + 주민번호 필요) */ INIpay.SetField(ref intPInst, "authentification", "01"); //본인인증 여부 /*5. 빌링 승인 요청*/ INIpay.StartAction(ref intPInst); string resultCode = INIpay.GetResult(ref intPInst, "resultcode"); /*6. 빌링 승인 결과*/ //tid.Text = INIpay.GetResult(ref intPInst, "tid"); //resultCode.Text = INIpay.GetResult(ref intPInst, "resultcode"); //resultMsg.Text = INIpay.GetResult(ref intPInst, "resultmsg"); //AuthCode.Text = INIpay.GetResult(ref intPInst, "authcode"); //PGAuthDate.Text = INIpay.GetResult(ref intPInst, "pgauthdate"); //PGAuthTime.Text = INIpay.GetResult(ref intPInst, "pgauthtime"); /*6. 인스턴스 해제*/ if (resultCode == "00") { result = true; } INIpay.Destroy(ref intPInst);


여기서 주위점  INIpay.Destroy(ref intPInst); 이거 하기전에 디비저장하실려면 하시고 하세요. 결과값같은거
이후에 하시면 안되요./. 이게 가비지로 보내버리는 듯해요


더 궁금하시거나 초보개발자여서 로직을 어떻게 하는지 모르겟어요 등등은 이메일로 댓글은 확인 잘 안해서요.



by tomochan | 2016/11/29 09:39 | 트랙백 | 덧글(1)

오사카 유니버셜 스튜디오 제대로 즐기기

요번 오사카 여행중 유니버셜 스튜디오 여행의 팁입니다.

유니버셜스튜디오는 LA보다는 규모가 작습니다. 2틀은 필요없습니다. 1루면 충분합니다.

저는 개인적으로 입장시간에 입장하여 오후 2시반에 나왔습니다. 충분히 즐기고 말이죠.

그러나 1루에 잼있게 즐기기에는 준비가 필요합니다.

한국에서 입장권을 미리 구매합니다. 

그리고 유니버셜 스튜디오 사이트에가서 익스프레스7 티켓을 구매합니다. 

가격은 입장권보다 조금 비쌉니다. 하지만 이게 있어야 스트레스도 안받고 놀 수 있습니다.

이 티켓은 줄을 안서고 놀이기구들(여기서는 어트랙션이라 합니다.)을 이용  할 수 있습니다.

저같은 경우 드림더라이드(백드롭: 의자가 뒤로 ) 10시에 예약을 했습니다.

해리포터존은 12시 반에 입장 하였구요.


스케줄은 아래와 같습니다.

8시50분 도착 줄을 서서 기다립니다. 9시 40분쯤 입장 했습니다. 

일단 조스로 가서 미리 출력한 익스프레스 티켓을 보여줘 10시에 드림더라이드를 타랴한다하니 저만 태우고 출발.

그 후 드림더라이드 탑승...

그 후에는 정문 기준으로 왼쪽순으로 주욱 보다가 시간에 해리포터 입장하여 구경하고 전부 타고 나왔습니다.
(주라식 파크는 너무 애들 위주인지라 안탔습니다.)

중간중간 구경도 하구요. 

이걸 안하시면 제가 간날에 혼잡도가 30% 였지만.... 해리포터 져니 는 4시간을 기다려야 하더군요.

그리고 음식은 아침을 많이 드시고 안에서는 음료만 드시길 추천합니다.

저의 개인적인 재미순은

드림더라이드(백드롭) > 해리포터저니 > 백투더퓨처 > 터미네이터 > 역류(분노의역류) > 스파이더맨 > 조스 > 스페이스 판타지 더라이드 > 힛뽀구리후 

궁금하신건 문의해주시면 아는 한에서 답해드릴게요.


by tomochan | 2015/12/16 00:12 | Vague think | 트랙백 | 덧글(1)

SMS 자동 보내는 프로그램

요번에 프로젝트를 하면서 Email, Sms 자동 보내는 윈도우 서비스를 개발했다.

일단 이메일의  smtp 서버는 구축을 하였다가 안정성 문제 때문에 mailjet 이라는 훌륭한 외국 업체거를 사용.

가격이 너무 저렴 하여 이걸 선택.

Sms 는 KT에서 제공하는 api 스토어를 이용 (이것도 가장 저렴).

여러개발자가 공유를 해야하니 DB에 테이블 하나만들고 여기에  내용과 보내는 전화번호 또는 이메일 주소를 넣으면 

알아서 메일과 문자가 슈웅 날라가게 만들었고 ..

개발하다 진행하면서 로그도 점점 디테일 하게 남기게되었다.

윈도우 서비스의 실행 유무를 알기 위해 서버에 서비스 상태 프로그램까지 개발 하였다.

결론.

만들기 어렵지 않다. 괜히 비싸게 메일 및 문자 서비스 프로그램 구입할 이유가 없다였습니다.

혹시 개발 하실 의향이 있으신 분들은 aka.tomochan@gmail.com 으로 문의 바래요


by tomochan | 2015/08/24 00:07 | Program | 트랙백 | 덧글(0)

APNS push, Feedback 테스트 프로그램

앱 개발시 또는 테스트를 위하여 push  또는 feedback service를 하여야 할때 쓰시면 됩니다.

내용은 간단합니다.

push

0. sendbox인지 리얼인지 선택합니다.
1. 인증 파일을 선택합니다.(xxx.p12)
2. 푸쉬를 보내실 기계 아이디를 입력해줍니다.(여러개 가능)
3. 보내실 메세지를 입력합니다.
4. 비밀번호를 입력합니다.

feedback service

push같이 동일하게 입력하시고..메세지 부분과 디바이스아이디 입력은 없겠지요..
실행시키면 됩니다.

p.s

본프로그램은 .net framwork 4.0을 필요로하며 윈도우전용입니다.(C#으로 만들었기에)

push.zip

by tomochan | 2012/08/09 13:55 | Program | 트랙백 | 덧글(0)

Jquery Dialog 모달 팝업 타이틀바 사용 하기 안하기.

jquery dialog 기능에는 타이틀 부분이 무조건 보입니다.
이것을 손을 조금 봐서 타이틀 보이고 싶음 보이고 아님 안보이게 할 수 있게 만들었습니다.

일단 jquery ui 파일을 jquery-ui-1.8.11.custom.zip 안의 파일로 바꾸어 줍니다.

<script src="jquery-1.5.1.js" type="text/javascript"></script>
<script src="jquery-ui-1.8.11.custom.js" type="text/javascript"></script>
<link href="css/jquery-ui-1.8.11.custom.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
 function fnModalOpen() {
            $("#divDialog").dialog(
                {
                    modal: true,
                    draggable: false,
                    resizable: false,
                    width: 1000,
                    height: 600,
                    istitle: false,     // 이부분 입니다. true는 title bar 나오게 false는 title bar 안나오게 합니다.
                    show: "slide",
                    hide: "explode"
                }
            );
            }
</script>

by tomochan | 2011/03/24 16:46 | Program | 트랙백(1) | 덧글(0)

동적으로 생성된 컨트롤 jquery로 이벤트 추가하기

요번 프로젝트 때문에 jquery를 쓰게 되었는데...이넘 물건이네..
근대 좀 심각한 오류가 하나 나왔는데 모르겠다..이유를 ㅠㅠ
암튼...
갠적인 관심때문에...
리스트같은걸 뿌리면서 리스트가 5줄이 나오면 10줄로 만들어 원래 보이는 tr과 수정버튼클릭시 보이게될 tr에 textbox를 만들어
데이터를 수정하게 할려고 했다..

그결과 된다....잘읽어 오더라..자바스크립트로 했으면 꾀나 코딩량이 많아질거를 단순화 시켰다...

이런식으로 일단 html의 페이지는 이렇게 구성하였다.

<asp:Repeater runat="server" ID="rpList">
    <ItemTemplate>
    <tr>
        <td class="td3" style="width:30px" align="center"><%#Eval("seq") %></td>
        <td class="td3" style="width:100px" align="center">&nbsp;<span name="sp1"><%#Eval("idate", "{0:yyyy-MM-dd}") %></span></td>
        <td class="td3" style="width:200px">&nbsp;<span name="sp2"><%#Eval("iwhere") %></span></td>
        <td class="td3" style="width:200px">&nbsp;<span name="sp3"><%#Eval("iwho") %></span></td>
        <td class="td3" style="width:200px">&nbsp;<span name="sp4"><%#Eval("iwhat") %></span></td>
        <td class="td3" style="width:150px" align="right">&nbsp;<span name="sp5"><%#Eval("imoney", "{0:#,###0}") %></span></td>
        <td class="td2" style="width:50px" align="center"><input type="button" class="input3" name="btnE" value="Edit" /></td>
    </tr>
    <tr name="tre" style="display:none;">
        <td class="td3" style="width:30px" align="center">
            <input style="display:none;" name="eidx"  type="text" value="<%#Eval("idx") %>" /><%=seq++ %>
        </td>
        <td class="td3" style="width:100px" align="center"><input name="edate" type="text" value="<%#Eval("idate", "{0:yyyy-MM-dd}") %>" /></td>
        <td class="td3" style="width:200px"><input type="text" name="ewhere" value="<%#Eval("iwhere") %>" /></td>
        <td class="td3" style="width:200px"><input type="text" name="ewho" value="<%#Eval("iwho") %>" /></td>
        <td class="td3" style="width:200px"><input type="text" name="ewhat" value="<%#Eval("iwhat") %>" /></td>
        <td class="td2" style="width:150px" align="right"><input type="text" name="emoney" value="<%#Eval("imoney") %>"/></td>
        <td class="td2" style="width:50px" align="center"><input type="button" class="input3" name="btnSA" value="Save" /></td>
    </tr>
    </ItemTemplate>
    </asp:Repeater>

스크립트 부분은

 $(document).ready(function() {

            $("input[name='btnE']").each(function(i) {
                //tr 보이기 안보이기
                $($("input[name='btnE']").get(i)).click(function() {

                    if ($($("input[name='btnE']").get(i)).val() == "Edit") {
                        $($("tr[name='tre']").get(i)).fadeIn("slow");
                        $($("input[name='btnE']").get(i)).val("Close");
                    }
                    else {
                        $($("tr[name='tre']").get(i)).fadeOut("slow");
                        $($("input[name='btnE']").get(i)).val("Edit");
                    }

                });

                //수정저장 버튼 클릭
                $($("input[name='btnSA']").get(i)).click(function() {
                    var url = "list.aspx?";
                    url += "idx=" + $($("input[name='eidx']").get(i)).val();
                    url += "&date=" + $($("input[name='edate']").get(i)).val();
                    url += "&where=" + escape($($("input[name='ewhere']").get(i)).val());
                    url += "&who=" + escape($($("input[name='ewho']").get(i)).val());
                    url += "&what=" + escape($($("input[name='ewhat']").get(i)).val());
                    url += "&how=" + $($("input[name='emoney']").get(i)).val();
                    //alert(url);
                    $("#div1").load(url);

                    $($("span[name='sp1']").get(i)).text($($("input[name='edate']").get(i)).val());
                    $($("span[name='sp2']").get(i)).text($($("input[name='ewhere']").get(i)).val());
                    $($("span[name='sp3']").get(i)).text($($("input[name='ewho']").get(i)).val());
                    $($("span[name='sp4']").get(i)).text($($("input[name='ewhat']").get(i)).val());
                    $($("span[name='sp5']").get(i)).text(commify($($("input[name='emoney']").get(i)).val()));

                    $($("tr[name='tre']").get(i)).fadeOut("slow");
                    $($("input[name='btnE']").get(i)).val("Edit");
                    $("#spT").text(commify(TotalSum()));
                    getDayInterval();
                    evergyMoney();
                });

                $($("input[name='edate']").get(i)).datepicker({
                    inline: true,
                    dateFormat: 'yy-mm-dd'
                });

            });
});

여기서 신경쓸부분은 셀렉트하는 부분이다..각각의 컨트를 속성에  name값을 주어 get()이라는 놈으로 해주면
그넘을 접근할수 있다는거.... !!

by tomochan | 2009/05/01 16:06 | Program | 트랙백 | 덧글(0)

슬롯





슬롯....
이책은 한마디로 카지노에서 벌어지는 주인공의 일이다.
그렇게 대단한 전개가 흐르는 스토리 라인이 있는것도 아니고,
도박에 대한 진지한 이야기를 하지도 않는다.
BUT!
읽으면 빠지더라....몬가 생각을 하게 한다..딱히 한 주제에 대해 생각을 하지는 않지만
끊임없이 생각을 하게 만드는 책이다.

문학상을 탈만하다고 생각이 드는건 그래서일까....

by tomochan | 2009/05/01 16:01 | Book | 트랙백 | 덧글(0)

잘지내나요. 청춘

그림

청춘에 대한 고촬?


이책을 읽게 된 동기는 상당히 단순하다. 인터파크에 메인에 2주동안 올라와있어 궁금해 보게되었다.
3명의 청춘들이 일본 여행을 하면서(상당히 일본에 대한 애착들이 강하다.) 느낀점을 적은 것이다.
청춘들만이 느낄 수 있는 감성들이 잘 나와있는듯하다.

책을 읽다 느끼는 점은..공감이 많이 간다는 것과 사진보다는 글이 더 많았으면....하는 아쉬움이다.
꼭 일본이 아니더라도 여행을 하게 되면서 느끼는 자유와 얽매여 사는 삶에서의 탈피를 통한 자신의 되샘기질...
이러한 느낌들을 자유롭게 형식을 탈피하여 있는 글들을 보며...
나또한 청춘을 잘 보냈나 돌아보게 한다.

나의 20대는 잘보냈는가?
앞으로 남은 나의 기나긴 청춘들은 어떻게 보낼것인가?
잘지내나요 청춘? 나또한 묻고싶다

by tomochan | 2009/04/24 09:58 | Book | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶