'전체'에 해당되는 글 26건

  1. 2009/03/16 Java (J2SE 5.0) and C# Comparison
  2. 2009/03/16 [펌] C# I/O와 네트워킹 by Raffi Krikorian
  3. 2009/03/16 [펌] Free unix timestamp and epoch conversion tool
  4. 2009/02/06 SourceSafe Error 'Cannot find SS.INI for user'
  5. 2009/01/19 [ATA] UX
  6. 2009/01/16 What is false in javascript?
  7. 2008/12/01 apply Style Sheet rules
  8. 2008/11/18 javascript 막코딩으로 flip 효과 시도 (뒤집는 효과)
  9. 2008/11/06 [ATA] 통신 소켓 생각들
  10. 2008/10/30 자바스크립트로 마우스 휠 (mousewheel) 움직임 체크.
  11. 2008/07/02 JSON 2 Table v 1.01 제이슨 데이타를 테이블로 출력합니다
  12. 2008/06/10 input type 변경의 크로스 브라우저 문제 (password)
  13. 2008/05/26 <button> 엘리멘트의 크로스 브라우징 문제 (1)
  14. 2008/05/21 JavaScript 에서 style 속성 구하기
  15. 2008/05/14 JavaScript Eval 함수의 IE에서 사용 주의점
  16. 2008/05/14 JavaScript 배열 변수 메소드 정리
  17. 2008/05/14 User preferences color table v 1.0
  18. 2008/05/14 JPT v 1.0 자바스크립트 코드 포퍼먼스 테스터 (JavaScript code Performance Tester)
  19. 2008/05/14 APC (Alternative PHP Cache) 유저 캐시 리스트 (user cache list) - apc_cache_info()
  20. 2008/05/14 [ATA] APC in php.ini
  21. 2008/05/14 [ATA] 준비물
  22. 2008/05/14 [AJAX] 파일 업로드 프로그레스 모니터(File Upload Progress Monitor) 구현에 관해..
  23. 2008/05/14 apache2 mod_deflate (gzip)
  24. 2008/05/07 createElement 의 사용(IE에서만의 특별한 방법)과 radio button 작동 버그
  25. 2008/05/07 자바스크립트 타입 비교 테이블 + 테이블 작성 스크립트
  26. 2008/05/07 ALTER TABLE 로 테이블명 바꾸기 / 컬럼명 바꾸기
분류없음2009/03/16 17:15

출처 : http://www.harding.edu/USER/fmccown/WWW/java1_5_csharp_comparison.html

Java (J2SE 5.0) and C# Comparison



Java

C#

Comments
// Single line
/* Multiple
    line  */

/** Javadoc documentation comments */
// Single line
/* Multiple
    line  */

/// XML comments on a single line
/** XML comments on multiple lines */
Data Types

Primitive Types
boolean
byte
char
short, int, long
float, double


Reference Types

Object   (superclass of all other classes)
String
arrays, classes, interfaces

Conversions

// int to String
int x = 123;
String y = Integer.toString(x);  // y is "123"

// String to int
y = "456";
x = Integer.parseInt(y);   // x is 456

// double to int
double z = 3.5;
x = (int) z;   // x is 3  (truncates decimal)

Value Types
bool
byte, sbyte
char
short, ushort, int, uint, long, ulong
float, double, decimal
structures, enumerations

Reference Types
object    (superclass of all other classes)
string
arrays, classes, interfaces, delegates

Convertions

// int to string
int x = 123;
String y = x.ToString();  // y is "123"

// string to int
y = "456";
x = int.Parse(y);   // or x = Convert.ToInt32(y);

// double to int
double z = 3.5;
x = (int) z;   // x is 3  (truncates decimal)

Constants
// May be initialized in a constructor
final double PI = 3.14;
const double PI = 3.14;

// Can be set to a const or a variable. May be initialized in a constructor.
readonly int MAX_HEIGHT = 9;

Enumerations

enum Action {Start, Stop, Rewind, Forward};

// Special type of class
enum Status {
  Flunk(50), Pass(70), Excel(90);
  private final int value;
  Status(int value) { this.value = value; }
  public int value() { return value; }
};

Action a = Action.Stop;
if (a != Action.Start)
  System.out.println(a);               // Prints "Stop"

Status s = Status.Pass;
System.out.println(s.value());      // Prints "70"

enum Action {Start, Stop, Rewind, Forward};

enum Status {Flunk = 50, Pass = 70, Excel = 90};

No equivalent.





Action a = Action.Stop;
if (a != Action.Start)
  Console.WriteLine(a);             // Prints "Stop"

Status s = Status.Pass;
Console.WriteLine((int) s);       // Prints "70"

Operators

Comparison
==  <  >  <=  >=  !=

Arithmetic
+  -  *  /
(mod)
/   (integer division if both operands are ints)
Math.Pow(x, y)

Assignment
=  +=  -=  *=  /=   %=   &=  |=  ^=  <<=  >>=  >>>=  ++  --

Bitwise
&  |  ^   ~  <<  >>  >>>

Logical
&&  ||  &  |   !

Note: && and || perform short-circuit logical evaluations

String Concatenation
+

Comparison
==  <  >  <=  >=  !=

Arithmetic
+  -  *  /
(mod)
/   (integer division if both operands are ints)
Math.Pow(x, y)

Assignment
=  +=  -=  *=  /=   %=  &=  |=  ^=  <<=  >>=  ++  --

Bitwise
&  |  ^   ~  <<  >>

Logical
&&  ||   !

Note: && and || perform short-circuit logical evaluations, no & and | equivalents

String Concatenation
+

Choices

greeting = age < 20 ? "What's up?" : "Hello";

if (x < y)
  System.out.println("greater");

if (x != 100) {   
  x *= 5;
  y *= 2;
}
else
  z *= 6;

int selection = 2;
switch (selection) {     // Must be byte, short, int, char, or enum
  case 1: x++;            // Falls through to next case if no break
  case 2: y++;   break;
  case 3: z++;   break;
  default: other++;
}

greeting = age < 20 ? "What's up?" : "Hello";

if (x < y) 
  Console.WriteLine("greater");

if (x != 100) {   
  x *= 5;
  y *= 2;
}
else
  z *= 6;

string color = "red";
switch (color) {                          // Can be any predefined type
  case "red":    r++;    break;       // break is mandatory; no fall-through
  case "blue":   b++;   break;
  case "green": g++;   break;
  default: other++;     break;       // break necessary on default
}

Loops

while (i < 10)
  i++;

for (i = 2; i <= 10; i += 2)
  System.out.println(i);

do
  i++;
while (i < 10);

for (int i : numArray)  // foreach construct 
  sum += i;

// for loop can be used to iterate through any Collection
import java.util.ArrayList;
ArrayList<Object> list = new ArrayList<Object>();
list.add(10);    // boxing converts to instance of Integer
list.add("Bisons");
list.add(2.3);    // boxing converts to instance of Double

for (Object o : list)
  System.out.println(o);

while (i < 10)
  i++;

for (i = 2; i <= 10; i += 2)
  Console.WriteLine(i);

do
  i++;
while (i < 10);

foreach (int i in numArray) 
  sum += i;

// foreach can be used to iterate through any collection 
using System.Collections;
ArrayList list = new ArrayList();
list.Add(10);
list.Add("Bisons");
list.Add(2.3);

foreach (Object o in list)
  Console.WriteLine(o);

Arrays

int nums[] = {1, 2, 3};   or   int[] nums = {1, 2, 3};
for (int i = 0; i < nums.length; i++)
  System.out.println(nums[i]);

String names[] = new String[5];
names[0] = "David";

float twoD[][] = new float[rows][cols];
twoD[2][0] = 4.5;

int[][] jagged = new int[5][];
jagged[0] = new int[5];
jagged[1] = new int[2];
jagged[2] = new int[3];
jagged[0][4] = 5;

int[] nums = {1, 2, 3};
for (int i = 0; i < nums.Length; i++)
  Console.WriteLine(nums[i]);

string[] names = new string[5];
names[0] = "David";

float[,] twoD = new float[rows, cols];
twoD[2,0] = 4.5f;

int[][] jagged = new int[3][] {
    new int[5], new int[2], new int[3] };
jagged[0][4] = 5;

Functions
// Return single value
int Add(int x, int y) {
   return x + y;
}

int sum = Add(2, 3);

// Return no value
void PrintSum(int x, int y) {
   System.out.println(x + y);
}

PrintSum(2, 3);

// Primitive types and references are always passed by value
void TestFunc(int x, Point p) {
   x++;
   p.x++;       // Modifying property of the object
   p = null;    // Remove local reference to object
}

class Point {
   public int x, y;
}

Point p = new Point();
p.x = 2;
int a = 1;
TestFunc(a, p);
System.out.println(a + " " + p.x + " " + (p == null) );  // 1 3 false




// Accept variable number of arguments
int Sum(int ... nums) {
  int sum = 0;
  for (int i : nums)
    sum += i;
  return sum;
}

int total = Sum(4, 3, 2, 1);   // returns 10

// Return single value
int Add(int x, int y) {
   return x + y;
}

int sum = Add(2, 3);

// Return no value
void PrintSum(int x, int y) {
   Console.WriteLine(x + y);
}

PrintSum(2, 3);

// Pass by value (default), in/out-reference (ref), and out-reference (out)
void TestFunc(int x, ref int y, out int z, Point p1, ref Point p2) {
   x++;  y++;  z = 5;
   p1.x++;       // Modifying property of the object     
   p1 = null;    // Remove local reference to object
   p2 = null;   // Free the object
}

class Point {
   public int x, y;
}

Point p1 = new Point();
Point p2 = new Point();
p1.x = 2;
int a = 1, b = 1, c;   // Output param doesn't need initializing
TestFunc(a, ref b, out c, p1, ref p2);
Console.WriteLine("{0} {1} {2} {3} {4}",
   a, b, c, p1.x, p2 == null);   // 1 2 5 3 True

// Accept variable number of arguments
int Sum(params int[] nums) {
  int sum = 0;
  foreach (int i in nums)
    sum += i;
  return sum;
}

int total = Sum(4, 3, 2, 1);   // returns 10

Strings

// String concatenation
String school = "Harding ";
school = school + "University";   // school is "Harding University"

// String comparison
String mascot = "Bisons";
if (mascot == "Bisons")    // Not the correct way to do string comparisons
if (mascot.equals("Bisons"))   // true
if (mascot.equalsIgnoreCase("BISONS"))   // true
if (mascot.compareTo("Bisons") == 0)   // true

System.out.println(mascot.substring(2, 5));   // Prints "son"

// My birthday: Oct 12, 1973
java.util.Calendar c = new java.util.GregorianCalendar(1973, 10, 12);
String s = String.format("My birthday: %1$tb %1$te, %1$tY", c);

// Mutable string
StringBuffer buffer = new StringBuffer("two ");
buffer.append("three ");
buffer.insert(0, "one ");
buffer.replace(4, 7, "TWO");
System.out.println(buffer);     // Prints "one TWO three"

// String concatenation
string school = "Harding ";
school = school + "University";   // school is "Harding University"

// String comparison
string mascot = "Bisons";
if (mascot == "Bisons")    // true
if (mascot.Equals("Bisons"))   // true
if (mascot.ToUpper().Equals("BISONS"))   // true
if (mascot.CompareTo("Bisons") == 0)    // true

Console.WriteLine(mascot.Substring(2, 3));    // Prints "son"

// My birthday: Oct 12, 1973
DateTime dt = new DateTime(1973, 10, 12);
string s = "My birthday: " + dt.ToString("MMM dd, yyyy");

