¿À´ÃÀÇ ±â»ç ¸ðµâ ÀÛ¼º±â
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

"¿À´ÃÀÇ ±â»ç" ¸ðµâ¸¸µé±â

1절. ¼Ò°³

ÀÌ »çÀÌÆ®´Â phpnuke ¸¦ ÅëÇØ¼­ ¸¸µé¾î Á³À¸¸ç, weblog ÇüŸ¦ ÃëÇϰí ÀÖ´Ù. ±×·± ÀÌÀ¯·Î Çѹø Áö³ª°£ ±â»ç´Â Ưº°È÷ °Ë»öÀ» ÇÏÁö ¾Ê´ÂÇÑ Á¢ÇϱⰡ ¾î·Æ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. ±×·¡¼­ À̹ø¿¡ °ú°Å Áö³ª°£ ±â»ç¸¦ ·£´ýÇÏ°Ô °¡Á®¿À´Â ¸ðµâÀ» ¸¸µé±â·Î Çß´Ù. ÀÌ ¸ðµâÀº mysql ¿¡ ¿¬°áÇØ¼­ ¸î°³ÀÇ ±â»ç¸¦ ·£´ýÇÏ°Ô °¡Á®¿Í¼­ webpage ÇüÅ·Π¸¸µé¾îÁÖ´Â ¿ªÇÒÀ» ÇÏ°Ô µÇ¸ç, ÇÏ·ç ´ÜÀ§·Î ±â»ç¸¦ ±³Ã¼ÇÏ°Ô µÈ´Ù.

ÀÌÀü¿¡µµ ¿À´ÃÀÇ ¸í·É¾î ¸ðµâ Á¦À۱⠸¦ ÅëÇØ¼­ ÀÌ¹Ì mysql ¿¡ Á¢±ÙÇØ¼­ ·£´ýÇÏ°Ô DB³»¿ëÀ» °¡Á®¿À´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑÀûÀÌ ÀÖ´Ù. ±×·¯¹Ç·Î À̹ø¿¡´Â ±×¶§¿Í´Â Á¶±Ý ´Ù¸¥ ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ°Ô µÉ°ÍÀÌ´Ù. ¸¸µé¾îÁø ¸ðµâÀº ¾Æ·¡¿Í °°ÀÌ ¼­ºñ½ºµÈ´Ù.

그림 1. random_article


2절. ÇÁ·Î±×·¥ Á¦ÀÛ

2.1절. ±¸ÇöÇØ¾ßÇÒ ±â´É

¸¸µé¾î¾ß µÉ ÇÁ·Î±×·¥ÀÇ À̸§Àº random_article ·Î Á¤Çß´Ù. ÀÌ ÇÁ·Î±×·¥Àº ÇÏ·ç ´ÜÀ§·Î ½ÇÇàÀÌ µÇ¾î¼­ ·£´ýÇÏ°Ô ±â»çÀÇ Á¤º¸¸¦ °¡Á®¿Í¼­ html ÆäÀÌÁö·Î ¸¸µé¾îÁØ´Ù. ÇÏ·ç´ÜÀ§·Î ÀÏÁ¤ÇÏ°Ô ½ÇÇàÇϱâ À§Çؼ­ cron À» »ç¿ëÇÏ´Â ´ë½Å¿¡, ÇÁ·Î±×·¥ ³»ºÎ¿¡¼­ À̸¦ ±¸ÇöÇϵµ·Ï ÇßÀ¸¸ç, ±×·¯±â À§Çؼ­ ÀÌ ÇÁ·Î±×·¥Àº µ¥¸ó¸ðµå·Î ÀÛµ¿µÇ°Ô µÉ°ÍÀÌ´Ù.

¶ÇÇÑ ¾Æ±Ô¸ÕÆ®¸¦ ó¸®ÇÒ¼ö ÀÖ¾î¾ß Çϸç, ¾Æ±Ô¸ÕÆ®¸¦ ÅëÇÏ¿©¼­ ¿©·¯°¡Áö »çÇ×µé(¾î¶² ¼³Á¤ÆÄÀÏÀ» ÂüÁ¶ÇÒ°ÍÀÎÁö, µ¥¸ó¸ðµå·Î ½ÇÇà½Ãų°ÍÀÎÁö µî)À» ÁöÁ¤Çϵµ·Ï ÇÁ·Î±×·¡¹Ö ÇÒ°ÍÀÌ´Ù.

