http://www.think-techie.com/2010/04/php-web-development-tips-and-tricks.html


의 글을 번역한 글입니다.


그냥 심심해서 했던거에요.. 별 의미 없고, 번역을 잘 못하기 때문에 원문을 문단별로 첨부합니다.






There are a number of tricks that can make your life easier and help you to squeeze the last bit of performance from your scripts. These tricks won't make your web applications much faster, but can give you that little edge in performance you may be looking for. More importantly it may give you insight into how PHP internals works allowing you to write code that can be executed in more optimal fashion by the Zend Engine.


아래에 소개되는 내용들은  약간의 성능을 향상시키고 당신의 삶을 좀 더 편하게 해줄 수 있는 트릭들입니다. 이 트릭들은 당신의 웹 어플리케이션을 엄청 빠르게하진 않을 것입니다. 그러나 당신이 찾고 있던 약간의 성능 향상을 줄 수 있습니다. 좀 더 중요한 것은 당신에게 PHP의 내부가 어떻게 돌아가는지 영감을 주고 젠드 엔진에 최적화 된 개발 방식을 익힐 수 있을겁니다.


1. Static methods

If a method can be declared static, declare it static. Speed improvement is by a factor of 4.


1. Static 함수들

함수를 Static으로 선언할 수 있다면 Static으로 선언하세요. 속도 향상을 얻을 수 있습니다. (4번 참조)


2. echo() vs. print()

Even both of these output mechanism are language constructs, if you benchmark the two you will quickly discover that print() is slower then echo(). The reason for that is quite simple, print function will return a status indicating if it was successful or not (note: it does not return the size of the string), while echo simply print the text and nothing more. Since in most cases this status is not necessary and is almost never used it is pointless and simply adds unnecessary overhead.

view plaincopy to clipboardprint?

echo( 'Hello World' );    

// is better than    

print( 'Hello World' );    

2. echo() vs print()

두 출력 함수는 모두 언어 구조에 종속되어있지만, 당신이 직접 벤치마킹해본다면 print() 는 echo()보다 느리다는 걸 확인할 수 있을겁니다. 꽤나 간단한 이유인데, print 함수는 출력에 대한 결과값을 반환(성공했을 때는 스트링의 크기를, 실패했을 때는 반환하지 않습니다) 하지만 echo 는 단순히 텍스트를 출력해주기만 합니다. 대부분의 경우에 결과값은 필요하지 않고, 쓸데없는 오버헤드가 늘어나게 됩니다.


3. echo's multiple parameters

Use echo's multiple parameters instead of string concatenation. It's faster.

view plaincopy to clipboardprint?

echo 'Hello', ' ', 'World';    

// is better than    

echo 'Hello' . ' ' . 'World';   

Read more...


3. echo 에서 여러 개의 인자를 이용할 때

echo에서 여러개의 인자를 이용하는 것이 문자열 연쇄(붙이기)를 이용하는 것보다 빠릅니다.


4. Avoid the use of printf

Using printf() is slow for multitude of reasons and I would strongly discourage it's usage unless you absolutely need to use the functionality this function offers. Unlike print and echo printf() is a function with associated function execution overhead. More over printf() is designed to support various formatting schemes that for the most part are not needed in a language that is typeless and will automatically do the necessary type conversions. To handle formatting printf() needs to scan the specified string for special formatting code that are to be replaced with variables. As you can probably imagine that is quite slow and rather inefficient.

view plaincopy to clipboardprint?

echo 'Result:', $result;    

// is better than    

printf( "Result: %s", $result );    


4. printf 함수 사용 자제

printf() 함수는 여러 이유로 느려지며, 나는 꼭 써야 할 경우가 아니면 사용하지 않는 것을 강력 추천합니다. print와 echo와는 달리 printf는 오버헤드를 많이 실행시키는 기능입니다. 더욱이, printf() 는 타입이 없고, 필요하다면 알아서 타입이 변환되는 언어에서는 다양한 자료형을 지원하는 상황에서는 대부분의 경우 필요가 없습니다. printf() 함수를 다루기 위해서는 특수한 문자열과 특수한 형 코드를 대치하게 됩니다. 아마 당신은 상당히 느리고 비효율적이라고 생각하게 될 것입니다.

5. Single quotes vs. double quotes

In PHP there is a difference when using either single or double quotes, either ‘ or “. If you use double quotes ” then you are telling the code to check for a variable. If you are using single quotes ‘ then you are telling it to print whatever is between them. This might seem a bit trivial, but if you use the double quotes instead of the single quotes, it will still output correctly, but you will be wasting processing time.

view plaincopy to clipboardprint?

echo 'Result: ' . $var;    

// is better than    

echo "Result: $var";  

Even the use of sprintf instead of variables contained in double quotes, it’s about 10x faster.


Read more...


5. 작은따옴표(‘) 와 큰따옴표(‘’)

PHP에서 작은 따옴표와 큰 따옴표를 쓰는 것은 차이가 있습니다. 만약 큰 따옴표(“)를 쓸 때는 이것을 변수로 취급한다고 코드에게 말하는 것입니다. 당신이 작은 따옴표(‘)를 쓴다면 이것은 어디에 있던 단지 출력만을 위한 것으로 취급할 것입니다.


6. Methods in derived classes vs. base classes

Methods in derived classes run faster than ones defined in the base class.


5. 상속받은 클래스의 함수 vs 부모 클래스의 함수

상속받은 클래스의 함수가 부모 클래스의 함수보다 빠르다


7. Accessing arrays

e.g. $row['id'] is 7 times faster than $row[id]


7. 배열 접근

$row[‘id’] 는 $row[id] 로 접근하는 것보다 7배 빠르다

8. Do not implement every data structure as a class

Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory. For this reason, do not implement every data structure as a class, arrays are useful, too.


8. 모든 자료구조를 클래스로 구현하지 말아라

모든게 객체지향일 필요도 없고, 이건 가끔 꽤나 큰 오버헤드를 유발하며, 이런 메서드나 오브젝트 호출은 메모리를 엄청 잡아먹습니다. 이런 이유에서, 모든 자료구조를 클래스로 만들지는 마세요. 배열도 꽤나 쓸만합니다.

9. Avoid functions inside loops

Try to use functions outside loops. Otherwise the function may get called each time.


9. 루프 안에 함수 쓰는걸 피하라

함수 바깥에 함수를 호출하도록 노력하세요. 안그러면 매번 해당 함수를 호출합니다.

view plaincopy to clipboardprint?

// 예를 들어 for 루프 안에서 count() 함수를 제어조건에 호출한다면,

// 매 루프 순환마다 함수가 호출됩니다

$max = count( $array );    

for( $i = 0; $i < $max; $i++ )    

{    

   // 무언가를 하겠죠..

}    

   

// 위에께 아래거보다 나아요.

   

for( $i = 0; $i < count( $array ); $i++ )    

{    

   // 여기도 무언가를 하겠죠..

}  

It's even faster if you eliminate the call to count() AND the explicit use of the counter by using a foreach loop in place of the for loop.

이게 count() 함수를 호출하거나, foreach 루프의 counter를 사용하는거보단 훨씬 빠릅니다.

view plaincopy to clipboardprint?

foreach ($array as $i) {  

   // do something    

}  

Read more...


참고: 단일 인자로 함수를 호출하는 것과 내용이 없는 함수를 호출하는 것은 $localvar++ 연산을 7~8번 하는 것과 비슷합니다. 유사한 함수 호출도 15번의 $localvar++ 연산을 하는 것과 흡사합니다.


