반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

How do I unset the clean URLs?

Last updated March 18, 2011. Created by dman on February 2, 2004.
Edited by mr.baileys, jonhattan, jwuk, greggles. Log in to edit this page.


clean URLs를 하지 않고 두루팔을 옮긴 경우가 발생할 수 있습니다. 그러면 모든 링크는 제대로 작동하지 않을 겁니다. 왜냐하면 이미 생성된 path는 hosting platform에 의해 지원되지 않기 때문이죠.


This occasionally happens아래의 경우도 발생할 수 있습니다.

  • 호스트 간 데이터베이스를 transfer 한 이후
  • local copy를 한 이후
  • 백업에서 restoring 한 이후 (.htaccess 가 없을 경우)
  • .htaccess 가 지워진 경우
  • 혹은 여러분 호스트에서 원하지 않은 security change가 있는 경우


문제는 여러분은 세팅을 할 수 없게 됐다는 겁니다. 왜냐하면 configuration page를 더이상 링크해서 들어갈 수 없기 때문이죠.

드루팔 (Drupal)은 여러분이 해당 링크에 접근하도록 하기 전에 먼저 clean URLs 가 지원되는지 부터 체크 하고 계속 작업이 이루어 질 수 있는지 여부를 체크합니다.




이 문제를 해결의 가장 간단한 방법은 unclean 시스템 path를 직접 entering 하는 겁니다.

여러분 스스로 lock 됐다면 아래 경로를 통해서 접근하세요.
http://example.com/?q=user

그 페이지에서 여러분은 로그인을 할 수 있습니다. 그러면 admin 권한을 받을 수 있겠죠. 아직까지 모든 링크는 작동하지 않을 겁니다.

다음으로는 아래 url로 접근하세요. (Drupal 5와 Drupal 6 의 경우). 그러면 여러분이 unset clean URLs를 할 수 있는 페이지를 보실 수 있을 겁니다.
http://example.com/?q=admin/settings/clean-urls

이제 여러분은 사이트를 제대로 이용할 수 있을 겁니다. 링크가 제대로 걸릴 테니까요.

Other options that should get the same result include:

다른 방법도 있습니다.

  • Drush command를 실행하세요.

    drush vset clean_url 0 --yes

  • mysql command를 실행하세요.

    UPDATE variable SET value = 's:1:"0";' WHERE name = 'clean_url';
    DELETE FROM cache;
  • 혹은 settings.php를 수정하셔도 됩니다.
    $conf['clean_url'] = 0;


반응형

'etc. > Drupal' 카테고리의 다른 글

두루팔 옮기기 2 - 체크 리스트 -  (0) 2012.07.18
두루팔 옮기기 1 - Drupal Migrating a site -  (0) 2012.07.17

두루팔 옮기기 2 - 체크 리스트 -

2012. 7. 18. 21:43 | Posted by 솔웅


반응형

Checklist for migrating to a new server

Last updated October 31, 2011. Created by dman on November 13, 2008.
Edited by xamount, Kami Petersen. Log in to edit this page.




두루팔을 새로운 호스트로 옮기고 사이트를 활성화 할 때 살펴봐야할 것들이 있습니다.

이 체크리스트는 이미 로컬이건  호스트된 서버이건 사이트가 돌아가도록 하는데 성공했지만 다른 host나 architecture에 이 사이트를 옮겨야 할 필요가 있는 사람들을 위해 쓴 글입니다. 서버별로 그리고 버전별로 조금 다를 수가 있습니다. 그러니까 옮기고 난 이후에 겉으로 잘 돌아가는 것 처럼 보여도 여러 테스트를 해야 합니다. 

아래 체크 리스트들이 많은 것 처럼 보이지만 이 리스트 들 중 대부분인 이미 제대로 세팅 돼 있을 겁니다. 하지만 옮긴 이후에 체크를 해서 문제 없다는 것을 확인 해야 이후에 발생될 여러 문제점을 예방할 수 있습니다. 여러분들 중 대부분은 아래 작업을을 해 보셨겠지만 사이트를 옮긴 후에 이 작업을 반복해서 해야 합니다. 이 체크리스트대로 하지 않고 이미 업로드를 해 버렸고 제대로 작동하지가 않는다면 unset clean-urls 를 manually 해야 합니다.



Server basics


Drupal UI

  • TEST an upload.
  • TEST an image derivative rebuild.
  • Review access control settings for admin/editor/authenticated/anonymous users.
    각 role 별로 로그인을 한 후 체크하세요. big file을 업로드 할 수 있는지 input filter 등을 사용할 수 있는지 등등.


Permissions checks

  • Adjust write-access to sites/${SITENAME} (if installing) and sites/${SITENAME}/files
    • Check at admin/settings/file-system, it'll warn you if there's a problem.
    • What you need to do and what you CAN do to adjust permissions on the server will vary between systems.
  • check write-access to /tmp . Change it to sites/${SITENAME}/files/tmp (no leading slash) if needed.


Security tweaks

  • 셋업을 하고 난 후 모든 코드가 security 때문에 read-only  되 있는지 체크해 보세요.
    See more at File Permissions and Ownership For Security.
  • 새롭게 생성된 파일과 폴더의 owner와 group을 확인하세요. Check the owner and group of any newly created files and folders
    ls -la files/
    If the owner of web-process created files is the same as your login username (not www-data), that means it's theoretically possible for web scripts to modify themselves. This is a hack vector, and could be a concern.
  • settings.php 를 체크하세요. 여기에 database 암호가 text로 돼 있습니다. 이 파일의 접근 권한을 보고 모두에게 readable 돼 있지 않나 살펴 보세요. 만약에 그렇게 돼 있으면 웹을 통해서 여러분 디비의 암호가 노출 될 수 있습니다.
    For this reason, it would be good to have your :
    - Admin-control panel-ssh login password different from your
    - database password different from your
    - Drupal user #1 password.
    ...even though that's a pain.
  • If you have enough rights, consider shifting htaccess directives into apache configuration files for performance.
  • Remove phpinfo.php if you had one.


Testing

  • TEST directory browsing is disabled for files/ (by attempting to access it in a browser)
  • TEST that www.example.com and example.com perform the same, preferably by redirecting one to the other. See .htaccess [handbook doc needed?]
  • TEST email sending. Email setup is different for different hosts, but should be configured already by the sysadmin.
  • Check the email:from headers and see what you can do to avoid system emails going into a spam bucket
  • More testing ideas.


Best Practice Extras

  • Run a links checker. Xenu is simple for windows. linklint is adequate for commandline.
  • Visit your admin/reports after running a link checker and see what shows up. Other errors, not just 404s may appear there and need attention.
  • Consider benchmarking Drupal Performance. apachebench (ab) is OK, but needs root and just whacks one page. siege is better (can script a session), but needs installing.
  • If you have a high level of control on the server, Consider other tuning issues like PHP accelerators.
  • Consider your backup plan.
  • TEST your backup recovery.
  • Remember to configure and test any non-Drupal logging tool you may want to use. eg, Webalizer, Google Analytics or something provided by your host.
    Now is a good time to locate your server logs, and make sure you have access to them from your host. When you need them to troubleshoot problems it's too late to find that they don't exist.
  • Document every password, path and IP you can find. Domain registration, Control Panel login, User account info, FTP server, MySQL connection string, location of the config files for your backups, contact details for key parties etc. Put it all in a document with a DATE in it. Print that off and save it in three SAFE places.
  • Review your hosts policies on overages. It's much better if your host provides a warning & throttle service when/if you overrun your bandwidth or storage allocation than if they let it run then charge and penalize you (or just shut you down). Some hosts also punish 'excessive' use of the database or processor - which Drupal can be guilty of. Read the fine print.


반응형

두루팔 옮기기 1 - Drupal Migrating a site -

2012. 7. 17. 22:34 | Posted by 솔웅


반응형

지금 사용하던 Drupal 을 다른 곳으로 옮겨야 됩니다.
두루팔 사용경험이 하나도 없어서 부랴부랴 정보 researching 하고 있습니다.

혹시 두루팔을 A 서버에서 B 서버로 Migration 하는 방법 아시는 분 있으면 정보 부탁드립니다.



Last updated April 13, 2012. Created by LeeHunter on April 20, 2010.
Edited by John_B, sebastianSue, vj_pdx, ajspadial. Log in to edit this page.


만약 host를 바꾼다던가 개발서버와 실제 서버를 분리해서 관리를 할 경우에는 Drupal site를 migrate 할 필요가 있을 겁니다. 이 글은 이 일에 대한 outline 입니다. (아마 체크리스트라고 해야 할 것 같습니다.) 하지만 다른 곳에서는 제대로 묘사되지 못한 몇가지 스텝들도 포함돼 있습니다. 여러분들은 여러분들이 사용하는 모듈과 여러분 서버의 환경에 따라 이 스텝들을 약간씩 수정할 필요가 있습니다.

아래 과정은 한개의 site에 대한 과정을 담고 있습니다. Multi-site migration (Windows/Apache와 Linux) 은 다른 곳에서 다뤄지고 있습니다.


Before You Start


두개의 서버에 있는 PHP installation의 차이점을 정리해 두세요. (버그들이나 기능, 모듈, configurations, version 등등). 그리고 MySQL과 Apache 에 대해서두요.

