【太阁x周刊】第十一期——纽约区线下活动预告、技术讨论群热点话题、Scala中的Typeclass模式实例、人气文章回顾



  • 前言

    0_1469575719803_周1101.png

    太阁x是基于太阁实验室(Bittiger.io)的程序员学习社群。我们在太阁x中践行生长学习法。藏宝阁提供丰富的学习资源。我们根据目标,筛选藏宝阁内的知识及技能,形成以问题为导向的逻辑树。接着我们通过互相讲解决问题,查漏补缺,相互促进。最后我们通过总结悟,提纲挈领,并把优质的内容输出到藏宝阁里,以此循环。

    在太阁x里,生长学习法的闭环无处不在,指引着程序员进阶之路。

    线下活动预告
    6/29 线下活动: 求职专场
    活动内容:
    于6月29日(本周三),BitTiger将携手燎原、Hired.com齐聚NYC,向各位程序猿/媛小伙伴带来主题为“Resume & Interviewing Workshop”的线下活动,想获得与导师一对一交流的机会吗?
    详情请点击:
    【太阁x燎原】| 导师与你面对面——简历、面试技巧更上一层楼

    6/29 线下活动: 娱乐专场
    活动内容:
    于7月2日(本周日),太阁x纽约与麓山书社将带领大家一起前往中央公园大草坪,朋友之间一起野餐、桌游、以及多种户外小游戏。当程序员遇上书友,科技与文化的碰撞,总有一个对你胃口~别宅啦!快来一起享受夏日的热情吧!
    详情请点击:
    【太阁x纽约】7月2日春末初夏野餐计划

    技术讨论群动态
    负责人: 凡齐
    总结: 小丸子 Jesse

    本周VR/AR群讨论热点:
    ● Oculus属于VR还是AR:部分人认为Oculus属于VR,部分人提出Oculus也可以是AR,安装摄像头把面前的景象拍下,与人工部分内容合成,或者knect。但是这和真正的AR还是不一样,因为AR是要能够看到真实世界景象的同时附上虚拟部分。

    ● Hololens:群里有些许小伙伴亲身体验了一下Hololens, air tap感觉需要适应一下,但是趣味十足。尤其是和VR比起来, 前者不受空间限制,行动更加自由,而且音响效果出色。之前也试过Vive和Oculus Rift,完全immersive的感觉也很棒。Oculus Rift可以连接Leap Motion,因此能达到一定的AR效果。这样一来就相当于安装了摄像头可以看到周围的环境,其中最神奇的是通过它能看到自己两只手的骨骼 (Leap Motion读的是手,骨骼只是效果)。

    ● Leap Motion:version2的精准度和敏感度比version1高,但仍有进步空间。Leap提供了自己的library,抓、点、摇手之类手势的都已经编写好了,当然自己也可以加入自定义手势。由于红外线不能穿透手所以很难判定看不到的手指的变化。很多时候你觉得不准是因为姿势不对,手指被挡住了,外红线导致motion capture捕捉不到是一直存在的问题。

    ● 独眼人士没法用VR? :目前的VR设备基本上供用于两只眼睛。

    ● 能否track眼睛聚焦?:目前好像只有一家VR的startup, 在日本据说可以做eye tracking; 但市面上的做的都是焦距可调(“track眼睛聚焦”是指跟踪视线的看到哪儿。“手动调节”是指调节近视和远视。)

    ● Unity的code:论点在于其风格和IOS 开发的code很相似。群主说是非常像xcode,但是没有xcode写起来快。两者思路是一样的,都是为了简化,xcode是为了强制少占用手机内存和电量所以有delegate,unity是为了减少fps,这些思路都是硬件限制的。

    ● VR游戏会让人感到不适?:有人提出一些直接移植的游戏会产生非常强烈的 motion sickness,那种眩晕感我认为是由于眼睛认为身体在移动,但是身体并没有感到移动,出现了不一致的问题。所以VR游戏设计必须考虑这点,现在比较舒服的都是不用玩家动,利用第三人称视角进行操作的游戏。

    ● 有没有把VR用于写代码的?:有人在VR里的可视化编程体验过,比较直观,但是感觉空间不够大。其实可视化编程是很多软件都在做的事情,建筑学领域内前几年有一个名为grasshopper的软件火了一下就是因为是图形编程,unreal里面也同样如此,就像插积木一样,音乐领域也有好多,就是一个一个的合成器,或者效果器。

    ● 关于Loading 3d models, such as obj files的建议:模型可以转成纯text的,只要加一个texture图片就行。写ios的app试过,网上有专门的程序做这一步,就是把所有vertex的信息转成点,展开,再贴一个texture map。

    本周Java Spring Web群讨论热点:

    1. 比较Mybatis, hibernate, Spring Data:
      ●mybatis是ibatis第二代,比hibernate轻量,可以在mapper中定制sql,好优化控制,适合需求变动大的一般互联网项目。阿里使用spring + mybatis。
      ●hibernate适合企业项目,自动化程度高,支持缓存,两级缓存不好调,不适合新人。hibernate这种比较成熟复杂的东西负面评价多是肯定的,因为用的多。轻而小的东西用的人就少,不代表没有坑只是没踩出来。
      ●有人认为大多数人还没用过spring data。
      ●mybatis debug,log level降成trace拿到带参数的query。hibernate有个参数show sql用log4j直接打印。

    2. 初创公司很少用Java:
      ●开发效率低,重(举例,学习打war包很久,war更新需要重启tomcat,互联网灰度发布),不适合需求长改,java需要编译,部署才能发布,适合长期复杂的业务逻辑。nodejs即写即生效,php可以上线,还有python。
      ●java优点:强类型,编译语言,容易debug。java社区有活力,稳定长久。前端太疯狂,换代太快。

    3. Build Tools:
      ●ant第一代(神难用),maven,gradle第二代。以前觉得微软包管理是弱点,现在发现nuget不错。
      ●关于maven:maven上手难;maven神器,直接贴pom就能用了;maven配置挺高;每次去查最新版本号没人吐槽么?
      ●关于gradle:gradle也比较推荐,在spring 网站上有gradle的案例; gradle与maven差不多,但是感觉gradle搞复杂了,用不着动态功能。

    4. Spring Framework:
      ●可以从4.0或者4.2学起,3.x也没问题,注意不要用xml config了。
      ●spring用途:spring MVC和spring Security肯定只是做web, 但是IOC的用处还是比较广的。
      ●spring严格来说是一堆框架的集合,比如spring security,其实是买的别人家的然后自己拿来改的。
      ●MVC: ORM表映射对象,DAO数据库对话。

    5. 前端和后端分界线在哪?
      只要是data-driven就是后端, after login, data-binding 还算前端。只要是浏览器处理的就是前端,服务器处理的就是后端。比如模板引擎:虽然是打印html,但是它是服务器输出的,所以与其说它是看html,实则应该是后端。不仅仅是浏览器,在日常生活中,用户可以看到的就是前端(可以是电冰箱,洗衣机,手机…),或者说server之前的都是前端。而如今观念越来越模糊,主要原因在我看来是技术栈。现在前端也有前端的 MVC 结构。以前粗俗的说 java就是后端 js就是前端,现在js已经进军后端了。

    本周Full Stack群讨论热点:
    ●请问大家有没有什么学习理解session,local storage,cookie,authentication的资源?
    session和cookie我觉得跟编程本身没什么紧密关系。不过要学的话可以看看jsp/servlet,有几章专门介绍了以上概念,其中包括了怎样用文件系统写cookie,不过是java web的。如果只是想理解,网上查查文章就够了。(嘘,跟前台的人提jsp会被当成古董的。但是我还是想说。不管怎样,模板引擎有时候真的很好用。)

    现在的项目用JQ,不用模板引擎我就得拿到ajax response之后把数据打包成DOM然后插到节点里去。用模板引擎后端直接打印网页出来,而且可以通过java传出来的一些flag各种动态改界面。

    ●讨论rest soap——Spring MVC是不是直接返回html?
    View层可以是html也可以是别的。现在基本都是serve REST response用ResponseBody来返回一个AjaxResponse。这个wsdl就是那个xml啦,现在一般都有现成的soap client来consume可以理解这个就是api的documentation。如果要是工作需要可以学习下soap,不然的话个人感觉并没有太大必要, Soap is more secure。

    博客小组动态
    Scala中的Typeclass模式实例
    作者:DY
    Typeclasses,(或者 type classes) 模式源自Haskell, 但是在Scala语言中得到了广泛应用并发扬光大。

    What is a type class and why do we need it ?
    Type classes are useful to solve several fundamental challenges in software engineering and programming languages. In particular type classes support retroactive extension: the ability to extend existing software modules with new functionality without needing to touch or re-compile the original source. [1]

    在Scala 包中已经包含了几个由typeclasses实现的包,这包括scala.math.Numeric 跟 scala.math.Ordering。 但是在ScalaZ的中,所有的library都是基于typeclasses实现的。
    Scala中使用traits和 implicits 可以实现typeclasses模式。 与Haskell相比,Scala中typeclasses的实现虽然繁琐一些,但同时也带来了极大的灵活性。在Haskell中只允许单一typeclasses实例化的全局创建,然而在Scala中几乎可以不束缚于创建数量的限制。
    此外,在Scala中如果在上下文中找不到合适的typeclasses的实现,也可以指定默认的实现。我们通过下文的例子来看下Scala中如何实现typeclasses的模式。

    Show me the Code!

    首先我们来定义一个叫Transformer的单例对象,并且给这个Transformer类添加一个T => R的方法叫transform。

    0_1469575766399_周1102.png

    其次,我们要实现下transform的具体方法, 例如我们想完成一个从Int => String的转换, 这时我们可以通过implicit关键字来定义隐身转换的方法。

    0_1469575777487_周1103.png

    如果你仅仅认为typeclasses模式只能做单一类型的转换那就错了, 我们同样可以做容器类型的转换。举个例子,还是根据上文给的例子我们想做List[T] => String的转换, 为了做这个容器List[T] 到String的转换, 我们还需要一个从T => String的转换。同样,我们可以通过定义我们的隐式转换来实现:

    0_1469575796124_周1104.png

    如何理解上文中的代码呢? 首先我们用implicit定义了一个隐式转换的方法叫ListToStringTransformer[T],同时,作为传入参数tToString, 也需要定义一个隐式转换类型Transformer[T, String]。 这样做的好处就是,你的参数可以不用显示的指明来传入,Scala的compiler会去自动搜索你的上下文找到相对应的这个类型的参数。 最后,我们在ListToStringTransformer中需要具体的实例化我们传入的的Tranformer类,并复写transform方法。
    接下来,我们要使用下我们之前定义的Transform typeclasses。我们可以通过定义一个Transform trait来实现。trait的命名完全等同于我们之前定义的typeclasses Transform。

    0_1469575836100_周1105.png

    上图中的trait的transform方法中,有两个传入参数, 第一个传入参数为t,其类型为T。 可以显示的声明传入; 第二个传入参数是被implicit修饰的transformer,其类型为Transformer[T,R],而这个transformer参数被隐式传入。 当这个方法被调用时, Scala的编译器会根据你第一个传入的数据类型为T的t,结合从上下文找到相应类型为T的transformer来调用, 也就是用来调用相应的transformer.transform(t)方法。

    最后我们来调用下我们定义的typeclasses, 通过以下示例:

    0_1469575853807_周1106.png

    从Boolean => String的转换,

    0_1469575877430_周1107.png

    总结:
    我们在定义typeclasses的时候要注意到3部分:
    ●首先定义type class本身, 是个generic的trait.
    ●我们需要实例化我们想要实现的具体类型
    ●我们同时也要定义一个或多个的接口方法来实现(这里的接口方法可以定义到object中)

    参考:
    “Type Classes as Objects and Implicits”; Bruno C. d. S. Oliveira, Adriaan Moors, Martin Odersky

    人气文章回顾
    ●那些年不容错过的硅谷IT公司(一)
    ●那些年不容错过的硅谷IT公司(二)
    ●那些年不容错过的硅谷IT公司(三)
    ●那些年不容错过的硅谷IT公司(四)
    ●搜索引擎原理扫盲
    ●论MongoDB和MySQL的区别

    太阁x小组动态播报
    负责人:Jerry Yang、EK 、凡齐

    ● 【太阁x微项目】动态更新

    ●"热辣七月"
    火热报名中:下周报名截止,想要参加项目的同学请抓紧时间报名!
    详情请参考:
    http://www.bittiger.io/blog/post/zxDfcW7fYW2sNcEjH

    ●"残酷六月"
    小组最新进展,请关注我们每周动态博客:
    http://www.bittiger.io/blog/post/yzgkTQJR8zdY23rmu

    ●"Kaggle(F7)"
    六月份太阁kaggle项目在报名结束之后,甄选出了20位成员,并按照项目意愿分为了5个项目小组。目前Haiyang Qi小组已经讨论完大体想法,并纂写了初步的Code,进行了第一次提交答案测试。接下来的任务是讨论具体调参和Feature修正,使结果更好。Keran Chen小组的项目也已经开始啦!小组成员们准备用卷积神经网络,目前正在处理数据阶段。他们也正在考虑怎么样把数据处理到可以直接用keras,总体来说进展顺利。Qiu Zezhen小组的项目同样在积极准备之中。

    太阁极客榜
    负责人:文哲

    太阁极客榜本周风云人物隆重揭榜 —— aaronice!

    0_1469575887038_周1108.png

    aaronice是太阁GitHub社区的领军人物,曾带领完成我们的明星项目美食爬虫Pikachu。目前aarronice在洛杉矶地区从事JavaScript全栈开发,对Node.js造诣颇深。

    如果对aaronice的项目感兴趣,可以到Ta的GitHub去follow,或者为Ta的项目点个赞哦~

    aarronice的GitHub: https://github.com/aaronice
    太阁极客榜: https://bittiger-ranking.firebaseapp.com0_1469575892949_周1109.png

    本期小编:大白柱、mimi

    更多详情,欢迎登陆BitTiger官网
    或关注官方微信公众号“论码农的自我修养”:bit_tiger
    0_1469576063843_bittiger qr code.jpg


登录后回复
 

与 BitTiger Community 的连接断开,我们正在尝试重连,请耐心等待