// Mutable string
System.Text.StringBuilder buffer = new System.Text.StringBuilder("two ");
buffer.Append("three ");
buffer.Insert(0, "one ");
buffer.Replace("two", "TWO");
Console.WriteLine(buffer);     // Prints "one TWO three"

Exception Handling

// Must be in a method that is declared to throw this exception
Exception ex = new Exception("Something is really wrong.");
throw ex;  

try {
  y = 0;
  x = 10 / y;
} catch (Exception ex) {
  System.out.println(ex.getMessage());
} finally {
  // Code that always gets executed
}

Exception up = new Exception("Something is really wrong.");
throw up;  // ha ha


try
{
  y = 0;
  x = 10 / y;
} catch (Exception ex) {      // Variable "ex" is optional
  Console.WriteLine(ex.Message);
} finally {
  // Code that always gets executed
}

Namespaces

package harding.compsci.graphics;












import
harding.compsci.graphics.Rectangle;  // Import single class

import harding.compsci.graphics.*;   // Import all classes

namespace Harding.Compsci.Graphics {
  ...
}

or

namespace Harding {
  namespace Compsci {
    namespace Graphics {
      ...
    }
  }
}

// Import all class. Can't import single class.
using Harding.Compsci.Graphics;

Classes / Interfaces

Accessibility keywords
public
private
protected
static



// Inheritance
class FootballGame extends Competition {
  ...
}

// Interface definition
interface IAlarmClock {
  ...
}

// Extending an interface
interface IAlarmClock extends IClock {
  ...
}

// Interface implementation
class WristWatch implements IAlarmClock, ITimer {
   ...
}

Accessibility keywords
public
private
internal
protected
protected internal
static

// Inheritance
class FootballGame : Competition {
  ...
}

// Interface definition
interface IAlarmClock {
  ...
}

// Extending an interface
interface IAlarmClock : IClock {
  ...
}

// Interface implementation
class WristWatch : IAlarmClock, ITimer {
   ...
}

Constructors / Destructors

class SuperHero {
  private int mPowerLevel;

  public SuperHero() {
    mPowerLevel = 0;
  }

  public SuperHero(int powerLevel) {
    this.mPowerLevel= powerLevel;
  }

  // No destructors, just override the finalize method
  protected void finalize() throws Throwable {
    super.finalize();   // Always call parent's finalizer  
  }
}

class SuperHero {
  private int mPowerLevel;

  public SuperHero() {
     mPowerLevel = 0;
  }

  public SuperHero(int powerLevel) {
    this.mPowerLevel= powerLevel;
  }

  ~SuperHero() {
    // Destructor code to free unmanaged resources.
    // Implicitly creates a Finalize method.

  }
}

Objects

SuperHero hero = new SuperHero();

hero.setName("SpamMan");
hero.setPowerLevel(3);

hero.Defend("Laura Jones");
SuperHero.Rest();  // Calling static method

SuperHero hero2 = hero;   // Both refer to same object
hero2.setName("WormWoman");
System.out.println(hero.getName());  // Prints WormWoman

hero = null;   // Free the object

if (hero == null)
  hero = new SuperHero();

Object obj = new SuperHero();
System.out.println("object's type: " + obj.getClass().toString());
if (obj instanceof SuperHero)
  System.out.println("Is a SuperHero object.");

SuperHero hero = new SuperHero();

hero.Name = "SpamMan";
hero.PowerLevel = 3;

hero.Defend("Laura Jones");
SuperHero.Rest();   // Calling static method

SuperHero hero2 = hero;   // Both refer to same object
hero2.Name = "WormWoman";
Console.WriteLine(hero.Name);   // Prints WormWoman

hero = null ;   // Free the object

if (hero == null)
  hero = new SuperHero();

Object obj = new SuperHero();
Console.WriteLine("object's type: " + obj.GetType().ToString());
if (obj is SuperHero)
  Console.WriteLine("Is a SuperHero object.");

Properties

private int mSize;

public int getSize() { return mSize; }
public void setSize(int value) {
  if (value < 0)
    mSize = 0;
  else
    mSize = value;
}


int s = shoe.getSize();
shoe.setSize(s+1);

private int mSize;

public int Size {
  get { return mSize; }
  set {
    if (value < 0)
      mSize = 0;
    else
      mSize = value;
  }
}

shoe.Size++;

Structs



No structs in Java.

struct StudentRecord {
  public string name;
  public float gpa;

  public StudentRecord(string name, float gpa) {
    this.name = name;
    this.gpa = gpa;
  }
}

StudentRecord stu = new StudentRecord("Bob", 3.5f);
StudentRecord stu2 = stu;  

stu2.name = "Sue";
Console.WriteLine(stu.name);    // Prints "Bob"
Console.WriteLine(stu2.name);   // Prints "Sue"
Console I/O
java.io.DataInput in = new java.io.DataInputStream(System.in);
System.out.print("What is your name? ");
String name = in.readLine();
System.out.print("How old are you? ");
int age = Integer.parseInt(in.readLine());
System.out.println(name + " is " + age + " years old.");


int c = System.in.read();   // Read single char
System.out.println(c);      // Prints 65 if user enters "A"

// The studio costs $499.00 for 3 months.
System.out.printf("The %s costs $%.2f for %d months.%n", "studio", 499.0, 3);

// Today is 06/25/04
System.out.printf("Today is %tD%n", new java.util.Date());

Console.Write("What's your name? ");
string name = Console.ReadLine();
Console.Write("How old are you? ");
int age = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("{0} is {1} years old.", name, age);
// or
Console.WriteLine(name + " is " + age + " years old.");

int c = Console.Read();  // Read single char
Console.WriteLine(c);    // Prints 65 if user enters "A"

// The studio costs $499.00 for 3 months.
Console.WriteLine("The {0} costs {1:C} for {2} months.\n", "studio", 499.0, 3);

// Today is 06/25/2004
Console.WriteLine("Today is " + DateTime.Now.ToShortDateString());

File I/O

import java.io.*;

// Character stream writing
FileWriter writer = new FileWriter("c:\\myfile.txt");
writer.write("Out to file.");
writer.close();

// Character stream reading
FileReader reader = new FileReader("c:\\myfile.txt");
BufferedReader br = new BufferedReader(reader);
String line = br.readLine();
while (line != null) {
  System.out.println(line);
  line = br.readLine();
}
reader.close();

// Binary stream writing
FileOutputStream out = new FileOutputStream("c:\\myfile.dat");
out.write("Text data".getBytes());
out.write(123);
out.close();

// Binary stream reading
FileInputStream in = new FileInputStream("c:\\myfile.dat");
byte buff[] = new byte[9];
in.read(buff, 0, 9);   // Read first 9 bytes into buff
String s = new String(buff);
int num = in.read();   // Next is 123
in.close();

using System.IO;

// Character stream writing
StreamWriter writer = File.CreateText("c:\\myfile.txt");
writer.WriteLine("Out to file.");
writer.Close();

// Character stream reading
StreamReader reader = File.OpenText("c:\\myfile.txt");
string line = reader.ReadLine();
while (line != null) {
  Console.WriteLine(line);
  line = reader.ReadLine();
}
reader.Close();


// Binary stream writing

BinaryWriter out = new BinaryWriter(File.OpenWrite("c:\\myfile.dat"));
out.Write("Text data");
out.Write(123);
out.Close();

// Binary stream reading
BinaryReader in = new BinaryReader(File.OpenRead("c:\\myfile.dat"));
string s = in.ReadString();
int num = in.ReadInt32();
in.Close();

 

Posted by 아즈키
분류없음2009/03/16 11:04
by Raffi Krikorian, 역 한빛리포터 2기 신동섭 자바가 프로그래밍 언어로 유명해진 이유는 입력/출력과 네트워킹 동작을 행함에 있어 자바가 지니고 있는 편리성 때문이다. 자바는 C#과 같은 맥락을 가지고 있으며 복잡함에 대해 신경쓰지 않아도 되는 라이브러리를 제공한다. 이 시리즈 중 앞의 두 기사에서는 자바 프로그래머가 간단한 C# 프로그램을 구축하기 위해 알아야 하는 언어 구조의 다른점을 중점적으로 다루었다. 이번 기사는 이러한 라이브러리들의 공통적 사용패턴을 따라 I/O와 네트워킹을 다루는 몇몇 C# 네임스페이스에 중점을 두고 작성할 예정이다. 스트림의 이해 자바와 C#에서 스트림이란 보통 콘솔로부터 콘솔까지, 파일시스템에서 파일시스템까지, 네트워크에서 네트워크까지 바이트를 읽고 쓰는 것을 포함한다. 두 언어 모두에서 스트림 패러다임은 하나의 프로그램을 바이트 그룹으로 동작하거나 이동할 필요가 있을 때 더 일반적으로 사용된다. 자바는 두 개의 추상 클래스인 java.io.InputStreamjava.io.OutputStream을 제공한다. 이 클래스는 프로그램이 이러한 두 스트림 서브 타입으로부터 읽고 쓸 수 있게 인증될 필요가 있는 구현되지 않은 메소드를 포함하고 있다. 반면, C#은 이러한 두 개의 클래스를 System.IO.Stream 하나로 통합한다. 하나는 읽기를 하고 하나는 쓰기를 하는 객체 두 개 대신에 C# 스트림 객체는 CanReadCanWrite 프로퍼티를 그 능력을 검증받을 필요가 있다. 동기 I/O 동기 I/O는 두 언어에 있어서 문법적으로 아주 비슷하다. C# System.IO.Stream와 함께 자바 java.io.InputStreamjava.io.OutputStream은 바이트 배열로 동작하는 메소드와 함께 한 번에 1 바이트를 동작하는 메소드를 가진다. (C#은 전체 배열에 대한 운영 문법이 필요하다. C#은 대신에 offset/length 쌍으로 배열을 사용하는 방법만 알고있다.)
기능 자바 C#
1 바이트를 읽어라 java.io.InputStream에 있는 read() 메소드 System.IO.Stream에 있는 ReadByte() 메소드
전체 바이트 배열을 읽어라 java.io.InputStream에 있는 read( byte[] b ) 메소드 그러한 구문적 메소드 없음 - offset/count 쌍을 가진 읽기 메소드를 사용할 것
바이트 배열의 일부분으로 읽어라. java.io.InputStream에 있는 read( byte[] b, int off, int len ) 메소드 System.IO.Stream에 있는 Read( byte[] buffer, int offset, int length ) 메소드
1 바이트를 작성해라. java.io.OutputStream에 있는 write( int b ) 메소드 System.IO.Stream에 있는 WriteByte( byte value ) 메소드
전체 바이트 arrayjava.io.OutputStream을 작성해라 write( byte[] b ) 메소드 특정 메소드 없음 - offset/count 쌍을 요청하는 메소드를 사용할 것
바이트 배열의 일부분을 작성해라 java.io.OutputStream에 있는 write( byte[] b, int off, int len ) 메소드 System.IO.Stream에 있는 Write( byte[] buffer, int offset, int length ) 메소드
[표 1] 자바와 C#에서 동기 I/O 메소드 동시에 스트림하도록 일하기 원할 때 사용하는 메소드들 자바 프로그래머들을 위한 조언 중 하나는 IOException을 포착하는 것을 잊지 말라는 것이다. 자바와는 달리 C# 컴파일러는 컴파일 할 때 예외(exceptions)를 강요하지 않기 때문이다. 비동기 I/O 자바는 I/O 동작을 공식적으로 비동기로 수행하는 방법이 부족하다. 스트림에 발생하는 읽기 또는 쓰기 야기시킨 후 그 결과를 나중에 점검하는 '내장' 방법이 없다. 자바에서 가장 근접한 시뮬레이션은 동기 메소드 주위에 java.lang.Thread를 생성하는 것이며 콜백을 실행하거나 부작용을 일으키는 스레드를 가지고 있거나 I/O 동작상태에 있을 수도 있다. C#은 그 라이브러리에 내장된 비동기 I/O 메소드를 가지고 있다. 예를 들어 자바에서 비동기 read(byte[] b) 호출을 실행하기 위해 콜백 또는 이후에 점검될 수 있는 상태 모두에서 할 수 있는 구현은 아래와 같다.
// variables to hold the side effects of the read
int read; // to hold the result of the read
IOException exception; // to hold a possible exception
Object wait  ... 
     // some value to block on until the end of the = call

