Windows 10 has something called Windows Subsystem for Linux and this something enables us to run Linux applications on Windows 10 using Linux without need for Hyper-V or other virtual machines. When building multi-platform applications like my open-source TemperatureStation solution then having Linux right there for testing comes very handy. This blog post shows how to get Linux running on Windows, how to install .NET Core and how to run web applications on Linux.
معرفی Web Framework Benchmarks
In case you are curious, a new benchmark
appeared.
The benchmark is really simple at present, but I think their plans are
to increase the complexity over time to show a more real-world use case
than something like the TechEmpower benchmarks
which are typically optimized for performance.
Visual Studio Code در DockerCon 2015
یکی کردن اسمبلیهای یک پروژهی WPF
The type or namespace name 'Stimulsoft' could not be found (are you missing a using directive or an assembly reference?)
چرا برای اسمبلیهای تلریک چنین مشکلی به وجود نمیآید و اینکه علاوه بر اسمبلیهای زیپ شده خود اسمبلیها نیز در فایل قرار داده شد؟
Cloud Computing is currently the hot topic in the developer world these days, and it seems all anyone wants to talk about is the cloud. If you're like me you signed up for something like Windows Azure just to see what the hype was all about. There are a lot of good reasons to move an app to the cloud, but it's still not for everyone. There are some things you need to think about before taking this gamble with your app.
چگونه با استفاده از لوسین مطالب را ایندکس کنیم؟
مقدمه
اگر به جستجوی سایت دقت کرده باشید، قابلیتی تحت عنوان پیشنهاد «عبارات مشابه» به آن اضافه شده است:
این مورد بر اساس ماژول غلط یاب املایی لوسین تهیه شده و بسیار شبیه به "did you mean" جستجوی گوگل است. در ادامه به نحوه پیاده سازی آن خواهیم پرداخت.
کتابخانههای مورد نیاز
علاوه بر کتابخانه لوسین، نیاز به دریافت پروژه Contrib آن نیز میباشد تا بتوان از اسمبلی Lucene.Net.Contrib.SpellChecker.dll موجود در آن استفاده کرد.
نحوه کار با غلط یاب املایی لوسین
خلاصه کار با غلط یاب املایی لوسین همین چند سطر ذیل است:
var indexReader = IndexReader.Open(FSDirectory.Open(indexPath), readOnly: true); // Create the SpellChecker var spellChecker = new SpellChecker.Net.Search.Spell.SpellChecker(FSDirectory.Open(indexPath + "\\Spell")); // Create SpellChecker Index spellChecker.ClearIndex(); spellChecker.IndexDictionary(new LuceneDictionary(indexReader, "Title")); spellChecker.IndexDictionary(new LuceneDictionary(indexReader, "Body")); //Suggest Similar Words var results = spellChecker.SuggestSimilar(term, number, null, null, true);
در ادامه شیء spellChecker را آغاز خواهیم کرد. بهتر است پوشه تولید فایلهای آن با پوشه ایندکس اصلی یکسان نباشد. اگر یکسان درنظر گرفته شود، تمام مداخل جدید به ایندکس موجود اضافه خواهند شد که میتواند سرعت جستجوی معمولی را کاهش دهد.
سپس کار تهیه ایندکس جدید غلط یاب املایی، شروع خواهد شد. متد spellChecker.ClearIndex، اطلاعات موجود در ایندکسی قدیمی را حذف کرده و سپس spellChecker.IndexDictionary، فیلدهایی را که نیاز داریم در تهیه غلط یاب املایی حضور داشته باشند، مشخص میکند.
همانطور که ملاحظه میکنید ایندکس جدید تهیه شده، بر اساس بانک اطلاعاتی واژههای موجود در ایندکس اصلی برنامه که توسط indexReader معرفی شده، تهیه میشود. برای نمونه در تصویر ابتدای مطلب جاری، واژههای پیشنهادی، واژههایی هستند که پیشتر یکبار تایپ شده و در بانک اطلاعاتی برنامه موجود بودهاند.
و در آخر برای استفاده از امکانات تهیه شده، تنها کافی است متد spellChecker.SuggestSimilar را فراخوانی کنیم (در زمانیکه جستجوی اصلی سایت نتیجهای را ارائه نداده است). حاصل لیستی از واژههای مشابه است.
fn main() { println!("The sum of 2 and 3 is {}", sum(2, 3)); } fn sum(a: i32, b: i32) -> i32 { a + b }
توابع در Rust با استفاده از کلمهی کلیدی fn و به دنبال آن نام تابع، پارامترها و نوع بازگشت (در صورت وجود) اعلام میشوند. در اینجا دستور کلی برای اعلان یک تابع در Rust آمدهاست:
fn function_name(parameter1: type1, parameter2: type2) -> return_type { // بدنه تابع // استفاده از مقادیر یارگشتی در صورت لزوم }
Function Parameters
توابع در Rust میتوانند صفر یا چند پارامتر را داشته باشند. پارامترها در امضای تابع، داخل پرانتز قرار گرفته و با کاما از هم جدا میشوند. در اینجا یک مثال، از یک تابع، با دو پارامتر آورده شدهاست:
fn greet(name: &str, age: i32) { println!("Hello, {}! You are {} years old.", name, age); }
Function Return Values
توابع در Rust میتوانند با استفاده از کلمهی کلیدی return و سپس مقدار بازگشتی، مقداری را برگردانند. یک مثال:
fn square(x: i32) -> i32 { return x * x; }
با این حال، Rust یک سینتکس مختصر را نیز برای برگرداندن مقادیر، از توابع دارد که در آن میتوانید کلمهی کلیدی return را حذف کنید و به سادگی مقداری را که باید در انتهای بدنهی تابع برگردانده شود، مشخص کنید. در اینجا همان مثال، با استفاده از سینتکس کوتاه آمدهاست:
fn square(x: i32) -> i32 { x * x }
Rust همچنین از توابعی با مقادیر بازگشتی چندگانه پشتیبانی میکند که به آنها 'tuples' نیز میگویند. یک مثال:
fn swap(a: i32, b: i32) -> (i32, i32) { (b, a) }
برای استفاده از مقادیر بازگشتی یک تابع tuple، میتوانید tuple را destructure کنید یا از عملگر '.' برای دسترسی به عناصر آن استفاده کنید. در این مثال هر دو روش وجود دارند:
let (b, a) = swap(1, 2); println!("a is {} and b is {}", a, b); let tuple = swap(1, 2); println!("a is {} and b is {}", tuple.1, tuple.0);