Skip to content
Permalink
Browse files

add how to learn scala

  • Loading branch information
xiantang committed Jan 15, 2020
1 parent f547fb3 commit ff061d3093feb9dc604a3b15be1bd4f1a8b518b1
Showing with 260 additions and 51 deletions.
  1. BIN .DS_Store
  2. +209 −3 config.toml
  3. BIN content/{scala → post}/.DS_Store
  4. BIN content/post/scala/.DS_Store
  5. +1 −0 content/post/scala/AES_limit_length.md
  6. +49 −0 content/post/scala/how_to_learn_scala.md
  7. +0 −48 content/scala/AES 限制长度.md
  8. BIN content/scala/images/image-20191109145633818.png
  9. BIN content/scala/images/image-20191109150457772.png
  10. BIN content/scala/images/image-20191129190236925.png
  11. BIN content/scala/images/image-20191129190608208.png
  12. BIN content/scala/images/image-20191129190638068.png
  13. BIN content/scala/images/image-20191129190758229.png
  14. BIN content/scala/images/image-20191129191234476.png
  15. BIN content/scala/images/image-20191129191724741.png
  16. BIN content/scala/images/image-20191129192023173.png
  17. BIN content/scala/images/image-20191129193025588.png
  18. BIN content/scala/images/image-20191129194251416.png
  19. BIN content/scala/images/image-20191129194526611.png
  20. BIN content/scala/images/image-20191129194814552.png
  21. BIN content/scala/images/image-20191129195217784.png
  22. BIN content/scala/images/image-20200102114652866.png
  23. BIN content/scala/images/image-20200102115023086.png
  24. BIN content/scala/images/image-20200102115950428.png
  25. BIN content/scala/images/image-20200102120043445.png
  26. BIN content/scala/images/image-20200109114040999.png
  27. BIN content/scala/images/image-20200109120145086.png
  28. BIN content/scala/images/image-20200109120406852.png
  29. BIN content/scala/images/image-20200109131215939.png
  30. BIN content/scala/images/image-20200109140449787.png
  31. BIN content/scala/images/image-20200109195143660.png
  32. +1 −0 themes/even
BIN +0 Bytes (100%) .DS_Store
Binary file not shown.
@@ -1,4 +1,210 @@
baseURL = "https://xiantang.github.io/"
languageCode = "en-us"
title = "xiantang"
theme = "ananke"
languageCode = "en"
defaultContentLanguage = "en" # en / zh-cn / ... (This field determines which i18n file to use)
title = "Even - A super concise theme for Hugo"
preserveTaxonomyNames = true
enableRobotsTXT = true
enableEmoji = true
theme = "even"
enableGitInfo = true # use git commit log to generate lastmod record # 可根据 Git 中的提交生成最近更新记录。

# Syntax highlighting by Chroma. NOTE: Don't enable `highlightInClient` and `chroma` at the same time!
pygmentsOptions = "linenos=table"
pygmentsCodefences = true
pygmentsUseClasses = true
pygmentsCodefencesGuessSyntax = true

hasCJKLanguage = true # has chinese/japanese/korean ? # 自动检测是否包含 中文\日文\韩文
paginate = 5 # 首页每页显示的文章数
disqusShortname = "" # disqus_shortname
googleAnalytics = "" # UA-XXXXXXXX-X
copyright = "" # default: author.name ↓ # 默认为下面配置的author.name ↓

[author] # essential # 必需
name = "xiantang"

[sitemap] # essential # 必需
changefreq = "weekly"
priority = 0.5
filename = "sitemap.xml"

[[menu.main]] # config your menu # 配置目录
name = "Home"
weight = 10
identifier = "home"
url = "/"
[[menu.main]]
name = "Archives"
weight = 20
identifier = "archives"
url = "/post/"
[[menu.main]]
name = "Tags"
weight = 30
identifier = "tags"
url = "/tags/"
[[menu.main]]
name = "Categories"
weight = 40
identifier = "categories"
url = "/categories/"

[params]
version = "4.x" # Used to give a friendly message when you have an incompatible update
debug = false # If true, load `eruda.min.js`. See https://github.com/liriliri/eruda
since = "2019" # Site creation time # 站点建立时间
# use public git repo url to link lastmod git commit, enableGitInfo should be true.
# 指定 git 仓库地址,可以生成指向最近更新的 git commit 的链接,需要将 enableGitInfo 设置成 true.
gitRepo = "https://github.com/xiantang/xiantang.github.io"