// a wrap around a read on the InputStream variable "is"
( new Thread( new Runnable() {
  public void run() {
    try {
      read  is.read();

    } catch( IOException error ) {
      exception  error;

    } finally {
      synchronized( wait ) {
        // wake up all other threads waiting on this
        // read
        wait.notifyAll();

        }

      // call a callback method
      callback();

      }

    }

} ) ).start();
이것은 '읽기'와 '예외'에 각각 저장된 것에 읽기 값 또는 읽을 때 포착되는 예외를 발생시킬 것이다. 다른 스레드는 변수 'wait'를 수반하거나 비동기 읽기가 완성될 때를 알기 위해 'callback' 메소드를 구현할 수도 있다. 이것을 정리함에 있어 C#은 위에서 언급한 모든 기능을 포함하는 BeginReadEndRead 메소드를 제공한다. AsyncCallback과 상태 객체인 두 개 이상의 변수를 가지는 것을 제외하고 BeginReadRead의 서명은 비슷하며 BeginRead의 서명은 나중에 비동기 읽기의 과정을 점검하는데 사용하는 IasyncResult 객체를 환원한다. BeginRead의 표준사용은 아래와 같다.
IAsyncResult iar sbs.BeginRead( buffer, 0, 1, new AsyncCallback( = callback ), null );
아래와 같이 보이는 callback 메소드
public void callback( IAsyncResult iar )
실제로 몇 바이트를 읽었는지 알아 보기위해 EndRead 메소드 호출은 IAsyncResult 오브젝트로 호출될 수 있다. EndRead를 호출하는 것은 BeginRead이 완성될때까지 블록킹 할 것이라는 것을 경고받는다. 블록킹 없는 읽기상태를 발견하기 위해 IasyncResult 환원에 대한 IsCompleted 프로퍼티가 리턴되는지 점검해라. 또한 buffer 변수의 내용이 비동기식 읽기가 완성될 때까지 보장되지 않는다는 것에 주목해야 한다. 스트림 구현 자바와 C# 스트림은 여러분이 자바 스트림에 대해 알고있는 것처럼 C# 스트림 구현이 그렇게 어렵지 않기 때문에 거의 비슷하다고 볼 수 있다. 이 두 가지를 구현하는데 있어 주요한 차이점은 적절한 읽기, 쓰기 메소드가 구현되어야 하는 것 외에도 C# 스트림 클래스는 읽기 또는 쓰기 두 가지 모두가 가능하기 때문에 성능 프로퍼티는 스트림이 할 수 있는 것을 정확하게 반영해야 한다는 것이다.
기능 자바 C#
읽기 java.io.InputStream에 있는 read() 메소드 System.IO.Stream에 있는 ReadByte() 메소드
검색 java.io.InputStream에 있는 메소드를 생락하고 파일 내로 향하는 필요한 연산을 수행하고, markSupported, mark 및 스트림으로 되돌아가는 reset 메소드를 구현 이 스트림이 Seek 메소드를 검색하고 구현할 수 있는지 프로그램을 보고하기 위해 System.IO.Stream에 있는 CanSeek 프로퍼티를 사용해라.
쓰기 java.io.OutputStream에 있는 write 메소드 구현 (다시 한 번, 최적화 하기위해 OutputStream에 있는 다른 write 메소드들이 제작될 수 있음) CanWrite라고 명명된 System.IO.Stream 프로퍼티로부터 참값을 환원해라. 그리고 최소한 Write, WriteByte, BeginWrite/EndWrite 메소드 중에 하나를 써라.
[표 2] 자바와 C#에서 스트림 구현하기 대응하는 스트림 클래스에서 구현될 필요가 있는 메소드 리스트 C# 스트림 클래스는 기능 구현을 위한 메소드에 관련된 많은 옵션을 제공한다. 모든 메소드의 기본 구현이 다른 메소드를 사용할 수 있는 것처럼 ReadWrite(두 가지 모두 바이트 배열, 오프셋과 길이를 차지함)를 오버라이딩 하는 것은 일반적으로 충분하다. 단순하게 읽기/쓰기 메소드 중 최소한 하나만이라도 오버라이딩 하는 것은 전체 스트림에 요구되는 기능을 추가해 줄 것이다. ReadByteWriteByte의 기본 구현은 롱 값을 바이트 배열로 바꿀 것이다. 반면에 비동기 BeginReadBeginWrite 메소드 기본 구현은 분할된 스레드로 ReadWrite를 실행할 것이다. 읽기와 쓰기 이 기사의 대부분은 C#에서 System.IO.Stream 클래스와 관련된 사항에 많은 시간을 할애했다. 그렇지만 가끔씩 System.IO.TextReaderSystem.IO.TextWriter에 대한 사항에 대해서도 생각해 볼 필요가 있다. 이 두 클래스는 다른 클래스 타입이 쓰기를 다루고 있는 동안 또다른 클래스 타입은 읽기를 하는 자바 I/O 모델과 아주 흡사하다. 그런 점에서 C# 스트림 객체는 바이트를 동시에 읽고 쓰는 방법에 대한 지식을 캡슐화 하고 TextReaderTextWriter 클래스는 읽기와 쓰기 특성을 각각 캡슐화한다. 위의 두 가지로부터 나온 가장 일반적으로 사용되는 클래스는 System.IO.StreamReaderSystem.IO.StreamWriter 클래스로서 이들 두 클래스는 Stream 객체를 취할 수 있으며 선택사항으로 바이트 스트림을 문자 스트림(C#은 기본으로 UTF-8 인코더/디코더를 사용)으로 바꾸는 방법을 명세하는 System.Text.Encoding 객체를 취할 수 있다. 만약 스트림과 유사한 기능으로 접근하는 것이 요구되고, 바이트로 동작하는 것 대신 문자 사용을 위해 프로그래밍을 하고 있다면 스트림 클래스의 미묘한 차이를 다루는 것보다 TextReaderTextWriter 클래스의 서브 클래스를 구현하는 것이 더 쉬울 수도 있다. 만약 스트림이 적절히 구현되었다고 할지라도, 여러분은 커스텀 스트림을 랩핑(Wrapping)하기 위해 StreamReaderStreamWriter 클래스를 사용해야 한다. 파일시스템 I/O 자바에서 디스크 작동 실행은 아주 간단하다. 그것은 java.io.FileInputStream이나 java.io.FileOutputStream 둘 중 하나를 사용하고 java.io.File 객체를 조작하는 것과 관련된 것이다. 이 전에서부터 많이 언급해왔던 것처럼 C#은 자바와 거의 비슷하지만 미묘한 차이가 있다. 자바에서처럼, C# 파일 객체는 파일 시스템 하에서 확고한 관계를 형성하지 않는다. 존재하지 않는 파일을 위해 파일 객체를 생성할 수 있으며 존재하는 파일을 위해 파일 객체를 생성해 파일을 열려고 할 때까지 C# 프로그램도 모르게 CLR하에서 그 파일을 이동시킬 수도 있다. 자바와 달리 파일 객체는 파일시스템으로 스트림을 환원해줄 AppendText 또는 CreateText와 같은 정적 메소드를 가지는 것만큼 훨씬 더 중요한 역할을 수행할 수 있다. 자바에서는 FileInputStream을 위한 생성자는 똑같은 기능을 얻기 위해 사용되어야 한다. 자바에서 쓰기를 위한 새로운 파일을 생성하기 위해서는 FileInputStream을 사용해야 한다.
FileOutputStream fos new FileOutputStream( "brand-new-file.txt" =);
fos.write( ... )
그렇지만 C#에서는

Stream s File.Create( "brand-new-file.txt" );
또는