Note: A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about15 $localvar++ operations.


10. ?> <?

When you need to output a large or even a medium sized static bit of text it is faster and simpler to put it outside the of PHP. This will make the PHP's parser effectively skip over this bit of text and output it as is without any overhead. You should be careful however and not use this for many small strings in between PHP code as multiple context switches between PHP and plain text will ebb away at the performance gained by not having PHP print the text via one of it's functions or constructs.


10. ?><?

 당신이 크거나, 중간 정도 사이즈의 고정된 텍스트를 출력하려 할 때엔 PHP구문 바깥에 출력하는게 더 빠르고 간단합니다. 이 행동은 PHP 파서가 효과적으로 해당 구문을 무시하고 지나가 출력시 오버헤드를 없애줍니다.  이런 부분에 주의하며 성능적인 이슈를 위해서 고정된 텍스트들을 소스 코드 중간 중간에 넣는 것을 최대한 자제해야 합니다.

11. isset instead of strlen

When working with strings and you need to check that the string is either of a certain length you'd understandably would want to use the strlen() function. This function is pretty quick since it's operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using a isset() trick.


11. isset으로 strlen으로 대신하기

당신이 문자열이 충분한 길이를 갖고 있는지 확인해야 할 때 strlen() 함수를 사용해야 한다고 생각할 겁니다. 이 함수의 속도는 그럭저럭 봐줄만한 편인데 그렇다고 zval 구조(PHP에서 변수를 저장하는데 쓰이는 C 구조)의 길이를 바로 반환하는 건 아니고 뭔가 연산을 합니다. 어쨌든 strlen()은 뭔가 느린데, 이 함수가 lowercase 나 hashtable 검색같은 연산을 한다는겁니다. 그래서 isset()을 사용하는 트릭으로 속도를 향상시킬 수 있습니다.

view plaincopy to clipboardprint?

if (!isset($foo{5})) { echo "Foo is too short"; }  

// 이게 더 빨라요

if (strlen($foo) < 5) { echo "Foo is too short"; }  

Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it's execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string's length.


isset()함수를 호출하는게 strlen()함수를 호출하는게 더 빠른데, 왜냐하면 strlen()함수랑 isset()은 언어 구조적으로 다르고, isset은 lowercase나 hashtable 검색 연산을 필요로 하지 않기 때문입니다. 이 의미는 가상의 오버헤드를 줄이지만 실제로는 문자열의 길이를 알아낼 수 있다는 이야기입니다.

12. true is faster than TRUE

This is because when looking for constants PHP does a hash lookup for name as is. And since names are always stored lowercased, by using them you avoid 2 hash lookups. Furthermore, by using 1 and 0 instead of TRUE and FALSE, can be considerably faster.


12. true 는 TRUE 보다 빠르다

왜냐하면 PHP는 상수들을 hash에서 검색을 하기 때문인데, 이게 다 최종적으로는  소문자로 저장이 되어있습니다. 그러므로 2개의 hash 테이블을 검색하는 연산을 회피할 수 있습니다. 게다가, 1과 0을 TRUE와 FALSE를 이용하는거보다 더 빠를 수 있습니다.


13. Incrementing or decrementing the value of the variable

When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend's PHP optimizer. It is a still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer.


Additionally,


1. Incrementing a local variable in a method is the fastest. Nearly the same as calling alocal variable in a function.


2. Incrementing a global variable is 2 times slower than a local variable.


3. Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable.


4. Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one.


Read more ... and more...


13. 변수의 증감 연산

증감 연산을 변수에 할 때에 $i++은 ++$i 보다 느립니다. 이건 PHP에 한정된 이야기가 아니라 다른 언어에도 적용됩니다. ++$i  가 PHP에서 더 빠른 이유는 $i++는 4개의 opcode가 필요하지만 ++$i는 opcode가 3개가 필요합니다. 후위 증가 연산은 임시 변수를 생성한 후에 이걸 증가시키지만, 전위 증가 연산은 바로 원래의 값을 증가시키기 때문입니다. 이건 하나의 최적화로써 Zend’s PHP optimizer와 같은 것에는 적용이 되어있습니다. 이건 여전히 기억해봄직한 아이디어인데 꽤나 많은 ISP들은 코드 최적화 없이 작동하기 때문입니다.


추가적으로,


1. 함수 안 지역 변수의 증가가 제일 빠릅니다. 이건 그냥 지역 변수를 호출하는 것과 근사합니다.

2. 전역 변수 증가 연산은 지역 변수 증가 연산보다 2배 느립니다.

3. 객체 속성(예: $this->prop) 증가 연산은 지역 변수 증가 연산보다 3배 느립니다.

4. 정의되지 않은 변수에 대한 증가 연산은 정의된 변수에 대한 증가 연산보다 9~10배 느립니다.

14. Replace regex calls with ctype extension, if possible

Many scripts tend to reply on regular expression to validate the input specified by user. While validating input is a superb idea, doing so via regular expression can be quite slow. In many cases the process of validation merely involved checking the source string against a certain character list such as A-Z or 0-9, etc... Instead of using regex in many instances you can instead use the ctype extension (enabled by default since PHP 4.2.0) to do the same. The ctype extension offers a series of function wrappers around C's is*() function that check whether a particular character is within a certain range. Unlike the C function that can only work a character at a time, PHP function can operate on entire strings and are far faster then equivalent regular expressions.

view plaincopy to clipboardprint?

ctype_digit($foo);  

// is better than  

preg_match("![0-9]+!", $foo);  

14. 가능하다면 regex함수 호출을 ctype 확장으로 변경하세요.

많은 스크립트는 정표현식 사용자의 입력에 대하여 정규표현식으로 확인합니다. 입력값의 유효성을 정규표현식으로 체크하는 것은 꽤나 훌륭한 아이디어지만, 이게 꽤나 느릴 수 있습니다. 많은 경우 유효성 검사 연산에서 단지 이 문자열들이 A-Z, 0-9 같은 것으로 이루어져있는지를 체크하는데, regex를 사용하는 대신 ctype 확장을 이용하여 대체할 수 있습니다.(PHP 4.2.0 이상부터 사용이 가능합니다). ctype 확장은 C의 is뭐뭐뭐() 함수와 같은 기능을 제공하며 어떤 범위 내의 문자열로 작성되어있는지 검사합니다. C함수는 한 문자당 한 번 작동하지만, PHP함수는 문자열 전체를 검사할 수도 있고, 정규표현식에 비해서 훨씬 빠릅니다.


15. isset vs. in_array and array_key_exists

Another common operation in PHP scripts is array searching. This process can be quite slow as regular search mechanism such as in_array() or manual implementation work by iterating through the entire array. This can be quite a performance hit if you are searching through a large array or need to perform the searches frequently. So what can you do? Well, you can do a trick that relies upon the way that Zend Engine stores array data. Internally arrays are stored inside hash tables when they array element (key) is the key of the hashtables used to find the data and result is the value associated with that key. Since hashtable lookups are quite fast, you can simplify array searching by making the data you intend to search through the key of the array, then searching for the data is as simple as $value = isset($foo[$bar])) ? $foo[$bar] : NULL;. This searching mechanism is way faster then manual array iteration, even though having string keys maybe more memory intensive then using simple numeric keys.


15. isset vs in_array 와 array_key_exists

