ÆÀºí·Î±×¸¦ À§ÇÑ ÄÚµù
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Á¦ ÄÚµù½ºÅ¸ÀÏÀº .. ÁÖº¯¿¡ Àִ°ŠÀß °¡Á®´Ù°¡ ´öÁö ´öÁö ¸¸µé¾î¼­ µ¹¾Æ°¡°Ô ¸¸µå´Â°Í ÀÔ´Ï´Ù. -.-;; ¿ì¼±Àº ¿øÇϰíÀÚ ÇÏ´Â°Ô Àß µÇ´ÂÁö¸¦ ºü¸£°Ô È®ÀÎÇÏ´Â°É ¸ñÀûÀ¸·Î ÇÕ´Ï´Ù. ±×·¡¼­ Ãʱâ ÄÚµå´Â °ÅÀÇ »À´ëÄÚµåÁ¤µµ·Î ´ëÃæ? µ¹¾Æ°¡°Ô ¸¸µé°í, ±× ÈÄ¿¡ ¿¡·¯/¿¹¿Üó¸® ±â´ÉÃß°¡¿Í ÄÚµå´Ùµë±â µîÀ» ÇÕ´Ï´Ù.

µü ÀÌ·± ½ºÅ¸ÀÏÀÌÁÒ.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Development/Forum/manager/Brain?action=download&value=6477503482.jpg

À̹ø ÆÀºíÀ» À§Çؼ­ °¡Á®´Ù ¾´°Ç planet ÀÔ´Ï´Ù. ±×·¯³ª planetÀÌ RSSÀÇ ¸ñ·ÏÀ» ÀúÀåÇÏÁö ¸øÇÏ´Â °ü°è·Î, RSS¸ñ·ÏÀ» ÀúÀåÇϱâ À§ÇÑ º°µµÀÇ php½ºÅ©¸³Æ®¿Í C ÇÁ·Î±×·¥À» ÀÛ¼ºÇß½À´Ï´Ù.

planet´Â ´ÙÇàÈ÷µµ ¼öÁýÇÑ RSS Á¤º¸¸¦ DB ÇüÅ·ΠÀúÀåÀ» Çϰí, ÀúÀåµÈ Á¤º¸¸¦ ¾ò¾î¿À±â À§ÇÑ python ÇÁ·Î±×·¥À» Á¦°øÇÕ´Ï´Ù. C ÇÁ·Î±×·¥Àº popen(3)À» ÀÌ¿ëÇØ¼­ python ÇÁ·Î±×·¥À» È£ÃâÇÏ°í ±× °á°ú°ªÀ» ½Ã°£¼øÀ¸·Î Á¤·ÄÇØ¼­ ÆÄÀÏ·Î ÀúÀåÇÕ´Ï´Ù. ÆÄÀÏ·Î ÀúÀåµÈ°Ç php½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇØ¼­ mysql DB¿¡ Áý¾î ³Öµµ·Ï Çß½À´Ï´Ù. CÇÁ·Î±×·¥¿¡¼­ Mysql API¸¦ Á÷Á¢ È£ÃâÇØ¼­ Çѹø¿¡ ³¡³¾ ¼öµµ ÀÖ°ÚÀ¸³ª ÀúÀÇ °¡´ÉÇÑ ÆíÇÑ ¹æ¹ýÀ¸·Î Á¶ÇÕÇØ¼­ ¹®Á¦¸¦ ÇØ°áÇÏÀÚ¶ó´Â öÇп¡ ¸ÂÃ߾, DB󸮰¡ ºñ±³Àû ½¬¿î PHP¸¦ ÀÌ¿ëÇß½À´Ï´Ù.

´ÙÀ½Àº C ÇÁ·Î±×·¥ ÄÚµå ÀÔ´Ï´Ù. ¿¡·¯ ó¸®? ¿¹¿Ü ó¸®? ¾Æ¹« °Íµµ ¾øÀÌ µ¹¾Æ°¡´Â°Ô È®ÀεǴ ¼öÁØÀÇ ÇÁ·Î±×·¥ÀÔ´Ï´Ù. STLÀ» ºñ·ÔÇØ¼­ ¿Â°® Àâ´ÙÇÑ°É °¡Á®´Ù ºÙ¿´±º¿ä.
#include <stdio.h> 
#include <map> 
#include <vector> 
#include <string> 
#include <string.h> 
#include <dirent.h> 
#include <sys/types.h> 
#include <libgen.h> 
 
using namespace std; 
 
// RSS ij½¬ÆÄÀÏÀÇ ¸ñ·ÏÀ» ¾ò¾î¿Â´Ù. 
vector<string> getCache() 
{ 
    struct dirent *item; 
    DIR *dp; 
    vector<string> rtv; 
 
    dp = opendir("/usr/planet/cache"); 
    if (dp != NULL) 
    { 
        for(;;) 
        { 
            item = readdir(dp); 
            if (item == NULL) 
                break; 
            // ¿ì¼±Àº joinc ÆÀºí·Î±×¿¡¼­ ¹ßÇàµÈ, RSS ij½¬¸¸ Àеµ·Ï Çß½À´Ï´Ù. 
            if(strstr(item->d_name, "teamblog.joinc.co.kr") != NULL) 
              rtv.push_back(item->d_name); 
        } 
        closedir(dp); 
    } 
  return rtv; 
} 
 
// ½Ã°£¼øÀ¸·Î Á¤·ÄÇØ¼­ DB¿¡ ÀúÀåÇϱâ À§ÇÔÀ¸·Î, map ¿¡¼­ È£ÃâµÉ °Ì´Ï´Ù. 
// »ç½Ç Mysql¿¡ ÀúÀåµÉÅ×´Ï ±»ÀÌ ½Ã°£¼øÀ¸·Î Á¤·ÄÇÒ Çʿ䵵 ¾ø°ÚÁö¸¸¿ä. 
struct ltstr 
{ 
   bool operator()(const int s1, const int s2) const 
   { 
      return s1 > s2; 
   } 
}; 
 