StreamWriter sw File.CreateText( "brand-new-file.txt" );
을 새 파일을 얻기 위해 Stream 또는 StreamWriter 을 허락한다. (FileOutputStream의 생성자 중 하나로 'append' 불린을 설정함에 따라 자바에서는 appending이 수행됨) C#은 OpenWriteOpenText라고 이름 붙여진 정적 메소드를 가지는 반면 자바는 java.io.FileInputStream를 사용하는 파일로부터 읽기를 허락한다. 마지막으로 C#은 Open 메소드에 더욱 세심한 컨트롤을 제공하며 이 메소드는 파일 퍼미션과 접근 내용을 설정할 수 있는 능력을 보여준다.
기능 자바 C#
쓰기 위한 새로운 파일 생성 java.io.FileOutputStream 사용 정적 File.Create 메소드나 정적 CreateText 사용 또는 인스턴스 CreateText 메소드 사용
기존 파일에 쓰기 java.io.FileOutputStream 사용 정적 또는 인스턴스 OpenWrite 메소드 사용
파일에 텍스트 추가하기 java.io.FileOutputStream 사용 그러나 append 매개변수를 차지하는 생성자를 사용해야 함. 정적 또는 인스턴스 AppendText 메소드 사용
파일로부터 텍스트 제거하기 java.io.FileInputStream 사용 정적 또는 인스턴스 OpenRead, OpenText 메소드 사용
[표 3] 읽기와 쓰기를 위한 파일 조작 자바와 C# 모두에서 파일로부터 쓰거나 읽기 위해 사용하는 메소드 호기심을 위해 언급할 가치가 충분한 C#이 가져온 또다른 향상점은 File.Copy 메소드의 추가라고 말할 수 있다. 파일 시스템 I/O를 사용했던 대부분의 자바 프로그래머들은 파일을 적절하게 옮기는 능력이 부족했다. Java.io.File에는 파일이름을 다시 정의할 수 있는 renameTo 메소드를 포함하고 있지만 파일시스템 경계(디스크, 네트워크 등등)에서는 실행되지 않는다. 대개의 경우 프로그래머는 자신의 이동 명령어를 구현해야만 했다. 이동 명령어는 java.io.FileInputStreamjava.io.FileOutputStream 모두를 사용해 파일을 복사하고 원본 파일을 지운다. File.Move 명령어 역시 볼륨(Volumes)과 파일시스템 경계에서는 실행되지 않는다고 하더라도 Copy 메소드의 C# 산물은 작은 파일들을 옮긴다. C# 파일-시스템 구현은 자바 모델이 대처해야만 하는 범용 플렛폼을 다룰 필요는 없다. Java.io.File.pathSeparatorjava.io.File.separator과 일치하는 변수는 없다. 불행하게도 이것은 또한 java.io.File 생성자중 호의적인 public File( File parent, String child )이 존재하지 않는다는 것을 의미한다. 그 대신 C# 프로그래머는
File parent  ...
File child  new File( parent.FullName + "\" + childName );
와 함께 새로운 System.IO.File 객체를 생성하는 문제가 남는다. 네트워크 이해하기 두 가지 프로그래밍 언어(C#, Java) 모두는 기본레벨 소켓 구현에 있어 몇 가지 추상적 계층을 제공한다(당연히 자바의 java.net.Socket 클래스는 C#의 System.Net.Sockets.Socket 클래스보다 더 추상적임).
Tier 자바 C#
응답/요청 java.net.URLjava.net.URLConnection System.Net.WebRequest
프로토콜 TCP/IP를 위한 java.net.Socketjava.net.ServerSocket; UDP를 위한 java.net.DatagramSocketjava.net.MulticastSocket TCP/IP를 위한 System.Net.Sockets.TCPListenerSystem.Net.Sockets.TCPClient ; System.Net.Sockets.UDPClient
원래 소켓 없음 System.Net.Sockets.Socket
[표 4] 자바와 C#에서 네트워크 아키텍처 계층 자바와 C# 모두 인터페이스의 다른 점에 영향을 주도록 허락하는 네트워크를 위한 서로 다른 추상 층을 갖고 있다. 응답/요구 계층은 한쪽 끝에서 연결을 초기화하고 스트림으로 바이트를 보낸다. 그리고 응답으로 바이트 집합을 기다리는 동안 블록킹하는 HTTP 형태의 요구를 위해 사용될 수 있다. 좀더 유연한 스트림 작동을 위해 프로토콜 계층은 아주 유용하다(우리는 아래에서 TCP/IP 동작을 커버할 것이다). 대부분 자바 프로그래머들은 네트워크 작동을 최적화하지 않는다면 정확한 소켓 콘트롤을 요구하지는 않는다. C#은 만약 필요하다면 원래의 버클리 소켓을 제어할 수 있는 능력을 제공한다. 응답/요구 계층 이 계층은 모든 네트워킹을 제거하고 앞뒤로 데이터를 이동할 수 있도록 스트림 같은 인터페이스를 제공한다. 자바는 HTTP URL을 가질것이고 아래와 같은 코드를 실행함으로써 간단히 GET을 실행할 것이다.
URL url  new URL( "http://to.post.to.com" );
URLConnection urlConnection  url.openConnection();
InputStream input  urlConnection.getInputStream();
... read stuff from input ...
input.close();
C#은 System.Net.WebRequest 객체로 이 코드를 모방한다:

WebRequest request WebRequestFactory.Create( = "http://to.post.to.com" );
Stream input request.GetResponse().GetResponseStream();
... read stuff from input ...
input.Close();
이러한 두 가지 구현은 기본적인 소켓 생성과 HTTP protocol 요구를 숨길 것이며 프로그래머가 데이터를 싣고 받는데 사용할 수 있는 스트림을 제공할 것이다. C# 스트림 클래스처럼, WebRequest 클래스는 읽기 위한 WebResponse 객체 또는 쓰기 위한 요구 스트림을 비동기적으로 얻기 위한 메소드를 가진다. 프로토콜 계층 System.Net.Sockets.TCPClient 클래스는 java.net.Socket에 친숙한 자바 프로그래머들에게 더 친숙해 보여야 한다. 왜냐하면 이 두 가지는 거의 똑같기 때문이다. 사용되는 리턴 스트림 대신에 프로그래머가 소켓 구현을 다룰 필요가 없는 것처럼 둘 다 아주 비슷한 API 및 비슷한 기능을 공유한다. 간단한 텔넷 클라이언트 구현은 간단히 아래의 코드를 사용함으로써 자바에서 조합될 수 있다:
Socket telnet  new Socket( "telnet.host.com", 23 );
OutputStream output  telnet.getOutputStream();
InputStream input  telnet.getInputStream();
그리고 위의 두 스트림도 telnet.host.com에 텔넷에 결합하는데 사용될 수 있다. C#으로도 거의 같은 형태로 똑같은 프로그램을 쓸 수 있다.
TCPClient telnet  new TCPClient( "telnet.host.com", 23 );
Stream telnetStream  telnet.GetStream();
StreamWriter output  new StreamWriter( telnetStream );
StreamReader input  new StreamReader( telnetStream );
또한, 자바로 들어오는 소켓을 설정하고 아래 코드를 사용하여 받는 것처럼 TCP/IP 연결을 받는 것은 두 언어에 있어 아주 비슷하다.
ServerSocket server  new ServerSocket( 23 );
Socket accept  server.accept();
반면에 C#은 아래와 같은 코드를 사용한다.
TCPListener server  new TCPListener( 23 );
server.Start();
Socket accept  server.Accept();
두 언어에서 인정되는 각각의 소켓은 따로 다루어져야 한다. 자바에서 선호하는 방법(java 1.4까지)은 받는 개개의 소켓을 위한 스레드를 생성하는 것이었다. 똑같은 것이 C# 소켓에서도 사용될 수 있다. 그러나 소켓 클래스는 'select' 메소드로 이벤트 구동 인터페이스를 사용하는 능력을 제공한다. (이벤트 구동 모델에서 소켓 프로그래밍은 이 기사의 범주를 벗어나는 것이므로 다루지 않겠다.) Raw 소켓 계층 이제 우리는 대부분의 자바 프로그래머에게 익숙하지 않은 영역으로의 모험을 시작할 것이다. 자바만 사용하는 프로그래머들은 버클리 소켓 구현에 대해 알 필요가 없었다. 왜냐하면 버클리 소켓 구현은 java.net.Socket java.net.DatagramSocket 클 래스에 의해 추출되기 때문이었다. 이 버클리 소켓 클래스를 적절하게 조작함으로써 눈에 익은 자바 기능의 스트림을 성취할 수 있다. 지금까지 우리는 자바(I/O와 네트워킹을 수행할 수 있는 능력)로부터 가장 강력한 추상개념을 포함하는 C# 레퍼토리에 대해 살펴보았다. 다음 기사에서는 병렬 동작을 허용하는 멀티스레딩을 다룰 것이다. Raffi Krikorian은 메사추세스 주 캠브리지에서 컨설턴트로 활동하고 있으며 대용량 분산 P2P 시스템, JXTA와 C#에 능통한 전문가 이다.
 
Posted by 아즈키
분류없음2009/03/16 10:23
출처 : http://www.epochconverter.com/


Free unix timestamp and epoch conversion tool


The current Unix epoch time is   1207534309      

Convert epoch to human readable date and vice versa
   or  batch convert epochs to human dates

Mon Day Yr   Hr Min Sec
/   /      :   :   GMT    

   or  batch convert
Format: RFC 2822 formatted date

Epoch dates for the start and end of the year/month/day
Show start & end of  year  month  day

Mon Day Yr  
/   /       or  Epoch List By Month & Year

Convert seconds to days, hours and minutes
 
More date conversion tools
Calculate the difference between 2 dates

What is epoch time?
The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap seconds. The epoch timestamp 0 can be written in ISO 8601 format as: 1970-01-01T00:00:00Z. One epoch hour is 3600 seconds, one epoch day is 86400 seconds long, leap seconds are not calculated. Many Unix systems store epoch dates as a signed 32-bit integer, which might cause problems on January 19, 2038 (known as the Year 2038 problem or Y2038).

Human readable time  Seconds
1 minute 60 seconds
1 hour 3600 seconds
1 day 86400 seconds
1 week 604800 seconds
1 month (30.44 days)  2629743 seconds
1 year (365.24 days)   31556926 seconds

How to get the current epoch time in ...
Perl time
PHP time()
Ruby Time.now (or Time.new). To display the epoch: Time.now.to_i
Python import time first, then time.time()
Java long epoch = System.currentTimeMillis()/1000;
Microsoft .NET C# epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
VBScript/ASP DateDiff("s", "01/01/1970 00:00:00", Now())
MySQL SELECT unix_timestamp(now())
PostgreSQL SELECT extract(epoch FROM now());
SQL Server SELECT DATEDIFF(s, '19700101', GETDATE())
JavaScript Math.round(new Date().getTime()/1000.0) getTime() returns time in milliseconds.
Unix/Linux date +%s
Other OS's  Command line: perl -e "print time" (If Perl is installed on your system)

Convert from human readable date to epoch
Perl Use these Perl Epoch routines
PHP mktime(hour, minute, second, month, day, year)  
Ruby Time.local(year, month, day, hour, minute, second, usec ) (or Time.gm for GMT/UTC input). To display add .to_i
Python import time first, then int(time.mktime(time.strptime('2000-01-01 12:34:00', '%Y-%m-%d %H:%M:%S')))
Java long epoch = new java.text.SimpleDateFormat ("dd/MM/yyyy HH:mm:ss").parse("01/01/1970 01:00:00");
VBScript/ASP DateDiff("s", "01/01/1970 00:00:00", time field)  
MySQL SELECT unix_timestamp(time) Time format: YYYY-MM-DD HH:MM:SS or YYMMDD or YYYYMMDD  
PostgreSQL SELECT extract(epoch FROM date('2000-01-01 12:34'));
With timestamp: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-08');
With interval: SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
SQL Server SELECT DATEDIFF(s, '19700101', time field)
JavaScript use the JavaScript Date object
Unix/Linux date +%s -d"Jan 1, 1980 00:00:01"

Convert from epoch to human readable date
Perl Use these Perl Epoch routines
PHP date(output format, epoch); Output format example: 'r' = RFC 2822 date  
Ruby Time.at(epoch)
Python import time first, then time.gmtime(epoch) time is an array of year, month, day, hour, min, sec, day of week, day of year, DST  
Java String date = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));
VBScript/ASP DateAdd("s", epoch, "01/01/1970 00:00:00")  
PostgreSQL SELECT TIMESTAMP WITH TIME ZONE 'epoch' + epoch * INTERVAL '1 second';  
MySQL from_unixtime(epoch, optional output format) The default output format is YYY-MM-DD HH:MM:SS  
SQL Server DATEADD(s, epoch, '19700101')
JavaScript use the JavaScript Date object
Linux date -d @1190000000 (replace 1190000000 with your epoch, needs newer version of date)
Other OS's Command line: perl -e "print scalar(localtime(epoch))" (If Perl is installed) Replace 'localtime' with 'gmtime' for GMT/UTC time.

Full screen epoch clock | Epoch Conversion Functions | Related Books
Esta página en Español: Convertir Epochs / Tiempos Unix
Please note: All tools on this page are based on the time settings of your computer.  

add to Favorites - add to Del.icio.us
www.epochconverter.com - © 2008 Misja.com - contact - privacy - Unicode Tools
Posted by 아즈키
분류없음2009/02/06 11:17
회사 개발 서버가 죽고 리부팅을 한 다음에 보니깐..

어떤 한분이 접속이 안대는 에러가 있었다.

'Cannot find SS.INI file for user ******'

라는 메시지가 뜨면서 로그인이 안되는 문제였다.

구글링을 통해 어떤 친절한 외국분의 설명을 듣고 수정에 성공하였다.

방법은 간단.

소스세이프 파일이 있는 폴더로 가서, users 폴더안의 유저이름으로 된 폴더 안을 보면..

~.tmp 로 된 파일이 있고 SS.INI 파일이 없다.

그럼 그 ~.tmp 파일의 이름을 SS.INI 로 바꿔주기만 하면 된다.

Posted by 아즈키
2009/01/19 17:26

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

분류없음2009/01/16 11:26
갑자기 포스팅이 하고싶어서 씀.


자바스크립트에서 조건식을 쓸때 무엇이 false 이고 무엇이 true 일까?

boolean 값인 true 나 false 는 그 자체가 true, false 이다.

number 일 경우 0 이나 NaN 이면 false, 그 외에는 모두 true 이다.

string 일 경우 "" 이면 false, 그 외에는 모두 true 이다.

object 의 경우 null 일 경우 false, 그 외에는 모두 true.

function, array 등은 모두 true.

정리하면.. 자바스크립트 조건문에서 true 는 false, 0, NaN, "", null 을 제외한 모든 값이다.


ps. 위를 응용한 재미있는 사실

if ("0") alert(1);
else alert(0);
 1 이 출력됨. (true)

