‏نمایش پست‌ها با برچسب Blogger. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب Blogger. نمایش همه پست‌ها

۱۳۹۰/۱۲/۱۲

گروه‌هاي گوگل، اينترفيس جديد و زبان فارسي


گوگل اخيرا شروع كرده به اعمال قالب جديد مترو مانند خودش به گروه‌هاي قديمي موجود در آن. اين مساله چند مزيت رو براي فارسي زبان‌ها مي‌تونه به همراه داشته باشه:
پيشتر اين گروه‌ها براي فارسي زبان‌ها آنچنان/«اصلا» دلچسب نبود. چون نه از زبان فارسي پشتيباني مي‌كرد، نه از راست به چپ و نه از فونت‌هاي سفارشي مطلوب (قلم پيش فرض آن courier new بود). هرچند يك سري style توسط افزونه استايليش به آن قابل اعمال بود ولي خوب، به يك سري مرورگر خاص محدود مي‌شد. الان اين گروه‌هاي جديد (كه در آدرس آن‌ها بجاي groups از كلمه forum استفاده شده) هم از زبان فارسي پشتيباني مي‌كنند و هم اينكه با انتخاب اين زبان، كل مجموعه راست به چپ خواهد شد و براي تمام مرورگرها به شكل يكساني قابل استفاده خواهد بود. به علاوه اين قالب جديد گروه‌ها/انجمن‌هاي گوگل،‌ اديتور متني پيشرفته‌اي را هم به همراه دارد؛ به علاوه امكان الصاق فايل.





به اين ترتيب اين گروه‌ها براي كساني‌ كه مي‌خواهند يك انجمن فارسي رايگان هاست شده توسط گوگل، به همراه قابليت الصاق فايل و پشتيباني از زبان فارسي و راست به چپ را داشته باشند، بسيار مناسب شده است. همچنين سطح دسترسي اين گروه‌ها به عمومي، فقط خواندني و همچنين خصوصي (فقط اعضاي دعوت شده قابليت خواندن يا ارسال مطلب را داشته باشند)‌،‌ قابل تنظيم است.

۱۳۹۰/۰۸/۱۰

راهي از گوگل ريدر به گوگل پلاس و سپس به دنياي خارج!


از امروز قابليت‌هاي اجتماعي گوگل ريدر با گوگل پلاس يكي شده و به همين جهت يك سري از امكانات قديمي آن حذف گرديده‌اند؛ مانند به اشتراك گذاري و لايك زدن و غيره و تمام اين‌ها با دكمه‌ي به علاوه يك گوگل پلاس جايگزين شده‌اند. اينبار مي‌شود علاقمند‌ي‌ها را از گوگل ريدر به حلقه‌هاي گوگل پلاس هدايت كرد. همه‌ي اين‌ها خوب؛ اما سيستم به اشتراك گذاري‌هاي روزانه‌ي من رو به هم ريخته اين‌ كارها! قبلا از حاصل اشتراك‌ها در گوگل ريدر، يك فيد تهيه مي‌شد كه الان ديگر وجود خارجي ندارد. هيچكدام از حلقه‌هاي گوگل پلاس هم فيد ندارند. به اين ترتيب اين محصول، تبديل به يك فيدخوان معمولي شده است. مثل 100ها برنامه‌ي مشابه ديگر.

اما ... در ادامه ببينيم كه چطور مي‌توان از گوگل ريدر جديد، راهي به خارج باز كرد!

الف) زمانيكه در محيط گوگل ريدر، بر روي دكمه به علاوه يك گوگل پلاس قرار گرفته در ذيل يك مطلب كليك مي‌كنيد، مي‌توان نام حلقه‌اي از حلقه‌هاي گوگل پلاس را انتخاب كرد تا مطلب ما به آن ارسال شود. يكي از اين حلقه‌ها، Public نام دارد. بنابراين اينبار اگر قصد به اشتراك گذاري عمومي مطلبي را داشتيد مطابق شكل زير، حلقه Public را وارد نمائيد و جالب اينجا است كه اين حلقه فقط در گوگل ريدر قابل انتخاب است؛ نه در خود گوگل پلاس.