¼³Á¤ÆÄÀÏÀ» Áö¿øÇØ¾ß ÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¼³Á¤ÆÄÀÏÀ» °¡Áö¸ç ¼³Á¤ÆÄÀÏÀÇ ³»¿ëÀ» ÅëÇÏ¿©¼­ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀ» Á¦¾îÇÏ°Ô µÉ°ÍÀÌ´Ù. ¼³Á¤ÆÄÀÏ¿¡´Â ¾÷µ¥ÀÌÆ® ½Ã°£, °¡Á®¿Ã ±â»çÀÇ ¼ýÀÚ, html ÆäÀÌÁöÀÇ À§Ä¡, db ¿¡ ¿¬°áÇϱâ À§ÇÑ °¢Á¾ Á¤º¸ - È£½ºÆ®, À¯ÀúÀ̸§, ÆÐ½º¿öµå, db À̸§ - µîµµ ¸ðµÎ ¼³Á¤ÆÄÀÏÀÇ ³»¿ë¿¡ µé¾î°¡°Ô µÉ°ÍÀÌ´Ù. Áï ÇϵåÄÚµùÀ» Áö¾çÇÏ°í ¼³Á¤ÆÄÀÏÀ» ÅëÇØ¼­ À¯µ¿ÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ ½ÇÇà ȯ°æÀ» º¯°æÇÒ¼ö ÀÖµµ·Ï ÇÒ°ÍÀÌ´Ù.


2.2절. ÇÁ·Î¼¼½º

random_article Àº ÃÖÃÊ¿¡ ¼³Á¤ÆÄÀÏÀ» Àоîµé¿©¼­, Á¢±ÙÇØ¾ßÇÒ DB Á¤º¸, °¡Á®¿Í¾ßµÉ ±â»çÀÇ ¼ö, ±â»ç ¾÷µ¥ÀÌÆ® ½Ã°£ µîÀÇ ±âº»Á¤º¸¸¦ ¾ò¾î¿Â´Ù. ÀÏ´Ü Á¢±ÙÀ» Çß´Ù¸é DB ¿¡ ¿¬°áÇØ¼­ ±â»çµéÀ» °¡Á®¿Í¼­ html ÆäÀÌÁö¸¦ ¸¸µç´Ù. ±×ÈÄ¿¡ ±â»ç ¾÷µ¥ÀÌÆ® ½Ã°£±îÁö sleep ¿¡ µé¾î°¡°Ô µÇ°í, ¾÷µ¥ÀÌÆ® ½Ã°£ÀÌ µÇ¸é ±ú¾î³ª¼­ ±â»çÀÇ ³»¿ëÀ» ¾÷µ¥ÀÌÆ® ÇÏ°Ô µÉ°ÍÀÌ´Ù.

             +------------------+
             |       ½ÃÀÛ       |
             +------------------+
                      | <------- ¼³Á¤ÆÄÀÏ  
                      | 
             +------------------+   query    +------+  +---+   +---+
      +----->|   ±â»ç°¡Á®¿À±â   | <--------> | DB   |  |   |   |   |
      |      +------------------+            +------+  |   |   | B |
      |               |                                | W |   | R |
      |      +------------------+            +------+  |   |   | O |
      |      | HTML ÆäÀÌÁö ÀÛ¼º | ---------> | HTML |--| E |-->| W |--> Client
      |      +------------------+            +------+  |   |   | S |
      |               |                                | B |   | E |
      |      +------------------+                      |   |   | R |
      |      |      SLEEP       |                      |   |   |   |
      |      +------------------+                      +---+   +---+
      |               | 
      +---------------+ 
			


2.3절. ÁÖ¿ä ÇÁ·Î±×·¥ ¸ðµâ ¼³¸í

¿©±â¿¡¼­´Â random_article ¸¦ ±¸¼ºÇÏ´Â °¢ ¸ðµâµéÀ» Á¤ÀÇ ÇÒ°ÍÀ̸ç, °¢°¢ÀÇ ¸ðµâµéÀ» ±¸¼ºÇÏ´Â ¹æ½ÄÀ¸·Î ÇÁ·Î±×·¡¹Ö ÀÛ¾÷ÀÌ ÁøÇà µÉ°ÍÀÌ´Ù.


2.3.1절. ¾Æ±Ô¸ÕÆ® ºÐ¼® ¸ðµâ