PHP의 일반적인 작업 중 하나라면 배열 검색입니다. 이 과정은 일반적인 배열 검색이나 in_array() 함수, 혹은 수동적으로 구현한 순환 검색기능을 통해 꽤나 느려지게 만듭니다. 만약 당신이 꽤나 큰 배열 통째로 이런 식으로 자주 검사한다면 성능에 꽤나 큰 타격을 입힐겁니다. 그럼 어째야 할까요? 젠드 엔진이 데이터를 저장하는 방식을 빌려서 해결할 수 있습니다. 내부적으로 배열들에 key를  hash table안에 저장 배열 요소(key)는 hash table의 key가 될 수 있습니다.hash table은 값을 찾기 위해 key를 이용하는데요.hashtable은 검색은 꽤 빠른 편이구요, 아마 당신은 의도한대로 key를 통해 데이터를 찾을 수 있을겁니다. 찾는 데이터는 간단하게 말하면  $value = isset($foo[$bar]))?$foo[$bar]:NULL; 과 같이 되는거죠. 이 탐색 메커니즘은 문자열로 된 key가 숫자로 된 key보다 메모리를 많이 먹음에도 불구, 배열 순회를 통해 결과를 얻는 것보다 빠를 겁니다.


view plaincopy to clipboardprint?

$keys = array("apples"=>1, "oranges"=>1, "mangoes"=>1);  

if (isset($keys['mangoes'])) { ... }  

 

// is roughly 3 times faster then  

 

$keys = array("apples", "oranges", "mangoes");  

if (in_array('mangoes', $keys)) { ... }  

 

// isset is also faster then  

if(array_key_exists('mangoes', $keys)) { ... }  

Note: However the lookup times don't diverge until you've got a very considerable amount of data in your array. e.g. If you have just 2-3 entries in your array, it will take more time to hash the values and perform the lookup than it would take to perform a simple linear search ( O( n ) vs. O( log n ) )


참고: 배열이 많은 데이터를 갖고 있다고 해서 배열의 연산량이 발산하진 않습니다. 예를 들자면 배열에 단지 2~3개의 항목이 있을 때,  간단한 선형 탐색이 hash table 검색보다 오래 걸릴겁니다( O(n) vs O(log n) )




16. Free unnecessary memory

Unset your variables to free memory, especially large arrays.


16. 필요없는 메모리를 해제하세요.

메모리 여유를 위해, 필요없는 데이터를 해제하세요. 특히 큰 배열이라면 더욱.


17. Specify full paths

Use full paths in includes and requires, less time spent on resolving the OS paths.

view plaincopy to clipboardprint?

include( '/var/www/html/your_app/database.php' );    

//is better than    

include( 'database.php' );   

Read more...


17. 절대경로로 명명하세요.

require에 절대 경로를 이용하는 것이 상대 경로를 이용하는 것보다 적은 시간을 소요합니다.

18. regex vs. strncasecmp, strpbrk and stripos

See if you can use strncasecmp, strpbrk and stripos instead of regex, since regex is usually slower.


18. regext vs strncasecmp, strpbrk and stripos

가능하다면 정규표현식보다 strncasecmp, strpbrk, stripos을 사용하세요. regex는 보통 느립니다.

19. str_replace vs. preg_replace vs. strtr

The str_replace is better than preg_replace, but strtr is better than str_replace by afactor of 4.


19. str_replace vs preg_replace vs strtr

str_replace함수가 preg_replace 보다 성능이 좋습니다. 그러나 strtr은 str_replace보다 4배 정도 빠릅니다.

20. select vs. multi if and else if statements

It’s better to use select statements than multi if, else if statements.


20. select vs 다중 if - else if 문

select를 쓰는게 다중 if 문을 쓰는 것 보다 낫습니다.

view plaincopy to clipboardprint?

switch( $name )  

 {  

  case 'aaa':  

  // do something  

  break;  

 

  case 'bbb':  

  // do something  

  break;  

 

  case 'ccc':  

  // do something  

  break;  

 

  default:  

  // do something  

  break;  

 }  

 

 // is better than  

 

 if( $name == 'aaa' )  

 {  

  // do something  

 }  

 else if( $name == 'bbb' )  

 {  

  // do something  

 }  

 else if( $name == 'ccc' )  

 {  

  // do something  

 }  

 else  

 {  

  // do something  

 }  

Read more...


21. Error suppression with @ is very slow

view plaincopy to clipboardprint?

$name = isset( $id ) : 'aaa' : NULL;    

//is better than    

$name = @'aaa';   

Read more...

21. @로 에러문을 무시하는건 몹시 느려요.


22. Boolean Inversion

Most of the time, inverting a boolean value is as simple as using the logical ‘not’ operator e.g. false = !true. That’s easy enough, but occasionally you might find yourself working with integer-type booleans instead, with 1s and 0s in the place of true and false; in that case, here’s a short PHP snippet that does the same thing:


22. 불대수 반전

많은 경우에,  불대수의 값을반전할 때 not 연산을 하는 것이 제일 간단하다. 저 방법도 충분히 쉬운데, 때때로 정수값과 불대수를 혼동해서 사용하는 경우가 있을 것이다(1 = true, 0 = false). 이런 경우에, 동일한 역할을 수행하는 php 코드 조각을 제시한다.


view plaincopy to clipboardprint?

$true = 1;  

$false = 1 - $true;  

$true = 1 - $false;  

The same principle can be used any time you want to toggle an integer between two values e.g. between 2 and 5:

위의 원리는 아래의 소스와 동일한 원리이다.

view plaincopy to clipboardprint?

$val = 5;  

$val = 7 - $val; // now it's 2...  

$val = 7 - $val; // and now it's 5 again  


23. isset($var, $var, …)

Useful little thing, this - you can check the state of multiple variables within a single PHP isset() construct, like so:


23. isset($var, $var, …)

제법 유용한 건데, 여러개의 변수를 isset()함수를 통해 한 번에 체크할 수 있다.

view plaincopy to clipboardprint?

$foo = $bar = 'are set';  

isset($foo, $bar); // true  

isset($foo, $bar, $baz); // false  

isset($baz, $foo, $bar); // false  

On a related note, in case you’re not already aware of this, isset actually sees null as being not set:

이것과 관련해서, 당신이 이것을 모를 경우에 대해, isset은 NULL과 할당이 되지 않음을 동일히 본다.

view plaincopy to clipboardprint?

$list = array('foo' => 'set', 'bar' => null);  

isset($list['foo']); // true, as expected  

isset($list['bar']); // false!  

In situations like the above, it’s more reliable to use array_key_exists().

위와 같은 경우에는 array_key_exists()를 사용하는 것이 좀 더 안정적이다.


24. Modulus Operator

During a loop, it’s a fairly common need to perform a specific routine every n-th iteration. The modulus operator is extremely helpful here - it’ll divide the first operand by the second and return the remainder, to create a useful, cyclic sequence:


24. 나머지 연산자.

반복문 구동 중에, 특정한 루틴이 n 번째의 구동 중에 필요할 경우가 종종 있다. 나머지 연산은 이럴 때 굉장히 쓸만하다. -  이건 첫 번째 연산을 나눈 뒤에 나머지를 반환합니다. 반복 구문을 쓸모있게 만들어봅시다.

view plaincopy to clipboardprint?

for ($i = 0; $i < 10; ++$i)  

{  

   echo $i % 4, ' ';  

}  

// outputs 0 1 2 3 0 1 2 3 0 1  


25. http_build_query

This function turns a native array into a nicely-encoded query string. Furthermore, this native function is configurable and fully supports nested arrays.


25. http_build_query

