ABA


"מערכת: בניית חתימת טקסט אוטומטית. בPHP"
גירסת הדפסה        
קבוצות דיון בניית אתרים נושא #15205 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15205
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   01:54   28.07.09   
אל הפורום  
  מערכת: בניית חתימת טקסט אוטומטית. בPHP  
 

טוב, רובכם בוודאי מכירים את החתימה המשתנה אוטומאטית ע"פ כל מיני קריטריונים, זאת שנמצאת אצל הרבה בפורומים בחתימה.
אז החלטתי לבנות אחת כזאת בעצמי, או לפחות סוג של.

אז אני עוד לא סיימתי, אבל הגעתי לשלב מאוד מעניין, ואני אשמח לשתף אתכם בשלבי העבודה שלי עד כה.

שלב ראשון, על מנת ליצור חתימה המשתנה אוטומאטית, או לפחות בלי שום עזרה, אני אשתמש במנוע הGD של PHP שיודע לצייר וליצור קבצי גראפיקה על השרת, באמצעות כמה פונקציות בסיסיות.

הפונקציה העיקרית שבניתי לצורך העניין היא זאת:


function newImage($line1,$line2,$len,$imageNumber,$adText)
{

$font_number=3;

$width=2*$len*imagefontwidth($font_number);
$height=6.6*imagefontheight($font_number);

$image=imagecreate($width/1.5,$height);
$back_color=imagecolorallocate($image,255,255,255);
$drawing_color=imagecolorallocate($image,0,0,0);

$xPos=($width-$len*imagefontheight($font_number))/2;
$yPos=($height-imagefontheight($font_number))/2;

$font = imageloadfont('fonts/arial.gdf');
$adFont = imageloadfont('fonts/adFont.gdf');

imagestring($image,$adFont,$len*1.9,$yPos,$adText,$drawing_color);
imagestring($image,$font-1,$xPos,$yPos-25,$line2,$drawing_color);
imagestring($image,$font-1,$xPos,$yPos-40,$line1,$drawing_color);

imagejpeg($image,"images/image$imageNumber.jpeg");
imagedestroy($image);
echo "<img src=images/image$imageNumber.jpeg>";
}


אוקי קצת מבלבל אך פשוט ביותר.

אני אסביר בהתחלה על הדברים היותר חשובים.
אני יוצר תמונה, ולכן השתמשתי בפונקציה:


imagecreate()

היוצרת תמונה, עם הפרמטרים של רוחב, וגובה.

imagecolorallocate()

המאפשרת לי להתאים צבעים לתמונה שאבחר כפרמטר הראשון, ואז עוד שלושה פרמטרים של RGB (אדום,ירוק,כחול).

אלו הם שלבי יצירת התמונה עצמה.
לאחר מכן חשובים לי התוכן, והמיקום שלו בתוך התמונה.

לכן יצרתי את xPos ו yPos שלהם נתתי ערך של מיקום יחסי לגודל הטקסט.
שימו לב שאת גודל הטקסט אני קובע בתחילת הפונקציה, היות וכל הפונקציות, עושות שימוש בגודל הטקסט, על מנת לקבוע גודל יחסי מתאים.

לצורך קביעת פונט הטקסט בתמונה, השתמשתי ב:


imageloadfont()

המתאים פונט לתמונה, שימו לב, כי הפונט הינו בסיומת GDF, איפה מוצאים כזה פונט? יוצרים בתוכנה הזאת:


מאוד פשוט.

הפונקציה הבאה היא:


imagestring()

הכותבת בעצם את הטקסט בתוך התמונה.

והפונקציה הסופית:


imagejpeg()

שלוקחת את כל מה שהכנו, והופכת את זה בעצם לתמונה מוגמרת.
שימו לב, ששכבתי כאן 3 שורות ולכן נאלצתי לקרוא לפונקציה 3 פעמים.