¾Æ±Ô¸ÕÆ®¸¦ Àоîµé¿©¼­ À̸¦ ¸Þ¸ð¸®¿¡ ÀûÀçÇÏ´Â ¸ðµâÀÌ´Ù. getopt¸¦ ÅëÇØ¼­ ±¸ÇöÀ» Çϸç, µ¥¸ó¸ðµåÀÎÁö ¾Æ´ÑÁö¿Í ¼³Á¤ÆÄÀÏÀÇ À§Ä¡¸¦ ¾Æ±Ô¸ÕÆ®¸¦ ÅëÇØ¼­ ¹Þ¾ÆµéÀδÙ. ¶ÇÇÑ help ¿Í version µîÀÇ Á¤º¸¸¦ º¸¿©ÁÖ±â À§ÇÑ ¾Æ±Ô¸ÕÆ®µµ ¹Þ¾ÆµéÀδÙ.


2.3.2절. ¼³Á¤ÆÄÀÏ Àб⠸ðµâ

¼³Á¤ÆÄÀÏÀ» ÀоîµéÀÌ°í ºÐ¼®Çؼ­ ±¸Á¶Ã¼¿¡ ÀúÀåÇÑ´Ù. ¼³Á¤ÆÄÀÏ ¿¡´Â db Á¤º¸¿Í ±â»ç ¾÷µ¥ÀÌÆ® ½Ã°£, °¡Á®¿Ã ±â»çÀÇ ¼öµîÀ» ÁöÁ¤Çϸç csv ½ºÅ¸ÀÏÀ» µû¸¥´Ù. ±¸Á¶Ã¼´Â STL ÀÇ map À» ÀÌ¿ëÇÒ°ÍÀÌ´Ù.

# ¼³Á¤ÆÄÀÏÀÇ ¿¹
db_host,127.0.0.1
db_user,yundream
db_pass,password
db_name,mydb

# ¾÷µ¥ÀÌÆ® ½Ã°£ HH
up_time,4
article,2
				
ÀÌ ¼³Á¤ÆÄÀÏÀº ÁÖ¼® '#' ¿ª½Ã Áö¿øÇÏ°Ô µÉ°ÍÀÌ´Ù. ¶ÇÇÑ ºó ¶óÀÎÀº ±×³É ³Ñ¾î°¡°Ô µÉ°ÍÀÌ´Ù. ±×·¯³ª ¿©·¯°¡Áö ¿¹¿Ü »çÇ×µé ¿¹¸¦ µé¾î ºóÄ­µÚ¿¡ '#' ÀÌ ¿À°Å³ª, '\t' ' ' ´ÙÀ½¿¡ '\n' ÀÌ ¿À´Â µîÀÇ ¶óÀο¡ ´ëÇØ¼­´Â üũÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº »ç¿ëÀÚ°¡ ¼³Á¤ÆÄÀÏÀ» Á¤È®ÇÏ°Ô ÀÔ·ÂÇÒ°ÍÀ̶ó´Â°É °¡Á¤Çϰí ÇÁ·Î±×·¡¹Ö µÉ°ÍÀÌ´Ù. ¿¹¿Ü »çÇ× Ã³¸®´Â °¢ÀÚÀÇ ¸òÀÌ´Ù.


2.3.3절. DB ¸ðµâ

DB ¿¡ Á¢±Ù Çϰí, Äõ¸®¸¦ ½ÇÇà ±× °á°ú¸¦ ¹Þ¾Æ¿À´Â ÀÏÀ» ÇÑ´Ù. ¹Þ¾Æ¿Â °á°ú¸¦ ÀÌ¿ëÇØ¼­ ·£´ýÇÑ ±â»ç ¹øÈ£¸¦ ÃßÃâÇØ³½´Ù.


2.3.4절. html »ý¼º ¸ðµâ

±â»ç¹øÈ£¸¦ ÀÌ¿ëÇØ¼­ html ÆäÀÌÁö¸¦ »ý¼ºÇس½´Ù. html ÆäÀÌÁö¿¡ ´ã±â´Â ³»¿ëÀº ±â»ç¿¡ ¸µÅ©ÇÒ¼ö ÀÖ´Â Á¤º¸ÀÌ´Ù.


2.3.5절. time ¸ðµâ

