日常开发中,经常有些探索性的工作需要处理。这类工作更多的是验证可行性,不需要像典型的工程那样遵守目录结构,严格编码,笔记本是做这类工作的良好载体。
jupyter本来是python平台的工具,拓展之后可以用来运行kotlin(间接运行java),也是挺好用的,比java11的jshell好多了;看来跨语言的相互借鉴还是蛮有意义的。
也可以参考jupyter-docker-stacks和kotlin-notebook来安装
使用scoop来安装anaconda。
//搜索anaconda
scoop search anaconda
//全局安装anaconada
scoop install -g anaconada
打开anaconda prompt命令窗口:
conda search notebook
conda install notebook=6.4.12
conda remove notebook
导出html可能报错:
module 'jinja2' has no attribute 'Markup'
原因是jinja2
版本太高了。把原来的移除,安装旧版本:
conda remove jinja2
conda install jinja2=3.0.3
conda search jupyterlab
conda install jupyterlab
conda remove jupyterlab
//安装
conda install -c jetbrains kotlin-jupyter-kernel
//更新
conda update -c jetbrains kotlin-jupyter-kernel
//卸载
conda remove kotlin-jupyter-kernel
为什么不用IJava解释器呢?个人觉得java冗余的语法不适合笔记本编程的体验。
//生成配置文件
jupyter notebook --generate-config
//搜索配置项
c.NotebookApp.notebook_dir
//配置为默认路径,去掉#解注释,配置项前面无空格
c.NotebookApp.notebook_dir = 'D:\jupyter'
# 使用jupyter生成密码
# 生成的密码保存在~/.jupyter/jupyter_notebook_config.json文件中
jupyter notebook password
# 修改配置文件参数
c.NotebookApp.ip='*'
c.NotebookApp.password = u'你的密码'
# 安装拓展包
conda install -c conda-forge jupyter_contrib_nbextensions
# 应用拓展包
jupyter contrib nbextension install --user
# 开启代码提示
jupyter nbextension enable Hinterland/main --user
# 安装主题
conda install -c conda-forge jupyterthemes
# 查看主题列表
jt -l
# 切换主题
jt -t <主题名> -T -N
个人推荐:gruvboxl,黄色背景,护眼;idea也有同款Gruvbox Theme,配合Material Theme UI很赞。
打开anaconda prompt命令窗口,输入:
jupyterlab
jupyter服务器运行起来,在浏览器中输入http://localhost:8888/lab
即可打开jupyterlab的工作界面。
:help
使用%use
语法。
默认版本
%use fuel
指定版本
%use fuel(2.3.1)
默认版本定义在
..\anaconda3\2021.11\Lib\site-packages\run_kotlin_kernel\libraries
的json
文件中。
指定依赖仓库
@file:Repository()
@file:Repository("*mavenLocal")
指定依赖包
@file:DependsOn()
@file:DependsOn("com.squareup.okhttp3:okhttp:4.9.3")
默认的依赖仓库为:
默认使用maven下载依赖,依赖存放位置:~/.m2
:classpath
:vars
通过配置如下环境变量设置jdk:
KOTLIN_JUPYTER_JAVA_HOME
JAVA_HOME
配置jvm参数
KOTLIN_JUPYTER_JAVA_OPTS
JAVA_OPTS
配置额外参数
KOTLIN_JUPYTER_JAVA_OPTS_EXTRA
新建一个kotlin笔记本,打印java相关信息:
System.out.println(System.getProperty("user.home"))
System.out.println(System.getProperty("os.name"))
System.out.println(System.getProperty("java.home"))
System.out.println(System.getProperty("java.version"))
System.out.println(System.getProperty("java.vm.name"))
System.out.println(System.getProperty("java.vm.version"))
System.out.println(System.getProperty("java.vm.vendor"))
使用:help
命令可以查看官方收录的库。
%use fuel(2.3.1)
import com.github.kittinunf.result.*
import com.github.kittinunf.fuel.core.*
FuelManager.instance.basePath = "https://www.baidu.com"
Fuel.get("/s", listOf("wd" to "fuel"))
.response()
由于时间精力的关系,这里不推荐使用:help里面收录的库,而是直接使用java库,毕竟java本身的库又多又全。使用kotlin jupyter,确实需要学习kotlin的一些基本的语法,但是依赖包尽量还是用java的,减少学习的成本。
从另一个角度讲,java本身的库本来就多,学都学不过来,没必要在使用kotlin的第三方库(kotlin标准库还是要了解下);相反,可以把kotlin jupyter作为实验java库的平台,了解并实践java库的入口,甚至,可以用来快速编写并调试一段算法。这些都有助于对java的理解和运用。
val
,var
关键字@file:DependsOn("org.knowm.xchart:xchart:3.8.1")
import org.knowm.xchart.*
val xData=doubleArrayOf(0.0,1.0,2.0)
val yData=doubleArrayOf(2.0,1.0,0.0)
val chart=QuickChart.getChart("Sample Chart","x","y","y(x)",xData,yData)
BitmapEncoder.getBufferedImage(chart)