struct Item 
{ 
  char id[80]; 
  char channel[80]; 
}; 
 
int main(int argc, char **argv) 
{ 
  map<int, Item, ltstr> keymap; 
  map<int, Item, ltstr>::iterator mi; 
  vector<string> cache; 
  FILE *fp; 
  char buf[1024]; 
  char key[80], value[80]; 
  char command[256]; 
  Item lItem; 
 
  cache = getCache(); 
  // Cache ÆÄÀÏÀÇ ¸ñ·Ï¸¸Å­ ·çÇÁ¸¦ µ¹¸é¼­, 
  // Á¦°øµÈ python ½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇØ¼­ RSS ä³Î Á¤º¸¸¦ ¾ò¾î¿É´Ï´Ù. 
  for (int i = 0; i < cache.size(); i++) 
  { 
    int first = 0; 
    sprintf(command,"/usr/bin/planet-cache.py -L /usr/planet/cache/%s", cache[i].c_str()); 
    fp = popen(command, "r"); 
    if (fp == NULL) 
    { 
      perror("Error"); 
    } 
    while(fgets(buf, 1024, fp) != NULL) 
    { 
      if (first != 0) 
      { 
        sscanf(buf, "%s%s", value, key); 
        memset((void *)&lItem, 0x00, sizeof(Item)); 
        sprintf(lItem.id, "%s", value); 
        sprintf(lItem.channel, "%s", cache[i].c_str()); 
        keymap[atoi(key)] = lItem; 
      } 
      first = 1; 
    } 
    pclose(fp); 
  } 
  mi = keymap.begin(); 
  string channel; 
  char *dftdir = "/usr/planet/cache"; 
 
  // ¾ò¾î¿Â ä³ÎÁ¤º¸¸¦ ÀÌ¿ëÇØ¼­ 
  // °¢ ä³ÎÀÇ Æ÷½ºÆ®ÀÇ ¼¼ºÎÁ¤º¸¸¦ ¾ò¾î¿É´Ï´Ù. 
  // popenÀ¸·Î È£ÃâÇߴµ¥, playnet-cache.py ¸¦ ¾à°£ ¼öÁ¤Çؼ­, ÇØ¼®Çϱâ ÁÁÀº °á°ú¹°À» Ãâ·ÂÇϵµ·Ï Çß½À´Ï´Ù. 
  while(mi != keymap.end()) 
  { 
    channel = mi->second.channel; 
 
    sprintf(command,"/usr/local/bin/planet-cache.py -I %s/%s %s", dftdir, mi->second.channel, mi->second.id); 
    fp = popen(command, "r"); 
    if (fp == NULL) 
    { 
      perror("Error"); 
    } 
    memset(buf, 0x00, 1024); 
    while(fgets(buf, 1023, fp) != NULL) 
    { 
      printf("%s", buf); 
      memset(buf, 0x00, 1024); 
    } 
    printf("\tchannel\t%s\n", mi->second.channel); 
 
    // §.. php·Î Æ÷½ºÆ®°£ ±¸º°À» ½±°ÔÇϵµ·Ï Çϱâ À§ÇÑ ±¸ºÐ¹®ÀÚ¿­ ÀÔ´Ï´Ù. 
    // ¾ÆÁÖ ¹«½ÄÇÑ ¹æ¹ýÀÌÁÒ. 
    printf("-------------------------------------::\n\n"); 
    pclose(fp); 
    *mi++; 
  } 
} 
 

ÀÌ·¸°Ô ÇØ¼­, ÆÄÀÏ·Î ÀúÀåµÇ¸é php ½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇØ¼­ DB¿¡ ³Ö°í »ç¿ëÀÚ°¡ ¹æ¹®Çϸé ÀоîµéÀÔ´Ï´Ù. DB´Â ´ÙÀ½°ú °°½À´Ï´Ù.
+----------+--------------+------+-----+---------+-------+ 
| Field    | Type         | Null | Key | Default | Extra | 
+----------+--------------+------+-----+---------+-------+ 
| id       | varchar(80)  |      | PRI |         |       | 
| channel  | varchar(255) | YES  |     | NULL    |       | 
| date     | int(11)      | YES  |     | NULL    |       | 
| author   | varchar(24)  | YES  |     | NULL    |       | 
| comments | text         | YES  |     | NULL    |       | 
| content  | text         | YES  |     | NULL    |       | 
| link     | varchar(255) | YES  |     | NULL    |       | 
| summary  | text         | YES  |     | NULL    |       | 
| title    | varchar(255) | YES  |     | NULL    |       | 
| udate    | int(11)      | YES  |     | NULL    |       | 
+----------+--------------+------+-----+---------+-------+ 
 
  • id : Post ÁÖ¼Ò·Î Key ·Î »ç¿ëµÈ´Ù.
  • channel : ä³Î ÁÖ¼Ò
  • date : Æ÷½ºÆÃ ³¯Â¥
  • author : ÀúÀÚ
  • comments : ¿¹ºñ
  • content : º»¹®³»¿ë
  • link : ¸µÅ©ÁÖ¼Ò
  • summary : º»¹®³»¿ëÀÇ ¿ä¾àº»
  • title : Æ÷½ºÆ® Á¦¸ñ
  • udate : ¾÷µ¥ÀÌÆ® ³¯Â¥.

ÀÌÁ¦ À̰É, keyÀÎ id·Î trackback DB¿Í join Çϸé, °¢ Æ÷½ºÆ®ÀÇ Ä«Å×°í¸®¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.