sleep ½Ã°£À» Á¶Á¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ÃÖÃÊ ÇÁ·Î±×·¥À» ½ÃÀÛÇϸé ÇöÀçÀÇ ½Ã°£¿¡¼­ ¼³Á¤ÆÄÀÏ¿¡ ÁöÁ¤µÈ ½Ã°£±îÁöÀÇ ½Ã°£À» 'ÃÊ' ´ÜÀ§·Î °è»êÇØ¼­ sleep Àû¿ëÇÑ´Ù. ±× µÚ¿¡´Â ¹«Á¶°Ç ÇÏ·ç(60*60*24 ÃÊ)¸¦ ±â´Ù¸°´Ù.

½Ã°£ °è»ê ¹æ¹ýÀº °£´ÜÇÏ´Ù. ¸¸¾à Áö±Ý ½Ã°£ÀÌ ¼³Á¤ÆÄÀÏ¿¡ ÁöÁ¤µÈ ½Ã°£º¸´Ù Å©´Ù¸é, (Áö±Ý½Ã°£ - ¼³Á¤½Ã°£) * 60 À» Çϰí, ±×·¸Áö ¾ÊÀ»°æ¿ì (¼³Á¤½Ã°£ - Áö±Ý½Ã°£) * 60 À» ÇÒ°ÍÀÌ´Ù. ¾à°£ÀÇ ½Ã°£ ¿ÀÂ÷(ÃÖ´ë 59ºÐ) ´Â ¹«½ÃÇϱâ·Î ÇÑ´Ù.


2.4절. ½ÇÁ¦ÄÚµù

½ÇÁ¦ÄÚµùÀº À§ÀÇ ¸ðµâÀ» ÄÚµùÇϱ⸸ ÇÏ¸é µÈ´Ù. »õ·Î¿î ¸ðµâÀÌ ¾øÀ¸¹Ç·Î ÀÌÇØÇϴµ¥ Å©°Ô ¾î·Á¿òÀÌ ¾øÀ»°ÍÀÌ´Ù. °¢ ¸ðµâ¿¡ ¾²ÀÎ ±â¼ú ¿ª½Ã ÀÌ »çÀÌÆ®¿¡¼­ ´ëºÎºÐ ´Ù·ç¾ú´ø °ÍÀ̹ǷΠ¸¶Âù°¡Áö·Î ½±°Ô ÀÌÇØ °¡´ÉÇÒ°ÍÀÌ´Ù.


2.4.1절. DB TABLE ±¸Á¶ ¿Í query

table À̸§Àº nuke_stories ÀÌ´Ù. ÀÌ Å×ÀÌºí ³»¿ëÀ» desc ÇÑ °á°ú´Â ´ÙÀ½°ú °°´Ù. Âü°í·Î desc ´Â Å×ÀÌºí ±¸Á¶¸¦ º¸¿©ÁÖ±â À§Çؼ­ mysql ¿¡¼­ Á¦°øÇÏ´Â ¸í·É¾îÀÌ´Ù.

mysql> desc nuke_stories;
+-----------+-----------------------+------+-----+---------+----------------+
| Field     | Type                  | Null | Key | Default | Extra          |
+-----------+-----------------------+------+-----+---------+----------------+
| sid       | int(11)               |      | PRI | 0       | auto_increment |
| catid     | int(11)               |      |     | 0       |                |
| aid       | varchar(30)           |      |     |         |                |
| title     | varchar(80)           | YES  |     | NULL    |                |
| time      | datetime              | YES  |     | NULL    |                |
~~
~~
| ratings   | int(10)               |      |     | 0       |                |
+-----------+-----------------------+------+-----+---------+----------------+
				
Å×À̺í Çʵ尡 ²Ï ¸¹À¸¹Ç·Î Áß¿äÄ¡ ¾ÊÀº°ÍµéÀº »ý·«Çß´Ù. ¿ì¸®´Â À§ÀÇ ÇõåÁß¿¡¼­ ±â»çÀÇ ¹øÈ£¸¦ ³ªÅ¸³»´Â sid ¿Í, title ¸¦ °¡Áö°í ¿À¸é µÈ´Ù.

¿©±â¿¡¼­´Â 2°³ÀÇ Äõ¸®°¡ »ç¿ëµÉ°ÍÀÌ´Ù. nuke_stories Å×ÀÌºí¿¡ Æ÷ÇÔµÈ tuple ÀÇ ¼ö¸¦ °¡Á®¿À´Â Äõ¸®¿Í ½ÇÁ¦ tuple ¸¦ °¡Á®¿À´Â Äõ¸®ÀÌ´Ù.