if ("0" == true) alert(1);
else alert(0);
 0 이 출력됨. (false)

if ("0" == false) alert(1);
else alert(0);
 1 이 출력됨. (true)

조건문에서 "0" 은 true 지만, "0" == false 이다.

 참고 :

자바스크립트 타입 비교 테이블 + 테이블 작성 스크립트

Posted by 아즈키
javascript2008/12/01 13:50

스타일 적용시에는 styleSheet 오브젝트의 (document.styleSheets : Array) 메소드를 사용하는데,

  • IE 에서는 addRule 을 사용

인자값을 3개(필수3개)로,

  1. 0번 argument에는 선택자('div', 'p' 등..)를 넣고,
  2. 1번 argument에는 스타일 명령("color:blue", "overflow:hidden" 등..)을 넣는다.
  3. 2번 argument에는 0부터 시작하는 pages 컬렉션(document.styleSheets[?].pages : Array)에서의 위치할 인수를 넣는다. (-1을 넣으면 제일 뒤에 위치하게 된다.)
    반환값은 항상 -1이다. (주의: 오류가 없어도 -1을 반환)
  • FF 에서는 insertRule 를 사용

인자값은 2개(필수2개)로,

  1. 0번 argument에는 스타일 명령을 선택자를 포함하여 넣는다. (예: "#myTable {-moz-user-select:none}")
  2. 1번 argument에는 0부터 시작하는 cssRules 컬렉션(document.styleSheets[?].cssRules : Array)에서의 위치할 인수를 넣는다. (주의: addRule과는 다르다, -1 인자값을 넣으면 에러가 난다.)
    반환값은 cssRules 컬렉션에서의 위치한 위치값이다.

ps. 아즈키네 2번째 블로그 옛글중에 가져옴 (http://2.azki.org/182)

Posted by 아즈키
javascript2008/11/18 17:56
자바스크립트 막코딩으로 (특별한 animation/effect 라이브러리 사용 없이) 뒤집는 효과를 구현해 보았습니다

구현을 위주로 엉망으로 짠 코드라  부끄럽지만, 올리고 봅니다.


  • url
http://fliptest.azki.org/proto.html
(상수값으로 효과를 만들어본 첫번째 버전)
http://fliptest.azki.org/
(몇가지 변수를 적용할 수 있는 두번째 버전)


  • 소개
4각형과 3각형의 조합으로 접히는 효과를 내보았습니다.
실제 flip 과정중 캡쳐화면입니다.
사용자 삽입 이미지
그리고 element 의 구성은 3가지로 이루어져 있습니다.
사용자 삽입 이미지
왼쪽 삼각형과 오른쪽 삼각형이 입체적으로 착각하도록 할 수 있습니다.

삼각형을 만드는 방법은 참고사이트중 Triangles in Javascript 에 자세하게 나와있습니다.
사용자 삽입 이미지


  • 참고 사이트
http://lab.smashup.it/flip/
(Flip!0.4 - A jQuery plugin)
http://www.uselesspickles.com/triangles/demo.html
(Triangles in Javascript)
http://www.xentrik.net/css/filters.php
(CSS Filters)


ps.
참고사이트중 Flip!0.4 - A jQuery plugin 에서 처음 flip 효과를 보았는데,
그 flip 은 Opera browser 를 지원하지 못합니다. 제가 만든 것은 됩니다 :]
테스트 한 브라우저 목록입니다.
  • FF2, FF3
  • IE6, IE7, IE8
  • Opera 9
  • safari 3 (windows)
  • Chrome 0.3
Posted by 아즈키
2008/11/06 00:57

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

javascript2008/10/30 11:05
등록 부분
initialize: function(id, container){
    (...)

    var thisP = this;
    AzLib.Event.observe(
        this._element,
        AzLib.Browser.Gecko ?
            "DOMMouseScroll" :
           "mousewheel",
        function(e){
            thisP.__event_mouseWheel(e);
        }
    );

    (...)
}

콜백 부분
__event_mouseWheel: function(e){
    AzLib.Event.stop(e);
    var delta = 0;
    if (e.wheelDelta) { /* IE, Opera, Safari, Chrome */
        delta = -e.wheelDelta / (AzLib.Browser.Chrome? 360: 120);
    } else if (e.detail) { /* Gecko */
        delta = e.detail / 3;
    }
    this._verticalScrollbar.stepPosition(delta * this.wheelRowCount);
}

mouse wheel 관련 자료를 찾아보니 살짝? 오동작도 하고 크롬 브라우저에 대한 처리가 안되어있어 수정하여 적용중인 코드.

IE6, IE7, IE8beta, FF2, Opera9, Safari3, Chrome0.2 에서 테스트 됨.
Posted by 아즈키
javascript2008/07/02 09:18
다른 팀의 업무를 도와주며 한두시간의 시간을 투자해서 만든 프로그램입니다.. (그런데 사용할 일이 사라져서 빛을 보지도 못한 프로그램입니다;)


  • URL
http://json2table.azki.org/ 입니다


  • 소개
JSON 문자열을 textarea 에 넣고 2 table ! 버튼을 누르면 JSON 데이타를 테이블로 출력하고, 출력하는데 걸린 시간을 출력합니다. 표시하는 룰은 object 타입은 테이블로 나타내고, array 타입은 row로 나타냅니다.
(참고: array 타입일 경우 테이블의 첫번째 로우에 각 item 의 이름(key)이 표시되는데, 그 아이템의 순서가 뒤바뀌거나 item 의 이름 종류나 개수가 일치하지 않는 경우 예외처리를 해놓지 않아서 정확하게 동작하지 않습니다)


  • 예제

{
    code: 'success',
    data: {
        member: {
            name: '김성준',
            id: 'azki',
            sno: '0701082'
        }
    }
}
위의 JSON 코드를 넣으니 아래 테이블로 표시되네요..
codedata
success
member
nameidsno
김성준azki0701082
15ms

아래부터는 다른 예제입니다

{
    "dataset": [{
        "columnInfo": [{
            "type": "string",
            "size": 10,
            "name": "departure_city"
        }, {
            "type": "string",
            "size": 10,
            "name": "departure_date"
        }, {
            "type": "string",
            "size": 10,
            "name": "arrival_city"
        }, {
            "type": "string",
            "size": 10,
            "name": "arrival_date"
        }],
        "rows": [{
            "arrival_city": "TOKYO",
            "departure_date": "03Jul08",
            "arrival_date": "05Jul08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "03Jul08",
            "arrival_date": "06Jul08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "10Jul08",
            "arrival_date": "12Jul08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "10Jul08",
            "arrival_date": "13Jul08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "17Jul08",
            "arrival_date": "19Jul08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "17Jul08",
            "arrival_date": "20Jul08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "24Jul08",
            "arrival_date": "26Jul08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "24Jul08",
            "arrival_date": "27Jul08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "31Jul08",
            "arrival_date": "02Aug08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "31Jul08",
            "arrival_date": "03Aug08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "07Aug08",
            "arrival_date": "09Aug08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "07Aug08",
            "arrival_date": "10Aug08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "14Aug08",
            "arrival_date": "16Aug08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "14Aug08",
            "arrival_date": "17Aug08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "21Aug08",
            "arrival_date": "23Aug08",
            "departure_city": "BUSAN"
        }, {
            "arrival_city": "TOKYO",
            "departure_date": "21Aug08",
            "arrival_date": "24Aug08",
            "departure_city": "BUSAN"
        }],
        "name": "Schedule"
    }]
}
위의 JSON 코드를 넣으니 아래 테이블로 표시되네요..

dataset
columnInforowsname
typesizename
string10departure_city
string10departure_date
string10arrival_city
string10arrival_date
arrival_citydeparture_datearrival_datedeparture_city
TOKYO03Jul0805Jul08BUSAN
TOKYO03Jul0806Jul08BUSAN
TOKYO10Jul0812Jul08BUSAN
TOKYO10Jul0813Jul08BUSAN
TOKYO17Jul0819Jul08BUSAN
TOKYO17Jul0820Jul08BUSAN
TOKYO24Jul0826Jul08BUSAN
TOKYO24Jul0827Jul08BUSAN
TOKYO31Jul0802Aug08BUSAN
TOKYO31Jul0803Aug08BUSAN
TOKYO07Aug0809Aug08BUSAN
TOKYO07Aug0810Aug08BUSAN
TOKYO14Aug0816Aug08BUSAN
TOKYO14Aug0817Aug08BUSAN
TOKYO21Aug0823Aug08BUSAN
TOKYO21Aug0824Aug08BUSAN
Schedule
109ms

  • 추후 업데이트될 수도 있는(?) 기능들..
    • JSON 데이타를 포맷팅해주는 기능 (보기 편하게)
    • 색상등으로 좀 더 보기 편하게 해주는 기능
    • 두가지 이상의 JSON 데이타를 서로 비교-분석 해주는 기능
    • 많은 케이스에 대해서 테스트가 이뤄지지 않은 상태라 버그가 있을 가능성이 높음. -> 디버깅..
Posted by 아즈키
javascript2008/06/10 15:12
소스1.
var input = document.createElement("input");
input.setAttribute("type", "text");
document.body.appendChild(input);

소스1. 적용 이후 다음 소스가 적용되지 않는다.. IE 에서만 ^^;

소스2.
input.setAttribute("type", "password");

IE 에서 나타나는 에러 메시지는 "이 명령은 지원하지 않습니다."

물론, setAttribute 메소드를 사용하지 않고 input.type = "..."; 로 적용시켜도 에러가 남.

FF2, Opera9, Safari3 에서는 정확히 잘 동작한다. IE6, IE7, IE8 beta1 에선 에러가 난다..


프로젝트에서는 아래와 같은 코드로 대체했다
 
if (Prototype.Browser.IE) {
    var outerHTML = this._input.outerHTML;
    outerHTML = outerHTML.replace(/type=[a-z]*/, "");
    outerHTML = outerHTML.replace(/value=""/, "value=\""+this._getText()+"\"");
    // IE 에서는 한번 지정된 type을 변경할 수 없어서 새로운 Element 를 만들어야 함.
    // IE 에서 password 타입의 텍스트 박스는 outerHTML 에서 value 값이 나타나지 않아서 다시 넣어줘야함.
    var newInput = document.createElement(outerHTML);
    if (this._getPassword()) {
        newInput.setAttribute("type", "password");
    }
    this._input.parentNode.replaceChild(newInput, this._input);
   
    //이벤트등록해제 등등 reference value 에 관련된 모든 것들 해제
    //...
    this._input = newInput;
    //...
    //이벤트등록 등등 reference value 에 관련된 모든 것들 재등록
}
else {
    this._input.setAttribute("type", this._getPassword()? "password": "text");
}

ps. 이벤트 등 element 값 자체를 등록시켜놓은 부분에 대해 수정이 반드시 필요하다.

참고로 이 문제의 다른 해결 방법이 없는지.. 구글을 찾아보니 역시나 비슷한게 있었다
http://codingforums.com/showthread.php?t=107073
Change input type="text" to input type="password"

Code:
<script type="text/javascript">
function passit(ip){
var np=ip.cloneNode(true);
np.type='password';
if(np.value!=ip.value)
np.value=ip.value;
ip.parentNode.replaceChild(np,ip);
}
</script>

<form id="login" action="#" method="post">
<input id="username-field" type="text" name="username" title="Username" onmousedown="javascript:this.value=''; javascript:this.focus();" value="Username" tabindex="1" />
<input id="password-field" type="text" name="password" title="Password" onmousedown="javascript:this.value=''; passit(this.form[0]); javascript:this.focus();" value="Password" tabindex="2" />
<input type="submit" name="submit" value="sign in" tabindex="3" />
</form>