이 함수는 잘 인코딩된 쿼리 스트링을 기본 배열로 돌려줍니다. 게다가, 이 기본 함수는 중첩 배열을 완벽하게 지원합니다.

26. <input name="foo[bar]" />

HTML + PHP are quite capable of handling form fields as arrays. This one’s particularly helpful when dealing with multiple checkboxes since the selected values can be automatically pushed into an indexed (or associative) array, rather than having to capture them yourself.


26. <input name=”foo[bar”] />

HTML + PHP 조합은 배열로 form의 field들을 괜찮게 다룰 수 있습니다. 위와 같이 설정하는 것은 다중 체크박스를 할 때 인덱스(나 연관) 배열로 반환하기 때문에 훨씬 편하게 쓸 수 있습니다.


27. get_browser()

Easily get your hands on the users browser-type. Some leave this process to the browser end but can be useful to get this info server side.


27. get_browser()

손쉽게 유저의 브라우저 타입이 뭔지 알 수 있습니다. 어떤 브라우저는 이 프로세스를 종료할 때 처리하지만, 서버에선 여전히 유용한 정보 획득 수단입니다.

28. debug_print_backtrace()

I use this one a lot, print a debug-style list of what was called to get the the point where this function is called.


28. debug_print_backtrace()

저는 이것을 꽤 많이 사용하는데, 이 함수가 호출된 위치를 디버깅 스타일로 출력해줍니다.


29. Automatic optimization for your database

Just like you need to defrag and check your file system, it’s important to do the same thing with SQL tables. If you don’t, you might end up with slow and corrupted database tables.


Furthermore, you will probably add and delete tables from time to time. Therefore, you want a solution that works no matter how your database looks like. For this, you can use this PHP script that finds all your tables, and then perform Optimize on every single one. Then a good idea can be to do this every night (or whenever your server is least accessed) with “cron” because you don’t want to delay your surfers to much.


29. 데이터베이스 자동 최적화 하기

파일 시스템을 조각 모음하고 체크하는 것을 좋아한다면, 이것은 SQL 테이블에서도 같은 역할을 수행하는 중요한 일입니다. 만약 당신이 그렇지 않다면, 당신의 데이터베이스는 결국 느리고 박살나겠지요.


게다가, 당신이 테이블을 매번 추가하거나, 삭제해서 DB의 모양이 어떻게 되건  당신이 원하는 모양으로 솔루션이 작동되길 바라겠죠.  이것을 위해, 당신은 PHP 스크립트를 이용하여 최적화를 통해 모든 테이블을 찾아가 하나씩 명령을 처리하고 있습니다. 그렇다면 당신이 매일밤 ‘크론’을 통해 수행할 수 있는 좋은 방법이 있습니다. (왜 크론을 쓰냐면 당신을 방해하고 싶지 않아서지요)

view plaincopy to clipboardprint?

dbConnect()  

$tables = mysql_query("SHOW TABLES");  

 

while ($table = mysql_fetch_assoc($tables))  

{  

  foreach ($table as $db => $tablename)  

  {  

      mysql_query("OPTIMIZE TABLE '".$tablename."'")  

          or die(mysql_error());  

  }  

}  



30. require() vs. require_once()

Use require() instead of require_once() where possible.


30. require() vs require_once()

가능하다면 require_once 대신아 require 함수를 사용하세요.


Read more...


31. Check System Calls

A common mistake with Apache


31. 시스템 호출을 확인하세요

보통 아파치에서 가장 많이 하는 실수입니다.

view plaincopy to clipboardprint?

/usr/sbin/apache2 -X &  

strace -p 16367 -o sys1.txt   

grep stat sys1.txt | grep -v fstat | wc -l  

...  

index.html (No such file or directory)  

index.cgi  (No such file or directory)  

index.pl   (No such file or directory)  

index.php ...  

Fix DirectoryIndex

디렉토리 인덱스를 수정하세요.

view plaincopy to clipboardprint?

<Directory /var/www>  

   DirectoryIndex index.php  

</Directory>  


32. Secure HTTP connections

You can force a secure HTTP connection using the following code,

view plaincopy to clipboardprint?

if (!($HTTPS == "on")) {  

  header ("Location: https://$SERVER_NAME$php_SELF");  

  exit;  

}  


33. Avoid magic like __get, __set, __autoload

_get() and __set() will provide a convenience mechanism for us to access the individual entry properties, and proxy to the other getters and setters. They also will help ensure that only properties we whitelist will be available in the object. This obviously carries a small cost. Also, __autoload will affect your code more less in the same way as require_once.


33.  __get, __set, __autoload와 같은 사술을 피하라.

__get() 과 __set()  개별 항목의 속성을 접근하거나, 다른 getter나 setter를 대신하는데 꽤나 편리한 방식을 제공한다. 이것들은 언제나 우리가 이 변수를 사용해도 되는지, 화이트리스트같이 확신을 제공해주기도 합니다. __autoload보다 __get, __set이 적은 비용을 소모하지만, 소모한다는 사실은 붕명하며 당신의 코드에 require_once와 같은 방식으로 적은 영향을 미칠 것입니다.

References

[1] Here it is. 8 randomly useful PHP tricks. http://theresmystuff.com, 2010.


[2] TJS. 5 useful (PHP) tricks and functions you may not know. http://www.tjs.co.uk, 2010.


[3] Checkmate - Play with problems. Optimize your PHP Code - Tips, Tricks and Techniques. http://abcphp.com, 2008.


[4] iBlog - Ilia Alshanetsky. PHP Optimization Tricks. http://ilia.ws, 2004.

Posted by TY
,

정말 자주쓰지만 매번 구글에 get radio checked   라고 검색하게 만드는 이 기능이 갑갑해서 블로그에 기록하는 겸 써놓는다.


소스가 아래와 같을 때 


        <h5> 푸시 발싸</h5>

        <label class="radio">

          <input type="radio" name="targetSelect" id="sendAll" value="option1" checked>

            전체 발송

        </label>

        <label class="radio">

          <input type="radio" name="targetSelect" id="sendiOS" value="option1" >

            iOS 대상 

        </label>

        <label class="radio">

          <input type="radio" name="targetSelect" id="sendAndroid" value="option1" >

            Android 대상

        </label>

        <label class="radio">

          <input type="radio" name="targetSelect" id="sendTarget" value="option1" >

            특정 사용자 UID (... , ... , ... 로 입력)

        </label> 



jQuery에서 아래와 같은 방식으로 선택된 객체를 얻어올 수 있다



 $("input[name=targetSelect]:checked")



그냥 오늘도 검색하고 넘어갈라 그랬는데 구글 첫 페이지에 있는 글이 문법이 틀려서 console에서 실행이 안되서 짜증나서 써봄. 

Posted by TY
,

Linux에서는 below 1024(1024 아래) 밑의 포트들을 root가 아닌 권한인 유저들이 여는 것을 허용하지 않는다


이것 땜에 좀 문제가 있었는데, 2가지 해결 방법이 있다.


1. iptables에서 port fowarding을 해준다.

reroute를 통해서 8080을 80으로 포워딩해주는 방법이 있다.

(root 권한에서 실행)

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080


2. authbind를 설치한다.

 authbind는 debian 패키지에 있는 1024 이하의 포트들을 root가 아닌 유저들이 열 수 있게 하는 것. 사실 나도 1번이 하기 싫어서 찾아보다가 이번에 처음으로 알게 되었다.