query> select count(sid) from nuke_stories;
query> select sid, title from nuke_sotires limit 10, 1;
				


2.4.2절. ½ÇÁ¦ ÄÚµù

ÄÄÆÄÀÏ·¯´Â ¸î°³ÀÇ STL ÅÛÇø´°ú, string À» »ç¿ëÇϱâ À§Çؼ­ C++ À» ÀÌ¿ëÇß´Ù. ±×·¯³ª ÄÚµåÀÇ ÇüÅ´ ÀüÀûÀ¸·Î CÀÇ ±¸Á¶¸¦ µû¸£°í ÀÖ´Ù.

¼³Á¤ÆÄÀϳ»¿ëÀ» ÀúÀåÇϱâ À§ÇÑ ÀڷᱸÁ¶·Î STL ÀÇ map ¸¦ »ç¿ëÇÏ¿´´Ù. perl À̳ª php ¸¦ »ç¿ëÇØ º¸¾Ò´Ù¸é ¸¹ÀÌ »ç¿ëÇØ º¸¾ÒÀ» ÀڷᱸÁ¶ÀϰÍÀÌ´Ù. map Àº index key ¸¦ int ÇüÀÇ ¼ýÀÚ¸»°íµµ ¹®ÀÚ¿­µîÀ» index key ·Î °¡Áú¼ö ÀÖ´Â ÀڷᱸÁ¶ ÇüÅÂÀÌ´Ù.

±×¹ÛÀÇ ³»¿ëµéÀº ÀϹÝÀûÀÎ ³»¿ëÀ̹ǷΠÄÚµå ÁÖ¼®À» ÅëÇØ¼­ ¼³¸íÇϵµ·Ï ÇϰڴÙ. ÀÌÇØÇϴµ¥ ÀüÇô ¾î·Á¿òÀÌ ¾øÀ»°ÍÀÌ´Ù.

¿¹Á¦: random_article.cc

#include <mysql.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
#include <map>
#include <string>
#include <vector>

void opt_parser(int, char **, char **);
void help();
void version();
void initdaemon();
map<string, string> cfg_parser(FILE *fp);
FILE *open_cfgfile(char *config_filename);
void close_cfgfile(FILE *fp);
int get_sleep_time(int cfgtime);
vector<int> article_num(int num, int total_num);