나도 처음에 cloneNode 메소드를 생각했었는데, 사용하지 않았다..
이유는 type="text" 인 input 을 type="password" 로 변경은 가능하지만..
반대로는 불가능했기 때문이다. -ㅁ-
어째뜬..
IE does not like to change dynamically the type, thus one solution might be to replace entirely the object.
Posted by 아즈키
javascript2008/05/26 19:22
소스1.
<button style="
    width: 152px;
    height: 100px;
    background: red;
    border: 15px solid blue;
    overflow: hidden;
    position: absolute;
">
<div style="
    width: 122px;
    position: absolute;
    left: 0px; top: 0px;
    background: green;
">
azki's test
</div>
</button>

출력물1. (FF2)


출력물2. (IE6, IE7 도 동일하게 나온다)


출력물3. (왼쪽부터 Opera9, Safari3... 비슷함)



직관적으론 출력물3 처럼 나와야 하겠지만 불행히도 FF와 IE에서는 이상하게 나온다..
내부 div 에 top 과 left 속성을 제거해보자.. 더욱 더 가관이다.

소스2.
<button style="
    width: 152px;
    height: 100px;
    background: red;
    border: 15px solid blue;
    overflow: hidden;
    position: absolute;
">
<div style="
    width: 122px;
    position: absolute;
    background: green;
">
azki's test
</div>
</button>

출력물1. (FF2)


출력물2. (IE6, IE7 도 동일하게 나온다)


출력물3. (Opera9)


출력물4. (Safari3)



내가 원하는 것은 소스1의 출력물3과 같은 형태인데,
참 어려운것 같다 ㅡㅡ
더욱 재미난 것은... FF 의 디버깅 도구 firebug 에서 보여지는 부분이다. (소스1)

날 약올리듯이? 내가 원하는 부분을 정확하게 가르키고 있다.

일단 하나 하나를 분석해보니..

border 가 좌우 좌표를 이상하게 만드는 것 같았다. (IE와 FF에서)

그리고 FF 에서는 padding 이 또 문제를 안쪽 div의 위치를 움직이고 있었다.

소스1에서 border 와 padding 을 모두 0px 로 준 결과를 살펴보면 다음과 같다

소스3.
<button style="
    width: 152px;
    height: 100px;
    background: red;
    border: 0px;
    padding: 0px;
    overflow: hidden;
    position: absolute;
">
<div style="
    width: 122px;
    position: absolute;
    left: 0px; top: 0px;
    background: green;
">
azki's test
</div>
</button>

출력물1. (FF2)

출력물2. (IE6, IE7, Opera9, Safari3)



결국 적절한 해답은 못 찾았고..

소스3의 상태에서 FF만 따로 위치를 잡아주는 식으로 처리를 했다
left 속성: -3 , top 속성: -(높이/2+1)


부록::
프로젝트에서는 javascript 로 이런식으로 구성되어 있다 ㅡㅡㅋ

initialize: function() {//컴포넌트 객체를 생성할 때 호출됨..
        //...
        if (Prototype.Browser.Gecko) {
            this._label.setX(-3);
        }
        else {
            this._label.setX(0);
            this._label.setY(0);
        }
}
,
//...
,
onresize: function() {//사이즈 변경시에 호출됨..
        //...
        if (Prototype.Browser.Gecko) {
            this._label.setY(-1-Math.floor(height/2));
        }
}

Posted by 아즈키
javascript2008/05/21 10:57

Javascript 로 지정한 style 의 경우 구하는 예
element.style["fontSize"]

IE 의 경우 구하는 예
element.currentStyle["fontSize"]

FF 의 경우 구하는 예
document.defaultView.getComputedStyle(element, "").getPropertyValue("font-size")


참고: IE 의 경우 filter 값을 구하는 방법의 예.
element.filters.item("alpha").opacity

Posted by 아즈키
javascript2008/05/14 09:27
예전부터 알고 있었던거라 그때 정리해 쓸려했는데..
조금 더 보편화된 패턴이 발견되면 정리할려다 시간이 많이 흘러 이렇게 그냥 정리.. (결국 보편화된 패턴이나 다른 이상 증상은 아직 발견하지 못했습니다. 발견하신분이나 이 문제에 대해 이견이 있으신분은 꼭 리플을 달아주시면 감사드리겠습니다.)

이제라도 증상에 대해 기록해 두어야 될거 같아 정리해 올림-.-

  • 증상 & 분석
IE 에서는 eval 구문에 다음 스트링을 사용하였을 때 반환이 되지 않음.
"(function() {})"
다른 4대 브라우저(FF,Opera,Safari) 에서는 반환이 된다.

typeof eval("(function() {})");
가 IE 에서만 "undefined" 가 나온다
나머지 브라우저에서는 잘 된다 ("function" 반환)

IE가 eval 안에서 function 구문이 동작하지 않는 건 아닌거 같다
typeof eval("(function() {return function() {};})();")
은 또 "function" 으로 나오기 때문이다

  • 대안
그냥 function 을 eval 로 정리해서 쓰고 싶을 땐.. (function 내용을 스트링 값으로 선언하고 싶을 때?)
  1. function 구문을 eval 밖으로 빼고 소스 부분만 eval 로 넣는다.
    var a = eval("function() { var a=1; alert(++a); return a; }");
    대신
    var a = function() { eval("var a=1; alert(++a); return a; ") };
    를 사용한다.

  2. 그냥 eval 대신 Function 을 사용한다.
    var a = eval("function() { var a=1; alert(++a); return a; }");
    대신
    var a = new Function("var a=1; alert(++a); return a;");
    를 사용한다.
ps. 필자는 2번 방식을 좋아한다. 속도가 더 빠르기 때문이다. (똑같은 구문이라면 eval을 사용하는 것이 거의 속도가 큰 차이로 떨어진다. 그렇기 때문에 난 왠만하면 eval 은 쓰지 않는다.)
Posted by 아즈키
javascript2008/05/14 09:27
업무 or 개인 프로젝트 시 자주 쓰게 되는 배열 변수 메소드를 정리하였습니다.

  • .sort
sort ([sortFunction: function]) : array
해당 배열 자신을 정렬한다. (기존 배열 변경)
sortFunction 을 생략하면 charCode 값을 기준으로 오름차순으로 정렬한다.
반환값은 자기 자신의 레퍼런스다. (non copy)
sortFunction 은 function 타입이며, 두개의 인자를 받는다. sortFunction 이 음수를 반환하면 그 두 아이템을 스왑한다. (양수나 0을 반환시에는 스왑하지 않는다.)
각 배열 아이템의 짝을 모두 수행하는 것은 똑같지만 수행하는 순서는 브라우저 별로 조금 다르다.
배열 ["a", "b", "c"] 를 .sort 메소드로 sortFunction 에 던질 경우 FF 는
sortFunction ("a", "b") -> sortFunction ("c", "a") -> sortFunction ("b", "a")
순으로 던지고, IE 에서는
sortFunction ("b", "b") -> sortFunction ("c", "a") -> sortFunction ("b", "a")
순으로 던진다.
sortFunction 이 무조건 음수를 반환하는 경우 결과값 또한 다르게 나온다. (물론 정상적인 비교를 수행하는 함수라면 같은 결과가 나오겠지만, 같은 코드가 다른 결과값을 낸 다는 사실에 흥미를 갖고 수행시켜보았다)
FF: ["c", "a", "b"]
IE: ["b", "c", "a"]

  • .reverse
reverse () : void
해당 배열 자신을 뒤집는다.

  • .push
push ([item1 : mixed [, item2 : mixed [, item3 : mixed, ...]]]) : item
푸시하고 마지막으로 추가된 아이템을 반환한다. (3개의 item을 추가했을 경우 item3을 반환)

  • .pop
pop () : item
팝한다. 비어있는 경우엔 undefined 를 반환한다.

  • .shift
shift () : item
시프트한다. 팝을 기능을 반대방향으로 수행한다.

  • .unshift
unshift ([item1 : mixed [, item2 : mixed [, item3 : mixed, ...]]]) : void
언시프트한다. 푸쉬의 기능을 반대방향으로 수행한다. 반환값은 브라우저별로 다르므로 사용하지 않는 것이 좋다. (예로 IE6 에서는 undefined 을 반환하지만, FF2 에서는 push와 마찬가지로 마지막 인자값을 반환한다)

  • .slice
slice (start : int [, end : int]) : array
지정된 부분을 복사해 새로운 배열을 반환한다. start는 포함하지만, end는 포함하지 않는다.
start 가 음수면 legnth + start 로 처리한다.
end 가 음수면 length + end 로 처리한다.
end 가 생략되면 배열의 끝까지 추출한다.
원래 배열변수에 영향을 주진 않는다. (복사해서 새로운 배열을 만듬)

  • .splice
splice (start : int, deleteCount : int, [item1 : mixed [, item2 : mixed [, item3 : mixed, ...]]]) : array
지정된 부분을 삭제하고, 그 부분에 새로운 아이템을 추가한다. 그리고 반환은 삭제된 아이템들을 가진 새로운 배열이다. (deleteCount 가 0 일 경우 빈 배열이, 1 일 경우 아이템이 1개인 배열이 반환)
deleteCount 가 0 이면 삭제되는 것이 없다.
item 을 생략하면 삭제만 수행한다.
배열 가운대 인자를 추가할 경우(deleteCount = 0)나 배열 중간에 있는 인자를 삭제할 경우(item 생략) 활용가능하다.

  • .concat
concat ([item1 : mixed [, item2 : mixed [, item3 : mixed, ...]]]) : array
배열에 아이템들을 추가한 새로운 배열을 반환한다. 푸쉬와 비슷하게 추가되지만, 기존 배열에 영향을 미치지 않고 새로운 배열을 반환한다는 점에서 다르다.
추가되는 순서는 당연히 왼쪽에서 오른쪽으로 순서대로이다.

  • .join
join ([separator : string]) : string
배열 요소들 사이에 separator 을 넣어서 하나의 string을 만들어 반환한다. separator 를 생략할 경우 ","(ascii 44)로 처리한다.


ps. 배열 변수는 레퍼런스 값이다.즉,
var a = b = [1];
var c = [1];
에서
a == b 는 true 지만 a == c 는 false 다.
Posted by 아즈키
javascript2008/05/14 09:27
업무용(?)으로 종종 쓰고 있는, User preferences for colors 입니다.

개인적으로 보기 위해 테이블로 작성하였습니다.

  • URL
http://upct.azki.org/

  • 소개
윈도우에서 설정한(디스플레이 설정에서 화면배색 부분) 색상들을 HTML 에서 가져다 쓰는 것 입니다.
CSS2 에서 추가되었다고 합니다. 참고로 꼭 윈도우즈에서만 적용되는 건 아닙니다. 우분투에서 파이어폭스로 테스트 해본 결과 됩니다.
4 대 브라우저(FF,IE,Opera,Safari)에서 다 적용됩니다. 다만 윈도우 버전 Safari에서는 설정값을 윈도우즈의 것으로 가져오지 않는군요. (내부적으로 설정된 컬러를 쓰더군요, Mac 에서는 어떤지 모르겠습니다. 아마 잘 되겠죠?)

  • 기반 자료 출처
