עדכונים שוטפים מהפורום - קוד פתוח
-
לא בשביל משהו.. אבל אם היית כותב את זה בתסריט פייטון.. היית רושם את כל זה ב-4-8 שורות.. ואולי בשביל Notification.. היית מוסיף עוד 2 שורות.
(כמובן בלי טעינה של כל ה-GUI וכו'.. אלא קוד נקי בלי פקדים מיותרים).ידידי, אני מוכן להתחרות איתך על אורך קוד מול דוט נט.
לא אכפת לי באיזה שפה אתה כותב. ומותר להשתמש בפונקציות הספריה הרשמיות.
ואכן הקוד שהעולה כאן ארוך יחסית, ואפשר לקצר אותו בלי לעבור לפייתון.פורסם במקור בפורום CODE613 ב13/02/2014 15:30 (+02:00)
-
רחמים, קוד ממש מוצלח ויפה!!
אבל הערות קטנות:
א. הסיפור של הlen והbyte כנראה במקורו נועד לחסוך ריענון במקרה שלא השתנו הנתונים, אך בפועל הוא לא עושה זאת, שים לב.
ב. אתה מקבל את הנתונים לבתים>XML>ואז לDataSet. מבחינת קריאות עדיף לקצר. ניתן לקרוא ישירות מXML ואפשר להוריד ישירות כטקסט ועוד.עריכה: שאלה א' מתרצת את שאלה ב', בשביל לקבל מס' בתים עדיף להוריד בתים וDataSet מיקל על קריאת XML. אבל בינתיים האמור בשאלה א' לא מיושם.
בע"ה אני אעלה בהמשך גירסה משלי אם תיקונים שונים.
פורסם במקור בפורום CODE613 ב13/02/2014 15:40 (+02:00)
-
יאללה דוד.. בזרימה..
""" @author Yakir Sitbon <http://www.yakirs.net/> """ import feedparser def main(): d = feedparser.parse('http://code.613m.org/feed.php') for post in d.entries: print post.title + ": " + post.link + "\n" main()
השאלה שלי מה תרצה עוד שיקרה כאן?
אפשר להוסיף פה איזה timeout בשביל הסינכרון.. ואפשר גם לבדוק איזו הודעה חדשה התווספה.. ואפשר גם לשמור את זה בלוקאלי בשביל פתיחה הבאה.. וגם אפשר לתת "התראה" בשולחן העבודה.פורסם במקור בפורום CODE613 ב13/02/2014 16:40 (+02:00)
-
רחמים.. מה הקטע של השורה הזאת:
'מנסה להוריד נתונים עד 10 שניות For I = 0 To 10 Threading.Thread.Sleep(1000) If DownloadThread.IsAlive = False Then Exit For End If Next
אי אפשר לרשום ישירות ב-Sleep את המספר 1000 * 10 (10,000) וזהו? למה צריך פה לולאה בשביל זה?
פורסם במקור בפורום CODE613 ב13/02/2014 16:46 (+02:00)
-
רחמים.. מה הקטע של השורה הזאת:
'מנסה להוריד נתונים עד 10 שניות For I = 0 To 10 Threading.Thread.Sleep(1000) If DownloadThread.IsAlive = False Then Exit For End If Next
אי אפשר לרשום ישירות ב-Sleep את המספר 1000 * 10 (10,000) וזהו? למה צריך פה לולאה בשביל זה?
זה אכן לדעתי קוד ארוך ומסורבל אבל לא החלופה שלך היא הטובה.
כי בחלופה שלך זה בכל מקרה יחכה, אפי' אם יש מייד תשובה מעודכנת.פורסם במקור בפורום CODE613 ב13/02/2014 16:48 (+02:00)
-
אני מנסה להבין רגע משהו..
למה הסקריפט לא יכול פשוט לרוץ בצורה כזאת:
כל 10 שניות להכנס להוריד למחשב את ה-XML שנוצר בשרת, לעבור עליו.. ואם יש אלמנט חדש.. להציגו. למה צריך בתוך 10 שניות לעשות בדיקה חוזרת כזאת?יותר מזה לדעתי, במיוחד שזה RSS בודד, למה הפעולה הזאת לא יכול לעבוד פעם ב-5 דקות לכל המוקדם? 10 שניות זה ממש ממש "להציק" לשרת ולמחשב שלך.
פורסם במקור בפורום CODE613 ב13/02/2014 16:52 (+02:00)
-
אני מנסה להבין רגע משהו..
למה הסקריפט לא יכול פשוט לרוץ בצורה כזאת:
כל 10 שניות להכנס להוריד למחשב את ה-XML שנוצר בשרת, לעבור עליו.. ואם יש אלמנט חדש.. להציגו. למה צריך בתוך 10 שניות לעשות בדיקה חוזרת כזאת?יותר מזה לדעתי, במיוחד שזה RSS בודד, למה הפעולה הזאת לא יכול לעבוד פעם ב-5 דקות לכל המוקדם? 10 שניות זה ממש ממש "להציק" לשרת ולמחשב שלך.
את האמת יקיר, אני ממש מכור לפורום המדהים הזה, ובודק כל רגע מה התחדש, והRSS הזה ממש עוזר. אם זה יהיה פעם ב5 דקות, אני כבר יעשה ריענון לדפדפן....
פורסם במקור בפורום CODE613 ב13/02/2014 16:58 (+02:00)
-
יקיר, במקרה זה ניצחת.
הנה הכי קומפקטי בC#:using System; using System.Xml.Linq; namespace CsConsole { class RssReader { public RssReader() { XNamespace ns = "http://www.w3.org/2005/Atom"; foreach (var item in XDocument.Load("http://code.613m.org/feed.php").Descendants(ns + "entry")) Console.Write("Title: {0} /n Link: {1}", item.Element(ns + "title").Value, item.Element(ns + "link").Value); } } }
פורסם במקור בפורום CODE613 ב13/02/2014 17:29 (+02:00)
-
אני מנסה להבין רגע משהו..
למה הסקריפט לא יכול פשוט לרוץ בצורה כזאת:
כל 10 שניות להכנס להוריד למחשב את ה-XML שנוצר בשרת, לעבור עליו.. ואם יש אלמנט חדש.. להציגו. למה צריך בתוך 10 שניות לעשות בדיקה חוזרת כזאת?יותר מזה לדעתי, במיוחד שזה RSS בודד, למה הפעולה הזאת לא יכול לעבוד פעם ב-5 דקות לכל המוקדם? 10 שניות זה ממש ממש "להציק" לשרת ולמחשב שלך.
לא הבנת. ה10 שניות זה טווח שבו מרשים למחשב להמתין לקובץ אח"כ מוותרים (timeout).
אם הכל הולך כשורה המחשב לא מוטרד כלל ומייד מגיע הקובץ.
[u:2rxfif2e]קצב העדכון[/u:2rxfif2e] כלל לא מופיע בקוד שרחמים הביא!פורסם במקור בפורום CODE613 ב13/02/2014 17:32 (+02:00)
-
גירסה שלי לקוד.
הקוד הוא הוא מחלקה עם אירוע של אלמנטים חדשים, ואין לה שום תלות ושייכות לאיך שישתמשו איתה.Public Class RssForumRead Public Class ItemRss Public Property authorname As String Public Property categoryTitle As String Public Property categoryLink As String Public Property Content As String Public Property UpdateAt As Date Public Sub New(author As String, Cat As String, CatLink As String, Cont As String, At As Date) authorname = author categoryTitle = Cat categoryLink = CatLink Content = Cont UpdateAt = At End Sub End Class Public Property Address As String = "http://code.613m.org/feed.php" Public Property IntervalUpdate As Integer Get Return Timer.Interval End Get Set(value As Integer) Timer.Interval = value End Set End Property Private ns As XNamespace = "http://www.w3.org/2005/Atom" Private lastDate As Date Private Timer As Timers.Timer Public Sub New() Timer = New Timers.Timer(10000) DownloadData() AddHandler Timer.Elapsed, AddressOf DownloadData Timer.Start() End Sub Private Function DateFromForumFormat(str As String) As Date Dim extStr = str.Split("+")(0) If String.IsNullOrEmpty(extStr) Then Return #1/1/1900# Return Date.ParseExact(extStr, "yyyy-MM-dd\THH:mm:ss", Globalization.CultureInfo.InvariantCulture) End Function Private Sub DownloadData() Dim xmlDoc = System.Xml.Linq.XDocument.Load("http://code.613m.org/feed.php") Dim s = xmlDoc.Root.Name Dim NewEl = From item In xmlDoc.Element(ns + "feed").Elements(ns + "entry") Let datePub = DateFromForumFormat(item.Element(ns + "published")) Where datePub > lastDate Let cat = item.Element(ns + "category") Select New ItemRss(item.Element(ns + "author").Elements().First().Value, cat.Attribute("label"), cat.Attribute("scheme"), item.Element(ns + "content").Value, datePub) If NewEl.Any Then RaiseEvent NewItems(NewEl) lastDate = NewEl.First().UpdateAt End If End Sub Public Event NewItems(items As IEnumerable(Of ItemRss)) End Class
פורסם במקור בפורום CODE613 ב13/02/2014 18:14 (+02:00)
-
לא הבנתי מה הכוונה "טווח זמן לקבל את הקוד".. בכל פתיחה של סוקט מינימלי פשוט מעבירים בפרמטר לפונקציה כמה שניות אתה מוכן לתת ל-Timeout וזהו.. אתה לא אמור לעשות את זה מחוץ לפונקציה.. אלא רק לחכות לקבל מהשרת וזהו.
פורסם במקור בפורום CODE613 ב13/02/2014 18:22 (+02:00)
-
למה שלא תורידו את זה.
http://clients2.google.com/service/update2/crx?response=redirect&x=id%3Dpnjaodmkngahhkoihejjehlcdlnohgmp%26uc%26lang%3Den-US&prod=chromeזה תוסף לכרום שקורא rss מכל אתר שתומך בזה.
פורסם במקור בפורום CODE613 ב13/02/2014 18:28 (+02:00)
-
לא הבנתי מה הכוונה "טווח זמן לקבל את הקוד".. בכל פתיחה של סוקט מינימלי פשוט מעבירים בפרמטר לפונקציה כמה שניות אתה מוכן לתת ל-Timeout וזהו.. אתה לא אמור לעשות את זה מחוץ לפונקציה.. אלא רק לחכות לקבל מהשרת וזהו.
תראה זה שאלה שלישית שלך על הקוד, תירגע...
דבר ראשון זה לא ממש timeout. timeout של סוקט אני סבור שזה הזמן שבין בקשה לתשובה, ואילו במקרה הורדת קובץ יכול להיות שיש תשובה מהירה אבל זה קובץ גדול, ואז זה ממומש בזרם (stream), שזה בקשות קטנות (אני חושב, לא יודע איך כתבו את המחלקה של webclient). גם במקרה כזה בקוד של רחמים ההורדה תיקטע עקב איטיותה.דבר שני, אפשר לעשות timeout כשאתה פותח סוקט אבל פה הוא לא פתח כלום אלא השתמש במחלקה קיימת.
בשביל לשנות את הtimeout שלה חייבים לרשת ממנה ולהתאים זאת.פורסם במקור בפורום CODE613 ב13/02/2014 18:33 (+02:00)
-
אני יעצור פה עם ה"שאלות"..
יש פרוייקט מאוד מומלץ.. ואני מאוד מרוצה ממנו, עושה עבודה ממש טובה.. אז הנה השיתוף: http://www.feednotifier.com/אתם תהנו
פורסם במקור בפורום CODE613 ב13/02/2014 18:39 (+02:00)
-
קצת שיפצתי את הקוד שלי על פי הקוד של דוד:
- בקריאת ה XML
- בדיקה על פי תאריך אחרון
- הרווחנו בקוד הזה שגם אם תוכנת נתיב סגורה זה לא מפריע לקרא את ה RSS
שימו לב!
יש להגדיר את ה Interval של הטיימר ל 60 שניות לפחות.Private ns As XNamespace = "http://www.w3.org/2005/Atom" Private lastDate As Date = Date.MinValue Private xmlDoc As XDocument Private href As String Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick Try Dim DownloadThread = New Threading.Thread(Sub() Try xmlDoc = XDocument.Load("http://code.613m.org/feed.php") Catch ex As Exception End Try End Sub) DownloadThread.Start() 'מנסה להוריד נתונים עד 10 שניות For I = 0 To 10 Threading.Thread.Sleep(1000) If DownloadThread.IsAlive = False Then Exit For End If Next 'יוצא אם עד אחר 10 שניות לא הצלח להוריד If DownloadThread.IsAlive Then DownloadThread.Abort() Exit Sub End If Dim XEl As XElement = xmlDoc.Element(ns + "feed").Elements(ns + "entry")(0) If Date.Parse(XEl.Element(ns + "published").Value) > lastDate Then lastDate = Now Dim sb As New StringBuilder sb.AppendLine("המחבר: " & XEl.Element(ns + "author").Value) sb.AppendLine("נושא: " & XEl.Element(ns + "title").Value) sb.AppendLine("תוכן ההודעה: " & XEl.Element(ns + "content").Value) href = XEl.Element(ns + "link").Attributes("href")(0).Value sb.AppendLine("לחץ כאן למעבר להודעה החדשה") NotifyIcon1.ShowBalloonTip(5555, "הודעה חדשה בפורום", sb.ToString, ToolTipIcon.Info) End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation + MsgBoxStyle.MsgBoxRight + MsgBoxStyle.MsgBoxRtlReading) End Try End Sub Private Sub NotifyIcon1_BalloonTipClicked(sender As Object, e As System.EventArgs) Handles NotifyIcon1.BalloonTipClicked Try Process.Start(href) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation + MsgBoxStyle.MsgBoxRight + MsgBoxStyle.MsgBoxRtlReading) End Try End Sub
פורסם במקור בפורום CODE613 ב14/02/2014 13:40 (+02:00)
-
@דוד ל.ט.
רחמים, טיימר וטריד, זה כפל.אחד מהם מיותר.
לא הבנתי אותך, תפקיד הטיימר זה להפעיל את הבדיקה כל X זמן, אני הגדרתי על דקה.
ותפקיד הטריד זה לבצע את ההורדה של ה RSS בלא זה יחסום את הממשק.צודק זו טעות שלי, החלפתי את הטיימר של טריידינג עם הטיימר הזה.
(אכן לכאורה יותר מתאים להחליף אותו בטיימר של טריידינג).
אם אתה משתמש בקוד שלי אתה לא צריך בכלל טיימר משלך, הטיימר כלול בפנים, ושים לב שאין שום טריד.עריכה:
כעת שמתי לב שאני משתמש בדיוק באותו הטיימר שלך,
וזה אומר שאני כן תוקע את התצוגה בעת הורדה.
אעדכן זאת בהמשך עם טיימר של טריידינג.פורסם במקור בפורום CODE613 ב16/02/2014 10:52 (+02:00)