ب) اكنون به اكانت گوگل پلاس خود مراجعه كنيد. در قسمت پروفايل، به لينك بالاي صفحه دقت نمائيد. چيزي است شبيه به:

https://plus.google.com/u/0/userId/posts 

اين userId براي ادامه كار مهم است.

ج) از اين userId براي فراخواني لينك زير استفاده خواهيم كرد (userId آن بايد جايگزين شود):

https://plus.google.com/_/stream/getactivities/?&sp=[1,2,"userId",null,null,null,null,"social.google.com",[]]


خروجي آن طبق معمول متداول گوگل، فرمت JSON است و مي‌توان از آن ليست اشتراك‌هاي عمومي را استخراج كرد. براي نمونه كلاس GooglePlusJsonParser تهيه شده زير مي‌تواند اين عمليات را انجام دهد:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
//needs a ref. to System.Web.Extensions asm.
using System.Web.Script.Serialization;

namespace GooglePlus
{
    [DebuggerDisplay("{DateTime}-{Title}-{Comment}-{Url}")]
    public class GooglePlusItem
    {
        public DateTime DateTime { set; get; }
        public string Url { set; get; }
        public string Title { set; get; }
        public string Comment { set; get; }
    }

    public static class Utils
    {
        public static DateTime ConvertFromUnixTimestamp(this long data)
        {
            return new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(data);
        }

        public static string ToSafeString(this object data)
        {
            return data == null ? string.Empty : data.ToString();
        }
    }

    public class GooglePlusJsonParser
    {
        public static IList<GooglePlusItem> GetMyPublicItemsList(string userId)
        {
            var url = string.Format("https://plus.google.com/_/stream/getactivities/?&sp=[1,2,\"{0}\",null,null,null,null,\"social.google.com\",[]]", userId);
            var jsonData = new WebClient().DownloadString(url);
            return ParsePublicData(jsonData);
        }

        public static IList<GooglePlusItem> ParsePublicData(string jsonData)
        {
            jsonData = removeRedundantData(jsonData);
            var posts = parseJson(jsonData);
            return createItemsList(posts);
        }

        private static IList<GooglePlusItem> createItemsList(object[] posts)
        {
            var result = new List<GooglePlusItem>();
            foreach (object[] post in posts)
            {
                var items = (object[])((object[])post[66])[0];
                result.Add(new GooglePlusItem
                {
                    DateTime = (((Int64)post[5]) / 1000).ConvertFromUnixTimestamp(),
                    Title = items[3].ToSafeString(),
                    Url = items[1].ToSafeString(),
                    Comment = post[4].ToSafeString()
                });
            }
            return result;
        }

        private static object[] parseJson(string jsonData)
        {
            var jsonObject = new JavaScriptSerializer().Deserialize<object[]>(jsonData);
            var posts = (object[])(((object[])jsonObject[1])[0]);
            return posts;
        }

        private static string removeRedundantData(string jsonData)
        {
            return jsonData.Replace(")]}'", string.Empty)
                           .Replace("[,", "[\"\",")
                           .Replace(",,", ",\"\",")
                           .Replace(",,", ",\"\",");
        }
    }
}

نحوه استفاده از آن هم مي‌تواند فراخواني متد GooglePlusJsonParser.GetMyPublicItemsList به همراه userId ياد شده باشد.



ايده اصلي از:
Getting the Google+ Feed for any profile in JSON


۱۳۹۰/۰۶/۲۵

ارسال خودكار مطلب به بلاگر


