技术实践 2019 小组第十五次活动

大家好,以下是咱们工业大学2019年技术学习小组的第十五次活动记录及培训概要。

活动时间:2019年2月1日 FRI 20:00 – 22:10

本次活动过程中,我们发现了一些严重的问题。

  1. 极少有人完成作业,即便作业如此简单
  2. 为了充分顾及新加入的同学,我们讲解的内容在老同学看来,越来越慢,越来越初级,有退化感
  3. “你不知道你不知道的事情”
  4. 大家的主动性不高,自主学习度整体很低
  5. 由于我们每周只有一次两小时的活动,讲解的内容会直接影响下一次的内容,一但缺席很难再跟上

我觉得这主要是咱们活动的组织问题。这是我们这项技术实践活动的第三轮讲解,而每一轮讲解的过程中,都会有更多的新同学加入我们,作为讲师,我无法在一节课同时去适应不同学习阶段的同学,这直接导致了内容越来越初级,越来越退化,但新同学依然觉得讲的很难、讲的太快、听不懂,而老同学必然觉得技术内容重复、初级,无法获得技术成长感。于是,所有人都在失去兴趣,很多人变成看客,而我们的活动也越来越失去意义。

回想从去年3月到今天的这些活动,我最开始的初衷就是希望能够让我们高年级的实验室同学对当下常见的基本技术有一个认识,能够完成一个最基础应用程序的开发,不至于毕业就失业,也不至于实验室的发展停滞。而在这以后大家可以自行组织这类活动,不断地帮助低年级的同学发展,在帮助别人学习技术的同时,也能够锻炼你们自己。

#

在第一轮学习的过程中(共25次,从2018年3月27日至8月20日),我们的活动频度很高,每次讲的内容很基础,同时,由于人数较少(10人以内),大家的积极度也很高,每次课后的小作业大家也能够很好的完成,总体效果很好。

在这一轮活动中,我们学习了 C# 的基础语法,OOP,计算机基础常识,HTML、CSS、JavaScript 和 jQuery 的基本知识,Ajax、Form 表单的使用,MongoDB 及 Squirrel Framework 的使用,ASP.NET MVC 的使用,SVN 的使用,百度地图的应用,我们还尝试编写了一个非常简单的管理站点,并尝试为自己编写个人简历。

#

而在第二轮学习的过程中(共13次,从2018年10月21日至12月10日),我们有更多的大二同学加入,人数逐渐增加(20人左右),有些新来的同学基础薄弱,我们针对许多基础内容进行了重新的讲解,这也导致我们的课程进度缓慢,第一轮就加入咱们活动的老同学积极性和主动性降低,而新同学又需要较多的时间去激发其活跃度。最终,第二轮活动的效果相比第一轮有了很大的降低。

在这一轮活动中,我们快速学习了 C# 的基础语法,面向对象的程序设计思想,MongoDB 及 Squirrel Framework 的使用,SVN、Git/GitHub 的使用,以及我们这一阶段的重头戏 —— WinForm 程序的开发,HTTP 协议,三层架构以及 关于云的基础常识。

我们尝试在第二轮的学习过程中进行分组,每个小组设定一个 Team Lead,负责检查大家的作业完成情况和学习进度,也负责给大家答疑解惑,并帮助大家把不能解决的问题汇总到我这里。但实际上,这个模型也并不顺利,我们的 Lead 并没有真正去坚持管理,而我们许多同学也不去遵循这套规则。当大家都不遵守游戏规则的时候,这个游戏也就无法继续了。

#

现在,咱们第三轮活动刚刚开始,是时候做出新的尝试了。为了解决上述提及的 5 个问题,从现在起,我们取消原有的 Team Lead 形式,改为按照课程主题将大家进行分组,每一组设定 1 – 2 个讲师,由这些讲师为大家讲解对应主题的基础内容。

担任讲师的同学每周负责组织 3 – 4 次技术活动,我会旁听解答疑问。每周末则由我为大家带来一次拓展内容的讲解,大家都可以参加。

现在需要大家:
1. 请所有同学积极推荐身边的同学加入我们的活动,让各位讲师准备的内容可以被更多人共享。
2. 讲师们请尽早准备学习计划和课程安排,并给我做 Review。

具体活动的计划与安排,请参见这里

#

通过这些活动,非常希望已经参加过几轮活动的老同学,能够回想一下,我们的活动是否真正提升了你个人对于技术的兴趣,是否可以在一年后的今天,让你自己的那份个人简历变得更加丰富?还有几个月的时间,大三的同学就要真正面对人生的第一个挑战了,你需要在暑假开始出发去北上广深,开始你的面试、实习之旅,这也是你职业生涯的正式开端。你是否做好了充足的准备?你们还面临一个关乎责任的任务,如何继续传承我们的这项活动?如何在你们离校前,尽自己所能更好地组织、培养低年级同学,同时也更好地锻炼自己的表达能力?

对于我们大二的同学,你是否已经相比前几届的同学有了一些改变呢?我们的基础认知是否已经足够,我们希望主动学习技术的动力是否被激发?我们是否希望去改变自己,影响身边?

而咱们大一的同学 —— 00 后们,你是否意识到了自身的优势?你是否看见了前人所走过的弯路,你是否能更明智一些,不再重蹈覆辙?让你有限的精力完成更多、更有益于自身的事情?

一切只关乎于时间,请记住,事情是会悄悄膨胀的,直到它占用了所有的可用时间(Parkinson 定律)。所以,请你珍惜当下,在人生最美好的四年,高效地学习,充实地娱乐。

Continue reading

技术实践 2019 小组第十三次活动

大家好,以下是咱们工业大学2019年技术学习小组的第十三次活动记录及培训概要。