# site info (optional) # 站点信息(可选,不需要的可以直接注释掉)
logoTitle = "xiantang" # default: the title value # 默认值: 上面设置的title值
# keywords = ["Hugo", "theme","even"]
description = "xiantang's blog"

# paginate of archives, tags and categories # 归档、标签、分类每页显示的文章数目,建议修改为一个较大的值
archivePaginate = 5

# show 'xx Posts In Total' in archive page ? # 是否在归档页显示文章的总数
showArchiveCount = true

# The date format to use; for a list of valid formats, see https://gohugo.io/functions/format/
dateFormatToUse = "2006-01-02"

# show word count and read time ? # 是否显示字数统计与阅读时间
moreMeta = true

# Syntax highlighting by highlight.js
highlightInClient = false

# 一些全局开关,你也可以在每一篇内容的 front matter 中针对单篇内容关闭或开启某些功能,在 archetypes/default.md 查看更多信息。
# Some global options, you can also close or open something in front matter for a single post, see more information from `archetypes/default.md`.
toc = true # 是否开启目录
autoCollapseToc = false # Auto expand and collapse toc # 目录自动展开/折叠
fancybox = true # see https://github.com/fancyapps/fancybox # 是否启用fancybox(图片可点击)

# mathjax
mathjax = false # see https://www.mathjax.org/ # 是否使用mathjax(数学公式)
mathjaxEnableSingleDollar = false # 是否使用 $...$ 即可進行inline latex渲染
mathjaxEnableAutoNumber = false # 是否使用公式自动编号
mathjaxUseLocalFiles = false # You should install mathjax in `your-site/static/lib/mathjax`

postMetaInFooter = true # contain author, lastMod, markdown link, license # 包含作者,上次修改时间,markdown链接,许可信息
linkToMarkDown = false # Only effective when hugo will output .md files. # 链接到markdown原始文件(仅当允许hugo生成markdown文件时有效)
contentCopyright = '' # e.g. '<a rel="license noopener" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank">CC BY-NC-ND 4.0</a>'

changyanAppid = "" # Changyan app id # 畅言
changyanAppkey = "" # Changyan app key

livereUID = "" # LiveRe UID # 来必力

baiduPush = false # baidu push # 百度
baiduAnalytics = "" # Baidu Analytics
baiduVerification = "" # Baidu Verification
googleVerification = "" # Google Verification # 谷歌

# Link custom CSS and JS assets
# (relative to /static/css and /static/js respectively)
customCSS = []
customJS = []

uglyURLs = false # please keep same with uglyurls setting

[params.publicCDN] # load these files from public cdn # 启用公共CDN,需自行定义
enable = true
jquery = '<script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>'
slideout = '<script src="https://cdn.jsdelivr.net/npm/slideout@1.0.1/dist/slideout.min.js" integrity="sha256-t+zJ/g8/KXIJMjSVQdnibt4dlaDxc9zXr/9oNPeWqdg=" crossorigin="anonymous"></script>'
fancyboxJS = '<script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.js" integrity="sha256-XVLffZaxoWfGUEbdzuLi7pwaUJv1cecsQJQqGLe7axY=" crossorigin="anonymous"></script>'
fancyboxCSS = '<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.css" integrity="sha256-7TyXnr2YU040zfSP+rEcz29ggW4j56/ujTPwjMzyqFY=" crossorigin="anonymous">'
timeagoJS = '<script src="https://cdn.jsdelivr.net/npm/timeago.js@3.0.2/dist/timeago.min.js" integrity="sha256-jwCP0NAdCBloaIWTWHmW4i3snUNMHUNO+jr9rYd2iOI=" crossorigin="anonymous"></script>'
timeagoLocalesJS = '<script src="https://cdn.jsdelivr.net/npm/timeago.js@3.0.2/dist/timeago.locales.min.js" integrity="sha256-ZwofwC1Lf/faQCzN7nZtfijVV6hSwxjQMwXL4gn9qU8=" crossorigin="anonymous"></script>'
flowchartDiagramsJS = '<script src="https://cdn.jsdelivr.net/npm/raphael@2.2.7/raphael.min.js" integrity="sha256-67By+NpOtm9ka1R6xpUefeGOY8kWWHHRAKlvaTJ7ONI=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/flowchart.js@1.8.0/release/flowchart.min.js" integrity="sha256-zNGWjubXoY6rb5MnmpBNefO0RgoVYfle9p0tvOQM+6k=" crossorigin="anonymous"></script>'
sequenceDiagramsCSS = '<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/bramp/js-sequence-diagrams@2.0.1/dist/sequence-diagram-min.css" integrity="sha384-6QbLKJMz5dS3adWSeINZe74uSydBGFbnzaAYmp+tKyq60S7H2p6V7g1TysM5lAaF" crossorigin="anonymous">'
sequenceDiagramsJS = '<script src="https://cdn.jsdelivr.net/npm/webfontloader@1.6.28/webfontloader.js" integrity="sha256-4O4pS1SH31ZqrSO2A/2QJTVjTPqVe+jnYgOWUVr7EEc=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/snapsvg@0.5.1/dist/snap.svg-min.js" integrity="sha256-oI+elz+sIm+jpn8F/qEspKoKveTc5uKeFHNNVexe6d8=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/underscore@1.8.3/underscore-min.js" integrity="sha256-obZACiHd7gkOk9iIL/pimWMTJ4W/pBsKu+oZnSeBIek=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/gh/bramp/js-sequence-diagrams@2.0.1/dist/sequence-diagram-min.js" integrity="sha384-8748Vn52gHJYJI0XEuPB2QlPVNUkJlJn9tHqKec6J3q2r9l8fvRxrgn/E5ZHV0sP" crossorigin="anonymous"></script>'