اكثر خدمات گوگل داراي API هم هستند و به اين ترتيب با استفاده از برنامه نويسي نيز مي‌توان به آن‌ها دسترسي پيدا كرد. براي نمونه API دسترسي به Blogger در اينجا توضيح داده شده است. براي كار با اين امكانات يا مي‌توان چرخ را از نو اختراع كرد يا از كتابخانه‌هاي مرتبطي همانند Gdata API for .NET استفاده نمود. براي دات نت فريم ورك، از آدرس http://code.google.com/p/google-gdata/ مي‌توان آخرين كتابخانه‌هاي كار با GData يا Google Data API را دريافت كرد. براي نمونه فايل Google_Data_API_Setup_1.9.0.0.msi فعلي آن حدود 28 مگ حجم دارد و به درد كساني مي‌خورد كه علاقمند هستند تا تمام امكانات موجود آن‌را بررسي كنند. راه ساده‌تري هم براي دسترسي به اين كتابخانه‌ها وجود دارد؛ مي‌توان از NuGet استفاده كرد.


به اين ترتيب به سادگي و سرعت هرچه تمامتر فايل 200 كيلوبايتي Google.GData.Client.dll دريافت شده و ارجاعي نيز به آن اضافه خواهد شد. همين حد جهت كار با بلاگر كافي است.
براي نمونه قطعه كد زير كار ارسال يك مطلب جديد به وبلاگ بلاگري شما را انجام خواهد داد:

using System;
using System.Collections.Generic;
using Google.GData.Client;

namespace BloggerAutoPoster
{
    public class BloggerAutoPoster
    {
        public string UserName { set; get; }

        public string Password { set; get; }

        public string PostTitle { set; get; }

        public IList<string> PostTags { set; get; }

        public string PostBody { set; get; }

        public string BlogUrl { set; get; }

        public bool PostAsDraft { set; get; }

        public bool PostNewEntry()
        {
            var service = new Service("blogger", "blogger-example")
                {
                    Credentials = new GDataCredentials(UserName, Password)
                };
            var newPost = constructNewEntry();
            var result = service.Insert(new Uri(BlogUrl), newPost);
            return result != null;
        }

        private AtomEntry constructNewEntry()
        {
            var newPost = new AtomEntry
                {
                    Title = { Text = PostTitle },
                    Content = new AtomContent
                              {
                                  Content = string.Format(@"<div xmlns=""http://www.w3.org/1999/xhtml"">{0}</div>", PostBody),
                                  Type = "xhtml"
                              },
                    IsDraft = PostAsDraft
                };

            foreach (var tag in PostTags)
            {
                newPost.Categories.Add(
                    new AtomCategory
                    {
                        Term = tag,
                        Scheme = "http://www.blogger.com/atom/ns#"
                    });
            }

            return newPost;
        }
    }
}

مثالي از استفاده آن هم به صورت زير مي‌باشد:

new BloggerAutoPoster
{
      BlogUrl = "https://www.blogger.com/feeds/number/posts/default",
      UserName = "name@gmail.com",
      Password = "pass",
      PostTitle = "بررسي ارسل خودكار-3",
      PostTags = new List<string> { "بررسي ارسال خودكار" },
      PostBody = "تست مي‌شود123",
      PostAsDraft = false
}.PostNewEntry();

نام كاربري و كلمه عبور آن، همان مشخصات وارد شدن به اكانت جي‌ميل شما است. اگر مي‌خواهيد مطلب ارسالي بلافاصله در سايت ظاهر نشود PostAsDraft را true كنيد. همچنين BlogUrl آن، همانطور كه ملاحظه مي‌كنيد فرمت خاصي دارد. جهت يافتن آن مي‌توان از قطعه كد زير كمك گرفت:

using System;
using System.Collections.Generic;
using System.Linq;
using Google.GData.Client;

namespace BloggerAutoPoster
{
    public class BlogInfo
    {
        public string Title { set; get; }
        public string Url { set; get; }
    }

