نظرات مطالب
نقدی بر کتاب «مرجع کامل entity framework 4.1»
چون عموما تیم‌های سورس باز، از لشگر مستند ساز و مستند نویس مایکروسافت محروم هستند.
برای مثال یادم هست زمانیکه سیلورلایت 5 بتا ارائه شد (چند وقت قبل)، همان روز حدود بالای 30 مقاله‌ی بلند بالا در مورد تازه‌های محصولی که دقیقا همان روز در یک کنفرانس برای اولین بار معرفی شده، مطلب منتشر شد. خوب ... این یک لشگر سازماندهی شده است. رقابت کردن با این‌ها سخت است.
شما فکر می‌کنید کسانی که کتاب‌های بعدی سیلورلایت 5 را منتشر می‌کنند از کجا مطالب خودشون رو تامین می‌کنند؟ همین 30 تا مقاله رو کنار هم قرار می‌دهند با نگارش خودشون منتشر می‌کنند. راحت میشه نصف یک کتاب.
NHibernate هم به همین صورت، این لشگر مستند ساز رو نداره. به علاوه خیلی اشتباه است اگر تصور کنید NHibernate همان Hibernate جاوا است. خیلی اضافات در NHibernate به دلیل پیشرفت‌های زبان‌های دات نتی وجود دارد که در Hibernate نیست (همین مباحث static reflection ، lambda expression ، LINQ و غیره). خلاصه اینکه NHibernate فقط یک معادل یک به یک، یکی از کتابخانه‌ها‌ی معروف جاوا نیست. شاید نگارش اول آن اینطور بوده.

ضمنا فعلا شما همین کتاب EF 4.1 رو بخرید! اگر به چاپ دوم رسید یعنی می‌شود به انتشار کتاب‌های مشابه امیدوار شد!
نظرات مطالب
نقدی بر کتاب «مرجع کامل entity framework 4.1»
یه سوال
چرا کتابهای زیادی در مورد Hibernate منتشر شده اما کتابهای NHibernate به تعداد انگشتان یک دست هم نمی رسه؟
در مورد چاپ کتاب NHibernateتوی ایران هم فکر کنم کسی به جز شما این دانش رو (حداقل برای چاپ کتاب)نداشته باشه و دست خودتونو می بوسه!
نظرات مطالب
استفاده از فیلدهای XML در NHibernate
سلام.
من nHibernate بلد نیستم اما قسمتی که درباره فرم ساز ها صحبت کردید جالب بود.
این فرم سازی که شما ازش صحبت کردید User Mode بود حالا اگر فرم سازی بخواهیم توسعه بدیم که Developer Mode باشه نظرتون چیه؟
مثلا از روی یک Table فرم خام رو صورت Html در بیاورد.
نظرات مطالب
استفاده از اسمبلی‌های دات نت 2 در یک پروژه دات نت 4
- یک نکته‌ی دیگر:
اگر حین کار با NHibernate و SQLite در یک برنامه‌ی دات نت 4 به خطای "Could not create the driver from NHibernate.Driver.SQLite20Driver" برخوردید، راه حل همان مورد فوق است (اضافه کردن useLegacyV2RuntimeActivationPolicy به فایل کانفیگ برنامه).
نظرات مطالب
لیستی از بانک‌های اطلاعاتی قابل استفاده در دات نت
کار با NHibernate سخته، Wizard برای Generate کردن Mapping دیتابیس نداره و همه چیز را خودمان باید تولید کنیم، ولی ابزار هایی مثل OpenAccess همه چیزهارو خودشان تولید میکنند واز Forward Mappingو Reverse Mapping هم پشتیبانی می کنند و کلی زمان تولید کد رو کم می کنند.
نظرات مطالب
خلاصه‌ای از آغاز به کار با NHibernate
با سلام
من مدتی قبل در مورد ORMها تحقیق کردم و به این نتیجه رسیدم که بهترین آنها Entity Framework است که حتی در نهایت LINQ to SQL را هم آرام آرام حذف می کند و جایگزین آن می شود. می توانید مقاله ای در مورد مقایسه nHibernate و Entity Framework تحریر کنید؟ (مثل مقایسه ای که در مورد jQuery و ASP AJAX داشتید)
نظرات مطالب
آشنایی با NHibernate - قسمت چهارم
روابط یک به چند و چند به چند رو در طی مقالات این سری توضیح دادم. باید وقت بگذارید این‌ها را مطالعه کنید (مواردی مانند one-to-many و many-to-many و غیره که ذکر شده به همین دلیل است).
یا اینکه می‌تونید از ابزار استفاده کنید: NHibernate Mapping Generator
نظرات مطالب
آشنایی با NHibernate - قسمت دوم
سلام
آقای نصیری عزیز

من هم مثل شما از Resharper به عنوان اجرا کننده های تست های NUnit استفاده می کنم ولی من در تست های Pass شده مثل شما Log مربوط به NHibernate رو نمی بینم فقط تست های fail رو میبینم. مخواستم ببینم تنظیم خواصی داره؟ اگه لطفا کنید راهنمایی کنید ممنون میشم.
نظرات مطالب
مزیت‌های استفاده از رویه‌های ذخیره شده؛ واقعیت یا توهم؟!
منم با آقای محبی موافقم.با این تفاوت که LINQ رو NHibernate ترجیح میدم.

با SP ها درسته که تقرایبا کار ها مدیریت بهتری دارن ولی مثلا زمانی که لازم باشه SP رو تغییر بدید باید خیلی چیز ها باز بینی بشن.

این مشکل وقتی با DataSet ها کار می کنی بیشتر هم میشه.

موفق باشید
مطالب
تبدیل زیرنویس‌های یوتیوب به فایل srt

