Thursday 25 January 2018

别纠结了,也许你根本不适合移民加拿大!

如何增加人生质量的砝码、加宽我们的生命厚度,成了某一部分人的苦苦追求……于是,有人毅然递上“辞职信”,带着老婆孩子,头也不回地加入了“移民”的大军……当然,也有人在国外兜兜转转,眼看即将打开一片天地,最后却决定踏上“归国”的航班……


移还是不移?这是个问题!

但,设身处地移民加拿大对每一位华人来说都会有个不一样的答案。

加拿大,G7国家、环境美好、教育先进、法治健全、福利完善、生活舒适、政局稳定,仿佛这样的国家不去走一遭就会觉得白来世间一趟!

然而,并非每个人都能感同身受地认同这里是“天堂”。

有时候,表象的繁华却是掩藏着无聊、孤寂、失望、无助……


所以,不要再犹豫、不要再徘徊!

如果看了下面10条,符合2条。

那就妥妥地收心……从哪里来回哪里去吧!


1
奢侈炫耀之人



如果你以为加拿大的每一个地方都像温哥华某些地方那样对美女、名包、豪车趋之若鹜的话,那你就大错特错了!

其实在加拿大,即便是贵为总理夫人或是身价千万的精英阶层也比较热衷购买打折商品。相反,在慈善捐助方面他们到时很大方的。



当然,在温哥华、多伦多这样的城市也有数不完的奢侈品名店。

但是,这却不是炫耀的资本。

在加拿大,路人不会因为你一身名牌而去多看你一眼,只会因为你善意的微笑而对你说一声“Hello”……



2
喜欢大城市之人



在国内,我们普遍认为大城比小城好。虽然小城房价低、生活安稳,但是大家都承认,小城的医疗条件、教育资源、基础设施、娱乐生活等等方面是比不上大城的。但是在加拿大,大城和小城就不是生活质量问题,而成为了一个自我选择问题。



小城的医疗条件很好,各种医疗设施一应俱全,医生、护士都有正规的行医资格,不用担心遇上赤脚大夫。举两个例子,小城金斯顿平均每1000名居民就拥有4.09名医生,这个比例是加国第二名,小城列治文,人均寿命83.4岁,这是加国第一名。试问,如果小城医疗条件不好,怎么可能达到这个傲人的成绩呢?







小城的教育资源和大城也没多大差别。在加拿大,教育被视作一种所有人都应该平等得到的权利,这就体现在教育部门喜欢把资源往教育差的地方调配,所以在哪里接受教育都是差不多的,不会像国内,好学校差学校简直一个天上一个地下。而且,很多名牌大学都不在大城里,比如滑铁卢大学所在的滑铁卢市,城市人口只有10万,但这不妨碍大学的录取分数线是加国第一。再比如,著名的UBC有一个校区在小镇基洛纳,那一带是以种植葡萄、酿造葡萄酒而著称的农业区。



小城的基础设施也用不着担心,马路是修好的,只管开车出行就可以了,水电暖气都是必不可少的,没准网还比大城里要快一些。当然,小城大城的环境都挺好,天空是蓝色的,空气是清新的。在加拿大,住大城只是喜欢热闹,住小城只是向往宁静。




众所周知,在华人眼里,加拿大这只有村!

温村、多村、卡村、蒙村……

多伦多人口也就600万,想象一下国内北上广动辄2000万+的人口规模,想在加拿大找到国际大都市的赶脚,是不是来错地方了?



在加拿大,人们比较少谈及“热闹“、”便捷“、“夜生活“,周末来临的时候,很多人也就是High Park,或者全家出动远足踏青。

所以,有种说法就是在加拿大待久了,回国就变成了“土鳖”……









3
依靠经验之人



所谓经验无非是你在特定的领域熟知后积累而已,那么换个国度呢?

找工难向来是初来加拿大的新移民最头疼的事。由于经济基础与体量的差别,加拿大能提供的工作类别和机会要比国内少得多。



当然,如果你在技术或者金融、医学等方面有过人之处,或许在加拿大生活的更容易些……同等条件下,加拿大的企业还是更青睐更懂当地市场熟悉用户的西人。


4
好高骛远之人



对实现财务自由优雅生活的幻想,导致了大多数人还停留在财富带来的满足感。在很多国人的心目中,金钱可以带来一切。

反观加拿大,比较成熟的西方社会里,阶级的流动是很慢的,快速实现财富增殖简直是不可能的事,除非,你中了649头奖。