    public class BloggerInfo
    {
        public static IList<BlogInfo> FindMyBlogsUrls(string username, string password)
        {
            var result = new List<BlogInfo>();

            var service = new Service("blogger", "blogger-example")
            {
                Credentials = new GDataCredentials(username, password)
            };

            var query = new FeedQuery { Uri = new Uri("https://www.blogger.com/feeds/default/blogs") };
            var feed = service.Query(query);

            if (feed == null)
                throw new NotSupportedException("You don't have any blogs!");

            foreach (var entry in feed.Entries)
            {
                result.AddRange(entry.Links.Where(t => t.Rel.Equals("http://schemas.google.com/g/2005#post"))
                                           .Select(t => new BlogInfo
                                                        {
                                                            Url = new Uri(t.HRef.ToString()).AbsoluteUri,
                                                            Title = entry.Title.Text
                                                        }));
            }

            return result;
        }
    }
}

توسط كد فوق، آدرس ويژه و عنوان تمام بلاگ‌هاي ثبت شده‌ي بلاگري شما بازگشت داده مي‌شود.


۱۳۹۰/۰۵/۲۰

بلاگر و تگ‌هاي BR‌ اضافي!


اگر پس از ارسال كدها در بلاگر فاصله‌هاي عجيبي را بين سطرهاي رندر شده مشاهده كرديد، مشكل از قرار دادن تك BR به صورت خودكار است!





براي حل اين مشكل به آدرس زير مراجعه كنيد:
Dashboard -> Settings -> Formatting -> Convert line breaks -> change to No


يا در قسمت كنترل پنل فارسي : تنظيمات ، قسمت قالب بندي و سپس گزينه‌ي «برعكس كردن شكست خط» را خير كنيد.

۱۳۹۰/۰۱/۱۴

قابليت جديد بلاگر؛ ديدهاي پويا


بلاگر اخيرا قابليتي رو به وبلاگ‌هاي خود تحت عنوان ديدهاي پويا اضافه كرده كه به صورت زير قابل دسترسي است:

ادعاهاي مرورگرهاي جديد رو در مورد سرعت پردازش جاوا اسكريپت اينجا به وضوح مي‌توان بررسي كرد. براي مثال سرعت و خصوصا CPU usage فايرفاكس 4 و IE 9 را با آدرس‌هاي فوق آزمايش كنيد.

ماخذ: (+)

۱۳۹۰/۰۱/۰۸

بلاگر و دومين سفارشي


سلام؛ نوروز مبارك!
اميدوارم در اين سال جديد برقرار به مانند سيسكو، محبوب مثل گوگل، پايدار همانند اينتل، به دور از گزند مثل ويندوز 7 و موفق همانند مايكروسافت باشيد!

يك دامنه‌ي جديد به نام dotnettips.info براي وبلاگ تهيه و تنظيم كردم كه شرح انجام آن براي علاقمندان به صورت زير است:

الف) خريد يك دامنه (براي مثال من از اينجا تهيه كردم)
ب) تنظيمات CNAME و A Records آن دامنه
براي مثال ممكن است كنترل پنل دامنه‌ي شما به صورت زير باشد. در اين حالت به قسمت DNS مراجعه كرده:



و در ادامه تغييرات ذيل را اعمال نمائيد:
در قسمت A Records چهار آدرس IP مربوط به گوگل بايد وارد شوند:



4 ركورد جديد را بايد ايجاد كنيد:



سپس CNAME مربوط به بلاگر بايد وارد شود:



ج) اكنون به تنظيمات بلاگ خود مراجعه كرده و نام دامنه جديد را وارد نمائيد:



اعمال اين تغييرات بين 7 ساعت تا 24 ساعت طول خواهد كشيد (مدتي طول مي‌كشد تا گوگل آدرس شما را فعال كند؛ مدتي هم طول خواهد كشيد تا اطلاعات DNS شما در سراسر سرورهاي مرتبط در دنيا به روز شود). بنابراين در اين بين، انجام اين تنظيمات و رها كردن سايت به حال خود كفايت مي‌كند.

ماخذ IP ها و همچنين CNAME فوق مستندات رسمي گوگل است: (+)

اگر هم براي سايت خود يك فيد از نوع feedburner ثبت كرده باشيد، خوانندگان فيد وبلاگ شما نياز به هيچ نوع تغيير و تنظيمي نخواهند داشت.