이용석의 JavaScript & DHTML (http://user.chollian.net/~spacekan/css/preferences-colors.htm)
아주 오래전부터 알고 다니는 사이트인데 지금 봐도 참 좋은 사이트입니다. ^^
Posted by 아즈키
javascript2008/05/14 09:26
개인적으로 관심이 있는 분야라서 코드 실행시간을 체크하는 스크립트를 짰습니다..

  • URL
http://jpt.azki.org/ 입니다

  • 소개
code A 에 테스트할 코드를 넣고 Test! 버튼을 누르면 그 코드가 Loop Count 만큼 실행됩니다
그리고 그 시간을 체크하여 화면에 표시해주는 프로그램입니다

  • 예제
code A 에 다음 코드를 넣습니다
a = 0;
code B 에 다음 코드를 넣습니다
var a = 0;
Loop Count
500000
으로 적어줍니다

code A 밑의 버튼 Test! 를 누릅니다
저의 경우 (FF2) 다음과 같은 결과값이 나오네요.
*Func Time: 1015 ms
*All: 2187 ms
*Empty Func: 1172 ms
code B 밑의 버튼 Test! 를 누릅니다
*Func Time: 78 ms
*All: 1250 ms
*Empty Func: 1172 ms
*All 에 해당되는 것은 코드를 Loop Count 만큼 반복해서 수행시킬 때 걸린 시간이며, *Empty Func 에 해당되는 것은 코드를 넣지 않고 Loop Count 만큼 반복만 수행했을 때 걸린 시간입니다. 그러므로 실제적으로 코드에 의해 걸린 시간은 *Func Time 시간 = ( *Empty Func 시간 - *All 시간 ) 이라는 논리입니다 ^^

결론: 변수 하나를 쓰더라도 var 를 붙여 주어 지역변수로 명확하게 표현해 사용하는 것이 빠르군요^^;


  • 추후 업데이트될 수도 있는(?) 기능들..
    • 타이머를 두어서 너무 시간이 오래걸리는 코드를 중도에 멈춤?
    • 실행시간을 계산해서 적절한 count 반복.
    • 두가지 이상의 코드에 대해 결과값 비교.
    • 입력한 시간을 기준으로 그 시간동안 몇번 실행되는지 체크.
Posted by 아즈키
ata2008/05/14 09:26
array apc_cache_info  ([ string $cache_type  [, bool $limited  ]] )

인자값중 $cache_type 을 "user" 로 주면 apc_cache_info 를 사용해서 apc_store 나 apc_add 로 캐시한 내용들의 목록을 가져올 수 있다. 예제 코드와 그 출력된 결과는 다음과 같다.
<?php
$s = "example string";
apc_store('five', $s, 5);
apc_store('minute', $s, 60);
apc_store('noTTL', $s);
print_r(apc_cache_info('user'));
?>

more..

Array
(
[num_slots] => 2000
[ttl] => 0
[num_hits] => 0
[num_misses] => 0
[start_time] => 1196245414
[expunges] => 16
[mem_size] => 1644
[num_entries] => 3
[num_inserts] => 24
[file_upload_progress] => 1
[memory_type] => IPC shared
[locking_type] => file
[cache_list] => Array
(
[0] => Array
(
[info] => five
[ttl] => 5
[type] => user
[num_hits] => 0
[mtime] => 1196246312
[creation_time] => 1196246312
[deletion_time] => 0
[access_time] => 1196246312
[ref_count] => 0
[mem_size] => 546
)

[1] => Array
(
[info] => noTTL
[ttl] => 0
[type] => user
[num_hits] => 0
[mtime] => 1196246312
[creation_time] => 1196246312
[deletion_time] => 0
[access_time] => 1196246312
[ref_count] => 0
[mem_size] => 548
)

[2] => Array
(
[info] => minute
[ttl] => 60
[type] => user
[num_hits] => 0
[mtime] => 1196246312
[creation_time] => 1196246312
[deletion_time] => 0
[access_time] => 1196246312
[ref_count] => 0
[mem_size] => 550
)

)

[deleted_list] => Array
(
)

)


쉽게 리스트를 뽑아 올 수 있다. 하지만 문제가 있다. ttl을 설정할 시 ttl이 만료되어도 (즉 변수를 apc_fetch 를 통해 가져올 수 없는 경우에도) 리스트에 나타난다는 것이다. 성능상의 이유로 캐시리스트를 리플레시하지 않는 것 같다. 대신 apc_fetch 를 통해 해당 변수를 접근 한 후에는 리스트에서 사라진다. 실제적으론 ttl을 적용할려면 time() 으로 현재 시간을 얻어내서 배열의 mtime값과의 차가 ttl값을 넘기는지 확인하여야 한다. 목록에서 지우기 위해서는 해당 변수에 한번 접근을 하면 된다.(apc_fetch)
Posted by 아즈키
2008/05/14 09:25

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2008/05/14 09:25

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

javascript2008/05/14 09:24
웹에서 파일 업로드시에 프로그레스 모니터 (흔히 ProgressBar 형태로 많이 쓰죠) 구현에 대한 글 입니다

짧은 지식과 소견으로 이루어진 글이므로, 틀리거나 이후 시대가 변해 달라진 내용이 많을 것 입니다 :]

많은 분들께 도움이 되길 바랍니다만 출처를 포함하지 않은 불펌은 자제해주시기를 -ㅁ-zz


이전에 프로그레스 바를 구현하기 위해서는 웹브라우저 자체로만은 힘들었고 (제가 아는한, 제대로 구현된 경우가 별로 없었고) ActiveX 를 설치해야 되는 경우가 많았지요

하지만 Ajax 시대가 초래됨에 따라 -.- activeX 사용을 자제하기 시작했지요

아무튼 유명 포탈사이트 플러그인도 깔기 싫은 (워낙 스파이웨어 이딴 것들이 판을 쳐서요) 시대라서 다른 방법을 생각하게 된거 같습니다


뭔가 잡담이길어지네요 . . . . 본론을 쓰겠습니다 :]


일단 많이 쓰는 방식으로
어도비 플래시(adobe flash)를 이용한 방법이 있습니다
플래시8부터 업로드 컴포넌트를 지원한다고 들은거 같습니다
제가 쓰는 텍스트큐브(태터툴즈)도 파일을 업로드할 때 플래시를 이용하네요
사실 플래시도 activeX 의 종류이긴하나 정말로.. activeX 가 아닌 것 처럼 쓰이고 있기때문에..
특별하지 않은 경우에는 문제가 되지 않죠
서버 세팅이 특별하게 필요하지 않아서 호스팅 받는 개인이 쓰기에 편한 방법이기도 합니다
현재는 순수한 JS와 HTML로 불가능한 다중선택 파일 선택 다이얼로그가 가능하고, 업로드 전에 파일 사이즈도 알아낼 수 있습니다.
제가 생각하기엔 특별한 경우가 아닌 이상 제일 괜찮은 방법이라고 생각합니다..
업로드 데모와 프로그램은 http://swfupload.mammon.se/ 를 보세요 =_=


그리고, AJAX를 이용한 방법이 있습니다
확실히 플래시에 비해 약하지만 진정한 non-download (no activeX) 이므로, 쓸데없다고 할 수는 없겠죠.
ASP, JSP, PHP 모두 가능합니다
ASP는 확인을 해보지 못했으나 된다하고, JSP와 PHP는 실제 코드를 작성하여 확인을 해보았습니다.

그 중 PHP 를 이용하는 방법을 소개하겠습니다
APC(Alternative PHP Cache) 모듈을사용하는 방법이 있습니다
다운로드는 http://pecl.php.net/package/APC/ 를 이용하시면 됩니다
윈도우 환경에서 Apache2 + PHP5 를 이용하시면 http://www.php.net/downloads.php 에서 버전에 맞는 PECL Win32 binaries 찾아서 받아 쓰면 됩니다
윈도우 환경 기준으로 설명드리면
extension_dir 을 설정하시고,
예:
extension_dir = "C:/php/ext/"

그 디렉토리에 php_apc.dll 파일을 복사하고 (다른 dll은 안넣으셔도 됩니다) 아래와 같이 설정합니다
extension = php_apc.dll
[apc]
apc.rfc1867 = "1"

Apache를 재시작하면 작동합니다

rfc1867 라는 옵션이 바로 그 기능(프로그레스-바를 만들 수 있는 기능)을 하는 옵션입니다
자세한 기능은 이곳을 참고하세요 http://www.php.net/manual/en/ref.apc.php
관련된 기능에 대한 간략한 설명.
apc.rfc1867
"0" 이면 사용하지 않는 것이고 "1"은 사용
apc.rfc1867_prefix
apc_fetch 로 뽑아올 때 사용할 키의 앞부분이죠 기본값은 "upload_"
apc.rfc1867_name
업 로드시에 파일 식별자를 넣어줄 파라메터의 이름 입니다. 이는 input 태그를 사용해서 넣어주고요. 보통 hidden 속성을 적용하여 사용합니다(type='hidden'). 값은 보통 Javascript 서 Math.random() 등으로 넣어주고요. 나중에 프로그레스 상태를 받을 요청을 할 때 사용합니다. 기본값은 "APC_UPLOAD_PROGRESS" 입니다.
apc.rfc1867_freq
"The frequency that updates should be made to the user cache entry for upload progress." 라는군요..

아무튼 사용법은 간단합니다
업로드하는 폼에 hidden 타입의 input을 하나 더 추가해서 apc.rfc1867_name 값을 이름으로 합니다 (기본값은 APC_UPLOAD_PROGRESS 입니다.)
간단하게 코드로 표현하면 이렇습니다
<form enctype="multipart/form-data" method="post" action="">
    <input type="hidden" name="APC_UPLOAD_PROGRESS" value="TEST123"/>
    <input type="file" name="f"/>
</form>

name이 APC_UPLOAD_PROGRESS 인 input 의 value가 가 됩니다 (임의로 TEST123을 넣었습니다, 랜덤값등을 생성하여 넣는 편이 좋겠지요)
action에 해당하는 PHP 파일에서는 프로그레스 모니터를 위해 따로 작업할 필요가 없습니다
다른 PHP 파일에서 아래와 같이 값을 이용해서 현재의 업로드 상태를 가져올 수 있습니다
<?php
print_r(apc_fetch("upload_TEST123"));
?>
결과값은 다음과 같습니다 (파일 업로드가 진행중일 경우)
Array
(
    [total] => 1488687
    [current] => 205020
    [filename] => test.exe
    [name] => f
    [done] => 0
    [start_time] => 1194251194.69
)
감이 오시겠지만 'total' 과 'current' 를 이용해서 프로그레스를 나타낼 수 있습니다. 'start_time' 도 쓸만하겠군요. 더 응용하면 업로드 속도까지 나타낼 수 있겠군요

AJAX를 이용해서 실시간으로 이를 나타낼려면 form의 target을 숨겨진 iframe으로 하고 submit 후에 (페이지가 바뀌지않게) ajax 통신을 시작해서 정보를 가져와야겠지요

차후 이 AJAX 코드에 관해서는 다시 예제와 함께 글을 올릴 생각입니다 ^^;
Posted by 아즈키
분류없음2008/05/14 09:23
통신망 업체에서 업로드 속도를 전혀 내주지 않고 있기때문에 결국 gzip 을 사용해서 html 을 압축해 응답하도록 고쳤습니다

설치된 아파치를 보니 2.x

찾아보니 1.3 에서 쓰던 mod_gzip 은 사라지고, 2.x 부터는 mod_deflate 이 대신한다 하는군요.

설치 결과 상당히 빨라졌네요
(index 파일의 html 만 비교해보면 109kbyte 정도 되는 분량이 21kb 정도로 줄었습니다.)
(로드 속도도 눈에 띄게 빨라졌네요 다만 그림 파일은 압축을 하지 않습니다:: 이미 압축된 포맷이기때문에.)

gzip compress 기능을 활성화 하기 위해 httpd.conf 파일에 들어갔던 세팅입니다 (apache 2.0 기준 :: windows 설치 버전)