파일을 업로드하고 다운로드하고 압축된 파일들을 다루고 퍼미션과 ownership을 수정하고 MySQL을 다루고 하는데 필요한 적절한 툴들을 준비하세요. 이런 스텝들을 다루는 Drupal tools들이 몇개 있습니다. 예를 들어 데이터를 백업하고 restoring 하는 것들 같은거요. 그렇다고 모든 과정을 다 처리해 주지는 않습니다. 여러분들이 아래 과정을 진행하는데 도움을 주는 툴이 있으면 사용하시고 아니면 그냥 직접 다 하셔도 됩니다.

새로운 사이트로 migrating 하기 위한 체크 리스트 - target site에서 두루팔이 필요로 하는 모든 기능 (mod_rewrite, AllowOverride) 등을 모두 지원하고 있어야 합니다. 전부 지원해 주는 호스트에서 조금 지원해주는 호스트로 옮기면 제대로 작동하지 않을 겁니다. 이건 migration에서 뭔가 잘못되지 않아도 target host의 세팅에 문제가 있으면 제대로 작동하지 않을 수 도 있다는 것을 말합니다.



On the old site

  1. 사용된 모듈과 버전 그리고 path 같은 것들을 정리해 두세요. contributed module site documentation이 이런 작업을 쉽게 할 수 있도록 할 겁니다.
  2.  admin/settings/file-system에서 사용될 수 있도록 temporary directory folder를 정리해 두세요. 그리고 database를 restoring 하고나서 수정할 수 있도록 준비해 두세요. 두 site 무도에 same path 가 존재하고 있어야 합니다.
  3. site maintenance mode를 세팅하세요 : Administer -> Site maintenance, Off line 선택
  4. 두루팔 core와 모듈을 최신버전으로 업데이트 할것인가에 대해 migration 하기 전에 결정하세요.
  5. Clean URLs를 Turn off 하세요. (Administer -> "Clean URLs") . 이제부터 www.example.com/?q=user 를 통해 administrator 부분으로 들어가게 될 거라는 것을 기억해 두세요. ("user"는 다른 유저 이름에 의해 replace 되지 말아야 합니다.)
  6. cache tables로부터 데이터를 clear 해 주세요. 이 데이터들은 transfer 에 필요하지 않은 데이터들입니다. 그리고 데이터를 정리할 때 혼란을 야기시킵니다. devel 모듈과 admin menu module 에는 이것을 쉽게 할 수 있는 link를 포함하고 있습니다. 다른 방법으로는 www.example.com/admin/settings/performance 로 가서 페이지 아랫쪽에 있는 Clear cached data 버튼을 누르세요.
  7. database를 Export 하세요. MySQL Administrator나 phpMyAdmin 을 사용해서 export 할 수 있습니다. 이렇게 해서 .sql 확장자를 가지는 text 파일로 된 데이터베이스 정보를 가질 수 있습니다.


    • MySQL Administrator 에서 우선 패스워드를 사용해서 접속하시고 왼쪽의 Backup 버튼을 누르세요. Databases 리스트에서 save하기를 원하는 데이터베이스를 선택하세요. 큰 화살표를 누르세요. 그러면 데이터베이스 이름을 오른쪽에 있는 네모칸인 Backup content 로 옮길 겁니다. 그 다음엔 오른쪽 아래에 있는 Start backup 버튼을 누르세요. 저장할 폴더를 선택하시고 이 때 윗쪽의 path par와 왼쪽의 Folders 리스트를 사용하시면 됩니다. 그리고 OK 버튼을 누르세요.
  8. 이전의 site 가 public (web에서) 이면 여러분 site를 on line으로 하는 것을 고려해 보세요. :  Administer -> Site maintenance 에서 on Line을 선택하시면 됩니다. 이제 예전 서버에서 만들어진 모든 modification은 잃어버릴 겁니다. (readers' comments, forums posts 등 등). 그러므로 여러분의 old website를 on line으로 set back 하시고 웹에서 public이라면 새로운 유저가 입력한 새로운 comments 등이 유실되지 않도록 new comments를 block 하면 좋을 겁니다 Administer -> Permissions.
  9. 모든 Drupal code를 copy 하세요. core, modules,themes 등을 copy 하고나서 필요하면 다운로드를 받으세요. 아니면 곧바로 새로운 서버로 transfer 하셔도 됩니다.
  10. files 디렉토리와 비슷한 다른 directory (image galleries 등)들도 copy 히세요. 그리고 다운로드 하시던가 새로운 서버에 곧바로 transfer 하세요.


In between

이 과정들은 old/new server와는 다른 여러분의 컴퓨터에서 수행 되어 질 겁니다. 만약 old 나 new 서버에서 작업하는 것이 더 쉽다면 그렇게 하셔도 됩니다. 쓸데 없이 다른 컴퓨터에 파일들을 복사해 넣을 필요는 없으니까요.

데이터베이스의 데이터들은 hard code 된 링크들을 가지고 있을 겁니다. 이런 링크들은 새로운 사이트에서는 필요가 없겠죠. 이것들을 수정하기 위해서 새로운 데이터베이스에서 SQL query를 사용하실 수 있습니다. 혹은 .sql 파일에서 직접 수정을 하실 수도 있겠죠. 이 작업을 하시면서 아래 내용들을 고려하세요.

  1. files table 에 있는 filepath field 의 files list.
  2. 사이트 URL - 많은 node 링크들과 reference들이 full site URL을 참조합니다. 그리고 많은 log file들을 참조하기도 하죠. 그렇기 때문에 new site의  name으로 바꾸는 것이 항상 적당한 것은 아닙니다. 그러니까 이 작업을 각각의 테이블단위로 하시고 고민하세요.
  3. 위 내용들을 variation 하세요. 예를 들어 messaging module은 messaging store에 각각의 message에 대한 site URL을 저장합니다. 그리고 imagefield 모듈은 filelist 같은 리스트가 있지요.
  4. 새 데이터베이스를 create 하기 위한 facility들 (아래의 Import Your SQL data를 보세요.)
  5.  데이터베이스 이름. 호스팅 회사에서는 모든 데이터베이스 이름 앞에 yourName_ 를 붙이도록 할수도 있습니다. 그리고 데이터베이스 이름에 들어가는 text 갯수를 제한할 수 도 있습니다.
  6. 아래 command는 두루팔을 A site에서 B site로 옮길 때 옮겨질 필요가 없는 데이터베이스의 데이터를 strip 하게 할 수 있습니다.
    sed -E -e "/^INSERT INTO \`(cache|watchdog|sessions)/d" < /path/to/dump.sql > /path/to/dump-stripped.sql
    만약 여러분의 database가 table prefix를 사용한다면 이 명령어를 약간 수정하실 필요가 있을 수도 있습니다.

만약에 실제 운행되고 있는 live site 에서 move 하거나 또는 live site로 move 한다면 여러분은 DNS 세팅을 수정해서 새 서버에 pointing 할 수 있도록 해야 할 필요가 있습니다.


On the new site


이제 new site에서 위의 과정을 거꾸로 진행하셔야 합니다.

  1. 전체 Drupal code (core,modules,themes) 를 new site로업로드 혹은 copy 합니다. 여러분이 원하시면 구조를 약간 바꾸셔도 되죠. 어떤 분들은 새 버전의 drupal core를 먼저 install 해서 새로운 server 환경을 테스트 하는 분도 계실겁니다.
  2. files directory나 비슷한 디렉토리들(image galleries 같은)를 업로드 혹은 copy 합니다. 업로드 혹은 copy 장소는 .sql 파일을 수정할 때 사용하게 될 위치가 되겠죠.
  3. 두루팔이 사용할 데이터베이스 유저를 생성합니다. 호스팅 회사에서는 여러분의 모든 데이트베이스 유저 이름 앞에 yourName_을 붙일 수도 있고 그 이름의 text 숫자에 제한을 둘 수도 있습니다. 여러분 호스팅 회사에서 create 쿼리를 허용한다면 .sql 파일 에 유저 생성 쿼리를 넣고 이 과정을 건너 뛰셔도 되겠죠.
  4. SQL data를 업로드하고 import 하세요. 데이터베이스를 직접 생성할 수 없다면 호스팅 회사가 제공하는 툴을 사용하실 수 있을겁니다. 이런 경우는 .sql 파일 안에 create database 라인을 지워주세요. (create database if not exist 라인은 상관없습니다.) phpMyAdmin으로 데이터베이스를 업로드하기엔 사이즈가 너무 클 수도 있습니다. 어떤 호스팅 회사는 MySQL Administrator로 접근할 수 있는 권한을 주기도 합니다. 그런 경우 용량이 큰 파일을 사용할 수 있습니다. SSH 접근을 가지고 있다면 text  console에서 MySQL을 사용하실 수 있을 겁니다. "mysql --user=user_name --password=your_password database_name" 그리고 sourch command도 사용하실 수 있겠죠. source database_backup.sql
  5. settings.php의 Database setting 섹션부분을 바꾸세요. 이 부분에서 new database로 경로가 설정 돼 있어야 합니다. 예전 서버와 다른 유저가 세팅 됐다면 유저도 제대로 설정해야 하구요.  패스워드도 마찬가지 입니다. 그리고 sub-domain과 domain level을 옮기셨다면 base URL을 수정하셔야 합니다.  그리고 $cookie_domain이 예전 도메인으로 설정돼 있지 않은지 체크하세요.
  6. 그리고 .htaccess 파일의 rewrite rule을 수정할 필요도 있습니다.
  7. new site로 log on 을 시도해 보세요. 아마 site maintenance mode와 non clean URLs의 combination에 의해 lock 돼 있을 겁니다. 이 경우에는 newsite/?q=user로 로그인을 하세요. 그리고 clean URLs를 turn on 하세요.
  8. site information부분을 수정하실 필요가 있습니다. (Administer → Site configuration → Site information). 여기에는 모든 email address 가 있습니다. 그리고 filedirectory를 (www.example.com/admin/settings/file-system) 파일이 새로 옮겨진 곳으로 바꿔 주세요. 또한 temp folder 도 다르다면 새로운 서버의 정확한 location으로 수정하세요. 
  9. 필요하다면 새로운 버전에 맞게 모듈들을 수정해 주세요. 예를 들어 PHP 5.2.8에서 5.3.0 으로 업그레이드 됐다면 어떤 모듈들은 제대로 작동하지 않을 수도 있습니다. 이럴 경우 여러곳에서 에러메세지를 보실 수 있을 겁니다. 아래 제가 search 한 에러의 내용들 입니다.

    • Set date.timezone = php.ini file안의 UTC  (아마 이 파일이 두개 있을 수 있는데요. 하나는 command line 용이고 다른 하나는 Apache 용인데 여러분의 경우엔 아파치용을 수정하셔야 할 겁니다.)
    • Apply patch 6.x-2.x-549884-30.patch to the date module
    • Use 6.x-3.x-dev instead of 6.x-3.0-alpha3 for the admin_menu module
    • Drush 와 함께 작동하지 않는 coder module을 delete 하세요. (하지만 이 부분이 항상 이 문제 때문인지는 확실하지 않습니다.)
  10. Check the status report: Administer → Reports → Status report. Drupal 에서 suggest 한다면 Cron을 Manually 작동시키세요.
  11. 이제 여러분의 new site는 예전 사이트 처럼 작동할 겁니다. 예전것과 구분하기 위해서 theme 이나 theme color를 바꾸고 싶을 수도 있을 겁니다.
  12. 필요에 따라 performance 파라미터도 수정하세요. Administer → Site configuration → Performance.
  13. 모든것을 다 체크했다면 site-maintenance mode를 turn off 하실 수 있습니다. : in Administer → Site configuration → Site maintenance, choose "On line".
  14. 여기서 설명한 대로 cron job을 셋업하세요. 이 크론은 어떤 컴퓨터에서든 온라인으로 run 할 수 있습니다. 여러분 PC에서도 가능합니다. 반드시 Drupal이 돌아가고 있는 서버여야 할 필요는 없습니다. 원하는 컴퓨터를 선택하세요. (항상 turn on돼 있고 on line  돼 있는 컴퓨터야 겠죠.) 만약 호스팅 컴퓨터가 크론 사용을 허용하지 않고 여러분에게 이 작업을 할 만한 컴퓨터가 없으면 Poormanscron 모듈을 사용하세요.
  15. 여러분의 새 두루팔 서버가 public으로 되기를 원하신다면 (예를 들어 WEB에 개방한다던지) 지금 DNS를 세팅해야 합니다. 여러분의 새로운 서버의 IP에 DNS를 세팅하세요. 이 작업을 하려면 domain name register를 contact 해야겠죠. 만약에 두루팔 사이트가 이미 웹에 있다면 그리고 여러분의 migrating이 public server에서 다른 곳으로 이뤄졌다면 이 register를 바꿀 필요가 있습니다. 이 경우에는  new registrar의 contract를 잘 읽어 보세요. 그리고 registrar를 바꾸기 전에 예전 registrar의 데이터베이스에 있는 DNS를 업데이트 하기를 추천합니다. TLD(top level domain)에 따라 (아마 EPP code, authorization code, Auth code라고 불리는 코드가 필요할 겁니다. 예전 registrar에 물어보세요. 그 다음에 이 코드를 새로운 registrar에 할당하세요. (아마 새로운 호스팅 회사를 통해서 가능할 겁니다.) 그 다음에는 기다리셔야 됩니다. 대가 5일 정도 시간이 걸립니다. 만약 이 작업에 아주 익숙하시다면 migration 작업 하기 전에 시간에 맞춰서 작업하셔도 되겠죠. 단지 여러분 작업이 완료되기도 전에 DNS transfer가 끝났다면 그 동안은 페이지 접근이 안되겠죠.



반응형

'etc. > Drupal' 카테고리의 다른 글

두루팔 옮기기 3 - Manual로 clean URLs 하기 -  (0) 2012.07.18
두루팔 옮기기 2 - 체크 리스트 -  (0) 2012.07.18

Kurogo Tutorial 21 - Emergency Module -

2012. 7. 12. 22:35 | Posted by 솔웅


반응형

Emergency Module


Emergency 모듈은 site의 emergency 정보에 대한 모바일 인터페이스를 제공합니다. 이 모듈은 가장 최근의 emergency 정보와 emergency contacts를 display 할 수 있습니다. 모듈에 대한 데이터 소스는 drupal server에서 올 수가 있습니다. 이 emergency drupal 모듈은 add-ones 안의 add-ons/drupal-modules/emergency 에서 찾아 보실 수 있습니다. (현재까지는 Drupal 6까지만 지원합니다.) 동시에 standard RSS feed 도 emergency notice에서 사용될 수 있습니다. 그리고 contacts list는 ini file에서 작성하실 수 있습니다.


Configure Emergency Notice


emergency notice를 display 하고 싶으면 config/emergency/feeds.ini[notice]  섹션을 추가하시면 됩니다.




Other Options


  • NOTICE_EXPIRATION -  Notice 가 active 상태이어야 할 시간 (초단위). notice 가 해당 feed에서 remove 되지 않는 경우 유용합니다. 디폴트는 1주간 입니다. (604800초).
  • NOTICE_MAX_COUNT - feed로 부터 보여야 할 notice들의 maximum number 값


Configure Contacts List


만약 emergency contact phone number들을 추가하기를 원한다면 config/emergency/feeds.ini 안에 contacts 섹션을 넣으셔야 합니다.

연결 된 Drupal emergency module의 contacts list를 configure 하세요.



아니면 ini 파일에 직접 contact list를 넣으실 수도 있습니다.


  • CONTROLLER_CLASS = “INIFileContactsListRetriever”
  • BASE_URL (해당 ini 파일을 가리켜야 합니다.)


ini 파일에는 primary contacts를 위해 primary 섹션이 있어야 하고 secondary contacts를 위해 secondary 섹션이 있어야 합니다. 각 contact는 아래와 같이 포매팅 되면 됩니다.


title[] = "Police"
subtitle[] = ""
phone[] = "6173332893"


secondary contacts 섹션이 있는 경우 모듈 변수 MORE_CONTACTS를 수정해서 secondary contacts 링크의 title을 수정하실 수 있습니다. 디폴트로 이 값은 “More Emergency Contacts”로 돼 있습니다.


Using Drupal Emergency Module


Installation


이 add on 모듈은 Drupal 6가 있어야 합니다. Drupal 7은 아직 지원되지 않습니다. 두루팔 모듈을 인스톨하는 표준 절차를 따라주세요.


  • 이 모듈을 인스톨 하려면 우선 drupal CCK (Content Creation Kit) 모듈과 drupal Views 모듈을 인스톨 해야 합니다.
  • add-ons/drupal-modules/emergencysites/all/modules/ 디렉토리로 복사하세요.
  • drupal administration panel 에서 modules 로 가세요. 그리고 "Emergency Info" 모듈을 선택하세요. 다음에 save configuration을 하시면 됩니다.


Usage


emergency notification을 input 하시려면 content type "Emergency Notification"의 node를 만드세요. RSS feed는 가장 최근에 업데이트 된 Emergency Notification 만 보여 줄 겁니다. 

emergency contacts를 input 하시려면 Emergency Contacts 타입의 노드를 생성하세요. 그리고 primary와 secondary emergency contacts를 채워 넣으시면 됩니다. 만약에 이 타입에 1개 이상의 노드를 생성하시면 RSS feed는 가장 최근에 업데이트된 것을 보여줄 겁니다.


http://YOUR_DRUPAL_SERVER_DOMAIN/emergency-contacts-v1 에 생성된 RSS feed 는 여러분이 입력한 contact 정보는 빠져 있을 겁니다.  /admin/user/permissions로 가셔서 field_primary_contactsfield_secondary_contacts를 anonymous user 가 볼 수 있도록 enable 해 주셔야 합니다.




반응형

'WEB_APP > Kurogo' 카테고리의 다른 글

Kurogo Tutorial 22 - Content Module -  (0) 2012.10.10
Database Authentication  (0) 2012.09.12
Authentication  (0) 2012.09.06
Flat File Authentication  (0) 2012.09.06
Access Control and Authorization  (0) 2012.09.06
Kurogo Tutorial 20 - Module Interaction -  (0) 2012.06.13
Kurogo Tutorial 19 - The Kurogo Object -  (0) 2012.06.12
Kurogo Tutorial 18 - Video Module -  (0) 2012.06.07
Kurogo Tutorial 17 - Calendar Module -  (0) 2012.06.01
Kurogo Tutorial 16 - Database Access -  (0) 2012.05.30

JQuery Mobile - Theming Page

2012. 7. 12. 20:57 | Posted by 솔웅


반응형

Page Theming


jQuery Mobile 에서는 페이지의 style을 지원하는 rich theming system을 제공하고 있습니다. 각 페이지 위젯에는 자세한 theming documentation이 있습니다. 이 글에서는 어떻게 theming이 apply 되는지 몇개의 high-level 예제들을 살펴보도록 하겠습니다.


data-them attribute는 헤더나 footer 콘테이너에 apply 될 수 있습니다. 이 콘테이너에 apply 되서 lettered theme color swatch들을 적용할 수 있도록 합니다. data-theme attribute가 content container에 적용 될 때에는 data-role="page"가 적용된 div나 콘테이너에 넣으라고 권장 드립니다. 그렇게 하면 배경색이 전체 페이지에 적용될 수 있습니다. 이 작업이 끝나면 페이지의 모든 위젯들은 그 페이지 콘테이너에 적용된 theme을 상속 받게 됩니다. header와 footer에는 디폴트로 theme "a"가 적용 됩니다. 모든 element에 theme "b" 가 적용되기를 원하신다면 이것을 header나 footer에 적용 시키세요. 페이지 div에 data-theme="b"를 하듯이 header와 footer div에도 이렇게 하면 됩니다. 이 디폴트 theme은 다양한 견본(swatches)들을 활용해서 visual texture를 만들고 각각 에 맞는 최상의 contrast를 다양한 element들에 적용하고 있습니다.




위 화면에 대한 소스와 기타 theme a ~ e 까지의 간단한 예제가 있는 소스를 아래에 올립니다.


themingpages.html


그리고 Tutorial Page에 가시면 A~E 까지의 theme들을 적용한 각 form 들을 보여주는 페이지가 있습니다.


이 페이지들을 따로 작업해서 파일로 만들었습니다.

보시면 도움이 될 겁니다.



themingApage.html


themingBpage.html


themingCpage.html


themingDpage.html


themingEpage.html



소스들을 보시면서 이것 저것 바꾸시고 테스트해 보시면 확실히 자기것으로 만들 수 있을 겁니다.


그럼 항상 즐 코딩 하세요.


반응형

'jQuery Mobile > JQM Tutorial' 카테고리의 다른 글

Fixed toolbars  (0) 2012.07.28
JQuery Mobile - Navbar  (2) 2012.07.25
JQuery Mobile - Footers  (0) 2012.07.24
JQuery Mobile - Header structure  (0) 2012.07.23
JQuery Mobile - Toolbar types  (0) 2012.07.21
JQuery Mobile - touchOverflow 기능  (0) 2012.07.09
JQuery Mobile - PhoneGap apps  (1) 2012.07.09
JQuery Mobile - Scripting pages  (1) 2012.07.05
JQuery Mobile - Dynamically Injecting Pages  (0) 2012.06.28
JQuery Mobile - Ajax, hashes & history 02 -  (0) 2012.06.27

Best Practices for Organizing Projects

2012. 7. 11. 11:33 | Posted by 솔웅


반응형
Posted on

. Written by


샘플코드나 다른 예제 혹은 이 웹사이트의 튜토리얼을 포함해서 코로나를 배우는데 명료하게 알기 힘든것이 바로 프로젝트를 어떻게 organize 할 것이냐 입니다. 알려 드릴 사항은 모든것이 여러분의 project 폴더 아래로 가게 된다는 거고 나머지는 여러분 취향대로 하시면 되는겁니다. 그리고 sub folder 도 지원 됩니다. 여기까지가 지금까지 이 주제와 관련해서 저희가 한 말이죠.


그런데 여러분의 프로젝트가 규모가 더 커지면 이 지식만 가지고는 organize 하기가 좀 부족합니다. 점점 더 많은 리소스들이 여러분 프로젝트에 추가 될 겁니다. 오디오 파일이나 이미지, 비디오, 루이 모듈 같은 것들이요. 이걸 제대로 정리하지 못하면 개발하는데 아주 복잡하게 만들죠.


이 튜토리얼은 코로나 SDK 프로젝트 organization 테크닉의 전부를 말하지는 않습니다. 단지 좀 더 효율적으로 관리할 수 있는 방법을 제안할 뿐입니다.




Project Structure


모든걸 간단하게 가지고 가는 것은 여러분의 프로젝트가 잘 organize 되어야하고 그로 인해 유지 관리하는 것이 쉽도록 하는 겁니다. 제가 소개할 이  organization technique 은 대부분의 프로젝트에서 쉽게 셋업하고 쉽게 이해하고 쉽게 scale (여러분의 프로젝트가 점점 더 커지게 될 때를 대비해서) 하는데 충분히 도움이 될 겁니다.


프로젝트 폴더를 구성할 때 여러분이 따라야할 기본적인 전제는 비슷한 파일들을 다른것과 별도로 보관하라는 겁니다. 비슷하고 다르다는 기준은 type 이나 그 종류를 말할 수도 있습니다. 아래 샘플로 제공하는 프로젝트 hierarchy 구조가 있습니다.


  • Project_Folder/ (top-level)
    • images/ (folder)
    • audio/ (folder)
    • videos/ (folder)
    • data/ (folder)
    • scripts/ (folder)
    • main.lua
    • config.lua
    • build.settings
    • Default.png
    • Default@2x.png
    • Icon.png
    • Icon@2x.png


위의 폴더 구조 예제에서 top-level 디렉토리(폴더) 에 있는 것은 가장 중요한 것은 main.lua 입니다. 다른 config.lua, build.settings 같은 파일들도 top-level에 있어야 된는 겁니다.

이 top 에 있는 폴더들은 그 이름만 봐도 어떤 것들인지 쉽게 이해가 갈 겁니다. 아래 간단히 설명을 덧 붙이겠습니다.

  • images – image files with the extension of (most-likely) .png or .jpg.
  • audio – audio files (.caf, .mp3, .ogg, etc.)
  • videos – video files (.avi, .mp4, etc.)
  • data – read-only data files used by your app. They can really be any format, but common ones include .json and .xml.
  • scripts – other Lua files (apart from main.lua). More on this in a moment.


더 이상의 설명은 필요 없겠죠? script 폴더만 제외하고는요.

여러분이 util.lua를 사용해야 한다고 가정해 봅시다. 일반적이로 이 파일을 top-level에 위치시키는데요. (main.lua 하고 같은 위치에요). 만약 그렇게 할 경우 아래처럼 불러올 수 있습니다.


local util = require( "util" )


만약 이 util.lua를 scripts 폴더 아래에 넣었다면 위와 같이 하면 작동하지 않을 겁니다. 폴더이름에 점을 붙이고 모듈 이름을 넣으셔야 합니다. 아래처럼요.


local util = require( "scripts.util" )


이미지를 불러올때는 폴더 이름을 쓰고 / 를 넣고 이미지 이름을 넣으셔야 합니다. script에서는 .을 사용했는데 여기서는 /를 사용해야 합니다. 사실 스크립트만 다릅니다. 아래 그 예제가 있습니다.


local obj = display.newImage( "images/corona.png" )


Scaling Projects

여러분의 프로젝트에 더 많은 이미지나 스크립트 그리고 다른 파일들이 추가되면 이 sub directory 만으로도 충분하지 않게 되죠. 그렇게 되면 서브 디렉토리 안에 또 다른 서브디렉토리를 넣어야 겠죠. 아래 depth 가 더 늘어나도 그 안에 있는 파일이나 스크립트를 require 하는 방법은 위에서 설명한 것과 같습니다. 아래는 몇단계의 level 이 있는 게임을 상상하고 폴더 구조를 구성해 봤습니다.


  • Project_Folder/ (top-level)
    • images/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • audio/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • videos/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • data/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • scripts/ (folder)
      • level-001/ (folder)
      • level-002/ (folder)
      • level-003/ (folder)
    • main.lua
    • config.lua
    • build.settings
    • Default.png
    • Default@2x.png
    • Icon.png
    • Icon@2x.png


위의 구조와 다른 점은 이미지,오디오, 비디오, 스크립트 디렉토리들이 이제 그 안에 또 sub-directory들을 가지고 있다는 겁니다. 각각의 레벨 별로 구분되는 서브 폴더들을요. 10단계 20단계 되는 게임을 상상해 보시면 이런식으로 개발하는 것이 훨씬 더 간편하겠죠? 오랫동안 유지 관리하는데 훨씬 유리하게 잘 조직화 돼 있다고 할 수 있습니다.


50단계가 있는 게임인데 모든 리소스를 top-level  프로젝트 디렉토리에 보관하고 있다고 상상해 보세요. 유지 관리하는 관점에서 보면 악몽이 되겠죠?


이 튜토리얼에서 소개한 대로 프로젝트 구조를 관리하시던지 아니면 여러분만의 방법을 사용하시던지 Corona SDK 프로젝트를 시작할 때 프로젝트의 파일구조를 충분히 고민하시고 난 후 시작하는것이 나중에 가서 훨씬 더 도움이 되실 겁니다.



반응형


반응형

touchOverflowEnabled: Deprecated in 1.1.0

jQuery Mobile 1.1 이전에서는 true fixed toolbar 지원이 touch에 대해 overflow-scrolling 하는 CSS 프로퍼티로 native browser 지원이 가능했었습니다. 지금은 iOS5에서만 지원되고 있습니다. jQuery Mobile 1.1 버전에서는 이 CSS 프로퍼티를 더 이상 사용하지 않습니다. 우리는 이 프로퍼티를 내부적으로 사용하는 부분을 모두 없앴습니다. 하지만 이미 이 프로퍼티를 사용하고 있는 어플리케이션에 문제가 발생하지 않도록 $.mobile 객체에 글로벌하게 정의해 놓고 있습니다. 이 프로퍼티는 remove 하라고 flag 되어 있습니다. 하지만 아직까지 $.support 를 통해서 남아있고 지금 현재로서는 이것을 완전 remove할 계획을 가지고 있지는 않습니다.


touchOverflow: Improved page transitions and true fixed toolbars


현재 보이는 화면과 앞으로 전환될 화면은 viewport에 나란히 있습니다.  이 화면전환이 아래쪽으로 된다면 이 두 페이지가 화면전환이 시작될 때 같은 viewport에 있어야 합니다. 그리고 손가락을 위쪽으로 해서 scroll을 하겠죠. 그러면 그 다음 화면이 밑에서부터 따라 올라올 겁니다. 만약에 back button을 클릭한다면 scroll up 하고 화면전환을 하고 이전 scroll position을 저장해야 합니다 .아직까지 모바일 브라우저의 속도가 느린편이라 이 스크롤 움직임은 실제 유저의 움직임을 따라가지 못할 수 있습니다.


이러한 문제점을 극복할 방법은 두 페이지를 각각의 콘테이너에 담는것입니다. 각각은 나름대로의 internal scroll bark 를 가지고 있습니다. 이 의미는 document를 더 이상 scroll 할 필요가 없다는 것이죠. 혹은 좀 더 자연스럽게 스크롤 포지션을 저장하는 것이 필요하다는 겁니다. fixed toolbar들을 만들어서 internal scrolling 과 함께 바깥의 콘테이너에  넣음으로서 이를 쉽게 구현할 수 있습니다.


How it works


overflow:auto 의 touch-targeted version을 지원하는 iOS5 를 한번 보죠. 여기에서는 native momentum scrolling과 함께 internal scrolling region을 허용합니다. 우리는 여기에 touchOverflow 라는 기능을 추가했습니다. 이 기능은 이 두개의 true "fixed" toolbar들을 사용할 수 있는 새로운 CSS capability들을 가능하게 합니다. 그로 인해 iOS5에서 아주 부드럽게 화면전환이 일어나도록 만들죠. 모두 웹 표준을 사용하고 있고 약간의 코드를 추가했습니다.


이 기능은 touchOverflowEnabled 라고 부르는데 CSS에서 overflow scrolling을 지원할 미래의 브라우저를 위해 디자인 됐습니다. 이 기능은 최고의 퍼포먼스를 위해 아직 테스트와 디버깅이 필요하기 때문에 디폴트로 off 상태입니다. 조만간 이 기능을 on 으로 활성화 할 수 있기를 바랍니다. 아래에 이 global option을 어떻게 enable 시키는지 예제가 있습니다.


<script>
$(document).bind("mobileinit", function(){
  $.mobile.touchOverflowEnabled = true;
});
</script>



이 기능이 activate 되면 프레임워크는 이 두 overflow를 브라우저가 support 하는지 찾게 됩니다. 그리고 -webkit-overflow-scrolling:touch CSS properties 를 찾게 되죠. 이 두가지를 지원하는 브라우저에서는 native overflow와 함께 dual page container 모델로 switch 합니다. 그래서 각각의 안에서 스크롤링을 하게 되어 true fixed toolbars smooth transition이 일어나도록 하죠. 이렇게 하면 native performance에 아주 가까운 인터페이스 build를 가능하도록 해 줍니다.

이 기능의 demo 를 보시려면 iOS5의 이 페이지를 체크하세요.


A few downsides


새 기능인 경우 완벽할 수는 없습니다. 이 기능을 activating 할 때 몇가지 고려해야 할 사항들이 있습니다.


  • 리스트나 form 같은 child element들은 가끔 iOS5에서 overflow된 페이지내의 embedded 일 때 render를 하지 않는 경우가 있습니다. 아주 random 하게 일어나는 현상이지만 그냥 둘 수는 없는 문제죠. 그래서 우리는 translage-z CSS 프로퍼티를 추가해서 IOS가 content를 render 하도록 force 하고 있습니다. 이 경우의 단점은 transform이 apply 됐을 때 모든 elements들은 relative 로 포지션이 set 되서 여러분의 layout에 어떤 이슈가 발생할 수가 있습니다.
  • -webkit-overflow-scrolling:touch는 status bar 를 tap 했을 때 위에서 아래로 스크롤 하는 이벤트가 제대로 작동하지 않는 것 같습니다. 애플에서 이와 관련해서 개선해주기를 바랍니다. 왜냐하면 이 기능은 아주 필요하거든요.
  • overflow이고 -webkit-overflow-scrolling:touch 프로퍼티가 세팅돼 있을 때 iOS는 그 parent의 (우리의 경우는 page) 어떤 overflow:hidden 프로퍼티도 무시하는 현상이 나타납니다. 그래서 viewport보다 넓은 이미지나 코드 블럭이 있다면 horizontal scrolling 이 나타납니다.
  • 이 기능이 active 일 때 메타 viewport 태그를 사용하게 되면 유저 zoom 이 제대로   작동하지 않게 됩니다. 왜냐하면 툴바와 페이지 콘텐트 모두 이상한 size로 zoom될 수 있고 다시 zoom back out 하는것이 무척 어렵기 때문입니다. 이런 이상한 현상을 완화하기 위해 우리는 fixed toolbar와 overflow container를 사용하는 것이 더 중요하게 됩니다.
  • re-load 된 페이지로 되돌아갈 때 스크롤 포지션을 잃어버릴 수가 있습니다. 만약 DOM caching이 on 상태이면 이런 이슈는 거의 발생하지 않을 겁니다.
  • 이 기능은 아직까지 실험적입니다. 그러니까 이런 이상한 현상들이 모두 해결된 상황은 아닙니다. 주의해서 사용하시고 항상 테스트를 하세요.


Don’t other mobile platforms already support overflow?


예 다른 플랫폼도 overflow를 지원합니다. 안드로이드의 허니컴과 블랙베리의 플레이북도 overflow를 지원합니다. 하지만 저희가 테스트해 본 결과 그 기기들에서의 overflow는 부드럽지 않습니다. 페이지들은 버벅거리거나 스크롤링 동안에 잠깐씩 멈칫멈칫 합니다. 저희들은 이 기계 제조사들에게 이 기능이 개선되어야 한다고 의견을 제시하고 있습니다.


더 중요한 것은 overflow가 정확하게 되어야 하는것입니다. 우리가 그냥 간단하게 페이지의 auto CSS rule에 overflow를 설정해 놓으면 안드로이드나 iOS의 이전 버전이면서 많은 사람들이 사용하는 플랫폼에서는 내용의 나머지 부분이 잘려나갈겁니다. (iOS의 경우에는 이런 경우 two-finger scroll을 할 수 있을 겁니다. 하지만 아무도 모르고 있을 겁니다.) iOS5에서 애플은 CSS 프로퍼티 -webkit-overflow-scrolling:touch 를 추가했습니다. 현명한 조치라고 생각합니다. 이렇게 함으로서 저희들은 이 touch 스크롤링 프로퍼티를 테스트할 수 있었습니다. 그래서 만약 이 기능을 지원한다면 그 브라우저에서는 overflow rule을 추가할 수 있겠죠.


우리는 이 CSS-based 프로퍼티들을 지원해 달라고 디바이스와 브라우저 개발사들에게 요청하고 있습니다. 왜냐하면 이 기능이 rich mobile 웹 앱을 만드는데 아주 중요한 요소가 될 거라고 믿기 때문입니다. 만약에 오페라, 파이어폭스, 마이크로 소프트같은 회사에서 이 기능을 지원하면 우리는 이 touch scrolling property를 위해 vender-prefixed additions를 추가할 것입니다. 사람들이 IOS5에서 얼마나 페이지 전환이나 fixed toolbar들이 더 훌륭하게 진행되는지를 보게 되면 다른 브라우저들에서도 하루빨리 이 기능을 적용할 거라고 기대합니다. JS-based scroller script들은 새로운 CSS capability 들이 지원되지 않는 브라우저에 polyfill로서 존재하고 있는 상황입니다. 우리는 모바일 웹의 잠정적인 개선사항을 다루는 툴을 통해 간단하게 이 기능을 볼 수 있을 뿐입니다.


Debugging touchOverflow


일반적으로 touchOverflow 는 overflow area의 touch-scrolling을 지원하는 디바이스에서만 가능합니다. 데스크탑에서는 가능하지 않습니다. 그래서 이 touchOverflow 기능을 디버깅하는것이 어렵습니다. 이 touchOverflow 를 모둔 브라우저에서 가능하도록 하려면 아래 예제처럼 하세요.


<script>
$(document).bind("mobileinit", function() {
  $.support.touchOverflow = true;
  $.mobile.touchOverflowEnabled = true;
});
</script>



반응형

JQuery Mobile - PhoneGap apps

2012. 7. 9. 22:36 | Posted by 솔웅


반응형

Building PhoneGap apps with jQuery Mobile


폰갭(PhoneGap)은 웹 기술로 된 native application 을 개발할 수 있도록 해 주는 HTML5 app 플랫폼 입니다. 애플리케이션은 일반 HTML 페이지로 빌드 됩니다. 이것을 UIWebView나 WebView 안에 넣은 native 어플리케이션 처럼 작동시키도록 package 되는 겁니다. 폰갭은 jQuery Mobile과 잘 어울려서 많이 사용 되고 있습니다. 폰갭과 함께 사용하는데 몇가지 팁을 제공해 드리려고 합니다.


local file:// URL로 폰갭 어픞피케이션에 의해 initial application document가 로드 됩니다. 이 의미는 여러분 회사의 remote server로부터 받은 페이지를 pull in 하고 싶으시다면 그 서버의 절대 URL 경로를 넣어야 한다는 겁니다. 왜냐하면 여러분의 document는 근본적으로 file://URL 형식이고 여러분의 remote 서버로부터 페이지나 assets들을 로딩하는 것은 특정 상황에서는 block 될 수 있는 cross-domain request 이기 때문입니다.


Phone Gap jQuery Mobile 어플리케이션 안에서 cross-domain 페이지들을 접근하는 것은 두가지 중요한 기능을 controll 해야 가능합니다. $.support.cors$.mobile.allowCrossDomainPages 이 그것입니다. 이것은 추후에 폰갭이 버전업해서 기능 추가나 기능 변경이 있게 되면 영향을 받을 수 있습니다.





$.support.cors


jQuery core에는 $.support.cors boolean 이 있습니다. 이것은 cross-domain request를 위한 W3C의 Cross-Origin Resource Sharing 기능을 지원하는 브라우저인지 아닌지를 나타내는 겁니다.


jQuery Mobile은 jQuery core의 $ajax() functionality에 의존하고 있습니다. $.support.cors 는 $ajax에게 cross-domain 페이지들을 로드하라고 하기 위해 반드시 true로 세팅되어야 합니다. 블랙베리캍은 일부 플랫폼에서는 webviews가 지원되지만 $.ajax()가 cross-domain 을 할 수 없도록 $.support.cors 값이 false로 세팅되어 있는 경우가 있다는 report를 받았습니다. 이럴 경우는 페이지나 asset 들의 로딩이 fail 될 수 있습니다. $.support.cors를 true로 세팅해야 합니다.


$.mobile.buttonMarkup.hoverDelay


만약 버튼 down이나 hover 상태가 (lists,buttons,links etc) 약간 버벅거린다고 느껴지시면 $.mobile.buttonMarkup.hoverDelay 가 사용중일 가능성이 있습니다. 이렇게 되면 터치 이벤트와 관계된 클래스와의 작동 시간을 줄일 수도 있지만 동시에 그 클래스가 유저가 스크롤링할 때도 apply 될 수도 있습니다. (예. 긴 리스트의 링크가 있을 때)


$.mobile.allowCrossDomainPages


jQuery Mobile이 external page를 로드하려고 할 때 이 request는 $.mobile.loadPage()를 통해 run 됩니다. 이것은 $.mobile.allowCrossDomainPages confituration 옵션이 true로 세팅되었을 경우의 cross-domain request에서만 해당 도비니다. 왜냐하면 jQuery Mobile은 그 브라우저의 location hash내의 어떤 페이지가 view 되고 있는지를 track 하기 때문입니다. 그러면 cross-site scripting 공격이 가능할 수 있습니다. 질문 안의 XSS 코드가 hash를 조종할 수 있고 그 결과로 cross-domain URL을 세팅할 수 있기 때문입니다. 이것이 $.mobile.allowCrossDomainPages 의 디폴트 값을 false로 하는 주요 이유입니다.


그래서 폰갭 앱 에서는 원격 서버의 assets 로딩을 하게 되는 phone home 일 경우 이 $.support.cors$.mobile.allowCrossDomainPages 반드시 true로 세팅되어 있어야 합니다. $.mobile.allowCrossDomainPages 옵션은 이런 cross-domain request 가 일어나기 전에 세팅되어 있어야 합니다. 그래서 저희는 이것을 mobileinit 핸들러에 wrapping 할 것을 권장합니다.


$( document ).bind( "mobileinit", function() {
    // Make your jQuery Mobile framework configuration changes here!

    $.mobile.allowCrossDomainPages = true;
});


PhoneGap White Listing


PhoneGap 1.0은 폰갭의 internal webview가  cross-domain request를 가능하게 하는 white-listing server에 대한 아이디어를 소개했습니다. 여기에 대한 정보는 PhoneGap wiki에서 보실 수 있습니다.


모든 플랫폼에서 이 white-listing feature 를 지원하는 것은 아닙니다. 그러니까 보다 자세한 사항은 PhoneGap 문서를 확인하세요. 폰갭 1.0 이전 버전은 어떤 서버에든 cross-domain request를 허용합니다.


Still having issues?


Here are a few more tips that aren't specifically related to PhoneGap but are good to know:

아래는 직접적으로 폰갭과 관련이 있지는 않지만 알아 두시면 도움이 될 사항들입니다.


앱을 인스톨 할 때 pushState feature 를 disabling하도록 추천합니다. 왜냐하면 이 기능이 있으면 원하지 않은 곳으로 navigation 하는 행위가 일어날 수 있기 때문입니다. webview 안에 URL이 보일 필요가 없다면 이 이 기능을 계속 able 상태로 놓아 둘 필요가 없습니다.


안드로이드에서는 웹뷰에서 loading 하는 시간이 길면 강제로 timeout 하게 합니다. 그런데 그 시간이 여러분이 필요로하는 시간보다 더 짧을 수 있습니다. 이 경우 이클립스 플러그인에서 Java class 가 generated 될 때 수정해서 timeout을 바꿀 수 있습니다.


super.setIntegerProperty("loadUrlTimeoutValue", 60000);



반응형

수요일의 FAQ - 070412 -

2012. 7. 8. 00:44 | Posted by 솔웅


반응형
Posted on . Written by


오늘은 수요일이자 독립기념일입니다. 독립기념일의 FAQ를 시작하겠습니다. 아래에 자주 나오는 질문 5가지와 그 답변이 있습니다.


1. ‘require(“file”)’ 과 ‘require “file”의 다른 점이 뭔가요?


여러분은 require API 에서 아래 두가지 방법을 보셨을 겁니다.

-- Example #1
local json = require( "json" )

-- Example #2
local json = require "json"


일반적으로 함수는 pass 하게 될 인자(argument)들을 요구합니다. 하지만 루아에서는 약간의

예외가 있습니다. 만약에 함수가 단 한개만의 인자만 가지고 있다면 (그것이 스트링이던

테이블이던) 괄호는 옵션 사항입니다. 이 규칙은 print 구문이나 한개의 인자(스트링이든

테이블이든) 를 받는 다른 함수에도 마찬가지로 적용됩니다.



2. 우리는 코로나의 변수와 관련해서 많은 complain을 받습니다.

분명히 변수에 값을 대입했는데 인덱스나 함수에서는 nil이라고 하니까

분명히 버그가 있을 거라는 겁니다.

 

코로나에서 사용하는 루아라는 언어로 프로그래밍을 하다보면 가장 흔하게 부딪히는 문제점이

nil 에러입니다.

다른 언어와는 다르게 루아는 변수를 사용하기 전에 선언해야 하지 않습니다.

변수에 값을 대입하지 않으면 루아는 그 값을 그냥 nil로 처리합니다.

nil 에러가 일어나는 일반적인 원인은 변수나 함수가 out of scope 일 경우가 많습니다.

여러분이 변수나 함수를 local로 정의해서 메모리를 점유하게 만들면 이런 경우가 종종

발생할 수 있습니다.

루아에서 로컬 변수의 scope은 그것이 선언된 곳 (예 main.lua)에 한정돼 있습니다.

다른 lua 파일에서 그 로컬 변수에 접근하려고 할 경우 이 nil 에러가 발생합니다.

또한 로컬 변수는 그것이 정의(선언)된 이후에 참조가 가능합니다. 변수가 선언되기 이전에

이 변수를 참조하려고 한다면 여기서도 nil 에러가 일어납니다.

 

저는 대개 로컬 변수를 루아 파일의 맨 첫 부분에 정의를 합니다. 그러면 나중에 그 변수에

접근이 가능하니까요.


-- This code block won't work because the addNumbers
-- function is called before it's been defined

local addNumbers -- forward reference

print( addNumbers( 5, 6 ) )

function addNumbers( num1, num2 )
return num1 + num2
end


-- This code block works because the addNumbers
-- function is called after it's been defined

local addNumbers -- forward reference

timer.performWithDelay( 1, function()print( addNumbers( 5, 6 ) ) end )

function addNumbers( num1, num2 )
return num1 + num2
end

 

timer.performWithDelayaddNumbers 함수가 정의 된 후에 execution code에서 addNumbers

함수를 call 합니다. 여기서 그 함수로 포인터가 access 하기 위해local addNumbers 구문이

필요합니다.


한번 변수 선언할 때 local을 없애고 어떻게 되는지 보세요. 그것이 정의 되기 전에 함수를

call 하게 되면 마찬가지로 에러가 날 겁니다. 그 변수나 함수가 nil (out of scope)인지

아닌지 체크해 보기 위해서 print 구문을 사용하셔도 됩니다. 에러가 났을 경우 정확히

어디에서 에러가 났는지 찾아보는데 도움이 될 겁니다. 변수나 함수들을 print out 할 때

콤마 , 를 사용하세요. 콤마와 함께 프린트 하게 되면 nil 밸류와 함께 함수와 테이블

addresses를 보여 줄 겁니다.



3. Facebook 인터페이스에 대한 문서는 어디에서 볼 수 있죠?


코로나의 페이스북 인터페이스는 Facebook Graph API를 사용합니다.

여기에서 코로나 페이스북 문서에 대한 인터페이스 정보를 찾아보실 수 있습니다.

Facebook API페이지의 페이스북 파라미터 정보도 찾아 보실 수 있습니다.
그리고 우리의 Jonathan Beebe의 아주 훌륭한 페이스북 튜토리얼도 참조하세요.
Implementing Facebook Single Sign-on and Uploading Photos to Facebook.

코로나 SDK에 포함된 페이스북 샘플 앱도 잊지 마시구요.



4. baseDirectory에 subdirectory 이름을 add 해서 이미지를 로드하려고

합니다.그런데 제대로 로드되지가 않네요. 뭐가 잘못된거죠?


baseDirectory
인자(argument)는 Corona API에서 아주 많이 사용되는데요.

이는 asset들에 대한 base directory를 가리키고 있습니다.

이 base directory는 사전 정의된 아래 3개 constants (상수) 중에 하나이어야 합니다.

system.ResourceDirectory,system.TemporaryDirectory, system.DocumentsDirectory

아무것도 특정하지 않으면system.ResourceDirectory 가 디폴트로 사용됩니다.


그 subdirectory에 있는 asset에 접근 하시려면 이 subdirectory는 파일 이름에 추가

하셔야 합니다. baseDirectory에 추가하시면 안 됩니다.


아래 예제가 있습니다.

local IMG_DIR = "images/"
-- Loads image from Resource directory
local image = display.newImage( "apple.png", 50, 50 )

-- Loads image from Resource directory
local image = display.newImage( "apple.png", system.ResourceDirectory, 50, 50 )

-- Loads image from images subfolder in Resource directory
local image = display.newImage( IMG_DIR .. "apple.png", 50, 50, true )

-- Loads image from images subfolder in Documents directory
local image = display.newImage( IMG_DIR .. "apple.png",
system
.DocumentsDirectory, 50, 50 )

subfolder 이름을 구분하는 구분자로는 . 가 아닌 / 를 사용한다는 것을 기억하세요.

. 는 require 에서 사용됩니다. 그리고 그 나머지에서는 / 를 사용합니다.



5. 이건 질문은 아닌데요. Lua 에만 있는 특별한 기능입니다.
함수에서 return 하는 return 값이 복수개가 될 수 있는 기능입니다.


루아는 함수에서 multiple value들을 return 할 수 있는 몇 안되는 언어중 하나입니다.

에러 메세지같은 multiple value들을 return 해야 할 때 편리하게 사용됩니다.

이 기능을 이용해 여러 진보된 기능의 루아 함수들을 많이 보실 수 있을 겁니다.

-- The string.find API returns the start and end of the found string
print( string.find( "Hello Corona user", "Corona" ) ) -- prints 7 and 12

여러분이 만드는 함수에도 이 기능을 사용하실 수 있습니다.

myRect = display.newRect( 0, 0, 25, 50 )

local function getWidthHeight( object )
return object.width, object.height
end

print( getWidthHeight( myRect ) ) -- print 25 and 50

여기까지가 오늘의 질문들입니다.

조금이라도 새로운 것을 배울 수 있는 유익한 시간이었길 바랍니다.



반응형

JQuery Mobile - Scripting pages

2012. 7. 5. 00:22 | Posted by 솔웅


반응형

Scripting pages in jQuery Mobile


jQuery Mobile은 Ajax-powered navigation system을 사용하고 있어서 여러분의 content를 다루는 script를 write 할 때 알아두면 좋을 몇가지가 있습니다. 좀 더 자세한 사항은  global configuration options, events, and methods 같은 mobile API를 읽어보시던가 Ajax navigation model의 technical detail 부분을 파 보시면 도움이 될 겁니다.


Scripts & styles in the head


jQuery Mobile-driven site에서 유저가 클릭할 때 navigation system의 디폴트 behavior는 Ajax request를 formulate 하기 위해 링크의 href를 사용하는 것입니다. (request의 디폴트 link behavior인 requesting에 대한 full page load 하는 href 를 다루는 것을 하는 대신에..). 그 Ajax request가 완료되고 나면 프레임워크는 전체 text content를 받을 겁니다. 하지만 그것은 response 의 body element content 만 inject 할 겁니다. (혹은 특별한 경우 data-role="page"가 제공될 경우 그 엘리먼트를 inject 할 겁니다). 그런데 페이지의 head에는 별 특별한것이 없기 때문에 사용될게 없습니다. (페이지 타이틀 같은게 있기는 하지만 페이지에 표시할 별 다른 특별한 것은 없습니다.)  스크립트는 이런 상황에서 다이나믹하게 로드 됩니다. 이 스크립트가 일반 http request를 통해 로드된다면 로드되는 순서가 항상 같다는 보장은 없습니다. 


이 의미는 페이지의 헤드부분에 있는 어떤 스크립트나 스타일이라도 ajax를 통해서 로드되는 페이지일 때 어떤 effect도 없을거라는 겁니다. 다만 http를 통해 일반적으로 request될 때 excute 될 겁니다. jQuery Mobile 싸이트의 스크립트인 경우는 두 경우 모두를 고려해야 합니다. Ajax를 통해서 request 될 경우 head 부분이 무시될거라는 것은 이런 자바스크립트가 다시 excute 될 가능성이 아주 높다는 겁니다. (같은 스크립트를 모든 페이지에서 참조하는게 일반적인 구조이기 때문이죠.) 이것 때문에 작업하는데 좀 복잡한 점이 있기 때문에 우리는 page-specific script는 개발자에게 excuting 하는 작업을 미루고 있습니다. 그리고 head script는 브라우저 세션별로 딱 한번 execute 될 거라고 가정한 상황에서 작업을 합니다.


jQuery Mobile 싸이트로 만들 때 가장 손 쉬운 접근법은 모든 페이지의 head 부분에서 같은 스타일쉬트와 스크립트 셋트를 참조하는 것입니다. 특정 페이지에서는 특정 스크립트나 특정 스타일 쉬트를 로드해야 한다면 pageInit 이벤트에 로직을 binding 하는 방법(자세한 것은 아래에 있습니다.)을 추천합니다.  이렇게 하면 특정 페이지가 생성될 때 필요한 코드를 run할 수 있습니다. (id attribute나 다른 방법으로 determined 될수 있습니다.) 아래있는 예제는 페이지가 직접 로드되던가 Ajax를 통해 보여지고 pull in 되는 경우 code가 execute될 겁니다.


해당 페이지에만 적용되는 스크립트를 구현하기 위한 다른 접근법은 아무런 data-role=page 엘리먼트가 정의되지 않은 bodey element 의 끝에 script를 include 시키는 방법이 있을 겁니다. 만약 이 방법으로 여러분의 스크립트를 include 시킨다면 이 스크립트는 Ajax나 일반 HTTP를 통해 페이지가 로드될 때 execute 될 겁니다. 그래서 이 스크립트가 매 페이지마다 있으면 문제가 일어날 수도 있습니다. 오직 그 페이지에만 unique한 스크립트는 Ajax를 통해 fetch되는 페이지일 때 실행하도록 그 element 안에 위치시킬 수 있습니다.


pageinit = DOM ready


$(document).ready() 함수를 이용해서 DOM이 준비 되자마자 DOM-specific code를 execute 시키기는 것이 jQuery를 사용하려는 사람들이 처음 배우는 것입니다. jQuery Mobile 사이트와 앱 그리고 페이지들은 유저가 navigate 하는 것과 같은 DOM으로 request 되고 inject 됩니다. 그래서 DOM ready 이벤트를 단지 첫번째 페이지를 execute 하기위해 사용하는 것은 그다지 유용하지는 않습니다. jQuery Mobile에서 새로운 페이지가 로드되고 생성될 때마다 코드를 실행시키기위해 여러분은 pageinit 이벤트에 bind 해 주시면 됩니다.

이 pageinit 이벤트는 그것이 initialized 될 때 페이지에 trigger 됩니다. initialization 된 바로 직후에 실행되죠. 대부분의 jQuery Mobile의 공식 위벳들은 이 이벤트에 근거해서 자동적으로 initialize 됩니다. 여러분의 코드에 대해서도 같은 방식으로 적용하시면 됩니다. 


$( document ).delegate("#aboutPage", "pageinit", function() {
  alert('A page with an ID of "aboutPage" was just created by jQuery Mobile!');
}); 


만약 pageinit 이벤트가 fire 되고 위젯들이 auto-initialized 되기 전에 페이지의 content들을 다루고 싶다면 pagebeforecreate 이벤트를 바인드 하시면 됩니다.


$( document ).delegate("#aboutPage", "pagebeforecreate", function() {
alert('A page with an ID of "aboutPage" is about to be created by jQuery Mobile!'); });


Important note: pageCreate() vs pageInit()


이전의 Beta2 버전에서는 jQuery Mobile의 페이지와 child widget markup을 다루는 방법으로 권장됐던 것이 pagecreate 이벤트를 바인드 하는 것이었습니다. Beta2에서 internal change는 위벳 메소드에 direct call 하는 장소에 pagecreate를 bind 함으로서 각각의 위젯들을 decouple 하도록 만든 것이었습니다. 결과적으로 mobileinit에서 pagecreate로 유저가 바인딩하는 것은 각각의 플러그인에 의해서 enhance 돼있는 markup 이전에 바인딩을 실생시키게 됩니다. jQuery UI 위젯 Factory의 lifecycle을 유지하기위해 initialization 메소드는 create 메소드 이후에 invoke 됩니다. 그래서 pageinit 이벤트는 DOM과 자바스크립트 객체들의 post enhancement manipulation에대해 적절한 타이밍을 제공하게 되는 겁니다.  간단히 말하면 이전에 여러분이 페이지가 보여지기 이전에 enhanced markup을 다루기위해 pagecreate를 사용했다면 지금 버전에서는 대신 pageinit을 사용하면 된다는 얘기입니다.


Changing pages


현재의 active page를 바꾸기를 원하신다면 여러분은 changePage 메소드를 사용하시면 됩니다. 페이지를 바꾸기위한 방법에는 아주 많은 메소드와 프로퍼티들이 있을 수 있습니다. 그중 두가지 예제를 아래에서 다루겠습니다.


//transition to the "about us" page with a slideup transition
$.mobile.changePage( "about/us.html", { transition: "slideup"} );

//transition to the "search results" page, using data 
//from a form with an ID of "search""
$.mobile.changePage( "searchresults.php", { type: "post", data: $("form#search").serialize() });


Loading pages

외부 페이지와 그 콘텐츠 enhance를 로드하기위해 그리고 그럿을 DOM에 넣기 위해 loadPage method를 사용합니다. 페이지를 로딩할 때 여러분이 세팅할 수 있는 메소드와 프로퍼티들은 무수히 많지만 아래 간단한 한가지 예제만 보여 드리겠습니다.


//load the "about us" page into the DOM
$.mobile.loadPage( "about/us.html" );


Enhancing new markup


페이지 플로그인은 pageInit 이벤트를 dispatch 합니다. 대부분의 위젯들은 auto-initialize 하기위해 이것을 이용하죠. 위젯 플러그인 스크립트가 참조 되면 그 페이지에서 찾은 위젯들의 instance를 자동적으로 enhance 하게 됩니다.


만약 여러분이 클라이언트 사이드에서 새로운 markup을 generate 시킨다던가 Ajax를 통해서 콘텐트를 로드한다던가 그 콘텐트를 페이지에 inject 하려고 한다면 create 이벤트를 trigger 하시면 됩니다. 그러면 새로운 markup안에 있는 모든 플러그인들에 대한 auto-initialization을 처리할 수 있습니다. 이것은 어떤 엘리먼트에서도 trigger 될 수 있습니다. (page의 div에서도 가능합니다.) 그렇게 하면 매뉴얼로 각각의 플러그인(listview 버튼, select 등)을 initializing 하는 번거로움을 덜 수가 있습니다.



예를 들어 HTML markup 블럭이 Ajax를 통해서 로드됐다면 enhanced version으로 모든 위젯들을 (login form 이라면 inputs and buttons ) 자동적으로 transform 하기 위해 create 이벤트를 트리거 합니다. 예제는 아래에 있습니다.


$(...new markup that contains widgets...).appendTo(".ui-page").trigger("create");


Create vs. refresh: An important distinction


같은 위젯이 가지고 있는 create 이벤트와 refresh 메소드는 서로 다른 중요한 부분이 있습니다. create 이벤트는 한개 이상의 위젯을 가지고 있는 raw markup에 대한 enhancing에 알맞습니다. 반면에 refresh 메소드는 프로그래밍적으로 처리되고 있고 해당 UI로 update될 필요성이 있는 이미 존재하고 enhance된 위젯을 사용하기 위해 필요합니다.


예를 들어 여러분이 페이지 생성 이후에 data-role=listview 어트리뷰트로 정렬돼 있지 않은 새로운 list를 다이나믹하게 추가해야하는 페이지가 있다면 그 리스트의 parent element에 create를 트리거 함으로서 listview 스타일 위젯으로 그것을 transform 하도록 만들겁니다. 그 다음에 좀 더 많은 아이템들이 프로그램적으로 추가된다면 listview의 refresh 메소드를 부름으로서 enhanced state로 그 새로운 리스트 아이템들을 업데이트하게 되고 이미 존재하는 리스트 아이템들을 untouched로 남아있게 됩니다.


Scrolling to a position within a page


Back button behavior를 유지하기 위해 URL hash를 사용하고 난 후 그 페이지의 어떤 포지션으로 jump down 하기 위해 anchor를 사용하는것은 일반적인 anchor link(#foo)를 사용해서 할 수 없습니다. 스크롤 이벤트 리스너를 trigger 하지 않고 특정 Y 포지션으로 스크롤하기 위해 silentScroll 메소드를 사용해야 합니다. Y 위치로 yPos 인자를 pass 합니다. 아래 예제가 있습니다.


//scroll to Y 300px
$.mobile.silentScroll(300);


Binding to mouse and touch events


모바일에서 또 한가지 중요하게 생각해야 할 것은 마우스와 터치 이벤트를 처리하는 것입니다. 이 이벤트들은 모바일 플랫폼에 따라 많은 차이가 있습니다. 그 중에서도 일반적이고 공통적인것은 click 이벤트가 있다는 겁니다. 대개 500~700ms 의 지연이 있게 되죠. 이 지연은 더블 탭이나 스크롤 혹은 extended hold tap 이벤트가 일어나는지 아닌지를 브라우저가 catch 할 수 있는시간입니다. 이 지연을 피하려면 터치이벤트로 바인드 할 수가 있습니다.(ex. touchstart). 하지만 이 접근법에서 주의해야 할 점은 어떤 모바일 플랫폼에서는 (WP7, Blackberry) touch를 지원하지 않는다는 것입니다. 이 이슈를 해결하기 위해 어떤 플랫폼들은 touch와 mouse 이벤트를 동시에 일으킵니다. 그래서 이 두개 타입을 바인드 한다면 하나의 동작에 duplicate event가 발생할 겁니다. 우리의 해결법은 일반화된 마우스와 터치이벤트인 virtual events 세팅을 생성하는 것입니다.



이렇게 하면 기본적인 마우스 이벤트에 대한 리스너를 register 할 수 있도록 해 줍니다. 예를 들어 mousedown, mousemove, mouseup, click 같은 거죠. 이 플러그인은 해당 디바이스에 맞는 가능한 가장 빠른 시간에 listener가 invoke 되도록 화면 뒤에서 적절한 리스너를 register 하도록 해 줍니다. 하지만 아직까지 일반적인 마우스 이벤트에서 일어나는 이벤트들의 순서 부분이 남아있습니다. 각각 다른 이벤트들에 대해 같은 엘리먼트가 register 되도록 multiple handler가 필요하게 되는 것이죠. virtual mouse system은 jQuery bind event에 대한 다음과 같은 virtual evnet들을 발생 시킵니다. vmouseover, vmousedown, vmousemove, vmouseup, vclick, and vmousecancel.


Passing parameters between pages


jQuery Mobile은 internal/embeded 페이지로 pass 하는 query parameter를 지원하지 않습니다. 예를 들어 프레임워크가 #somePage?someId=1로 된 링크를 보면 이것을 "#somePage" 로 해석하고 somPage의 ID로 페이지 div를 navigate 학 ㅔ됩니다. 다음에 #somePage?someId=1의 data-url을 페이지 컨테이너에 적용하게 됩니다. #somePage?someId=2 같은 다른 params에 대한 이차적인 call들은 같은 div에서 찾을 겁니다. 왜냐하면 jQuery Mobile은 이미 세팅된 div의 data-url을 참조할 것이기 때문입니다.  페이지들 사이에서 query parameter가 필요하다면 이를 지원하는 두가지 plugin 이 있습니다. backbone.js나 spine.js를 사용할 수 있도록 하는 가벼운 플러그인으로는  page params plugin가 있고 좀 더 다양한 기능들이 제공 되는 플러그인으로는 jQuery Mobile router plugin 이 있습니다.


반응형