异步社区传送门,有勘误,目前只有 3 条,希望在第二次印刷前有更多的反馈。
简单陈述一下个人的翻译经历:
另外,何品大哥在翻译本书之前,参与过龙腾世纪和质量效应 2 的游戏汉化,翻译过《 Netty 实战》,目前由何品参与翻译的《反应式设计模式》也快要上市了。
source: http://www.texmacs.org/tmweb/about/philosophy.en.html
TeXmacs 的主要目标之一是通过显著地降低创造高质量用户接口的成本,促进那些与科学相关的自由软件的开发。如果你计划为 TeXmacs 与某个软件写插件,请联系我们。
作为一个数学家,从科学的角度上讲,我坚信只有自由软件可被接受。两个主要理由如下:
然而,当前主流的数学软件大多是专有的。这很奇怪,且是一种耻辱。这种现象的根源在于数学家们往往不认为编程是一种完全的科学活动。结果,实用软件的开发被委托给了“工程师们”因而数学家们只能像黑盒一样使用这些程序。
这种对科学活动的细分是非常武断的:从科学的角度认知黑盒中所有为何物往往十分重要。反过来讲,科学上深邃的理解往往能够诞生更加精良的软件。所以我认为科学家们应当将软件开发视为完全的科学活动,如同撰写文章。自然而然,这种软件的发布方式和科学的传播应当兼容,即:公众可及、可复制和自由使用。
<del>成为 Apache XYZ 项目 PMC Member,迎娶白富美,走上人生巅峰</del>
这个公众号主要关注反应式编程,包括 Netty、Akka、Spark、Scala 等话题,刚刚开始建设,欢迎大家关注。
为了不给何品大哥拖后腿,终于在这个月给 Apache Spark 和 Scala 项目贡献了若干个 PR。今晚发布的 Scala 2.12.7 就有鄙人的一点点微小的贡献,欢迎大家尝试。
恭喜 @xcjx @chocolatesir @lnomve @funky @wenning @magicsilence 中奖。请告诉我你们的联系方式。我的邮箱 MyV2EXNickname AT zoho.com 。完整的抽奖代码:
import $ivy.`com.lihaoyi::requests:0.1.4`
import $ivy.`org.json4s::json4s-jackson:3.5.2`
import org.json4s.jackson.JsonMethods.parse
import org.json4s._
import org.json4s.JsonDSL._
import scala.util.Random
// 一些常量
val url = "https://www.v2ex.com/api/replies/show.json?topic_id=493356"
val numberOfWinners = 6
// 从 V2EX 获取数据
val source = requests.get(url)
// 解析 JSON,获取所有参与抽奖的用户
implicit val formats = DefaultFormats
val json = parse(source.text)
case class Profile(username: String, github: String)
case class Member(member: Profile)
val members = json.extract[List[Member]].map(_.member.username).distinct
// 抽奖
Random.shuffle(members).take(numberOfWinners)
参考了这个 Python 版本的代码 mytest.py 。最后手动检查一下大家的 profile 是否符合要求。
import random
import requests
url = 'https://www.v2ex.com/api/replies/show.json?topic_id=490659'
# 中奖人数
numberOfWinners = 4
if __name__ == '__main__':
source = requests.get(url)
names_list = []
for item in source.json():
username = str(item['member']['username'])
names_list.append(str(item['member']['username']))
# print("list length: " + str(len(names_list)))
names_set = set(names_list)
totalMembersCount = len(names_set)
print("本次参与活动人数为:{}".format(totalMembersCount))
print("-" * 20)
for name in names_set:
print(name)
print("-" * 20)
luckyMembers = random.sample(list(names_set), numberOfWinners)
print("恭喜中奖用户:" + str(luckyMembers))
大家可以对比感受一下 Scala 和 Python 的一些异同点。
401
zy8595208 2018-09-29 23:11:10 +08:00 via Android
分母+ 1
|
402
UnixCRoot 2018-09-30 01:33:20 +08:00 via Android
来了解一下 scala 语言
|
403
QK8wAUi0yXBY1pT7 2018-09-30 01:35:24 +08:00
了解一下,分母++
|
404
goodspb 2018-09-30 01:41:57 +08:00 via iPhone
谢谢老板
|
405
36211 2018-09-30 03:37:44 +08:00 via Android
顶
|
406
nutting 2018-09-30 06:17:39 +08:00 via Android
希望能中
|
407
SYsensei 2018-09-30 09:00:32 +08:00
支持
|
408
alphadog619 2018-09-30 09:06:29 +08:00
哎,希望能中
|
409
Tiakon 2018-09-30 09:29:39 +08:00
希望能中
|
410
Tiakon 2018-09-30 09:31:21 +08:00
正在从事 scala 的开发中,能中感激不尽:)
|
411
Tiakon 2018-09-30 09:32:10 +08:00
楼主,你的二维码过期了...
|
412
WesleyWong 2018-09-30 09:41:00 +08:00
公司马上要建大数据平台, 现在正在调研 Spark 生态圈.
|
413
bogun 2018-09-30 09:46:55 +08:00
幸运之神,砸我吧
|
414
470326964 2018-09-30 09:48:11 +08:00
来了解一下 scala 语言
|
415
470326964 2018-09-30 09:48:17 +08:00
来了解一下 scala 语言 1
|
416
cangshui 2018-09-30 09:49:04 +08:00 via Android
拉低中奖率
|
417
LuckCode 2018-09-30 12:52:37 +08:00 via iPhone
来一手来一手
|
418
DonaldY 2018-09-30 13:20:28 +08:00
拉低
|
419
blindmt 2018-09-30 14:45:56 +08:00
分母++
|
420
yorec 2018-09-30 14:46:14 +08:00
分母++,希望能中
|
421
wangfeng 2018-09-30 14:52:30 +08:00
谢谢老板
|
422
wangfeng3769 2018-09-30 15:08:16 +08:00 via Android
我来组成头部
|
423
xxmen 2018-09-30 15:13:21 +08:00
做分母,scala 了解一下
|
424
caotian 2018-09-30 15:15:20 +08:00
不错不错, 欢迎多翻译这类的图书
|
425
eryuan 2018-09-30 15:43:46 +08:00
++
|
426
hwsdien 2018-09-30 16:09:16 +08:00
++
|
427
27 2018-09-30 17:13:30 +08:00
正好在看何品的 Netty 书,一看觉得名字有点眼熟,来抽个奖
|
428
dyllanwli 2018-09-30 17:14:51 +08:00
加油
|
429
oftoo 2018-09-30 17:19:01 +08:00
国庆节快乐~
|
430
gmx1234 2018-09-30 17:54:42 +08:00
我是来拉低中奖率的
|
431
zhyzhy 2018-09-30 20:22:11 +08:00
国庆节快乐~ +1
|
432
zacharyjia 2018-09-30 20:23:58 +08:00
来来来拉低中奖率,说不定国庆节可以有本书看
|
433
HashStr 2018-09-30 23:05:43 +08:00
前不久听朋友介绍了 Scala,想入坑
|
434
v2yllhwa 2018-10-01 13:09:09 +08:00 via Android
了解一下 scala
|
435
470326964 2018-10-01 13:38:11 +08:00
来来来拉低中奖率,说不定国庆节可以有本书
|
436
hepin1989 2018-10-01 15:17:32 +08:00
大家好哦,沈达在旅游,我们国庆收假了第二天抽奖吧。
我也在加班搞双十一。。。稳定性 ~~ |
437
duanlian 2018-10-01 20:12:52 +08:00
概率概率低
|
438
area346 2018-10-02 08:54:08 +08:00
想学习下…一直无从下手
|
439
lionseun 2018-10-02 15:15:45 +08:00 via Android
还有机会吗?
|
440
470326964 2018-10-08 10:50:54 +08:00
还有机会吗?
|
441
sadhen OP 直播抽奖,首先参照一下之前 Flask 上面现有的 Python 代码在 Ammonite 中探索一下
``` @ repl.history.foreach(println) import $ivy.`com.lihaoyi::requests:0.1.4` import $ivy.`org.json4s::json4s-jackson:3.5.2` val url = 'https://www.v2ex.com/api/replies/show.json?topic_id=490659' val url = "https://www.v2ex.com/api/replies/show.json?topic_id=490659" val numberOfWinners = 4 val source = requests.get(url) import org.json4s.jackson.JsonMethods.parse val json = parse(source.contents) val json = parse(source.text) json \\ "username" json \ "username" json \\ "username" (json \\ "username").extract[List[String]] import org.json4s._ import org.json4s.JsonDSL._ implicit val formats = DefaultFormats (json \\ "username").extract[List[String]] (json \\ "username").extract[List[(String, JString)]] (json \\ "username") (json \\ "username")head (json \\ "username").head json (json \\ "username").head (json \\ "username") (json \\ "username").extract[List[JValue]] (json \\ "username").extract[List] (json \\ "username") json (json \\ "username") (json \\ "username") \ "username" json json.head json case class Profile(username: String, github: String) case class Member(member: Profile) json.extract[List[Member]] json.extract[List[Member]].map(_.member.name).distinct json.extract[List[Member]].map(_.member.username).distinct json.extract[List[Member]].map(_.member.username).distinct val members = json.extract[List[Member]].map(_.member.username).distinct import scala.util.Random Random.shuffle(members) Random.shuffle(members) Random.shuffle(members).take(numberOfWinners ) help :help help repl.help repl.history repl.history.head repl.history.foreach(println) repl.history.foreach(println) ``` |
442
sadhen OP 正式抽奖完整过程
➜ ~ amm Loading... Welcome to the Ammonite Repl 1.2.1 (Scala 2.12.6 Java 1.8.0_172) If you like Ammonite, please support our development at www.patreon.com/lihaoyi @ import $ivy.`com.lihaoyi::requests:0.1.4` import $ivy.$ @ import $ivy.`org.json4s::json4s-jackson:3.5.2` import $ivy.$ @ val url = "https://www.v2ex.com/api/replies/show.json?topic_id=493356" url: String = "https://www.v2ex.com/api/replies/show.json?topic_id=493356" @ val numberOfWinners = 6 numberOfWinners: Int = 6 @ val source = requests.get(url) source: requests.Response = Response( "https://www.v2ex.com/api/replies/show.json?topic_id=493356", 200, "OK", Map( "etag" -> Buffer("W/\"02f2dce98bcae83800ccd1568488d6f583c9d72d\""), "server" -> Buffer("Galaxy/3.9.8.1"), "x-rate-limit-reset" -> Buffer("1539086400"), "cache-control" -> Buffer("max-age=3600"), "google" -> Buffer("XY"), "date" -> Buffer("Tue, 09 Oct 2018 11:41:36 GMT"), "x-rate-limit-limit" -> Buffer("120"), "x-rate-limit-remaining" -> Buffer("118"), "content-type" -> Buffer("application/json;charset=UTF-8"), "transfer-encoding" -> Buffer("chunked"), "connection" -> Buffer("keep-alive"), "x-frame-options" -> Buffer("SAMEORIGIN"), "vary" -> Buffer("Accept-Encoding"), "strict-transport-security" -> Buffer("max-age=31536000"), "content-encoding" -> Buffer("gzip") ... @ import org.json4s.jackson.JsonMethods.parse import org.json4s.jackson.JsonMethods.parse @ val json = parse(source.text) json: org.json4s.package.JValue = JArray( List( JObject( List( ( "member", JObject( List( ("username", JString("cye3s")), ("website", JString("")), ("github", JString("")), ("psn", JString("")), ("avatar_normal", JString("//cdn.v2ex.com/gravatar/041a96d84145b357e82a6e44628125f9?s=24&d=retro")), ("bio", JString("")), ("url", JString("https://www.v2ex.com/u/cye3s")), ("tagline", JString("")), ("twitter", JString("")), ("created", JInt(1409614320)), ("avatar_large", JString("//cdn.v2ex.com/gravatar/041a96d84145b357e82a6e44628125f9?s=24&d=retro")), ("avatar_mini", JString("//cdn.v2ex.com/gravatar/041a96d84145b357e82a6e44628125f9?s=24&d=retro")), ... @ case class Profile(username: String, github: String) defined class Profile @ case class Member(member: Profile) defined class Member @ val members = json.extract[List[Member]].map(_.member.username).distinct cmd9.sc:1: No org.json4s.Formats found. Try to bring an instance of org.json4s.Formats in scope or use the org.json4s.DefaultFormats. val members = json.extract[List[Member]].map(_.member.username).distinct ^ Compilation Failed @ implicit val formats = DefaultFormats cmd9.sc:1: not found: value DefaultFormats implicit val formats = DefaultFormats ^ Compilation Failed @ import org.json4s._ import org.json4s._ @ import org.json4s.JsonDSL._ import org.json4s.JsonDSL._ @ implicit val formats = DefaultFormats formats: DefaultFormats.type = org.json4s.DefaultFormats$@58647985 @ val members = json.extract[List[Member]].map(_.member.username).distinct members: List[String] = List( "cye3s", "CoderHugo", "zsh1995", "densuc", "sadhen", "hepin1989", "isnowify", "chenpipguge", "yorksonchang", "WeberXie", "0vels", "duoweimi222", "linghutf", "nakedou", "zhijiansha", "Applenice", "vecZro", "billlee", "someonedeng", ... @ import scala.util.Random import scala.util.Random @ Random.shuffle(members).take(numberOfWinners ) res14: List[String] = List("xcjx", "chocolatesir", "lnomve", "funky", "wenning", "magicsilence") 很幸运,只在 REPL 里面粘贴错两次 |
443
sadhen OP 恭喜 @xcjx @chocolatesir @lnomve @funky @wenning @magicsilence 中奖。请告诉我你们的联系方式。我的邮箱 MyV2EXNickname AT zoho.com 。
第二个附言写崩了 :( |
444
chocolatesir 2018-10-09 20:31:02 +08:00 via Android
@sadhen 看来我的好运气都花在 v2 抽奖上了😂请问楼主邮箱前缀是 MyV2EXNickname 还是 Nick 加上 v2 用户名呢
|
445
sadhen OP My_V2EX_Name 一共六个字母哦 @chocolatesir 就是你 AT 的那个
|
446
sadhen OP |
447
sadhen OP |
448
hepin1989 2018-10-10 02:55:37 +08:00
代码清单已经更新到 sbt 1.2.4 了,如果各位有勘误,可以随时 at 我们,一切联系方式都可以,确认送冰可乐。
另外本书中的一些原文,因为年久失修,所以几乎没法用了,后来我们重新写过了,比如天气预报和股票的例子。因为国家出版规定,(地图)等敏感信息,所以都是使用的静态数据,还望各位海涵,当然好处就是,获得的结果一定是和书中保持的一致。 至于书中的勘误,我们也是合并了国外最新的勘误,当然也包括一些自己补充的勘误。 而对于定价,主要是 Pragmatic Scala 的这家出版社他们的授权费就比较贵,所以这个书和《 Netty 实战》一样,也是 69 的定价。当然也包括今年的纸变贵了。 代码清单最新的都在 Github,只要本人不挂,会一直更新的,编译的话基于的是 2.12.x,对于一些个将来在 Dotty 中会废弃掉的语法,也改掉了,当然不包括书中故意用来展示类型推导的例子。 欢迎各位反馈,同时特别辛苦沈达组织这次活动,本周日我和他面基后,把书给各位邮寄过来,谢谢大家。 |
450
hepin1989 2018-10-10 03:02:41 +08:00
@cye3s 目前的版本就是最新的,有 3 个勘误,在异步社区的本书页面,代码清单在 Github 绝对是最新最新的。
|
451
hepin1989 2018-10-10 03:07:56 +08:00
@xcjx 第一次印刷的勘误不少,不过后续的勘误一直在跟进,在第 4 次印刷的时候就没啥勘误了。
代码清单我一直在更新,如果有什么新的意见可以直接提出来哦。 英文原版的错误其实很多很多的,很多人可能没在意,中文版合并了外版本的勘误,对于新的勘误也反馈了。而原版的代码清单也是后来我更新上去的哈:) 一起进步,这次是两个人,所以 Netty 实战我只能保证现在的印刷版本几乎没新的勘误,不过我的确无法保证符合每个人的胃口呢,后续的 Scala 书和反应式设计模式一书,因为是多人翻译,多人校对,可能更加好一些。 |
452
hepin1989 2018-10-10 03:12:02 +08:00
@Mistwave 这个书其实翻译初衷是因为一直没人接锅,然后我和嘉和又想写一本 Akka 书,Akka 书又不可避免地会涉及到 Scala,所以就。。。
终于本书,全面是肯定不全面的,甚至市面上没有任何一本书可以全面地介绍 Scala。不过本书胜在实用,且我们在翻译过程中也加入了一些 Dotty 等未来语言会出现的变化。原文的内容作为译者我们无法改变,所以如果要全面地了解 Scala 本书完全不行,不过如果是应付工作,或者快速入门,那的确是绰绰有余:) |
453
hepin1989 2018-10-10 03:13:40 +08:00
@changdy Kotlin 和 Scala 在很多地方也比较像,不过 kotlin 对于目前 Scala 的一些不好的地方,进行了改进。但是 HKT 等特性目前 Kotlin 是不支持的。而 Dotty 现在又在抄一点 Kotlin 好的地方,所以你懂的。
|
454
hepin1989 2018-10-10 03:16:04 +08:00
@exceldream Akka typed 更坑,还有 Dotty 在 20 年等你。
|
456
hepin1989 2018-10-10 03:20:04 +08:00
@frandy 这个书的确挺实用的,基本是工作上使用是够了,当然,我是说别写那种让人捉摸不透的代码哦,想要见识下,可以问下 QQ 群的小星星。
|
457
hepin1989 2018-10-10 03:21:06 +08:00
@yinbowu95 SBT 这个,其实陈涛和沈达都有过想法写本书的,不过你知道,这个书的销量肯定是 GG。简单用的话陈涛在 gitub 上有 notes。您可以参考下。
|
458
hepin1989 2018-10-10 03:22:27 +08:00
@luozic 这个问题社区讨论过,基于 Scala.js 的经验,得贡献 4-5 年的时间,请问谁愿意,请站出来哦。
|
459
hepin1989 2018-10-10 03:25:34 +08:00
@caotian 翻译书耗时耗力还挨骂,KPI 的钱更多,不过不管是《 Netty 实战》,还是沈达和我翻译的这本《 Scala 实用指南》,我们真的都是用了心的,而对于将要出的《反应式设计模式》,光 neo 的投入都是几百万 RMB 的成本。所以,翻译书这个活,估计在《反应式设计模式》之后,有点儿难为情了,两个娃儿嗷嗷叫,没办法的。
|
461
luozic 2018-10-10 07:55:30 +08:00 via iPhone
从语言设计上来说 C# F#比 Java 还是坑少一点,现在看 dotty 应该能把 Scala 的一些坑给填了。实际现在还是觉得 typescript 和 python 感觉更适应场景。julia 有点意思,不过实际 python 的主要场景根本和 julia 不搭。
|
463
Mistwave 2018-10-10 13:07:07 +08:00
给沈达大哥发了邮件,请查收:)
|
464
whirly 2018-10-10 17:22:29 +08:00
正在学习 Spark,希望获奖
|
465
funky 2018-10-10 19:04:15 +08:00
中奖!!
|
466
wenning 2018-10-10 21:57:18 +08:00
@sadhen , 哈哈谢谢,人品爆发, 我使用 [email protected] 发送了邮件,请查收
|
468
sadhen OP |
472
djx314 2018-10-11 23:13:12 +08:00
哟西,可以发言啦,来打气一波
|
473
sadhen OP |
474
sadhen OP |
475
hepin1989 2018-10-16 15:48:56 +08:00 1
书已经全部邮寄了哈,大家等待签收即可。
|
479
chocolatesir 2018-10-20 11:49:17 +08:00 via Android
谢谢楼主,昨天已经收到
|