So,一步登天的黄粱美梦可以醒醒了……


5
享惯“特权”之人



长期的潜移默化,让国人都变成攻关里手,托人高手。友谊与亲情都染上了严重的势利与利用价值。而一踏上加拿大这块土地,所有这些人生技巧与思维模式好像一下子被重新清零,重新洗脑……



当然也有一小部分人在久候看病拖拉,拿到交通告票想私了,小孩不符合规定不能入好学校时还会想念国内托关系搞定的便利。除非理由正当并走该走的程序,真正以身试法的人还是不多。

想走“特权”?更多的时候会弄巧成拙的……


6
无视外语之人



加拿大是个双语国家,英语和法语都是它的官方语言。掌握两门以上异族语言就足以在某种角度,说明一个人的聪明才智。

从就业的角度讲,英、法双语人士能够进入加拿大政府工作的机会会远远高出只会一门语言的人士。

当然,如果你的目标只是看懂路标,会点菜……那说明你也没打算在加拿大长待……


7
有关系好办事之人


中国有句古话叫,好汉不提当年勇。

在国内,或许你只是打几通电话就能搞定一件棘手的事,托关系吃个饭能签个大项目……你的经验,你的人脉会让你在职场游刃有余。



但是,在加拿大初来乍到,谁也不知道你以前的风光,“地位”的一落千丈会造成极大的“心理落差”。在国内,是妥妥的“人生赢家”,而到了加拿大却要从头再来……也是颇为无奈。

在国内,没有“关系”不是不能生活,但是会活得很累。不是说不需要人际交往,不需要扩大自己的社交圈,只是有些时候、有些事情不需要我们动用“关系”。在加拿大,这种方面的烦恼就少了许多,而且我们也不要随随便便就和别人“攀关系”。



比如,开车在大街上奔驰,被交警叫停了。这个时候,如果你平心静气配合交警的工作,不一定会得到一张罚单。但是如果你趾高气昂说自己的爸爸是谁谁谁、自己和谁谁谁关系好,就算交警认识那个谁谁谁,也会装作不认识,铁面无私地开出一张罚单。再比如,一不小心惹上了什么官司,想私下给法官送礼“运作”一下,一定是会被追究责任的。


其实,在加拿大不需要这么累,有些应该得到的东西不需要“关系”。如果家门口需要一个垃圾桶,给市政府打电话,可能第二天家门前就会出现一个新的垃圾桶。如果邻居深夜大声播放音乐,给警察打个电话,20分钟之内音乐就会消失。如果要去政府部门办材料,不用排长队,不用找人,不用给钱,不用受气,不用走冤枉路,按流程走就行了。


8
藐视法律之人


加拿大法律所涉及面之广之细,让人瞠目结舌。

与店员发生口角,不仅要付出金钱的惩罚,还要受到警告;自行车不带头盔上路,都要接受罚款;甚至在户外与友人举杯欢庆时,都会有警察限制……

国内人看来似乎“大惊小怪”的日常,却是加拿大警察的丝毫不容人情。



有位新移民伸出手想要回月票,不经意间轻轻地碰到了司机的手臂,就是这样的一个小小的举动,不仅引来了警察搜身,更导致了镣铐上身,最终竟然被告上法庭。在加拿大,这就要被当成是刑事案件来处理了,原因仅仅是因为两者发生了身体上的接触,而既然成为了刑事案件,只能请律师来处理相关事务……

淡漠的法律意识,不仅会为自己的移民路制造困难,更会为海外华人族群抹黑。



9
纵情享乐之人


如果,你认为买豪宅、玩名车、交女友……是生活。

其实,在加拿大呼吸清新的空气,亲近自然、陪伴家人、享受自我才是生活。

你要的纸醉金迷、声色犬马……真的不在加拿大!


10
深陷体制之人


如果你是从体制中的骄子,做移民的决定前一定要慎之又慎。"金饭碗"丢了,可不是想找就能找回来的!因为,一切都要从头再来……

加拿大本地失业率持续高企,从就业招聘会人头挤拥可反映现象。欠缺本地工作经验,便难于与别人竞争。

上述10点,你满足几条?

如果都与你无缘,那么加拿大欢迎你。

如果条条都占,那么也恭喜你!省了机票钱,祖国才是你大展宏图的好地方。

Sunday 14 January 2018

sessions asp core

Using Sessions and HttpContext in ASP.NET Core and MVC Core

If you’re new to ASP.NET Core or MVC Core, you’ll find that sessions don’t work the way they used to. Here’s how to get up and running the new way.