1. 아래 모듈의 주석("#")을 해제하거나 없을 시에는 작성.
# 압축을 위한 모듈
LoadModule deflate_module modules/mod_deflate.so
# 헤더 제어를 위한 모듈
LoadModule headers_module modules/mod_headers.so

2. 타입에 의한 설정을 이용하였습니다 (다른 방법도 있음)
압축률은 1~9까지 있는데 크게 차이는 없더군요, 테스트결과 1이 더 느린거 같아서 저는 9로 했습니다 (최대압축률:9 ~ 최소압축률:1)
########################################################################
# 타입에 따라 압축을 한다 (text파일 위주)
########################################################################
AddOutputFilterByType DEFLATE text/html text/plain text/xml
# 압축률을 설정한다.
DeflateCompressionLevel 9
########################################################################

3. 브라우저 따라 문제가 있는 것 같더군요 그외 압축을 회피할 경우에 대해 설정합니다(이미 압축이 되어있는 형식의 파일, 압축시 간헐적으로 FF에서 문제가 생기는 파일등)
########################################################################
# 압축을 하지 않을 경우 지정
########################################################################
# Netscape 4.x에 문제가 있다...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08에 더 문제가 있다
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE은 Netscape라고 자신을 알리지만, 문제가 없다
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 압축하지 않을것목록..
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|bmp|zip|tar|rar|alz|a00|ace|mp3|mpe?g|wav|asf|wma|wmv|swf|exe|pdf|doc|xsl|hwp|java|c|t?gz|bz2|7z)$ no-gzip dont-vary
# 프록시가 잘못된 내용을 전달하지않도록 한다
Header append Vary User-Agent env=!dont-vary
########################################################################
Posted by 아즈키
javascript2008/05/07 17:51
createElement 사용에 관련된  W3C DOM 에 대한 글을 보면 다음과 같다
The W3C DOM spec is supposed to be "the name of the element type to instantiate" (e.g., createElement('input'))

하지만 IE에선 이런 방법도 가능하다
var radio1 = document.createElement("<input type=radio name=onandoff value=on>");
var radio2 = document.createElement("<input type=radio name=onandoff value=off>");
document.body.appendChild(radio1);
document.body.appendChild(radio2);

FF, Opera, Safari 등에서도 작동할 수 있도록 짜면 다음과 같다
var radio1 = document.createElement("input");
var radio2 = radio1.cloneNode(false);
radio1.value = "on";
radio2.value = "off";
document.body.appendChild(radio1);
document.body.appendChild(radio2);

첫번째 방법을 사용하면 FF에서는 error가 발생한다
크로스 브라우징을 위해선 두번째 방법을 사용하는 것이 좋겠다

하지만, 두번째 방법으로 사용시 IE6과 IE7에서는 문제가 있다
직 관적으로 생각하면 위의 두가지 코드는 아래의 HTML 코드와 같기 때문에 하나를 선택하면 다른 하나가 선택해제되는 radio 버튼의 작동을 해야 정상이지만 두번째 코드를 사용하면 IE에서는 동작하지 않는다. (클릭을 해도 선택이 되지 않음)
<input type="radio" name="onandoff" value="on"/>
<input type="radio" name="onandoff" value="off"/>

속성값이 잘 적용되지 않을 때 setAttribute 메소드를 사용한 우회적인 방법으로 작동시킨 경험이 몇번 있어서 이번에도 아래와 같이 사용해 보았지만 결과는 똑같았다 (FF에서는 되고 IE에서는 작동안하고.)
var radio1 = document.createElement("input");
radio1.setAttribute("name", "onandoff");
radio1.setAttribute("type", "radio");
var radio2 = radio1.cloneNode(false);
radio1.value = "on";
radio2.value = "off";
document.body.appendChild(radio1);
document.body.appendChild(radio2);

찾은 해결책은 innerHTML 을 이용하는 방법과 try ~ catch 문을 사용하는 것..

innerHTML 을 사용하는 건 다음과 같다
document.body.innerHTML += "<input type=radio name=onandoff value=on>";
document.body.innerHTML += "<input type=radio name=onandoff value=off>";
다 만 Element 의 Reference 값을 얻을려면 좀 우회해야 한다. innerHTML 의 뒤에 추가하고 바로 lastChild 로 찾는 방법이 있지만 좀 모듈화 시켜보면 (보다 돌아가는 방법이지만.) 이런 코드를 사용할 수도 있다
function createRadioButtonElement () {
    var tempTag = document.createElement('temp');
    tempTag.innerHTML = "<input type=radio name=/>";
    var radioButtonElement = tempTag.removeChild(tempTag.firstChild);
    delete tempTag;
    return radioButtonElement;
}
var radio1 = createRadioButtonElement();
radio1.name = "onandoff";
var radio2 = radio1.cloneNode(false);
radio1.value = "on";
radio2.value = "off";
document.body.appendChild(radio1);
document.body.appendChild(radio2);

try ~ catch 문을 사용하는 예제는 다음과 같다
var radio1;
try {
  radio1 = document.createElement("<input type='radio' name='onandoff'>");
}
catch (e) {
  radio1 = document.createElement('input');
  radio1.type = 'radio';
  radio1.name = 'onandoff';
}
var radio2 = radio1.cloneNode(false);
radio1.value = 'on';
radio2.value = 'off';
document.body.appendChild(radio1);
document.body.appendChild(radio2);

결론: IE 에서는 radio 버튼에 name 속성을 적용시켜 동작하게 할려면 createElement("input") 외의 다른 우회적 방법이 필요하다.
Posted by 아즈키
javascript2008/05/07 17:50
이 테이블은 자바스크립트의 느슨한 비교(==)와 엄격한 비교(===)를 설명합니다. 이는 타입 저글링과도 관련이 있고 변수에 대한 이해를 도울 수 있을 것입니다.
테 이블을 이용하기 전에 자바스크립트 타입과 각 타입의 의미를 어느정도는 이해하여야 합니다. 예를 들면 "1"는 string 타입이고, 반면에 1은 number타입입니다. 또 true는 boolean타입이며, [1]은 object타입입니다(배열).
방금 나열한 4가지는 모두 다른 타입이고 엄격한 비교시 모두 다르다고 나옵니다(false). 하지만 느슨한 비교시에는 모두 서로 같다고 나옵니다(true).

기본 샘플:
TypesComparisonsTable.html

느슨한 비교 (==) 테이블

TypesComparisonsTable2.html

엄격한 비교 (===) 테이블

느슨한 비교:

more..

== true false 1 0 -1 NaN "1" "0" "-1" "" "javascript" [] [0] [1] [2] [1,0] {} {1:1} null undefined new Boolean() new Number() new String() new Array() new Object() ==
true true false true false false false true false false false false false false true false false false false false false false false false false false true
false false true false true false false false true false true false true true false false false false false false false true true true true false false
1 true false true false false false true false false false false false false true false false false false false false false false false false false 1
0 false true false true false false false true false true false true true false false false false false false false true true true true false 0
-1 false false false false true false false false true false false false false false false false false false false false false false false false false -1
NaN false false false false false false false false false false false false false false false false false false false false false false false false false NaN
"1" true false true false false false true false false false false false false true false false false false false false false false false false false "1"
"0" false true false true false false false true false false false false true false false false false false false false true true false false false "0"
"-1" false false false false true false false false true false false false false false false false false false false false false false false false false "-1"
"" false true false true false false false false false true false true false false false false false false false false true true true true false ""
"javascript" false false false false false false false false false false true false false false false false false false false false false false false false false "javascript"
[] false true false true false false false false false true false false false false false false false false false false false false false false false []
[0] false true false true false false false true false false false false false false false false false false false false false false false false false [0]
[1] true false true false false false true false false false false false false false false false false false false false false false false false false [1]
[2] false false false false false false false false false false false false false false false false false false false false false false false false false [2]
[1,0] false false false false false false false false false false false false false false false false false false false false false false false false false [1,0]
{} false false false false false false false false false false false false false false false false false false false false false false false false false {}
{1:1} false false false false false false false false false false false false false false false false false false false false false false false false false {1:1}
null false false false false false false false false false false false false false false false false false false true true false false false false false null
undefined false false false false false false false false false false false false false false false false false false true true false false false false false undefined
new Boolean() false true false true false false false true false true false false false false false false false false false false false false false false false new Boolean()
new Number() false true false true false false false true false true false false false false false false false false false false false false false false false new Number()
new String() false true false true false false false false false true false false false false false false false false false false false false false false false new String()
new Array() false true false true false false false false false true false false false false false false false false false false false false false false false new Array()
new Object() false false false false false false false false false false false false false false false false false false false false false false false false false new Object()
== true false 1 0 -1 NaN "1" "0" "-1" "" "javascript" [] [0] [1] [2] [1,0] {} {1:1} null undefined new Boolean() new Number() new String() new Array() new Object() ==

엄격한 비교:

more..

=== true false 1 0 -1 NaN "1" "0" "-1" "" "javascript" [] [0] [1] [2] [1,0] {} {1:1} null undefined new Boolean() new Number() new String() new Array() new Object() ===
true true false false false false false false false false false false false false false false false false false false false false false false false false true
false false true false false false false false false false false false false false false false false false false false false false false false false false false
1 false false true false false false false false false false false false false false false false false false false false false false false false false 1
0 false false false true false false false false false false false false false false false false false false false false false false false false false 0
-1 false false false false true false false false false false false false false false false false false false false false false false false false false -1
NaN false false false false false false false false false false false false false false false false false false false false false false false false false NaN
"1" false false false false false false true false false false false false false false false false false false false false false false false false false "1"
"0" false false false false false false false true false false false false false false false false false false false false false false false false false "0"
"-1" false false false false false false false false true false false false false false false false false false false false false false false false false "-1"
"" false false false false false false false false false true false false false false false false false false false false false false false false false ""
"javascript" false false false false false false false false false false true false false false false false false false false false false false false false false "javascript"
[] false false false false false false false false false false false false false false false false false false false false false false false false false []
[0] false false false false false false false false false false false false false false false false false false false false false false false false false [0]
[1] false false false false false false false false false false false false false false false false false false false false false false false false false [1]
[2] false false false false false false false false false false false false false false false false false false false false false false false false false [2]
[1,0] false false false false false false false false false false false false false false false false false false false false false false false false false [1,0]
{} false false false false false false false false false false false false false false false false false false false false false false false false false {}
{1:1} false false false false false false false false false false false false false false false false false false false false false false false false false {1:1}
null false false false false false false false false false false false false false false false false false false true false false false false false false null
undefined false false false false false false false false false false false false false false false false false false false true false false false false false undefined
new Boolean() false false false false false false false false false false false false false false false false false false false false false false false false false new Boolean()
new Number() false false false false false false false false false false false false false false false false false false false false false false false false false new Number()
new String() false false false false false false false false false false false false false false false false false false false false false false false false false new String()
new Array() false false false false false false false false false false false false false false false false false false false false false false false false false new Array()
new Object() false false false false false false false false false false false false false false false false false false false false false false false false false new Object()
=== true false 1 0 -1 NaN "1" "0" "-1" "" "javascript" [] [0] [1] [2] [1,0] {} {1:1} null undefined new Boolean() new Number() new String() new Array() new Object() ===
Posted by 아즈키
분류없음2008/05/07 17:07
ALTER TABLE 테이블명 RENAME 새로운테이블명
예:
ALTER TABLE azki_log RENAME log;

ALTER TABLE 테이블명 CHANGE 컬럼명 새로운컬럼명 정의
예:
ALTER TABLE log CHANGE loginnumber login_count INTEGER;
Posted by 아즈키