# Display a message at the beginning of an article to warn the readers that it's content may be outdated.
# 在文章开头显示提示信息,提醒读者文章内容可能过时。
[params.outdatedInfoWarning]
enable = false
hint = 30 # Display hint if the last modified time is more than these days ago. # 如果文章最后更新于这天数之前,显示提醒
warn = 180 # Display warning if the last modified time is more than these days ago. # 如果文章最后更新于这天数之前,显示警告

[params.gitment] # Gitment is a comment system based on GitHub issues. see https://github.com/imsun/gitment
owner = "" # Your GitHub ID
repo = "" # The repo to store comments
clientId = "" # Your client ID
clientSecret = "" # Your client secret

[params.utterances] # https://utteranc.es/
owner = "" # Your GitHub ID
repo = "" # The repo to store comments

[params.gitalk] # Gitalk is a comment system based on GitHub issues. see https://github.com/gitalk/gitalk
owner = "" # Your GitHub ID
repo = "" # The repo to store comments
clientId = "" # Your client ID
clientSecret = "" # Your client secret

# Valine.
# You can get your appid and appkey from https://leancloud.cn
# more info please open https://valine.js.org
[params.valine]
enable = false
appId = '你的appId'
appKey = '你的appKey'
notify = false # mail notifier , https://github.com/xCss/Valine/wiki
verify = false # Verification code
avatar = 'mm'
placeholder = '说点什么吧...'
visitor = false

[params.flowchartDiagrams]# see https://blog.olowolo.com/example-site/post/js-flowchart-diagrams/
enable = false
options = ""

[params.sequenceDiagrams] # see https://blog.olowolo.com/example-site/post/js-sequence-diagrams/
enable = false
options = "" # default: "{theme: 'simple'}"

[params.busuanzi] # count web traffic by busuanzi # 是否使用不蒜子统计站点访问量
enable = false
siteUV = true
sitePV = true
pagePV = true

[params.reward] # 文章打赏
enable = false
wechat = "/path/to/your/wechat-qr-code.png" # 微信二维码
alipay = "/path/to/your/alipay-qr-code.png" # 支付宝二维码

[params.social] # 社交链接
a-email = "zhujingdi1998@gmail.com"
b-stack-overflow = "https://stackoverflow.com/users/12515344/%e6%9c%b1%e9%9d%99%e8%bf%aa"
c-twitter = "https://twitter.com/xiantang98"
g-github = "https://github.com/xiantang"
i-zhihu = "https://www.zhihu.com/people/xian-tang-37-99"

# See https://gohugo.io/about/hugo-and-gdpr/
[privacy]
[privacy.googleAnalytics]
anonymizeIP = true # 12.214.31.144 -> 12.214.31.0
[privacy.youtube]
privacyEnhanced = true