活动时间:2019年1月19日 SAT 15:00 – 17:30

距离上次阶段性活动的结束已经过去一月有余,这次我们有许多新的同学加入,有些是我们00后的大一同学,非常欢迎大家,希望我们可以一同学习,共同进步。

Continue reading

Squirrel Framework 查询入门 (1)

从 Squirrel Framework 1.0.15 起,我们拥有了 4 种 MongoDB / Cosmos DB 的查询形式,分别是 定制封装、Linq、Lambda 及 Mongo Database Object Command。今天我们通过一个最简单的例子,来介绍一下最常规的查询模式,体验 MongoDB 可以给我们带来的便捷。

如何获取并使用?


正式开始

假设我们在 MongoDB 或者 Microsoft Azure Cosmos DB 中有一个 TestDatabase,其中的 UserCollection 表中拥有许多的用户信息,我们希望得到:

在按照年龄从大到小排序的情况下,选取前三名,18 到 27 岁的老姑娘,并且英文名字中必须带字母 “h”。

啧啧。同时,由于我们每个 User 对象的数据都非常大,出于存储成本及数据传递成本的考虑,我只希望得到她们的中文名和联系电话。

如果我们在常规的 SQL 数据库中进行查询,只需编写如下 SQL 语句。


SELECT TOP 3 
  ChineseName AS Girl,
  MobilePhone AS Tel
FROM
  UserCollection
WHERE
  EnglishName LIKE "%h%"
  AND Gender = 1
  AND Age > 17
  AND Age < 28
ORDER BY
  Age DESC

那么对于 NoSQL 类型的 MongoDB 数据库,我们又该如何基于 Squirrel Framework 进行查询呢?这次我们以 1.0.15 版本最新的 Linq 方式进行查询。


        private dynamic LinqQuery()
        {
            var userCollection = this.userRepository.AsQueryable();
            var regex = new Regex("h", RegexOptions.IgnoreCase);

            var query = from u in userCollection
                        where regex.IsMatch(u.Name)
                                && u.Gender == false
                                && u.Age > 17
                                && u.Age < 28
                        orderby u.Age descending
                        select new { Girl = u.ChineseName, Tel = u.MobilePhone };

            return query.Take(3).ToList();
        }

        // Get the result
        var json = JsonHelper.Serialize(this.LinqQuery());


版本说明

JavaScript: HTML 字符串折叠 (Html String Ellipsis)

2018 年马上就要过去了,这一年真的经历了太多,本应该按惯例写写年终总结的,不过最近真的太忙了,总有些事情是更优先的,又赶上今天有人需要帮忙,索性就把解决这个小问题的代码讲一讲,全当作是对 2018 年的一个告别吧。

其实很久以前,在某个项目中也遇到过这个问题,我们在一个前端 Table (Grid) 中,希望显示出一个包含了 HTML 样式的富文本内容列,但是其内容很长,我们希望可以按照一个指定的字数进行截取(需要继续保留富文本的样式),并将字符串的剩余部分显示为 …

我们知道,通过 CSS ellipsis 也能设置 … 样式,但是这只能按照外围容器的 width 进行设定,无法按照字数进行处理。所以,为了庆祝新年,我们自己动手写一个吧!

Continue reading

如何将 .NET DateTime 转换为 JavaScript Date – 形如:\/Date(1539953962642)\/

前言

在使用 ASP.NET MVC 开发 Web 程序时,对于 DateTime 类型的数据在 JSON 结果中,以类似于 “\/Date(1539953962642)\/” 的形式进行返回,那么这里中格式叫做什么呢?其中的数字的意义如何?

实际上这种数据格式叫做 Microsoft’s built-in JSON Date format,这不是任何一个通用规范的一部分,它是微软定义的一种格式。并且这里的数字并不是 .NET DateTime 的 Ticks!实际上这个值就是 TimeInMillis!


Ticks 和 TimeInMillis 有什么区别?

Ticks 一般是指从 0001-01-01 00:00:00.000 到现在的百纳秒计数,这个计数单位是 100 nanosecond(long 类型存储),.NET 平台使用 Ticks 方式记录时间(比如 [C#] DateTime.UtcNow.Ticks)。

TimeInMillis 一般是指从 1970-01-01 00:00:00.000 到现在的毫秒数,这个单位是 1 millisecond(long 类型存储),Java 和 JavaScript 使用 TimeInMillis 方式记录时间(比如 [JavaScript] Date.now())

所以,我们只需要通过正则表达式提取这个 Microsoft’s built-in JSON Date format 的值,直接应用于 JavaScript 即可。
Continue reading

.NET Standard / Core 项目发布 NuGet 包并使包中的配置文件自动生成到 Bin 下

之前在如何创建 NuGet 包的文章中,曾经提到如何将配置文件(文件夹)包含到 NuGet 包中,并在用户安装了这个 NuGet 包并 build 自己工程后,自动将 Config 文件夹复制到 Bin 下。但是当时我并没有找到 .NET Standard 或 .NET Core 项目的配置方法,因此 Squirrel Framework 只能选择通过 .NET Framework 4.6.2 项目形式生成 NuGet 包(.NET Framework 下 NuGet 的配置方式请查看这篇文章《如何在 NuGet 发布自己的类库包》)。

不过最近有时间,通过半天的尝试终于将 4.6.2 的工程切换到 .NET Standard,这次的关键点在于不必自己去写 .nuspec 配置文件之后通过 dotnet pack 命令进行 build,而是改为直接通过编辑项目文件(.csproj)并通过 Visual Studio 在每次 build 时,自动完成 NuGet 包的生成。具体配置步骤如下:

Continue reading