Add Session NuGet Package

Add the Microsoft.AspNetCore.Session NuGet package to your project.
VERSION WARNING: As you’ll find with most Microsoft.* packages, you should make sure the versions all match. At RTM time as of writing, this means “1.0.0”.

Update startup.cs

Now that we have the Session nuget package installed, we can add sessions to the ASP.NET Core pipeline.
Open up startup.cs and add the AddSession() and AddDistributedMemoryCache() lines to the ConfigureServices(IServiceCollection services)
// Add MVC services to the services container.
services.AddMvc();
services.AddDistributedMemoryCache(); // Adds a default in-memory implementation of IDistributedCache
services.AddSession();
Next, we’ll tell ASP.NET Core to use a Memory Cache to store the session data. Add the UseSession() call below to the Configure(IApplicationBulider app, ...)
// IMPORTANT: This session call MUST go before UseMvc()
app.UseSession();

// Add MVC to the request pipeline.
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

Where’s the Session variable gone?

Relax it’s still there, just not where you think it is. You can now find the session object by using HttpContext.Session. HttpContext is just the current HttpContext exposed to you by the Controller class.
If you’re not in a controller, you can still access the HttpContext by injecting IHttpContextAccessor.
Let’s go ahead and add sessions to our Home Controller:
using Microsoft.AspNetCore.Http; // Needed for the SetString and GetString extension methods

public class HomeController : Controller
{
    public IActionResult Index()
    { 
        HttpContext.Session.SetString("Test", "Ben Rules!");
        return View();
    }

    public IActionResult About()
    {
        ViewBag.Message = HttpContext.Session.GetString("Test");

        return View();
    }
}
You’ll see the Index() and About() methods making use of the Session object. It’s pretty easy here, just use one of the Set() methods to store your data and one of the Get() methods to retrieve it.
Just for fun, let’s inject the context into a random class:
public class SomeOtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void TestSet()
    {
        _session.SetString("Test", "Ben Rules!");
    }

    public void TestGet()
    {
        var message = _session.GetString("Test");
    }
}
Let’s break this down.
Firstly I’m setting up a private variable to hold the HttpContextAccessor. This is the way you get the HttpContext now.
Next I’m adding a convenience variable as a shortcut directly to the session. Notice the =>? That means we’re using an expression body, aka a shortcut to writing a one liner method that returns something.
Moving to the contructor you can see that I’m injecting the IHttpContextAccessor and assigning it to my private variable. If you’re not sure about this whole dependency injection thing, don’t worry, it’s not hard to get the hang of (especially constructor injection like I’m using here) and it will improve your code by forcing you to write it in a modular way.
But wait a minute, how do I store a complex object?

How do I store a complex object?

I’ve got you covered here too. Here’s a quick JSON storage extension to let you store complex objects nice and simple.
public static class SessionExtensions
{
    public static void SetObjectAsJson(this ISession session, string key, object value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    public static T GetObjectFromJson<T>(this ISession session, string key)
    {
        var value = session.GetString(key);

        return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
    }
}
Now you can store your complex objects like so:
var myComplexObject = new MyClass();
HttpContext.Session.SetObjectAsJson("Test", myComplexObject);
and retrieve them just as easily:
var myComplexObject = HttpContext.Session.GetObjectFromJson<MyClass>("Test");

Use a Redis or SQL Server Cache instead

Instead of using services.AddDistributedMemoryCache() which implements the default in-memory cache, you can use either of the following.
SQL Server
Firstly, install this nuget package:
  • "Microsoft.Extensions.Caching.SqlServer": "1.0.0"
Secondly, add the appropriate code snippet below:
// Microsoft SQL Server implementation of IDistributedCache.
// Note that this would require setting up the session state database.
services.AddSqlServerCache(o =>
{
 o.ConnectionString = "Server=.;Database=ASPNET5SessionState;Trusted_Connection=True;";
 o.SchemaName = "dbo";
 o.TableName = "Sessions";
});
Redis Cache
Unfortunately, the redis package does not support netcoreapp1.0 at the moment. You can still use this if you’re using net451 or higher.
  • "Microsoft.Extensions.Caching.Redis": "1.0.0"

// Redis implementation of IDistributedCache.
// This will override any previously registered IDistributedCache service.
services.AddSingleton<IDistributedCache, RedisCache>();

Stay up to date

Even though we’ve reached RTM, you should still keep an eye on the ASP.NET Session Repository for any changes. Here’s a direct link to the Sample code.