int main(int argc, char **argv)
{
    MYSQL        *connection=NULL, conn;
    MYSQL_RES    *sql_result;
    MYSQL_ROW    sql_row;
    int            query_stat;
    char        query[255];
    char        *config_filename;
    map<string, string> cfg_data;
    FILE *fp, *html_fp;
    int  late_time;
    int  loop;
    vector<int> list_num;

    // ¾Æ±Ô¸ÕÆ®¸¦ ÇØ¼®ÇÑ´Ù. 
    opt_parser(argc, argv, &config_filename);

    // ¼³Á¤ÆÄÀÏÀ» OPEN ÇÑ´Ù.  
    fp = open_cfgfile(config_filename);
    if (fp == NULL)
    {
        perror("file open error : ");
        exit(0);
    }

    // ¼³Á¤ÆÄÀÏÀ» ºÐ¼®ÇÑ´Ù. 
    cfg_data = cfg_parser(fp);
    close_cfgfile(fp);

    // ÃÖÃÊ ±â»ç ¾÷µ¥ÀÌÆ® ½Ã°£À» °è»êÇÑ´Ù. 
    late_time = get_sleep_time(atoi(cfg_data["up_time"].c_str()));

    // DB ¿¬°áÇØ¼­ ÇÊ¿äÇÑ ·£´ýÇÑ ±â»çÁ¤º¸¸¦ °¡Á®¿Â´Ù. 
    while(1)
    {
        mysql_init(&conn);
        connection =mysql_real_connect(&conn, cfg_data["db_host"].c_str(),
                                                 cfg_data["db_user"].c_str(),
                                                 cfg_data["db_pass"].c_str(),
                                               cfg_data["db_name"].c_str(),
                                              3306,
                                              (char *)NULL, 0); 
        if (connection == NULL)
        {
            fprintf(stderr, "Mysql connection error : %s", mysql_error(&conn));
            exit(0);
        }

        // Àüü ±â»çÀÇ row(Æ©ÇÃ) °¹¼ö¸¦ °¡Á®¿Â´Ù.
        query_stat = mysql_query(connection, 
                             "select count(sid) from nuke_stories"); 
        if (query_stat != 0)
        {
            fprintf(stderr, "Mysql query erro : %s", mysql_error(&conn));
            return -1;
        }
        sql_result = mysql_store_result(connection);
        if ((sql_row = mysql_fetch_row(sql_result)) == NULL)
        {
            fprintf(stderr, "Mysql query error : %s", mysql_error(&conn)); 
            return -1;
        }

        // ·£´ýÇÑ ¹øÈ£¸¦ °¡Á®¿Â´Ù.
        list_num = article_num(atoi(cfg_data["article"].c_str()), atoi(sql_row[0]));
        mysql_free_result(sql_result);

        html_fp = fopen(cfg_data["html"].c_str(),"w");
        if (html_fp == NULL)
        {
            perror("file open error 1: ");
            exit(0);
        }

        // ·£´ýÇÑ ±â»ç ¹øÈ£¸¦ ÀÌ¿ëÇØ¼­ html ÆäÀÌÁö¸¦ ÀÛ¼ºÇÑ´Ù. 
        fputs("<?\n", html_fp);
        for (loop = 0; loop < list_num.size(); loop ++)
        {
            char url_query[255];
            sprintf(query, "select sid, title from nuke_stories limit %d, 1", 
                            list_num[loop]);  
            query_stat = mysql_query(connection, query);
            sql_result = mysql_store_result(connection);
            sql_row = mysql_fetch_row(sql_result);
            sprintf(url_query, "$content .= \"<a href=modules.php?name=News&"
                               "file=article&sid=%d"
                               "&mode=&order=0&thold=0>%s</a><br>\";\n"
                               ,atoi(sql_row[0])
                               ,sql_row[1]);
            fputs(url_query, html_fp);
        }    
        fputs("?>\n", html_fp);
        fclose(html_fp);

        mysql_free_result(sql_result);
        mysql_close(connection);

        sleep(late_time);
        late_time = 60*60*24; 
    }
}

// ¾Æ±Ô¸ÕÆ®¸¦ ºÐ¼®ÇÑ´Ù.
void opt_parser(int arg_num, char **arg_str, char **config_file)
{
    int opt;
    int opt_ok = 0;
    while((opt = getopt(arg_num, arg_str, "vhdf:")) != -1)
    {
        switch(opt)
        {
            case 'h':
                help();
                break;
            case 'v':
                version();
                break;
            case 'd':
                initdaemon();
                break;
            case 'f':    
                *config_file = optarg; 
                opt_ok = 1;
                break;
            default:
                help();
                break;
            
        }
    }
    if (opt_ok != 1)
    {
        help();
    }
}

// µµ¿ò¸»À» Ãâ·ÂÇÑ´Ù.
void help()
{
    printf("Usage: random_article -[hvd] -f [cfg file]\n");
    exit(0);
}

// ¹öÁ¯Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.
void version()
{
    printf("random_article\nVersion 1.0\n");
    exit(0);
}

// ÇÁ·Î¼¼½º¸¦ µ¥¸ó »óÅ·Π¸¸µç´Ù. 
void initdaemon()
{
    pid_t pid;

    if ((pid = fork()) < 0)
        exit(0);

    else if (pid !=0)
        exit(0);

    setsid();
    chdir("/");
}

// config ³»¿ëÀ» Àоîµé¾î¼Å scanf ·Î ÆÄ½ÌÇÑ´Ù.
// ÆÄ½ÌÇÑ ³»¿ëÀº map ÇüÅ·Π¸®ÅÏÇÑ´Ù. 
map<string, string> cfg_parser(FILE *fp)
{
    char buf[80];
    char null[2];
    char key[20], value[80]; 
    map<string, string> cfg_data;
    string s_key, s_value;

    while(fgets(buf, 80, fp) != NULL)
    {
        if ((buf[0] != '#' && buf[0] != '\n'))
        {	
            sscanf(buf,"%[a-zA-Z_]%[,]%s", key, null, value);
            s_key = key;
            s_value = value;
            cfg_data[s_key] = s_value; 
        }
    }
    return cfg_data;
}

