You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
8.3 KiB
8.3 KiB
混合使用多语言并共享变量
混合使用多种语言(C#、F#、Powershell、SQL、KQL、Python、Html、JavaScript、JavaScript、Mermaind等语言),是多语言笔记的最大特性,并且支持各语言之间共享变量这一创新功能。
语言及共享变量的支持情况
语言 | 变量共享 |
---|---|
C# | 支持 |
F# | 支持 |
PowerShell | 支持 |
JavaScript | 支持 |
SQL | 支持 |
KQL | 支持 |
Python | 支持 |
R | 支持 |
HTML | 不支持 |
Mermaid | 不支持 |
初始化
//全局初始化
#!import "./Base.ipynb"
//共享
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
使用 SQL(SQLite为例)
- 引用NuGet包
#r "nuget:Microsoft.DotNet.Interactive.SQLite,*-*"
- 连接 SQL内核(使用
#!connect
魔法命令)
/* 简单使用
#!connect sqlite --kernel-name SQLiteSharedKernel --connection-string "Data Source=.\assets\database\study.db;"
*/
//优化方法
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
{
//内核名:魔法命令中的内核名,执行后会自动加 sql- 前缀,做为内核名被使用
string magicCommandKernelName = "SQLiteSharedKernel";
string completeKernelName = "sql-" + magicCommandKernelName;
//引入内核:可重复执行
if(Microsoft.DotNet.Interactive.Kernel.Root.FindKernelByName(completeKernelName) == null)
{
var connectKernelCode = $"#!connect sqlite --kernel-name {magicCommandKernelName} --connection-string \"{SharedDbConnect.SQLiteConnectionString}\"";
await Kernel.Root.SendAsync(new SubmitCode( connectKernelCode, "csharp"));
}
else
{
Console.WriteLine($"名为 {completeKernelName} 的内核已存在。需要新内核时,请为--kernel-name参数使用不同的值, 本次执行不做任何更改!");
}
}
- 使用SQL内核(SQL语句操作数据库)
#!sql-SQLiteSharedKernel
--查询年龄最大的5名学生
SELECT * FROM Student order by Age Desc LIMIT 5;
--查询学生总数
SELECT COUNT(*) AS Count FROM Student;
使用 KQL(效果图)
因为环境比较难搭建,用效果图代替。
使用 Raw Value Storage
使用value内核,可以方便的管理共享文本数据。
#!value --name SharedDataFromValueKernel --from-file ./shared/file/data.json
C#
一般使用
var student = new {Id=1, Name="张三",Age=18};
student.Display();
使用Value内核共享的变量
#!set --name fromSharedFileData --value @value:SharedDataFromValueKernel
fromSharedFileData.Display();
共享变量
使用C#查询数据库中的数据,共享出来,给其它语言(F#、html、js等使用)
#r "nuget:Microsoft.Data.SqlClient"
#r "nuget:Microsoft.Data.Sqlite"
using System.Data;
using System.Data.Common;
using System.Data.SqlTypes;
using Microsoft.Data.SqlClient;
using Microsoft.Data.Sqlite;
//使用 Ado.Net 从SQLite中获取数据,再共享出去
//查询数据
var SharedStudents = new List<Student>();
{
DataSet ds = new DataSet();
using(var sqlConnection = new SqliteConnection(SharedDbConnect.SQLiteConnectionString))
{
sqlConnection.Open();
var querySql =
"""
SELECT * FROM Student LIMIT 5;
""";
var cmd = sqlConnection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = querySql;
using (var reader = await cmd.ExecuteReaderAsync())
{
//循环输出行数据
while (await reader.ReadAsync())
{
var user = new Student()
{
Id = reader.GetFieldValue<int>("Id"),
Name = reader.GetFieldValue<string>("Name"),
Age = reader.GetFieldValue<int>("Age"),
};
SharedStudents.Add(user);
}
}
sqlConnection.Close();
sqlConnection.Dispose();
}
}
//共享数据:默认SharedStudents已共享,其它语言引用即可
SharedStudents.Display();
F#
简单示例
printfn "Hello World from F#"
使用C#共享数据
#!set --value @csharp:SharedStudents --name SharedStudents
SharedStudents
Powershell
#!powershell
Write-Host "hellow powershell"
使用Python
-
前提:系统要安装Python环境,推荐使用Anaconda安装,直接安装Python也可以
-
作用:使多语言笔记,直接支持 Python语言;
-
连接到 Python 内核
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
//引入Python内核:使用C# 执行引入语句
if(Kernel.Root.FindKernelByName("pythonkernel2") == null)
{
//Console.WriteLine("正在导入Python内核....");
var importPythonkernel = "#!connect jupyter --kernel-name pythonkernel2 --kernel-spec python3";
await Kernel.Root.SendAsync(new SubmitCode( importPythonkernel, "csharp"));
Console.WriteLine("Python内核导入完成");
}
else
{
Console.WriteLine("Python内核已经导入");
}
- 使用 Python
# 明确指定内核:优先级高于 "单元格选择的内核"
#!pythonkernel2
#!set --value @csharp:SharedStudents --name SharedStudents
print("你好,我是 Ployglot Notebooks 使用 Python语言内核,打印的内容!")
在 Python 中使用C#共享变量
#!pythonkernel2
#!set --value @csharp:SharedStudents --name SharedStudents
print(SharedStudents)
使用 html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>完整html文档</title>
</head>
<body>
<div style="color:green">
<h2 id="MyTitle">使用Html文档,当然也可以使用Html片断。注意:纯HTML不支持共享变量!</h2>
<table id="student" border="1" style="color:#fff">
<caption>C#共享数据:学生表</caption>
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</body>
</html>
使用 JavaScript
- 简单使用
console.log("输出js日志");
- 操作html
//改变上面html中h2文本颜色:执行后上面看效果
document.getElementById("MyTitle").style.color = "red";
- 使用C#共享数据,填充数据表格
#!set --value @csharp:SharedStudents --name SharedStudentsInJs
// 获取表格的tbody部分
const tableBody = document.querySelector('#student tbody');
// 遍历数据数组
SharedStudentsInJs.forEach(item => {
// 创建一行
const row = document.createElement('tr');
// 创建单元格并填入数据
const nameCell = document.createElement('td');
nameCell.textContent = item.Id;
row.appendChild(nameCell);
const ageCell = document.createElement('td');
ageCell.textContent = item.Name;
row.appendChild(ageCell);
const jobCell = document.createElement('td');
jobCell.textContent = item.Age;
row.appendChild(jobCell);
// 将该行添加到表格的tbody中
tableBody.appendChild(row);
});
HTTP Request
基本请求
### 请求 京东
get https://www.jd.com
### 请求QQ
get https://www.qq.com
- 高级请求(使用变量等)
@host=https://www.qq.com
get {{host}}
使用 mermaind
stateDiagram-v2
[*] --> Active
state Active {
[*] --> NumLockOff
NumLockOff --> NumLockOn : EvNumLockPressed
NumLockOn --> NumLockOff : EvNumLockPressed
--
[*] --> CapsLockOff
CapsLockOff --> CapsLockOn : EvCapsLockPressed
CapsLockOn --> CapsLockOff : EvCapsLockPressed
--
[*] --> ScrollLockOff
ScrollLockOff --> ScrollLockOn : EvScrollLockPressed
ScrollLockOn --> ScrollLockOff : EvScrollLockPressed
}
stateDiagram-v2
state fork_state <<fork>>
[*] --> fork_state
fork_state --> State2
fork_state --> State3
state join_state <<join>>
State2 --> join_state
State3 --> join_state
join_state --> State4
State4 --> [*]