טוב זה היה השלב הראשון.
בשלב השני, אני בעצם צריך לקחת משפטים כלשהם, ולדחוף אותם לתוך התמונה.
לצורך הפרויקט, החלטתי לעשות מין "בדיחות צ'אק נוריס יומיות" או מין משהו חמוד כזה.
בניתי מסד נתונים פשוט, ככה:


$result=mysql_query("CREATE TABLE $newTable
(

sentence_id int unsigned auto_increment primary key,
line1_text text,
line2_text text,
sentence_cat INT

)")

or die(mysql_error());

שמאפשר לי לכתוב שתי שורות, למה? כי המשפטים ברובם די ארוכים, וצורכים שורה שניה.
עכשיו צריך להכניס קצת תוכן, אז כתבתי סקריפט די ערבי, שעובד, שפשוט ידנית מכניס את כל המשפטים:


<?php

include('database/connect_db.php');

$text="Chuck Norris uses pepper spray to spice up his steaks.";
$text="Chuck Norris doesnt go hunting....; CHUCK NORRIS GOES KILLING.";
$text="If you have five dollars and Chuck Norris has five dollars,; Chuck Norris has more money than you.";
$text="There is no Ctrl button on Chuck Norriss computer.; Chuck Norris is always in control.";
$text="Apple pays Chuck Norris 99 cents every time he listens to a song.";
$text="Chuck Norris can sneeze with his eyes open.";
$text="Chuck Norris can eat just one Lays potato chip.";
$text="Chuck Norris is suing Myspace for taking the name ;of what he calls everything around you.";
$text="Chuck Norris destroyed the periodic table, because ;he only recognizes the element of surprise.";
$text="Chuck Norris can kill two stones with one bird.";
$text="Guns dont kill people. Chuck Norris kills People.";
$text="There is no theory of evolution. Just a list of ;animals Chuck Norris allows to live.";
$text="Chuck Norris does not sleep. He waits.";
$text="The chief export of Chuck Norris is Pain.";
$text="There is no chin under Chuck Norris Beard. ;There is only another fist.";
$text="Chuck Norris has two speeds. Walk, and Kill.";
$text="The leading causes of death in the United ;States are: 1. Heart Disease 2. Chuck Norris 3. Cancer.";

$tableName=$db_perfix.'_'.'sentences_list';

foreach($text as $value)
{
$pos=strrpos($value,";");
$line1=substr_replace($value," ",$pos);
$line2=substr_replace($value," ",0,$pos);
$line2=str_replace(";"," ",$line2);
echo $line1,"<br>",$line2;
echo "<br><br>";
$result=mysql_query("INSERT INTO $tableName (line1_text,line2_text, sentence_cat) VALUE ('$line1','$line2',1)")
or die(mysql_error());
}

?>

שימו לב, לאחר שיצרתי מערך עם כל המשפטים, אני רוצה להכניס אותם לDB, אז בתוך כל משפט, שמתי ";" במקום שבו אני מעוניין שתתחיל שורה חדשה, ובאמצעות פונקציות בסיסיות למדי, חילקתי לתוך הDB לפי שורות.
שימו לב, ששמתי את השורה הראשונה כשנייה ולהפך, כי משומה הוא נהפך לי בסוף בתצוגה.
בנוסף השורה השנייה כברירת מחדל קיבל ערך ריק (לא NULL) אחרת הפונקציה ליצירת הטקסט בהתחלה תעשה בעיות.

טוב, אז יש לי DB עם 17 משפטים ופונקציה ליצירת חתימה, איך משלבים?
פשוט:


include('database/connect_db.php');

$tableName=$db_perfix.'_'.'sentences_list';

$num=rand(1,17);

$result=mysql_query("SELECT * FROM $tableName where sentence_id=$num")
or die(mysql_error());

$row=mysql_fetch_array($result);

$imageNumber=1;

$line1=$row;
$line2=$row;
$adText="Daily Chuck Norris Sentence";

if (strlen($line1)>strlen($line2))
{
$len=strlen($line1);
}
else
{
$len=strlen($line2);
}

אוקי, בעיקרון, א הקטע הנ"ל שמתי לפני הפונקציה הראשונה, כדי להניח את אבני היסוד לפונקציה, ואחרי הפונקציה קראתי לה בצורה פשוט:


newImage($line1,$line2,$len,$imageNumber,$adText);

והכנסתי את כל הנתונים מהקטע קוד האחרון.

הדבר האחרון שנשאר, הוא ליצור תקייה בשם images אותה נשאיר ריקה.
ותקייה בשם fonts בה נשים את הפונטים שיצרנו.
אגב, אם אתם מעוניינים להשתמש בפונטים מהפונקציה, הנה הם:


זהו, בעיקרון אם תעבדו לפי כל מה שכתבתי, יצא לכם דבר מגניב למדי אך בסיסי ביותר.
לצערי אין לי דוגמא להראות לכם, כי השרת שלי משומה עושה בעיות, אבל תסתפקו במילה שלי שזה עובד .
דבר אחרון, דיברתי על אוטומציה, אז בעיקרון את האוטומציה אני מבצע בצורה הבאה, אני בונה בשרת Cron Jobs כלומר רשימת משימות לשרת, אותן הוא יבצע ע"פ תזמון שאני קובע, כלומר למשל פעם ב24 שעות תריץ את הקובץ הזה וכדו' וככה אני מריץ רק את קובץ ההחלפה, שיגריל משפט, ייצור תמונה, ויחליף את הישנה בחדשה.
אגב, באמצעות Cron Jobs אפשר לעשות המון דברים, אבל זה לא המקום, גוגל יעזור במקרה הזה יותר ממני.
אגב, יצאתי כאן מנקודת הנחה שלקורא יש ידע בסיסי+ בPHP והנחתי שאתם יודעים להתחבר למסד הנתונים ולחבר בין כל הקבצים, אבל בכ"ז אם יש לכם שאלות אני אשמח לענות.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  השקעת אז אתן הערות.. Kent Net 28.07.09 11:55 1
     בקשר לא' asco88  28.07.09 12:02 2
  אגב במידה ויש לך משפט אחד בתוך IF akoka 28.07.09 13:33 3
     וואלה סבבה לגבי הכל, asco88  28.07.09 14:25 4
         אני מסכים עם יוחאי, Mr Andersson 28.07.09 14:32 5
             אין קשר לתעבורה Kent Net 28.07.09 14:47 7
     יש יתרונות ויש חסרונות Kent Net 28.07.09 14:45 6

       
Kent Net
חבר מתאריך 18.3.02
2359 הודעות
   11:55   28.07.09   
אל הפורום  
  1. השקעת אז אתן הערות..  
בתגובה להודעה מספר 0
 
   א. בשביל כל כך קצת משפטים אין צורך בדטאבייס.
פשוט תכניס אותם לקובץ טקסט ותקרא אותם מתוך מערך. חבל על הזמן.

ב. אין אבל אין יותר גרוע מפונטים GDF. זה פשוט נראה על הפנים.
השתמש ב TTF. אם השרת שלך לא תומך .. הגיע הזמן לעבור שרת.

ג. מיותר לחלוטין להריץ את הסקריפט כל 24 שעות ולייצר תמונה חדשה. במקומך הייתי נותן פשוט תצוגה LIVE של התמונה עם HEADER מתאים,
ומחליף משפטים באופן רנדומלי.

ד. סך הכל מדריך נחמד .

רוצים גם אתם חתימת פז"ם ? https://.net/


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   12:02   28.07.09   
אל הפורום  
  2. בקשר לא'  
בתגובה להודעה מספר 1
 
אני תכננתי להוסיף קטגוריות, ושפות, ושאפשר יהיה לבחור לשלב משפטים שונים ולהתאים לשמות משתמשים וכדו' ולכן נאלצתי להשתמש בDB.

בקשר לשאר, החכמתי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka

   13:33   28.07.09   
אל הפורום  
  3. אגב במידה ויש לך משפט אחד בתוך IF  
בתגובה להודעה מספר 0
 
   תחסוך מאיתנו ומעצמך את הסוגריים המסולסלות זה סתם מעיק.

אגב כמה דברים לגבי ההסברים שלך.

imagecolorallocate מחזירה צבע בפורמט RGB עכשיו הפונקציה הזאת מקבלת ארגומנט resource שזאת התמונה שכביכול אנחנו מקצים לה צבע, אבל יש פה כמה מקרי קצה שצריך לדבר עליהם.

הפונקציה תקצה צבע רקע רק אם אנחנו משתמשים בimagecreate (אם אנחנו משתמשים בimagecreatetruecolor יש דרך שונה להקצות צבע רקע).

תמיד תשתמש בimagecreatetruecolor אפילו בPHP.NET ממליצים על זה.

תקפיד על כתיבה של קוד יפה, קוד עם הערות,הזחות במקום הנכון.

כשאתה כותב שם משתנה, תמיד תעשה רווח ואז = ואז ערך, זה הרבה יותר קריא.

תעבוד בצורה של בלוקים של קוד, כאשר אתה כותב 2 משתנים ששייכים נניח לקבוצה מסויימת (קבוצה שמבצעת חישוב על הפונט) שים אותם בבלוק בנפרד, ככה אפשר לגשת לקוד בצורה נוחה יותר.

עכשיו בקשר למה שגל אמר, אתה לא יכול לחשוב על לשמור את התמונות על השרת, זה מיותר, לא יעיל, ובמקרה שיהיו לך כמות משתמשים כמו שלגל יש עם החתימת פז"מ שלו, אתה תצטרך המון תעבורה/שטח אחסון כדי להחזיק הכול.

תשתמש בheader תציג את התמונה עם imagejpeg או עם מה שבא לך, וזהו תעשה גם htaccess נחמד שלא יידעו שאתה לא שומר את התמונה .


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   14:25   28.07.09   
אל הפורום  
  4. וואלה סבבה לגבי הכל,  
בתגובה להודעה מספר 3
 
מסתבר שיש לי עוד הרבה ללמוד אפילו על דברים שאני כבר יודע..
תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Mr Andersson
חבר מתאריך 19.3.02
6234 הודעות, 1 פידבק
   14:32   28.07.09   
אל הפורום  
  5. אני מסכים עם יוחאי,  
בתגובה להודעה מספר 4
 
   בעבודה עם GD ותמונות דינאמיות, עדיף מאוד לעבוד עם header של תמונה במקום לבזבז תעבורה ואחסון.

בהצלחה

http://i60.tinypic.com/35aowg8.jpg


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Kent Net
חבר מתאריך 18.3.02
2359 הודעות
   14:47   28.07.09   
אל הפורום  
  7. אין קשר לתעבורה  
בתגובה להודעה מספר 5
 
   את התעבורה אתה מבזבז בכל מקרה. המידע נשלח מהשרת ללקוח ,בגודל זהה לחלוטין. העיבוד שלו מתבצע בצד השרת.
זה לא משנה אם זאת תמונה מאוחסנת או לא.

רוצים גם אתם חתימת פז"ם ? https://.net/


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Kent Net
חבר מתאריך 18.3.02
2359 הודעות
   14:45   28.07.09   
אל הפורום  
  6. יש יתרונות ויש חסרונות  
בתגובה להודעה מספר 3
 
   מהצד השני,
שמירה של התמונה על השרת תחסוך מאוד את היצירה של התמונה כל פעם מחדש ועומס מיותר על המערכת.
זה אולי נראה לכאורה מאוד מינורי,
אבל אין לך מושג לדוגמא מה הולך אצלי עם החתימות.
יש לי עשרות אלפי חתימות שנוצרות באופן מיידי בכל כמה דקות.
אני מקבל כל יום עשרות אימיילים מ SERVAGE שאני מעמיס להם על השרתים ואני אקנס ובלה בלה (ומתעלם בחינניות).

עזוב את תעבורת השרת המטורפת שהולכת אצלי

רוצים גם אתם חתימת פז"ם ? https://.net/


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net