원래대로 서비스에 설치해서 쓰는거면 /etc/init.d/tomcat* (해당버전)에 들어가서 authbind 를 YES인가 OK로 설정하면 되는데, 나는 서비스에 설치해서 안쓰니까..험난하다


우선 authbind를 설치한 다음에.. 80포트를 접근 가능하게 바꿔준다. 백형 블로그 참고했다

http://www.2ality.com/2010/07/running-tomcat-on-port-80-in-user.html


ㄱ. authbind를 설치

ㄴ. root 로 authbind 폴더에 쓸 포트(80)을 chown으로 쓸 계정에 줌. 이 백형은 glassfish를 쓰지만 난 촌스럽게 톰캣 쓰므로 톰캣으로 간다

* ipv6은 지원안한다는데, 음.. 아직 신경쓰지 않기로 했다. nginx경우에는 신경을 좀만 쓰면 되지만, 이 놈은 아닌 듯. 그렇다고 톰캣을 root로 올릴 순 없잖음...

ㄷ. setenv.sh 에 CATALINA_OPTS에 IP4stack   쓴다고 설정

ㄹ. startup.sh에 authbind를 통해 구동하게 강제로 바꿈


되나 확인해보면 됨

Posted by TY
,

지금은 i-pin 시대! 라는걸 증명하듯 핸드폰 실명 인증 / 아이핀 인증 적용 작업을 하고 있는데..  나이스..어쩌구에서 api를 받아서 하고있다. 기존의 inicis와는 상대도 되지 않는 끔찍한 i-pin과 휴대폰 인증. 암호화/복호화 라이브러리가 바이너리로 되어있어서 php에서 일말의 호출도 없이 그냥 문자열이 변환된다. 오오 신기해 오오. 대체 어떻게 하는건지 모르겠다. 어떻게하는거죠... 알면 python으로 변환해서 썼을텐데. 생각하기도 싫고 알수도 없어서 그냥 cli로 하기로...



우선 처리 과정을 순서대로 써보자.


1. 실명인증 메일이 왔습니다. 증

 라이브러리는 php / asp / jsp / .net 밖에 지원을 안한다고 하네요. 이런 코딩 후진국. 왜 안 python요! 이러니까 내가 맨날 사람들이 물어보면 그냥 php나 jsp로 짜라고 하잖아. 이런 문제 생길까봐 아오. 

 어쨌든 그래서 저의 오랜 친구 php와 함께 하기로 했어요. php_cli만큼 만만한게 없잖아요. (사실은 서버는 ubuntu라 asp, .net은 이미 아웃이고 jsp는 java 셋팅할 생각을 하니 뭔가 머리가 아파서 칼포기, 그래서 남은게 php)


2. 소스를 봤습니다.

 엣헴..이게 뭔소린가..

어쨌든 클라에서 무언가 값을 생성해줘서 서버에 던져주는데 내용은 뭣도 없는게 실행할때마다 encryption 된 내용물이 바뀌어서 너무 신기. 근데 이걸 자체 생성하고 막 그러길래. echo 찍어서 php_cli 로 받아오는 처리를 함. 그리고 그거랑 똑같은 form 은 django template에 걍 넣어서 쏨. 아 잘가네여


3. 결과를 받고 싶다

 오랜만에 보는 csrf 문제.. 그냥 가벼운 마음으로 csrf_exempt를 하기로 하고 패스.

 그리고 그냥 결과를 아무 생각없이 받았더니 노란 django 에러 화면이 딱. 워메 이건 안됭...


 그래서 결과 받기 소스를 보니 이것도 복호화를 해줘야 하는 것. 


 $_POST 로 암호화 안되서 받아올 수 있는건 그냥 받아와서 view딴에서 처리, 암호화 된 데이터는 또 결과 띄워주는 샘플 소스를 뜯어서 내맘대로 변형 ^^7


 그런데 보다보니 session으로 validation check를 하는데.. 

http://stackoverflow.com/questions/4500240/php-cli-session-warnings

http://stackoverflow.com/questions/5117816/php-session-recreate-cli


위의 두 개의 문서를 참고하면 도움이 될 듯하다. 내가 어떻게 했는지는 비밀--; 부끄러워서 못말하겠다.


어쨌든 그 예외처리를 하니.. 어맛.. 이건 python에서나 보던거잖아? 

\xc0\xe5\xc5\xc2\xbf\xb5 (... 내 이름임 --; )


자 그럼 이걸 어떻게할까여. 저는 프론트엔드랑 친하지 않아서 이걸 어떻게 해야할지 모르겠어여 예전에 군대에서 할 때의 온갖 기억을 동원해서 decoding을 시도.


여기서 왜 디코딩을 하냐고 묻는 사람이 있을 수 있는데, 난 그냥 이거 json으로 넘겨줄라고 한거임. 별 악의 없음..--; 