# 将下面这段配置取消注释可以使 hugo 生成 .md 文件
# Uncomment these options to make hugo output .md files.
#[mediaTypes]
# [mediaTypes."text/plain"]
# suffixes = ["md"]
#
#[outputFormats.MarkDown]
# mediaType = "text/plain"
# isPlainText = true
# isHTML = false
#
#[outputs]
# home = ["HTML", "RSS"]
# page = ["HTML", "MarkDown"]
# section = ["HTML", "RSS"]
# taxonomy = ["HTML", "RSS"]
# taxonomyTerm = ["HTML"]
Binary file not shown.
BIN +0 Bytes (100%) content/post/scala/.DS_Store
Binary file not shown.
@@ -60,3 +60,4 @@ def instance = MessageDigest.getInstance("MD5")
secret = instance.digest(a.getBytes())
new String(secret).length()
```

@@ -0,0 +1,49 @@
---
title: "How to learn scala"
date: 2020-01-15T16:33:34+08:00
tags: ["scala"]
categories: ["中文","scala"]
draft: false
---

## 背景:

刚来到以scala为技术栈的公司的时候,配置了半天环境,然后终于将项目起了起来,发现里面的代码很奇怪,没有任何循环,数据的操作是一个函数套着一个函数,十分令人疑惑,于是借着业务需求和这股好奇劲开始学习关于scala的内容。

## 目标:

1. 熟练运用项目中的异步操作 Future 变换 (同步思维转异步)
2. 熟悉 Play 框架能够熟练的翻文档解决问题
3. 熟练运用高阶函数 map flatMap 等操作

### 阶段 1:能写 Scala

这个阶段比较容易达到,就是首先需要阅读 《[Scala编程](https://www.douban.com/link2/?url=https%3A%2F%2Fbook.douban.com%2Fsubject%2F5377415%2F&query=scala+编程&cat_id=1001&type=search&pos=1)》前几章 或者 [推特scala课堂](https://twitter.github.io/scala_school/zh_cn/index.html) ,来了解scala的基本语法。但是在这个阶段仍然会有很多的坑,基本是在 IDEA 的提示 与 爆红下才能勉强的写代码。

### 阶段2: 知道函数式编程是什么东西

当你差不多写了半个月 Scala 之后,仍然好奇函数式编程是什么东西,这个时候你就可以去学习一些关于函数式编程的知识了,我的线路是先学习了 [programming-languages](https://www.coursera.org/learn/programming-languages/home/welcome) 这门入门课程,主要讲了一些关于函数式编程的基础知识,包括但不限于 闭包 高阶函数 尾递归 代数类型。 虽然语言不是Scala 但是这门课为我之后的函数式编程打下了一定的基础。 如果你在这门课上认真的完成了作业,后面的路会通畅很多。

### 阶段3:再深入的了解

到这个时候,你一定会听到一本十分有名的书《Scala 函数式编程》 这本书,很有可能在你没经历前几个阶段的时候,你就看了,但是发觉里面的内容十分抽象,便放弃了。现在你就可以大胆的去看它了,可以无痛的看到第六章。

再在下面,就会被更抽象的 Monad Factor 等概念所迷惑。

### 阶段4:持续学习基础

上面的阻塞其实还是因为对基础知识不够扎实,所以还是需要进一步的学习,这里推荐 Scala 语言作者的课程 [Functional Programming Principles in Scala](https://www.coursera.org/learn/progfun1/home/welcome) . 因为不是免费的,所以需要付费或者采用奖学金(咸鱼)来免费学习。这门课程虽然不及上面的 programming-languages 课程,但是比较困难的习题还是能提升FP的水平的。

### 阶段5:参与社区

这个时候你就可以继续去看 《Scala 函数式编程》 这本书了,因为你看完了上面的两门全英文课程所以英文也不会再惧怕就可以参与社区了,这里推荐几个比较好的社区,曾经给我过帮助的社区 https://gitter.im/scala/scala. https://gitter.im/akka/akka , 如果对开源有兴趣,就可以给 akka 或者 Play 修复BUG了。

最后推荐一些给我过帮助的网站

[coursera.org](http://coursera.org/) 网课平台

https://www.playframework.com/ play 官网

https://stackoverflow.com/ scala 模块 基本99%的scala 问题都能在上面找到,前提是会搜索

https://github.com/ 找轮子

This file was deleted.

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Submodule even added at d39d3e

0 comments on commit ff061d3

Please sign in to comment.
You can’t perform that action at this time.