// config ÆÄÀÏÀ» ¿¬´Ù.
FILE *open_cfgfile(char *config_filename)
{
    FILE *fp;        
    fp = fopen(config_filename, "r");
    return fp;
}

// config ÆÄÀÏÀ» ´Ý´Â´Ù.
void close_cfgfile(FILE *fp)
{
    fclose(fp);
}

// sleep ½Ã°£À» °Ë»çÇÑ´Ù. 
// ½Ã°£(hour) ´ÜÀ§À̸ç, 
// sec ¸¦ ³Ñ±ä´Ù.
int get_sleep_time(int cfgtime)
{
    time_t now_time;
    struct tm *tm_ptr;    
    int    late_time;

    time(&now_time);
    tm_ptr = localtime(&now_time);
    late_time = abs(tm_ptr->tm_hour - cfgtime);
    return late_time * 60 * 60;
}

// ·£´ýÇÏ°Ô °¡Á®¿Ã ±â»ç¹øÈ£ÀÇ ¸®½ºÆ®¸¦ ³Ñ±ä´Ù.
// ±â»ç¹øÈ£°¡ 0À̰ųª, µ¿ÀÏÇÑ ±â»ç¹øÈ£°¡ ³ª¿À´ÂÁö 
// °Ë»çÇÑ´Ù.
vector<int> article_num(int num, int total_num)
{
    vector<int return_num;
    int random_number;
    int check_number = 1;
    int count=0, i=0;;
    time_t now_time;
    time(&now_time);
    srandom((unsigned int)now_time);

    while(count < num)
    {
        check_number = 1;
        random_number = random()%total_num;
        if (random_number == 0)
            continue;
        for (i = 0; i < return_num.size(); i++)
        {
            if (random_number == return_num[i])
            {
                check_number = 0;
                break;
            }    
        }

        if (check_number != 0)
        {
            return_num.push_back(random_number);
            count++;
        }
    }
    return return_num;
}    
				

´ÙÀ½Àº ¼³Á¤ÆÄÀÏÀÇ ³»¿ëÀÌ´Ù.

db_host,127.0.0.1
db_user,test
db_pass,password
db_name,mydb

up_time,4
article,2
html,/home/html/blocks/block-random_article.php
				

½î¾² ÄÄÆÄÀÏÀº g++ À» ÀÌ¿ëÇØ¼­ ´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀÏÇÑÈÄ ½ÇÇàÇÑ´Ù. -d ¿É¼ÇÀ» ÁÙ°æ¿ì daemon ¸ðµå·Î ½ÇÇàµÈ´Ù. library ¿Í incldue ÆÐ½º´Â ½Ã½ºÅÛ¿¡ µû¶ó¼­ ´Þ¶óÁú¼ö ÀÖ´Ù.

[root@localhost source]# g++ -o random_article random_article.cc -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient
[root@localhost source]# ./random_article -f /etc/article.cfg
				


3절. °á·Ð

ÀÌ»ó random_article ÇÁ·Î±×·¥Á¦À۱⿡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. Å×½ºÆ®¸¦ ¿øÇÑ´Ù¸é Àû´çÇÏ°Ô db Å×À̺íÀ»±¸¼ºÇÑ´ÙÀ½ Å×½ºÆ®ÇÏ¸é µÈ´Ù. ¹°·Ð mysql ¼­¹ö°¡ ¶°ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡¼­ ÀÌ´Ù.

À§ ÇÁ·Î±×·¥Àº ¿©·¯°¡Áö ¿¡·¯Ã³¸® µîÀº º°·Î ½Å°æÀ» ¾²Áö ¾Ê¾ÒÀ¸¸ç, È¿À²ÀûÀÎ ÄÚµù¹æ¹ýÀ» ã±â À§Çؼ­ Ưº°È÷ ³ë·ÂÇÑ Äڵ尡 ¾Æ´Ñ, Áö±ØÈ÷ º¸¿©ÁÖ±â À§ÇÑ ¸ñÀûÀ¸·Î ÀÛ¼ºµÈ ÄÚµåÀ̹ǷÎ, °³¼±ÇÒ ¿©Áö°¡ ¸¹ÀÌ ÀÖÀ»°ÍÀÌ´Ù. ¿©±â¿¡ ´ëÇØ¼­´Â °¢ÀÚ ½Ã°£ÀÌ ³²À»¶§ »ý°¢ÇØ º¸±â ¹Ù¶õ´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.