تعدادی از ویدیوهای یوتیوب، خصوصا مواردی که از Google videos به یوتیوب منتقل شده‌اند، دارای زیر نویس هستند. این زیر نویس هم فرمت جالبی دارد:
<?xml version="1.0" encoding="UTF-8"?>
<transcript>
<text start="23.49" dur="5.97">
&amp;gt;&amp;gt;Commentator: We have here today, Steve with
us whom I met not too long ago at something
</text>
...
</transcript>
و از هر لحاظ بهتر است از فرمت srt متداول (خصوصا از لحاظ قابلیت بهتر parse آن) ولی ... این فرمت xml ایی، متداول نیست و بهتر است جهت استفاده از آن در برنامه‌های پخش کننده فایل‌های ویدیویی، به srt تبدیل شود.
ابتدا شاید بپرسید که این‌ها را چگونه می‌توان دریافت کرد. روش کار به صورت زیر است:
http://video.google.com/timedtext?hl=en&v=Id&lang=en

در قسمت‌های hl و lang ، زبان مورد نظر قرار می‌گیرد و قسمت v همان id معروف ویدیوی یوتیوب مورد نظر است. برای مثال اگر لینک ویدیوی ما http://www.youtube.com/watch?v=-PA-buwI3q4 باشد، لینک زیرنویس انگلیسی هماهنگ با آن http://video.google.com/timedtext?hl=en&v=-PA-buwI3q4&lang=en خواهد بود.

البته زمان‌های این فایل xml یک نکته‌ی خاص گوگلی دارد!
اگر عدد 3.4 را مشاهده کردید یعنی سه ثانیه و 400 میلی ثانیه
اگر عدد 3.04 را مشاهده کردید یعنی سه ثانیه و 40 میلی ثانیه
به عبارتی با قسمت اعشاری آن باید به صورت رشته برخورد کنید. اگر طول آن یک بود، دو صفر و اگر طول آن 2 بود، 1 صفر در جلوی آن باید قرار گیرد تا قابل استفاده شود.

کلاس تهیه شده زیر کار تبدیل Xml گوگل را به Srt انجام می‌دهد:
using System;
using System.Linq;
using System.Text;
using System.Web;
using System.Xml.Linq;

namespace YtSubs
{
public class GoogleXmlToSrt
{
public string ConvertXmlToSrt(string url)
{
var transcript = loadTranscript(url);

var srtBuf = new StringBuilder();
var lineNumber = 0;

foreach (var item in transcript.Root.Elements("text"))
{
lineNumber++;
srtBuf.Append(lineNumber.ToString());

var timeLine = getTimeLine(item);
srtBuf.AppendFormat("{0}{1} --> {2}{3}", Environment.NewLine, timeLine.Item1, timeLine.Item2, Environment.NewLine);

var msg = decodeText(item);
srtBuf.AppendLine(msg + Environment.NewLine);
}
return srtBuf.ToString();
}

private static XDocument loadTranscript(string url)
{
var transcript = XDocument.Load(url);

if (transcript.Root == null)
throw new InvalidOperationException("couldn't load received data.");
return transcript;
}

private static string decodeText(XElement text)
{
var textValue = text.Value.Split('\n');
var msg = textValue.Aggregate(
string.Empty, (current, line) =>
current + (HttpUtility.HtmlDecode(line.Trim()) + Environment.NewLine)
);
return msg.Trim();
}

private static int fractionalPart(string data)
{
var idx = data.IndexOf(".");
if (idx == -1) return 0;
var fractionalPart = data.Substring(idx + 1);
if (fractionalPart.Length == 1) //3.4 --> 3.400
return int.Parse(fractionalPart + "00");

if (fractionalPart.Length == 2) //3.04 --> 3.040
return int.Parse(fractionalPart + "0");

return int.Parse(fractionalPart.Substring(0, 3));
}

private Tuple<string, string> getTimeLine(XElement text)
{
var startTs = getStartTs(text);
TimeSpan endTs = getEndTs(text, startTs);
return new Tuple<string, string>(timeSpanToString(startTs), timeSpanToString(endTs));
}

private static TimeSpan getStartTs(XElement text)
{
var startData = text.Attribute("start");
if (startData == null)
throw new InvalidOperationException("This is not a valid subtitle file.");

var start = startData.Value;
var startTs = new TimeSpan(0, 0, 0, (int)Math.Truncate(double.Parse(start)), fractionalPart(start));
return startTs;
}

private static TimeSpan getEndTs(XElement text, TimeSpan startTs)
{
TimeSpan endTs;
var durData = text.Attribute("dur");
if (durData == null)
{
endTs = startTs + new TimeSpan(0, 0, 0, 3, 0);
}
else
{
var dur = durData.Value;
var durTs = new TimeSpan(0, 0, 0, (int)Math.Truncate(double.Parse(dur)), fractionalPart(dur));
endTs = startTs + durTs;
}
return endTs;
}

private static string timeSpanToString(TimeSpan lineTs)
{
return string.Format("{0}:{1}:{2},{3}",
lineTs.Hours.ToString("D2"),
lineTs.Minutes.ToString("D2"),
lineTs.Seconds.ToString("D2"),
lineTs.Milliseconds.ToString("D3"));
}
}
}
و یک نمونه از استفاده آن می‌تواند به شکل زیر باشد:
using System.IO;

namespace YtSubs
{
class Program
{
static void Main(string[] args)
{
var url = "http://video.google.com/timedtext?hl=en&v=-PA-buwI3q4&lang=en";
//var url = "subtitle.xml";
var srtBuf = new GoogleXmlToSrt().ConvertXmlToSrt(url);
File.WriteAllText("-PA-buwI3q4.srt", srtBuf);
}
}
}


مطالب تکمیلی:
همه چیز درباره زیرنویس ویدئوهای گوگل