그런데 이게 안됨. iconv도 안되고, urldecode도 안됨. 예전 우리 와우 길드 주제가를  들으면서 멘붕을 했음. (옛날 우리 와우 길드 주제가: http://www.youtube.com/watch?v=8QZo5Ji43u8 )아 진짜 난 어쩌라고... 란 생각을 하면서 했음.


그러면서 구글에 열심히 검색을 하다 깨달음. 난 맨날 검색어를 영어로 치기 때문에 한국어 인코딩 문제 따위를 찾을 수 없었던 것이었다! 인도새끼들은 이런거 안하나? 쪽바리들은? 으아! (이걸 깨닫는데 30분 걸림--;;) 어쨌든 그래서 네이버에 열심히 검색. 알 수 없는 자바스크립트 유니코드 변환기만 한가득. 거기다 넣어봄. 안되잖아? 으아.


어쨌든 이런저런 과정을 거쳐서 생각하다가 rawurleoncde 함수가 생각남. 


$name = rawurlencode(iconv("CP949","UTF-8",$name));


그래서 이런 더러운 과정을 거쳐서 한글로 변환해줌. 왜 대체 php에서 걍 unicode를 인식을 못하는걸까 고민했는데, 아마 암호화해서 넘겨줘서 인자로 받은거에 대해 decoding을 거치지 않고 들어와서 그런듯 함.


그래서 잘 쑤셔넣었더니..


%EC%9E%A5%ED%83%9C%EC%98%81


이런 좋은 값이 나옴 ^^7 행복하당.


오늘 이거 하느라 KG모빌리언스에서 받은 문자만 30개가 넘는다. 이새끼들은 왜 자꾸 번호를 바꾸는거야 지우기 힘들게 -_- 




Posted by TY
,

개발환경

HW: Apple Macbook Pro 13" early 2011 (i7@2.7 / 4g / intel graphic)

OS: Mac OSX 10.8.2 (mountain lion)

IDE: Eclipse Juno

JDK: 1.6

 


이미지 몇 백장을 리사이즈하고 앞으로 이 일이 반복될 것 같은 끔찍한 느낌이 들어서 걍 만듬..


ImageIcon 으로 리사이징된 이미지를 리턴해줌... 소스코드는 메인이랑 함수 딸랑 하나 있는 클래스랑..  끝임.


원래 할라고 했던 것들은..


1. 처음에 구동하면 최대 width * height 적어줌 (width나 height중 원본 사이즈와 비교해서 원본대비 더 큰 것에 맞춰서 비율을 맞춰서 줄여줌..)

2. 다이얼로그 박스가 떠서 디렉토리를 선택

3. 프로그레스 바와 로그 텍스트가 나와서 얼마나 됐고 무슨 이미지들을 바꿨는지 찍어줌 


근데 귀찮아서

width*height는 그냥 함수 인자로 넣고 / 경로도 걍 소스에 string에 대입하고 / 어떤 파일 리사이징 됫는지 콘솔창에 찍힘 


근데 다시 고칠라나? 귀찮을듯.. 나중에 심심하면 할듯 --;


자바로 짠 이유는 노트북에 obj-c랑 java랑 python이 깔려있는데 마침 eclipse를 켜놨었음..


ImageResize.java


import java.awt.Graphics2D;

import java.awt.geom.AffineTransform;

import java.awt.image.BufferedImage;

import java.io.File;


import javax.imageio.ImageIO;

import javax.swing.ImageIcon;



public class ImageResize {

public static ImageIcon resizeImage(String fileName, int maxWidth, int maxHeight){

String data = fileName;

BufferedImage src, dest;

ImageIcon icon;

try{

src = ImageIO.read(new File(data));

int width = src.getWidth();

int height = src.getHeight();

if(width > maxWidth){

float widthRatio = maxWidth/(float)width;

width = (int)(width*widthRatio);

height = (int)(height*widthRatio);

}

if(height > maxHeight){

float heightRatio = maxHeight/(float)height;

width = (int)(width*heightRatio);

height = (int)(height*heightRatio);

}

dest = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics2D g = dest.createGraphics();

AffineTransform at = AffineTransform.getScaleInstance((double) width / src.getWidth(), (double)height / src.getHeight());

g.drawRenderedImage(src, at);

icon = new ImageIcon(dest);

return icon;

}catch(Exception e){

System.out.println("This image can not be resized. Please check the path and type of file.");

        return null;

}

}

}




Main.java


import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;


import javax.imageio.ImageIO;

import javax.swing.ImageIcon;



public class Main {


/**

* @param args

* @throws IOException 

*/

public static void main(String[] args) throws IOException {

String path = "/Users/TY/Dropbox/사진/";

File dirFile = new File(path);

File [] fileList = dirFile.listFiles();

for(File t:fileList){

String tmpPath = t.getParent();

String tmpFileName = t.getName();

int extPosition = tmpFileName.indexOf("jpg");

if(extPosition != -1){

String fullPath = tmpPath+"/"+tmpFileName;

ImageIcon ic = ImageResize.resizeImage(fullPath, 1024, 1024);

Image i = ic.getImage();

BufferedImage bi = new BufferedImage(i.getWidth(null), i.getHeight(null), BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = bi.createGraphics();

g2.drawImage(i, 0, 0, null);

g2.dispose();

String newFileName = tmpFileName.replaceFirst(".jpg", "_resize.jpg");

String newPath = tmpPath+"/"+newFileName;

ImageIO.write(bi, "jpg", new File(newPath));

System.out.println(newPath);

}

}

System.out.println("FIN");

}

}





Posted by TY
,

mysql에서 가끔 보면 PK가 아닌 부분에서 indexing을 걸지않고 내부에서 indexing 역할하는 변수를 만드는데 이빨빠지는 경우가 많다 (잦은 경우에 많이 일어난다. 예를 들어서 특정 사용자별로 ordering을 줘야할 때 따로 order같은데서 남길 필요가 없는 데이터라서 날릴 때 이빨이 빠지게 된다)


이게 한 두개면 그냥 console에서 업데이트를 박아버리던가 할텐데 이게 양이 늘어나면 무지막지하게 귀찮으며 비효율적이다. 프로그래머가 병목자원이라 불리는 이 시대에 이딴 짓을 할 시간이 어디있겠는가.


이럴 때 방금 전에 올린 글  http://oddly.tistory.com/68 을 보면 변수를 선언해서 사용하는데 이걸 좀 응용해봤다


Table student 가 column 이 name, score, rank 가 있을 때


Hwangho / 70 / 1

Minho / 50 / 2

Changho / 40 / 3

Yeonho / 30 / 4

Hyunho / 10 / 5


같은 식으로 있는데 Minho가 빠져버리면 1,3,4,5로 이빨이 빠져버리는데.. 이럴 때 DB에서 싸그리 처리를 하려면..


SELECT @rank:=0;

UPDATE student SET rank=@rank:=@rank+1 ORDER BY rank


이런식으로 하면 1,2,3,4로 다시 이쁘게 들어간다


생각보다 이런 걸 쓸일이 많으므로 숙지해두는게 좋을 것 같다.

Posted by TY
,

table test 의 column이


name, score가 있다고 할 때


John / 50

Matthew / 40

Cain / 70


일 때 


select @rownum:=@rownum+1 as num, t.* from test t, (SELECT @rownum:=0) r 


로 하면 


num/name/score


1 / John / 50

2 / Matthew / 40

3 / Cain / 70


로 되고


select @rownum:=@rownum+1 as num, t.* from test t, (SELECT @rownum:=0) r  ORDER BY score DESC


로 하면


1 / Cain / 70

2 / John / 50

3 / Metthew / 40


로 나온다

Posted by TY
,

여태까지 세팅한 서버가 2-30대 되는거같은데 맨날 세팅할 때마다 인터넷 찾아보기도 귀찮고 물어보는 사람도 많아서 귀찮아서 걍 정리해서 올림


이건 대학 과제도 아니고 주는 것도 없으므로 음슴체..-_-


1. 생성

귀찮으니까 네이버 블로그에 과제 땜에 썼던 걸로 대체

http://torisdream.blog.me/20165825658


2. apache설치

sudo apt-get install apache2


2-1. apache2 utf-8로 세팅 [할 이유가 전혀 없지만]

 cd /etc/apache2/conf.d/

 cat charset


내용을 보고 다른 문자열로 세팅되어 있을 경우 주석 지우고 바꿔줌. 아닐 경우 걍 생략


2-2. apache2 port설정

cd /etc/apache2/

cat ports.conf


내용을 보고 Listen과 VirtualHost쪽에 포트 확인인

보통 80일거임


SSL포트는 443이 기본


2-3. 홈폴더 설정

cd /etc/apache2/sites-availables/

vi default


DocumentRoot 이 홈 디렉토리임

권한 문제가 있기 때문에 sudo로 수정해 줄 것


기본은 /var/www로 되있을거임


3. php 설치

sudo apt-get install php5


3-1. php 잘 되었나? 테스트


cd /var/www/

* index.html 이 거슬린다면 지운다


sudo vi index.php

<?php

phpinfo();

?>


뭔가 보라딩딩한거 나오면 잘 깔린거


3-2. php-mysql 깔기 (목적 mysqli를 쓰고 싶다)

sudo apt-get install php5-mysql

sudo /etc/init.d/apache2 restart


아까 보라딩딩한거에서 새로고침해서서 mysqli 검색해서 나오면 잘 깔린거


3-3. mcrypt 깔기기

sudo apt-get install php5-mcrypt

sudo /etc/init.d/apache2 restart


다시 보라딩딩한거 새로 고침해서 mcrypt 검색해서 나오면 잘 깔린거


4. mysql 설치

sudo apt-get install mysql-server mysql-client


보라딩딩한 화면에서 패스워드를 입력하려고 한다

꼴리는대로 칠 것


4-1. 잘되었나? 확인해보자

mysql -u root -p 

접속 잘됨?


exit로 빠져나오셈

친절하게 Bye도 나옴

가끔 이걸 바꾸고 싶다는 생각이 들 때가 있지만 영 귀찮아서 알아보지도 않음


4-2. 유니코드 세팅(한글이 되게 하자)


cd /etc/mysql

ls -l | grep my.cnf


없냐? 그럴리 없다능..

일단 기존거 백업부터 해놓자

sudo cp my.cnf my.cnf.old


여기부터는 조금 복잡함

mysql restart했는데 뻑나면 my.cnf.old로 복구시키고 다시 수정하고 이러길 바람 이거 뻑나면 오도가도못함 디비 접속도 못하고 서버도 안올라감. 그래서 백업하라고 하는 거임


근데 한두번 해봤으면 뻑나기도 힘듬


http://oddly.tistory.com/60


여기 2부터 따라할 것. 링크 누르기 귀찬흐면 아래꺼 볼 것

[mysql] 이런 대분류가 있는데 그 아래 추가하란거임


[mysqld]

character-set-server=utf8

collation-server=utf8_general_ci


init_connect=SET collation_connection=utf8_general_ci

init_connect=SET NAMES utf8

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8


대충 이런거임


나는 별 지장 없어서 안하고 innodb폴더를 통째로 떠서 관심없는데 dump뜨는걸로 증분백업하는 사람들은

[mysqldump]에도 default-character-set을 지정해줘야함



다 했으면 mysql 껐다켜보기

mysql stop/waiting

start: Job failed to start


이렇게 뜨면 망한거임


대체 왜망했죠 


라고 하면 가끔 물어보는 사람들이 있는데

제발 복사 붙여넣기 해라 지네가 따라쳐서 오타내놓고 안된다고 난리치고 그러지좀 말고  한글자라도 틀리면 서버 안올라간다


어쨌든 저거 나오게 할라고 고의적으로 오타 한 번 내봄 ㅎㅎ;


5. svn 자동 업데이트 파일


벌써부터 느껴지는 왜 svn을 쓰냐는 geek님들의 눈총이 느껴지는데

저는 bitbucket과 github를 애용한다구여

그냥 사정상 svn을 쓸 일이 다 있는거임

왜냐면 난 힘없는 개발자니까....


난 CUI별로 안좋아해서 GUI tool 꼭 써야겠는데, osx라서 곤란함.


나도 돈내고 cornerstone사서 쓰는거 싫음

나도 무상 github client나 sourcetree같은거 쓰고 싶은데


뭐 세상이 제맘대로 되나여 ㅎㅎ


5-1. svn client 설치

sudo apt-get install subversion


http://www.brightlemon.com/blog/checkout-svn-php


요거 보고 참고해서 만드세여


페북이나 네톤으로 요청하면 제꺼드림 ㅎㅎ



Posted by TY
,

php에서 getimagesize함수를 이용할 경우 이미지에 대한 정보를 얻어올 수 있다.

http://php.net/manual/en/function.getimagesize.php


하지만 reference에 영어로 써있다. (사실 읽기도 귀찮음)


간단한 설명을 붙이자면


$info = getimagesize($filepath)

와 같은 방식으로 이루어져있다. 


$filepath에 이미지의 경로를 주고, $info에서 이미지에 대한 정보를 얻어온다.


Array ( [0] => 1280 [1] => 800 [2] => 3 [3] => width="1280" height="800" [bits] => 8 [mime] => image/png )



이런 식으로 얻어오게 되는데 설명은 다음과 같다.


0: width

1: hieght

2: ?

3: width와 height의 크기를 문자열로(아마 img 태그에 그냥 박으라고 주는 것 같다)

bits: 비트 수 

mime: mime type(아마 이미지 종류를 판별하기 위해 필요한 듯 하다)


2번은 모르겠는데


Index 2 is one of the IMAGETYPE_XXX constants indicating the type of the image.


라고 써있다. 그냥 무시하기로 결심했다.

Posted by TY
,

* 해당 글은 raphaeljs.com 의 글을 번역한 것이며, 어떠한 수익, 영리적 목적이 없습니다. 라파엘JS 측으로부터 공식적인 허가를 받았음을 알립니다.

* 라파엘의 공식 홈페이지는 http://raphaeljs.com/ 이곳이며, Raphael JS는 이하 '라파엘'로 통칭하겠으며, 특별히 영문 풀네임을 써야 하는 경우에만 이용하겠습니다.

 

* 개인 계정에 소스를 포킹해서 올릴까 했지만, 트래픽 용량이 걱정되어 그만두었습니다. 원 사이트와 양식이 다를테니, 원 사이트를 참조하시며 보는 것을 추천합니다.

 

* 이전 글 리스트

 

2012/08/06 - [My study/Web] - [Raphael JS] Raphael JS 번역 1 - 메인 페이지

 

Animation

 

Animation.delay(delay)


 기존에 생성된 애니메이션 객체에 다른 지연시간(delay)을 주어 생성한다.

 

인자

 

 

인자명 

자료형 

설명 

 delay

number 

애니메이션의 시작으로부터 실제 애니메이션이 시작되기까지의 지연시간 설정. 단위는 ms(mili  second, 1/1000 초)로 설정한다. 

 

반환형

 

 

 반환형

 설명

 object

 새로 생성된 애니메이션 객체를 반환한다.

 

예제 소스

 

var anim = Raphael.animation({cx: 10, cy: 20}, 2e3);
circle1.animate(anim); // 애니메이션이 즉각 실행되도록 설정한다

circle2.animate(anim.delay(500)); // 애니메이션이 500ms 이후에 실행되도록 설정한다

 

Animation.repeat(repeat)

 

  기존에 생성된 애니메이션 객체에 반복 회수를 주어 생성한다.

 

인자

인자명

자료형

설명

repeat

number

 애니메이션이 반복될 횟수를 지정한다. 무한 반복되게 설정하려는 경우 인자에 Infinity를 패스하도록 한다.

 

반환형

 

반환형

설명

object

새로 생성된 애니메이션 객체를 반환한다.

 

Element

Element.animate(...)


인자(속성)에 맞는 애니메이션을 생성하고, 시작하게 한다.

 

인자

 

인자명

자료형

설명

params

objects 

넘어오는 Element(가 object로 넘어온다는 뜻)의 마지막 속성을 가져온다. Element.attr 참조

ms

number 

애니메이션의 재생 시간 (단위: ms)

easing

string 

완화되는 방식을 선택한다. Raphael.easing_formula 의 멤버 중 하나나, CSS 포맷인 cubic-bezier(xx, xx, xx, xx) 방식을 사용할 수 있다.

callback

function

애니메이션이 끝날 때 호출될 콜백 함수를 지정한다.

혹은

animation

object 

애니메이션(Raphael.animation) 객체

 

반환형

 

반환형

설명

object

생성된 객체

 

Element.animateWith(...)


Element.animate 랑 비슷하게 작동하지만, 지정된 애니메이션들이 동시에 시작하는 것을 보장한다.

 

인자

인자명

자료형

설명

el

objects

동기화할 원소

anim

objects

동기화할 애니메이션

params

objects

넘어오는 Element(가 object로 넘어온다는 뜻)의 마지막 속성을 가져온다. Element.attr 참조

ms

number

애니메이션의 재생 시간 (단위: ms)

easing

string

완화되는 방식을 선택한다. Raphael.easing_formula 의 멤버 중 하나나, CSS 포맷인 cubic-bezier(xx, xx, xx, xx) 방식을 사용할 수 있다.

callback

function

애니메이션이 끝날 때 호출될 콜백 함수를 지정한다.

혹은

element

objects

동기화할 원소

anim

objects

동기화할 애니메이션

animation

object

애니메이션(Raphael.animation) 객체

반환형

반환형

설명

object

생성된 객체

 

Element.attr(...)


원소의 속성을 설정한다

 

인자명

자료형 

설명 

 attrName

string 

속성명 

 value

 string

속성값

혹은 

 params

 object

 속성값을 K-V(key-value)형태로 객체로 전달. (attrName, value)

혹은 

 attrname

 array

 속성명

혹은 

attrNames 

 array

 속성명들, 이 경우에는 주어진 이름들에 대한 속성값들을 반환한다

 

반환형

반환형

설명

object

속성명과 속성값이 전달된 원소를 반환

 

반환형

설명

...

속성명(attrName)만 인자로 넘겼을 경우, 그 속성명(attrName)에 해당되는 속성값만 반환

 

반환형

설명

array

attrnames로 속성명들을 여러개 넘겼을 때, 그 속성명들에 대한 값을 반환

 

반환형

설명

object

아무 인자도 넣지 않았을 때, 속성 객체를 반환

 

가능한 인자들

* SVG 명세서를 참고하면 해당 인자들을 좀 더 쉽게 이해할 수 있다(http://www.w3.org/TR/SVG/styling.html)

 

 

 인자명

자료형 

설명 

 arrow-end

 string

 path의 마지막에 화살표 머리를 든다. 다음과 같은 형식으로 설정한다.  <타입>[ -<두께>[-<길이>]]]
타입: classic, block, open, oval, diamond, none
두께: wide, narrow, midium
길이: long, short, midium

 clip-rect

 string

콤마(,) 나 스페이스로 분류된다. x,y,가로,세로 와 같은 방식으로 정의. 

 cursor

 string

css 의 커서 타입 

 cx

 number

원이나 타원의 x축 중심 좌표 

 cy

 number

원이나 타원의 y축 중심 좌표

 fill

 string

색이나, 그라디언트나 이미지  

 fill-opacity

 number

fill의 농도 

 font

 string

 

 font-family

 string

 

 font-size

 number

글씨 크기(단위: 픽셀) 

 font-weight

 string

 

 height

 number

 

 href

 string

어떤 원소를 하이퍼링크처럼 쓰고 싶을 때, URL을 입력 

 opacity

 number

 

 path

 string

SVG path 스트링 포맷 

 r

 number

원, 타원, 가장자리가 둥그런 렉트의 반지름 

 rx

 number

 타원의 수평 반지름 

 ry

 number

 타원의 수직 반지름

 src

 string

 Element.image 원소에서만 작동하는 이미지 주소

 stroke

 string

 스트로크 색상

 stroke-dasharray

 string

 [“”, “-”, “.”, “-.”, “-..”, “. ”, “- ”, “--”, “- .”, “--.”, “--..”]

 stroke-linecap

 string

 [“butt”, “square”, “round”]

 stroke-linejoin

 string

 [“bevel”, “round”, “miter”]

 stroke-miterlimit

 number

 

 stroke-opacity

 number

 

 stroke-width

number 

 스트로크의 두께(단위: 픽셀), 기본값은 1

 target

string

 href를 이용할 경우 사용

 text

 string

 text원소의 내용. \n 을 멀티라인을 구현할 때 쓸 수 있다.

 text-anchor

 string

 [“start”, “middle”, “end”], 기본값은 “middle

 title

 string

 툴팁에 표시될 제목

 transform

 string

 Element.transform 참조

width 

 number

 

 x

 number

 

 y

 number

 

 

그라디언트

 

선형 그라디언트 표현 형식: "<각도> - <색깔>[-<색깔>[:<비율>]]*-<색깔>"

예시) (90도 각도로 흰색에서 검은색으로 바뀌는 그라디언트) "90-#fff-#000"

         (0도 각도로 흰색에서 20%지점까지 빨간색이 되다가 검은색으로 바뀌는 그라디언트) "0-#fff-#f00:20-#000"

 

광선(각도)형 그라디언트 표현 형식: "반지름[(<x가중치>, <y가중치>)]<색깔>[-<색깔>[:<비율>]]*-<색깔>"

예시) (흰색에서 검정색으로 0.25, 0.75 지점에서 바뀌는 그라디언트) "r[0.25, 0.75]#fff-#000"
* x가중치와 y가중치는 0과 1 사이이며, 원 혹은 타원에만 적용 가능

 

