<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. https://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="https://www.livejournal.com" xmlns:idx="urn:atom-extension:indexing" idx:index="no">
  <id>urn:lj:livejournal.com:atom1:support_syn</id>
  <title>Support syndication category</title>
  <subtitle>Support syndication category</subtitle>
  <author>
    <name>Support syndication category</name>
  </author>
  <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/"/>
  <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom"/>
  <updated>2011-03-14T22:31:43Z</updated>
  <lj:journal userid="830680" username="support_syn" type="community"/>
  <link rel="service.feed" type="application/x.atom+xml" href="https://support-syn.livejournal.com/data/atom" title="Support syndication category"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:support_syn:88632</id>
    <author>
      <name>FunBux™ Commissioner</name>
    </author>
    <lj:poster user="gerg" userid="752059"/>
    <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/88632.html"/>
    <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom/?itemid=88632"/>
    <title>In case you didn't already see...</title>
    <published>2011-03-14T22:31:34Z</published>
    <updated>2011-03-14T22:31:43Z</updated>
    <category term="fyi"/>
    <content type="html">Paid Account Trials cannot create new syndicated accounts. This is intentional, and not a bug. If a user on a Paid Account Trial asks about creating a syndicated account, you can gently nudge them to purchase the real thing.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:support_syn:87161</id>
    <author>
      <name>FunBux™ Commissioner</name>
    </author>
    <lj:poster user="gerg" userid="752059"/>
    <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/87161.html"/>
    <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom/?itemid=87161"/>
    <title>New FAQ and new stock!</title>
    <published>2009-12-05T22:26:14Z</published>
    <updated>2009-12-05T22:28:50Z</updated>
    <category term="documentation"/>
    <category term="stock answers"/>
    <category term="gerg the great and powerful"/>
    <content type="html">Hello gang! I have come to bring Holiday tidings and joy and these tidings are in the form of:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.livejournal.com/support/faq/306.html" target="_blank"&gt;FAQ 306&lt;/a&gt; (&lt;a href="http://community.livejournal.com/lj_userdoc/785507.html" target="_blank"&gt;userdoc post&lt;/a&gt;) and&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.livejournal.com/support/stock_answers.bml?spcatid=17&amp;amp;ansid=1287" target="_blank"&gt;stock answer 1287&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;These were both added to address a new source of requests for us, people going "OMG GOOGLE READER HAS ALL MY PROTECTED ENTRIES" and acting like they've uncovered a terrible secret that we're in cahoots with Google to pass off private entries (we're not. at least not until their check clears).&lt;br /&gt;&lt;br /&gt;So, if a request comes in where someone is concerned about a 3rd-party service or about RSS exposing their protected entries in general, you can point them to the new FAQ and apply the new stock as appropriate.&lt;br /&gt;&lt;br /&gt;In other news, do any of you have edits you'd like to see to the stocks/to the FAQs/is there anything I can do to make you being in syn more fun (or to get you involved in syn, if you're not already)? Please comment to this request (I've screened comments) and I will try to make your wish come true for Christmas.&lt;br /&gt;&lt;br /&gt;Love and bunnehs,&lt;br /&gt;~gergles</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:support_syn:82845</id>
    <author>
      <name>FunBux™ Commissioner</name>
    </author>
    <lj:poster user="gerg" userid="752059"/>
    <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/82845.html"/>
    <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom/?itemid=82845"/>
    <title>A new syn priv!</title>
    <published>2009-03-03T06:04:56Z</published>
    <updated>2009-03-03T06:07:15Z</updated>
    <content type="html">Effective immediately, all syn supporthelps will also receive the canview:entryprops priv as part of their priv package. This priv will permit you to view meta-information about entries by going to &lt;a href="http://www.livejournal.com/admin/entryprops.bml" target="_blank"&gt;this page&lt;/a&gt; and pasting in an entry link.&lt;br /&gt;&lt;br /&gt;Syn-wise, the useful lines are mostly:&lt;br /&gt;&lt;br /&gt;User Date/Time: 2009-02-20 05:00:00&lt;br /&gt;Server Date/Time: 2009-02-20 05:22:49&lt;br /&gt;&lt;br /&gt;# syn_id: &lt;a target='_blank' href='http://xkcd.com/546/'&gt;http://xkcd.com/546/&lt;/a&gt;&lt;br /&gt;Unique id of syndication item&lt;br /&gt;&lt;br /&gt;# syn_link: &lt;a target='_blank' href='http://xkcd.com/546/'&gt;http://xkcd.com/546/&lt;/a&gt;&lt;br /&gt;Original URL of syndication item&lt;br /&gt;&lt;br /&gt;User date/time is the date and time that were listed in the feed, and server date/time is the time synsuck ran and posted the entry to LJ. syn_id is the GUID or other unique ID that LiveJournal picked up for the entry, and syn_link is the &amp;lt;link&amp;gt; attribute's information. For an outstanding guide to reading entryprops output, check &lt;a href="http://community.livejournal.com/support_interim/133491.html" target="_blank"&gt;this post&lt;/a&gt; to &lt;span  class="ljuser  i-ljuser  i-ljuser-type-C     "  data-ljuser="support_interim" lj:user="support_interim" &gt;&lt;a href="https://support-interim.livejournal.com/profile/"  target="_self"  class="i-ljuser-profile" &gt;&lt;img  class="i-ljuser-userhead"  src="https://l-stat.livejournal.net/img/community.png?v=556&amp;v=923.1" /&gt;&lt;/a&gt;&lt;a href="https://support-interim.livejournal.com/" class="i-ljuser-username"   target="_self"   &gt;&lt;b&gt;support_interim&lt;/b&gt;&lt;/a&gt;&lt;a class="i-ljuser-badge i-ljuser-badge--pro" data-badge-type="pro" data-placement="bottom" data-pro-badge data-pro-badge-type="1" data-is-raw hidden href="#"&gt;&lt;span class="i-ljuser-badge__icon"&gt;&lt;svg class="svgicon" width="25" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 33 24"&gt;&lt;path fill-rule="evenodd" d="M19.326 11.95c0 2.01 1.47 3.45 3.48 3.45 2.02 0 3.49-1.44 3.49-3.45 0-2.01-1.47-3.45-3.49-3.45-2.01 0-3.48 1.44-3.48 3.45Zm5.51 0c0 1.24-.8 2.19-2.03 2.19-1.23 0-2.02-.95-2.02-2.19 0-1.25.79-2.19 2.02-2.19s2.03.94 2.03 2.19ZM7.92 15.28H6.5V8.61h3.12c1.45 0 2.24.98 2.24 2.15 0 1.16-.8 2.15-2.24 2.15h-1.7v2.37Zm1.51-3.62c.56 0 .98-.35.98-.9 0-.56-.42-.9-.98-.9H7.92v1.8h1.51ZM18.3802 15.28h-1.63l-1.31-2.37h-1.04v2.37h-1.42V8.61h3.12c1.39 0 2.24.91 2.24 2.15 0 1.18-.74 1.81-1.46 1.98l1.5 2.54Zm-2.49-3.62c.57 0 1-.34 1-.9s-.43-.9-1-.9h-1.49v1.8h1.49Z" clip-rule="evenodd"/&gt;&lt;path fill-rule="evenodd" d="M2 8c0-2.20914 1.79086-4 4-4h20.5c2.2091 0 4 1.79086 4 4v7.9c0 2.2091-1.7909 4-4 4H6c-2.20914 0-4-1.7909-4-4V8Zm4-2.5h20.5C27.8807 5.5 29 6.61929 29 8v7.9c0 1.3807-1.1193 2.5-2.5 2.5H6c-1.38071 0-2.5-1.1193-2.5-2.5V8c0-1.38071 1.11929-2.5 2.5-2.5Z" clip-rule="evenodd"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Of course, you're being given the priv to do syn stuff, there may be sensitive information exposed through entryprops, abuse of the tool will you get whomped, etc. etc.&lt;br /&gt;&lt;br /&gt;Thanks for all you all do for the category!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:support_syn:82342</id>
    <author>
      <name>FunBux™ Commissioner</name>
    </author>
    <lj:poster user="gerg" userid="752059"/>
    <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/82342.html"/>
    <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom/?itemid=82342"/>
    <title>The Bizarro Feed, or, When 404 Doesn't Mean 'Not Found'</title>
    <published>2009-01-13T01:23:07Z</published>
    <updated>2009-01-13T01:23:28Z</updated>
    <category term="fyi"/>
    <content type="html">(This post was migrated from the syn_training community, originally made by &lt;span  class="ljuser  i-ljuser  i-ljuser-type-P     "  data-ljuser="seaofdestiny" lj:user="seaofdestiny" &gt;&lt;a href="https://seaofdestiny.livejournal.com/profile/"  target="_self"  class="i-ljuser-profile" &gt;&lt;img  class="i-ljuser-userhead"  src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&amp;v=923.1" /&gt;&lt;/a&gt;&lt;a href="https://seaofdestiny.livejournal.com/" class="i-ljuser-username"   target="_self"   &gt;&lt;b&gt;seaofdestiny&lt;/b&gt;&lt;/a&gt;&lt;a class="i-ljuser-badge i-ljuser-badge--pro" data-badge-type="pro" data-placement="bottom" data-pro-badge data-pro-badge-type="1" data-is-raw hidden href="#"&gt;&lt;span class="i-ljuser-badge__icon"&gt;&lt;svg class="svgicon" width="25" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 33 24"&gt;&lt;path fill-rule="evenodd" d="M19.326 11.95c0 2.01 1.47 3.45 3.48 3.45 2.02 0 3.49-1.44 3.49-3.45 0-2.01-1.47-3.45-3.49-3.45-2.01 0-3.48 1.44-3.48 3.45Zm5.51 0c0 1.24-.8 2.19-2.03 2.19-1.23 0-2.02-.95-2.02-2.19 0-1.25.79-2.19 2.02-2.19s2.03.94 2.03 2.19ZM7.92 15.28H6.5V8.61h3.12c1.45 0 2.24.98 2.24 2.15 0 1.16-.8 2.15-2.24 2.15h-1.7v2.37Zm1.51-3.62c.56 0 .98-.35.98-.9 0-.56-.42-.9-.98-.9H7.92v1.8h1.51ZM18.3802 15.28h-1.63l-1.31-2.37h-1.04v2.37h-1.42V8.61h3.12c1.39 0 2.24.91 2.24 2.15 0 1.18-.74 1.81-1.46 1.98l1.5 2.54Zm-2.49-3.62c.57 0 1-.34 1-.9s-.43-.9-1-.9h-1.49v1.8h1.49Z" clip-rule="evenodd"/&gt;&lt;path fill-rule="evenodd" d="M2 8c0-2.20914 1.79086-4 4-4h20.5c2.2091 0 4 1.79086 4 4v7.9c0 2.2091-1.7909 4-4 4H6c-2.20914 0-4-1.7909-4-4V8Zm4-2.5h20.5C27.8807 5.5 29 6.61929 29 8v7.9c0 1.3807-1.1193 2.5-2.5 2.5H6c-1.38071 0-2.5-1.1193-2.5-2.5V8c0-1.38071 1.11929-2.5 2.5-2.5Z" clip-rule="evenodd"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;.)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.livejournal.com/support/see_request.bml?id=621769" target="_blank"&gt;This was a strange request.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As the user mentioned, the profile page for &lt;span  class="ljuser  i-ljuser  i-ljuser-deleted  i-ljuser-type-Y     "  data-ljuser="zakhad_blog" lj:user="zakhad_blog" &gt;&lt;a href="https://zakhad-blog.livejournal.com/profile/"  target="_self"  class="i-ljuser-profile" &gt;&lt;img  class="i-ljuser-userhead"  src="https://l-stat.livejournal.net/img/syndicated.png?v=6283&amp;v=923.1" /&gt;&lt;/a&gt;&lt;a href="https://zakhad-blog.livejournal.com/" class="i-ljuser-username"   target="_self"   &gt;&lt;b&gt;zakhad_blog&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; mentioned that the last fetch resulted in an error '404 Not Found' -- but if you clicked on the 'XML' button on the profile, you could see content in your browser.&lt;br /&gt;&lt;br /&gt;After a bit of digging, including a command-line utility (I used lwp-request, which comes with Perl's LWP package), I found something weird: when I fetched the feed, I got data, yes. But when I added some debugging flags to show me the HTTP status, it told me "404 Not Found"! A bit more digging with netcat and speaking raw HTTP to the server (always fun ^^~) corroborated that.&lt;br /&gt;&lt;br /&gt;So it appears that the server, for whatever reason, was delivering data, but with a status code indicating that there was no data there! My browser, apparently, figured that if the content was not text/html (likely an error page) but text/xml, then there was indeed content despite the status code; but LiveJournal, apparently, chose to trust the status code (as I think it should have).&lt;br /&gt;&lt;br /&gt;Fortunately, the user was able to provide an alternate feed location which behaved properly (returning '200 OK' as its HTTP status), and I used syn_editurl to change the feed URL to the new URL.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;In related news, if anyone is interested in a quick tutorial in using lwp-request and/or netcat to diagnose syn-related problems, let me know. If there's interest, I'll try to make time to write something down about what I do.&lt;br /&gt;&lt;br /&gt;(I use a Unix shell for this, but Perl runs on Windows, too, and I wouldn't be surprised if netcat had been ported to Windows as well, so the information might be applicable even if you don't have access to a Unix shell but 'only' a Windows command line.)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:support_syn:82095</id>
    <author>
      <name>FunBux™ Commissioner</name>
    </author>
    <lj:poster user="gerg" userid="752059"/>
    <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/82095.html"/>
    <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom/?itemid=82095"/>
    <title>Translated accounts</title>
    <published>2009-01-09T23:52:44Z</published>
    <updated>2009-01-13T01:20:16Z</updated>
    <category term="fyi"/>
    <content type="html">(This post was migrated from the syn_training community, originally made by &lt;span  class="ljuser  i-ljuser  i-ljuser-type-P     "  data-ljuser="seaofdestiny" lj:user="seaofdestiny" &gt;&lt;a href="https://seaofdestiny.livejournal.com/profile/"  target="_self"  class="i-ljuser-profile" &gt;&lt;img  class="i-ljuser-userhead"  src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&amp;v=923.1" /&gt;&lt;/a&gt;&lt;a href="https://seaofdestiny.livejournal.com/" class="i-ljuser-username"   target="_self"   &gt;&lt;b&gt;seaofdestiny&lt;/b&gt;&lt;/a&gt;&lt;a class="i-ljuser-badge i-ljuser-badge--pro" data-badge-type="pro" data-placement="bottom" data-pro-badge data-pro-badge-type="1" data-is-raw hidden href="#"&gt;&lt;span class="i-ljuser-badge__icon"&gt;&lt;svg class="svgicon" width="25" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 33 24"&gt;&lt;path fill-rule="evenodd" d="M19.326 11.95c0 2.01 1.47 3.45 3.48 3.45 2.02 0 3.49-1.44 3.49-3.45 0-2.01-1.47-3.45-3.49-3.45-2.01 0-3.48 1.44-3.48 3.45Zm5.51 0c0 1.24-.8 2.19-2.03 2.19-1.23 0-2.02-.95-2.02-2.19 0-1.25.79-2.19 2.02-2.19s2.03.94 2.03 2.19ZM7.92 15.28H6.5V8.61h3.12c1.45 0 2.24.98 2.24 2.15 0 1.16-.8 2.15-2.24 2.15h-1.7v2.37Zm1.51-3.62c.56 0 .98-.35.98-.9 0-.56-.42-.9-.98-.9H7.92v1.8h1.51ZM18.3802 15.28h-1.63l-1.31-2.37h-1.04v2.37h-1.42V8.61h3.12c1.39 0 2.24.91 2.24 2.15 0 1.18-.74 1.81-1.46 1.98l1.5 2.54Zm-2.49-3.62c.57 0 1-.34 1-.9s-.43-.9-1-.9h-1.49v1.8h1.49Z" clip-rule="evenodd"/&gt;&lt;path fill-rule="evenodd" d="M2 8c0-2.20914 1.79086-4 4-4h20.5c2.2091 0 4 1.79086 4 4v7.9c0 2.2091-1.7909 4-4 4H6c-2.20914 0-4-1.7909-4-4V8Zm4-2.5h20.5C27.8807 5.5 29 6.61929 29 8v7.9c0 1.3807-1.1193 2.5-2.5 2.5H6c-1.38071 0-2.5-1.1193-2.5-2.5V8c0-1.38071 1.11929-2.5 2.5-2.5Z" clip-rule="evenodd"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;. Please excuse the friends page mess!)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.livejournal.com/support/see_request.bml?id=651619" target="_blank"&gt;This support request&lt;/a&gt; reminded me of something which I learned and which might come in handy.&lt;br /&gt;&lt;br /&gt;The user is talking about 'translation', and it appears that 'syndication' is what we'd call it.&lt;br /&gt;&lt;br /&gt;This is probably due to the Russian terminology in this area; 'syndication' appears to be translated as 'трансляция' (translyatsiya) in Russian, and a 'syndicated account' as 'трансляционный аккаунт' (translyatsionnyj akkaunt) or 'транслируемый аккаунт' (transliruyemyj akkaunt). So this is standard Russian terminology on LiveJournal (don't know about on the wider Internet).&lt;br /&gt;&lt;br /&gt;My Russian is limited to recognizing a word here and there so I don't know whether the words are related to the English words 'translation/transliteration', but occasionally you'll see a support request from a Russian speaker mentioning that they want to 'translate their blog to LiveJournal' or create a 'translated account'. Now you'll know what they're likely to mean with that.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:support_syn:81784</id>
    <author>
      <name>FunBux™ Commissioner</name>
    </author>
    <lj:poster user="gerg" userid="752059"/>
    <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/81784.html"/>
    <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom/?itemid=81784"/>
    <title>New Policy: "Too Big" feeds</title>
    <published>2009-01-03T01:47:19Z</published>
    <updated>2009-01-03T01:47:59Z</updated>
    <category term="policy"/>
    <content type="html">Happy New Year, synners!&lt;br /&gt;&lt;br /&gt;For Syndicated Accounts that aren't updating because of the "Too Big" error, we (the admins) now have a tool available to us that lets us flag the feed to update anyway, as long as it is less than 500 KB in size. Therefore, please don't say "Sorry, the limit's 300K, [FAQ]" for feeds that are between 300 and 500 KB - just leave them for an admin to fix. If you want to be super-helpful, IC with the feed file size. &lt;br /&gt;&lt;br /&gt;If the feed is more than 500 KB in size, feel free to say "the FAQ says they can only be so big" and to handle them as before.&lt;br /&gt;&lt;br /&gt;If you have questions about the policy, please e-mail us at support@.&lt;br /&gt;&lt;br /&gt;Cool? Cool!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:support_syn:15896</id>
    <author>
      <name>Rich Lafferty's LiveJournal</name>
    </author>
    <lj:poster user="mendel" userid="495344"/>
    <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/15896.html"/>
    <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom/?itemid=15896"/>
    <title>Brad asks, "How many points would be good?"</title>
    <published>2003-11-03T06:15:34Z</published>
    <updated>2003-11-03T14:16:21Z</updated>
    <content type="html">In &lt;a href="http://www.livejournal.com/users/news/72473.html?thread=7582745" target="_blank"&gt;this thread&lt;/a&gt; on the News post about userpics, &lt;span  class="ljuser  i-ljuser  i-ljuser-type-P     "  data-ljuser="bradfitz" lj:user="bradfitz" &gt;&lt;a href="https://bradfitz.livejournal.com/profile/"  target="_self"  class="i-ljuser-profile" &gt;&lt;img  class="i-ljuser-userhead"  src="https://l-stat.livejournal.net/img/userinfo_v8.png?v=17080&amp;v=923.1" /&gt;&lt;/a&gt;&lt;a href="https://bradfitz.livejournal.com/" class="i-ljuser-username"   target="_self"   &gt;&lt;b&gt;bradfitz&lt;/b&gt;&lt;/a&gt;&lt;a class="i-ljuser-badge i-ljuser-badge--pro" data-badge-type="pro" data-placement="bottom" data-pro-badge data-pro-badge-type="1" data-is-raw hidden href="#"&gt;&lt;span class="i-ljuser-badge__icon"&gt;&lt;svg class="svgicon" width="25" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 33 24"&gt;&lt;path fill-rule="evenodd" d="M19.326 11.95c0 2.01 1.47 3.45 3.48 3.45 2.02 0 3.49-1.44 3.49-3.45 0-2.01-1.47-3.45-3.49-3.45-2.01 0-3.48 1.44-3.48 3.45Zm5.51 0c0 1.24-.8 2.19-2.03 2.19-1.23 0-2.02-.95-2.02-2.19 0-1.25.79-2.19 2.02-2.19s2.03.94 2.03 2.19ZM7.92 15.28H6.5V8.61h3.12c1.45 0 2.24.98 2.24 2.15 0 1.16-.8 2.15-2.24 2.15h-1.7v2.37Zm1.51-3.62c.56 0 .98-.35.98-.9 0-.56-.42-.9-.98-.9H7.92v1.8h1.51ZM18.3802 15.28h-1.63l-1.31-2.37h-1.04v2.37h-1.42V8.61h3.12c1.39 0 2.24.91 2.24 2.15 0 1.18-.74 1.81-1.46 1.98l1.5 2.54Zm-2.49-3.62c.57 0 1-.34 1-.9s-.43-.9-1-.9h-1.49v1.8h1.49Z" clip-rule="evenodd"/&gt;&lt;path fill-rule="evenodd" d="M2 8c0-2.20914 1.79086-4 4-4h20.5c2.2091 0 4 1.79086 4 4v7.9c0 2.2091-1.7909 4-4 4H6c-2.20914 0-4-1.7909-4-4V8Zm4-2.5h20.5C27.8807 5.5 29 6.61929 29 8v7.9c0 1.3807-1.1193 2.5-2.5 2.5H6c-1.38071 0-2.5-1.1193-2.5-2.5V8c0-1.38071 1.11929-2.5 2.5-2.5Z" clip-rule="evenodd"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;
asks:&lt;blockquote&gt;
We never meant for those to be restrictive. Just for anti-abuse. (we're
always paranoid with new features)
&lt;p&gt;
The syn subsystem is pretty damn robust/fast now, though, so maybe we
should up everything.
&lt;p&gt;
How many syn points you think would be good?
&lt;/blockquote&gt;
Just so y'know. I've given my 2c. :-)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:support_syn:12227</id>
    <author>
      <name>Rich Lafferty's LiveJournal</name>
    </author>
    <lj:poster user="mendel" userid="495344"/>
    <link rel="alternate" type="text/html" href="https://support-syn.livejournal.com/12227.html"/>
    <link rel="self" type="text/xml" href="https://support-syn.livejournal.com/data/atom/?itemid=12227"/>
    <title>A stroll through synsuck</title>
    <published>2003-08-12T19:30:56Z</published>
    <updated>2003-08-13T02:44:49Z</updated>
    <content type="html">What follows below is an overview and a line-by-line walkthrough of
the part of the LiveJournal source code which handles the retrieval
of RSS feeds, conversion to journal entries, and storage of those
entries in the LiveJournal database.

&lt;p&gt;&lt;b&gt;Understanding this document is not required of Syndication 
volunteers.&lt;/b&gt; I expect that most volunteers will not use this,
or maybe will find the overview interesting. It's a reference I
wrote up to help me diagnose one problem a long time ago, and I
figured I might as well make it public.

&lt;p&gt;(That said, I encourage anyone to comment with questions, requests
for clarifications, and so forth, even if you think your question
is silly.)

&lt;p&gt;The current version of &lt;tt&gt;synsuck.pl&lt;/tt&gt; can be obtained by
clicking on the highest version number in its entry
in the CVS repository browser:
&lt;blockquote&gt;
&lt;a href="http://cvs.livejournal.org/browse.cgi/livejournal/bin/maint/synsuck.pl" target="_blank"&gt;http://cvs.livejournal.org/browse.cgi/livejournal/bin/maint/synsuck.pl&lt;/a&gt;
&lt;/blockquote&gt;

&lt;hr&gt;
&lt;br&gt;&lt;br&gt;
&lt;h1&gt;Walkthrough of &lt;tt&gt;bin/maint/synsuck.pl&lt;/tt&gt; v1.25&lt;/h1&gt;
&lt;i&gt;Last modified: 2003-08-12 02:25 UTC&lt;/i&gt;
&lt;br&gt;&lt;br&gt;
&lt;h3&gt;Overview&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;For each syndicated account&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;request RSS file
  &lt;li&gt;if response is larger than 150KB, exit and try again in 60 minutes
  &lt;li&gt;check for misidentified character set and repair
  &lt;li&gt;parse RSS
  &lt;li&gt;take most recent 20 items of feed in reverse order
  &lt;li&gt;delete any entries older than two weeks (max friends page time)
    from LJ database
  &lt;li&gt;check to see if feed uses different &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt;s in each entry;
    if so, pull up the last set of &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt;s from the database for
    later comparison
  &lt;br&gt;&lt;br&gt;
  &lt;li&gt;&lt;b&gt;For each item in a feed&lt;/b&gt;:
  &lt;ul&gt;
      &lt;li&gt;Check to see if this exact item (all fields) has been
        seen before; if so, skip to next item
      &lt;li&gt;Store fields from XML into fields of an LJ entry
      &lt;li&gt;Check if the &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt; already exists in the database
      &lt;li&gt;If so, perform 'editevent' to edit entry; otherwise, 
          perform 'postevent' to post new entry
  &lt;/ul&gt;
  &lt;br&gt;
  &lt;li&gt;Update account name, website, bio with global title, URL,
    description from RSS feed
  &lt;li&gt;Decide when to poll the feed next
  &lt;li&gt;Update count of number of users reading this syndicated account
&lt;/ul&gt;
&lt;br&gt;&lt;br&gt;

&lt;h3&gt;Detail&lt;/h3&gt;



&lt;dl&gt;
&lt;p&gt;&lt;dt&gt;&lt;b&gt;Lines 4-9:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
loads required Perl libraries, declares global variables.
&lt;/dd&gt;


&lt;p&gt;&lt;p&gt;&lt;dt&gt;&lt;b&gt;11:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
The synsuck subroutine is entered into the hash which contains all of LiveJournal's maintenance tasks. This subroutine and the others in that hash are alled from &lt;tt&gt;bin/ljmaint.pl&lt;/tt&gt;, which is launched as a periodic job via
&lt;tt&gt;cron&lt;/tt&gt;.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;20:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
We retrieve all users whose statusvis is 'V' (syndicated) and whose
'checknext' field is in the past (ie, where checknext has come up
since the last run).
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;25-end (312):&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
This is the main loop of &lt;tt&gt;synsuck.pl&lt;/tt&gt;, which executes once for every
syndicated account returned from the previous query (l. 20).
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;27-33:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Create an anonymous subroutine which sets the 'lastcheck' field
in the 'syndicated' table to the current time, and the 'checknext'
field in that table to the current time plus N minutes where N 
is supplied as an argument, and records the status provided as
an argument, for the syndicated user being looked at. Note that
this subroutine is not &lt;i&gt;called&lt;/i&gt; yet, only created, and a reference
to it is stored (in &lt;tt&gt;$delay&lt;/tt&gt;) for later use. Below, this
subroutine will be referred to as the &lt;i&gt;scheduler&lt;/i&gt;.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;37-47:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Requests the feed URL with libwww-perl, including HTTP headers to
request the document only if it has been modified since the last
request and if the entity tag has changed since the last request.
(This way, per HTTP 1.1 we get new data unless both conditions
are true -- i.e., we increase our chances of getting new data from
a recalcitrant caching proxy along the way.)

&lt;p&gt;We check the size of the response on the way via a subroutine that
is called on the incoming data. If the response is larger than
150*1024 bytes we discard it immediately and set the &lt;tt&gt;$too_big&lt;/tt&gt; flag.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;48:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
If &lt;tt&gt;$too_big&lt;/tt&gt; is set, we tell the scheduler to check the 
feed again in 60 minutes and store "toobig" as the status, and go on to
the next feed.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;50-55:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
If we received HTTP 304 (Not Modified), we call the scheduler 
subroutine with a status of 'notmodified' and a delay of 
60 minutes if the feed has readers, or 1 day if the feed has no
readers.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;57-66:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Comment justifying the subsequent block that deserves reproduction
here:
&lt;pre&gt;
 # WARNING: blatant XML spec violation ahead... 
 # 
 # Blogger doesn't produce valid XML, since they don't handle encodings
 # correctly.  So if we see they have no encoding (which is UTF-8
 # implictly) but it's not valid UTF-8, say it's Windows-1252, which
 # won't cause XML::Parser to barf... but there will probably be some
 # bogus characters. [...]
&lt;/pre&gt;
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;67-73:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Code referred to by above comment, which looks for "&lt;tt&gt;&amp;lt;?xml&lt;/tt&gt;" 
and "&lt;tt&gt;encoding=&lt;/tt&gt;"
and stores the value of "encoding"; if not present and data does
not appear to be UTF-8 (via &lt;tt&gt;LJ::is_utf8()&lt;/tt&gt;), edits the content
in-place to contain "&lt;tt&gt;encoding='windows-1252'&lt;/tt&gt;".
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;75-83:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
"Another hack" which checks for Windows smart quotes in a document
which claims to be UTF-8; if present, edits the existing "&lt;tt&gt;encoding=&lt;/tt&gt;"
string to read "&lt;tt&gt;encoding='windows-1252'&lt;/tt&gt;".
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;85-89:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Parse XML with &lt;tt&gt;XML::RSS::parse()&lt;/tt&gt;, trapping exceptions, and storing
the resulting RSS object.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;90-99:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
If an exception is raised, call the scheduler subroutine with the status
"parseerror" and a delay of three hours, clean up the error returned by
&lt;tt&gt;XML::RSS::parse()&lt;/tt&gt;, and store as the user's "rssparseerror"
userprop, then go to the next feed.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;102:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Check that the "items" method of the RSS object returns an array
(of items in the feed). If it doesn't, call the scheduler subroutine
with a status of "noitems" and a delay of 3 hours, then go to
the next feed.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;104:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Store a copy of the items in the RSS feed in the reverse order
that they appear in the feed.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;107:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Take only the 20 bottommost items from the feed (i.e., the first
20 items in our stored copy).
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;111-116:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Connect to the LJ database. If connection fails, call the scheduler
subroutine with status "nodb" and delay of 15 minutes, then
go to the next feed. 
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;118-130:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Retrieve ids of all articles in the database for this account
user which are older than &lt;tt&gt;MAX_FRIENDS_VIEW_AGE&lt;/tt&gt; (default 2 weeks) and
delete them from the database.
&lt;/dd&gt;


&lt;p&gt;&lt;dt&gt;&lt;b&gt;132-143:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Try to determine if the &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt; field of each item can be expected
to be unique; for each item that has a link field, store the link
field, and if we've stored more than one link field, assume that
links can be expected to be unique. 
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;149-158:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
If the links can be expected to be unique, pull all of the 
links of already-stored entries from the database, and store
those links with their entry IDs.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;163-249:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Iterates over each item in the feed to possibly store it:
&lt;blockquote&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;169-171:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt; 
   Remove Perl's internal UTF-8 flag from the title, link and
   description fields of the item, so that Perl does not know it is
   UTF-8 even if it is. This prevents Perl from performing UTF-8
   conversions for us even when we're doing it ourselves. These
   automatic conversions are what introduced the recent
   double-encoding bug where one syndicated entry would break UTF-8
   encoding for a whole friends page.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;173-178:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
   Take an MD5 hash (via &lt;tt&gt;LJ::md5_struct&lt;/tt&gt;) of &lt;i&gt;all&lt;/i&gt; of the fields
   and values in the item. Check to see if that digest has already
   been stored in the synitem table for this syndicated account; if
   it has, assume we've already seen this item and go on to the next
   item. If it hasn't, store the MD5 hash and account ID in the
   synitem table.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;180:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
   Now that we believe this is a new item, increment a counter,
   &lt;tt&gt;$newcount&lt;/tt&gt; (which is specific to this account).
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;182-183:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
   Remove whitespace from the beginning and end of the
&lt;tt&gt;&amp;lt;description&amp;gt;&lt;/tt&gt; field.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;186-190:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   If the item has a &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt; field, store it in an &lt;tt&gt;&amp;lt;a href&amp;gt;&lt;/tt&gt; in
   a temporary variable, &lt;tt&gt;$htmllink&lt;/tt&gt;.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;192-209:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;Set the fields of the LJ "postevent". Of interest:
&lt;ul&gt;
     &lt;li&gt;'Subject' is &lt;tt&gt;&amp;lt;title&amp;gt;&lt;/tt&gt;
     &lt;li&gt;'Event' is &lt;tt&gt;$htmllink&lt;/tt&gt; prepended to &lt;tt&gt;&amp;lt;description&amp;gt;&lt;/tt&gt;
     &lt;li&gt;The 'syn_link' property is &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt;
&lt;/ul&gt;
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;211-214:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
   If the &lt;tt&gt;&amp;lt;description&amp;gt;&lt;/tt&gt; contains &lt;tt&gt;&amp;lt;p&amp;gt;&lt;/tt&gt; or &lt;tt&gt;&amp;lt;br&amp;gt;&lt;/tt&gt;, assume that the
   contents are preformatted, and set the "don't autoformat"
   property.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;216-235:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   If this &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt; appears in the list (from l.149) of existing
&lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt;s for the feed, decrement &lt;tt&gt;$newcount&lt;/tt&gt;, and prepare
to perform an "editevent" instead of a "postevent". Maintain the original
   posting time.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;237-239:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   Perform the postevent or editevent, using the current time as
   post time.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;240-244:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   If successful, ensure that one second elapses between the time
   the post was posted and now, otherwise wait one second. This
   prevents two articles from being posted at the same time, so
   the order in which they appear in the friends list matches the
   order they appeared in the feed.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;245-249:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   If the postevent or editevent failed, set &lt;tt&gt;$errorflag&lt;/tt&gt;.
&lt;/dd&gt; 

&lt;p&gt;&lt;i&gt;[Repeat from 163 for each item.]&lt;/i&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;245-255:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
If any postevent or editevent for this feed failed (ie, &lt;tt&gt;$errorflag&lt;/tt&gt;
is set), call the scheduler subroutine with a status of "posterror"
and a delay of 30 minutes, and go to the next feed.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;257-288:&lt;/b&gt;&lt;/dt&gt;

&lt;dd&gt;
Update syndicated account's userinfo:
&lt;/dd&gt;
&lt;blockquote&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;258:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   Load 'url' and 'urlname' property from existing userinfo.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;260-264:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   If the RSS feed has a &lt;tt&gt;&amp;lt;title&amp;gt;&lt;/tt&gt;, replace the syndicated account's
   name with the feed &lt;tt&gt;&amp;lt;title&amp;gt;&lt;/tt&gt; and set the "urlname" user property
   to the feed &lt;tt&gt;&amp;lt;title&amp;gt;&lt;/tt&gt;.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;266-269:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   If the RSS feed (not an individual item) has a &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt; set the
   "url" user property to the &lt;tt&gt;&amp;lt;link&amp;gt;&lt;/tt&gt;.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;271-287:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   If the RSS feed (not an individual item) has a &lt;tt&gt;&amp;lt;description&amp;gt;&lt;/tt&gt;,
   set the user's bio to the &lt;tt&gt;&amp;lt;description&amp;gt;&lt;/tt&gt;, otherwise record that
   the user has no bio.
&lt;/dd&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;293-297:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
    Decide when to poll the feed next. And I quote:
&lt;pre&gt;
     # FIXME: this is super lame.  (use hints in RSS file!) 
&lt;/pre&gt;
   If there were new articles this time, interval is 30 minutes
   and status is "ok"; otherwise interval is 60 minutes and
   status is "nonew". Call the scheduler subroutine with the
   appropriate values.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;299-304:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   Update reader count if there were new articles, or if it has
   never been updated, but otherwise leave it at current value.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;307:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   If there are no readers, use the scheduler subroutine to 
   change next poll interval to 1 day.
&lt;/dd&gt;

&lt;p&gt;&lt;dt&gt;&lt;b&gt;309-311:&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;
   Store last-modified date, entity tag, status, and interval to
   next poll in database.
&lt;/dd&gt;&lt;/dl&gt;&lt;/dd&gt;</content>
  </entry>
</feed>