경로 문자열

 

http://www.w3.org/TR/SVG/paths.html#PathData 를 참고. 모두 지원함.

 

색 파싱 방법

 

  • 색 명칭 (“red”, “green”, “cornflowerblue”, 등)
  • #••• — 짧은 HTML 색상 표시: (“#000”, “#fc0”, 등)
  • #•••••• — 긴 HTML 색상 표시: (“#000000”, “#bd2300”)
  • rgb(•••, •••, •••) — rgb 채널값: (“rgb(200, 100, 0)”)
  • rgb(•••%, •••%, •••%) — rgb 채널값을 비율로 표기: (“rgb(100%, 175%, 0%)”)
  • rgba(•••, •••, •••, •••) — rgba 채널값: (“rgba(200, 100, 0, .5)”)
  • rgba(•••%, •••%, •••%, •••%) — rgba 채널값을 비율로 표시: (“rgba(100%, 175%, 0%, 50%)”)
  • hsb(•••, •••, •••) — hsb(hue, saturation, brightness)값 : (“hsb(0.5, 0.25, 1)”)
  • hsb(•••%, •••%, •••%) — hsb값을 비율로 표기
  • hsba(•••, •••, •••, •••) — hsba 값
  • hsl(•••, •••, •••) — hsb값과 거의 유사하다, 참조 Wikipedia page
  • hsl(•••%, •••%, •••%) — hsl값을 비율로
  • hsla(•••, •••, •••, •••) — hsla값
  • hsb와 hsl은 선택적으로 hue를 도(degree) 형식으로 표기할 수 있다.: “hsl(240deg, 1, .5)” 만약 당신이 간지나게 표기하고 싶다면: “hsl(240°, 1, .5)
  •  

    Element.click(handler)


    해당 원소의 클릭 이벤트 리스너를 설정

     

    인자

    인자명

    자료형

    설명

    handler

    function

    click 이벤트 핸들러

    반환형

    반환형

    설명

    object

    해당 원소 반환

     

    Element.clone()


    해당 원소를 복제

     

    반환형

    반환형

    설명

    object

    해당 원소를 복제한 원소

     

    Element.data(key, [value])

     

    새로운 데이터를 추가하거나, 이름만 주어질 경우 해당 키에 맞는 값을 반환. Element.removeData 참조

    인자

    인자명

    자료형

    설명

    key

    string

    저장하려는 데이터의 값

     value

     any

    저장하려는 값 

     

    반환형

    반환형

    설명

    object

    해당 원소 반환

     

    반환형[만약 key 값만 넣었다면]

    반환형

    설명

    any

    key에 해당하는 값

     

    사용 예

     

    for (var i = 0, i < 5, i++) {
        paper.circle(10 + 15 * i, 10, 10)
             .attr({fill: "#000"})
             .data("i", i)
             .click(function () {
                alert(this.data("i"));
             });

     

    Element.dblclick(handler)


    해당 원소의 더블 클릭 이벤트 리스너를 설정

    인자

    인자명

    자료형

    설명

    handler

    function

    더블 클릭 이벤트 핸들러

    반환형

    반환형

    설명

    object

    해당 원소 반환

     

    -------------

     

    두시간 반을 했는데 겨우 이만큼밖에 못했네요 ㅠㅠ 번역보다 표그리는게 더 일이군요~

    Posted by TY
    ,