原英文术语 | 中文对应 |
---|---|
contact | 联系 |
name | 名称 |
type | 类型 |
Partner | 合作伙伴 |
Vendor | 供应商 |
Customer | 客户 |
Qualified lead | ? |
原英文术语 | 中文对应 |
---|---|
board | 白板 |
column | 列 |
delete/remove | 删除 |
new/add | 新添 |
table | 表格 |
cell | 单元格 |
right | 右侧 |
text | 文本 |
numbers | 数值 |
date | 日期 |
Trash | 垃圾箱 |
empty | 空 |
export | 导出 |
import | 导入 |
rename | 重命名 |
options | 选项 |
successfully | 成功 |
link | 链接 |
copy | 复制 |
main table > new contact > 输入名 ditou.org, type 为 Partner/Vendor/Customer/Qualified lead
反馈:table 中新添一项
main table > 某行左侧 … > delete
反馈:如果有其他表格有关(不一定引用该项),会提示警告。
成功:“deleting > deleted successfully”
表格的第二列开始的每列右侧 … > add column to the right > 选择类型 Text/Numbers/Date 等
所见即所得
选中列头… > remove
会提示在垃圾箱(Trash)留30天;所见即所得
选中该格 > 点击该格右侧× 或者 选中内容删除 > 会自动提示该列的可能值, 可以从中选择, 也可手动填入新内容 (如留空? )
如果选择 contact 名(第一格), 留空会报错 “name can’t be empty”
选中列头文字 ‘Text’ > 改为 仓库地址
/类型等2;或右键 > rename
所见即所得
选中格右键 > copy contact link 并不是复制内容,而是复制了此项联系的链接。> copy cell 才是复制内容。
无反馈
鼠标点击列头, 拖动到目标位置
所见即所得
…(options) > More actions > Export to excel
可从表格拷贝到另一个csv格式文件
…(options) > More actions > Import from file
选中 csv 导入 > 选择一列作名 > 选择其他列的映射关系,随时可取消
在导入csv文件时,发现中文内容显示为乱码。 在其论坛 发问 后,得到其工程师成员回应,未解决后望私信发测试文件,后让我向技术支持反映。
暂不打算继续试用。
所用术语有一些不一致的情况,比如 delete/remove、new/add。某些操作的反馈缺失,比如复制单元格。界面相关术语多于业务相关的,对于简单用例来说,上手过程中主要精力会用于熟悉各功能在界面的位置。
CRM 平台研发的技术门槛看似不高,也有相当的免费工具供选择,正是如此界面设计对用户的影响就更大。
’>’ 如果 不 是 有 可(以) 一定
输入 选择/选中 反馈 左侧 有关 引用 项 提示 警告 成功 所见即所得 点击 内容 可能值 报错 改为 右键 鼠标 列头 拖动 目标 位置 文件 存为 格式 取消
]]>从舆论上拉高编译器实现门槛且把语言设计和实现强行绑定。
编程语言国产化的关键一战——对肆意污名化“木兰”编程语言说“不” 30 赞同 · 16 评论文章
门槛拉高的另一个方面是,将手写解析器捧为“上流”而视使用antlr/yacc/ply等辅助工具、框架为“下等”。这和“依赖其他语言生态”的评价如出一辙——不是从铁矿石和种树开始手搓出来的锤子就不算自主、不能拿来卖。
]]>在语言中有矩阵的语法如下:a=[1 2 3],但是如果矩阵中带有符号,那么会错误解析.例如[1 -2 3]会被解析为[-1 3],在处理中空格全部都被过滤掉了
于是用 rply定制版 做一简单演示。很久没用,碰到不少报错,最后的语法实现很不如意,但至少通过了最基本测试。
演示分支 在此,运行 % pytest tests/test_按语法分词.py
进行测试。此文将各种报错尽量还原并记录下如何解决。
起初草稿如下(在 tests/test_语法分析器.py,以为不需无空格语法支持):
def test_数组(self):
分词母机 = 分词器母机()
分词母机.添了("左括号", r"[")
分词母机.添了("右括号", r"]")
分词母机.添了("减", r"-")
分词母机.添了("数", r"\d")
分析器母机 = 语法分析器母机(["数", "左括号", "右括号", "减"])
@分析器母机.语法规则("数组 : 左括号 数列 右括号")
def 数组(p):
return [] + p[0]
@分析器母机.语法规则("数列 : 数")
@分析器母机.语法规则("数列 : 数列 数")
def 数列(片段):
if len(片段) == 1:
return [片段[0].getint()]
if len(片段) == 2:
return 片段[0] + [片段[1].getint()]
@分析器母机.语法规则("正负数 : 数")
@分析器母机.语法规则("正负数 : 减 数")
def 正负数(片段):
if len(片段) == 1:
return 片段[0].getint()
if len(片段) == 2:
return -片段[0].getint()
分词器 = 分词母机.产出()
分析器 = 分析器母机.产出()
assert 分析器.分析(分词器.lex('[1 -2 3]')) == [1, -2, 3]
运行测试报错:
def test_数组(self):
分词母机 = 分词器母机()
> 分词母机.添了("左括号", r"[")
tests/test_语法分析器.py:55:
...
FAILED tests/test_语法分析器.py::TestParser::test_数组 - re.error: unterminated character set at position 0
加上转义符:
分词母机.添了("左括号", r"\[")
分词母机.添了("右括号", r"\]")
报错:
@分析器母机.语法规则("数列 : 数")
@分析器母机.语法规则("数列 : 数列 数")
def 数列(片段):
if len(片段) == 1:
> return [片段[0].getint()]
E AttributeError: '词' object has no attribute 'getint'
片段[0]
为一个词(token),本身没有getint方法。因为草稿是从另一个测试用例改出来的,而该用例用了 BoxInt。于是改为自带的getstr:
@分析器母机.语法规则("正负数 : 数")
@分析器母机.语法规则("正负数 : 减 数")
def 正负数(片段):
if len(片段) == 1:
return int(片段[0].getstr())
if len(片段) == 2:
return -int(片段[0].getstr())
另还有个警告:
ParserGeneratorWarning: 规则 '正负数' 无用
发现 数列
规则未使用 正负数
,改为:
@分析器母机.语法规则("数列 : 正负数")
@分析器母机.语法规则("数列 : 数列 正负数")
def 数列(片段):
if len(片段) == 1:
return [片段[0]]
if len(片段) == 2:
return 片段[0] + 片段[1]
接下来就看不清楚了:
> assert 分析器.分析(分词器.lex('[1 -2 3]')) == [1, -2, 3]
tests/test_语法分析器.py:85:
...
rply/分词器.py:114: 分词报错
======================================================= short test summary info =======================================================
FAILED tests/test_语法分析器.py::TestParser::test_数组 - rply.报错.分词报错: (None, SourcePosition(idx=2, lineno=1, colno=3))
想起 [1
这种无空格设计,估计需要无空格语法解析支持,于是改为(顺便放到 tests/test_按语法分词.py):
assert 分析器.按语法分词(分词器.lex('[1 -2 3]')) == [1, -2, 3]
没好多少:
rply.报错.按语法分词报错: [(0, '左括号'), (1, '数'), (2, None)]
于是将 分词器.py
中的 调试细节
改为 1,看得到分词尝试细节,比如:
变长模式已试完:词名:左括号, 模式=re.compile('\\[')
位置 0 第一次尝试:词名:右括号, 模式=re.compile('\\]')
位置 0 第一次尝试:词名:减, 模式=re.compile('-')
位置 0 第一次尝试:词名:数, 模式=re.compile('\\d')
完全无匹配
栈已空!
看来是根据语法分词失败。于是简化用例:
assert 分析器.按语法分词(分词器.分词('[1]')) == [1]
#assert 分析器.按语法分词(分词器.分词('[1 -2 3]')) == [1, -2, 3]
至少分词通过。报错看得懂了:
@分析器母机.语法规则("数组 : 左括号 数列 右括号")
def 数组(p):
> return [] + p[0]
E TypeError: can only concatenate list (not "词") to list
...
找到匹配词:], 路径历史:{0: 词名:左括号, 模式=re.compile('\\['), 1: 词名:数, 模式=re.compile('\\d'), 2: 词名:右括号, 模式=re.compile('\\]')}
改正错误:
@分析器母机.语法规则("数组 : 左括号 数列 右括号")
def 数组(p):
return p[1]
第一个用例通过~ 加负数测试:
assert 分析器.按语法分词(分词器.分词('[-1]')) == [-1]
继续报错:
if len(片段) == 2:
> return -int(片段[0].getstr())
E ValueError: invalid literal for int() with base 10: '-'
继续改:
if len(片段) == 2:
return -int(片段[1].getstr())
第二个用例通过~ 第三个:
assert 分析器.按语法分词(分词器.分词('[1 3]')) == [1, 3]
分词失败:
变长模式已试完:词名:左括号, 模式=re.compile('\\[')
位置 0 第一次尝试:词名:右括号, 模式=re.compile('\\]')
位置 0 第一次尝试:词名:减, 模式=re.compile('-')
位置 0 第一次尝试:词名:数, 模式=re.compile('\\d')
完全无匹配
栈已空!
======================================================= short test summary info =======================================================
FAILED tests/test_按语法分词.py::Test按语法分词::test_数组 - rply.报错.按语法分词报错: [(0, '左括号'), (1, '数'), (2, None)]
看来是空格导致的。头痛医头吧:
分词母机.添了("数", r"\d\s*")
报错:
@分析器母机.语法规则("数列 : 数列 正负数")
def 数列(片段):
if len(片段) == 1:
return [片段[0]]
if len(片段) == 2:
> return 片段[0] + 片段[1]
E TypeError: can only concatenate list (not "int") to list
片段[0] 是列表,片段[1] 是数,于是:
if len(片段) == 2:
return 片段[0] + [片段[1]]
第三个通过~继续测试:
assert 分析器.按语法分词(分词器.分词('[-1 3]')) == [-1, 3]
assert 分析器.按语法分词(分词器.分词('[1 -2 3]')) == [1, -2, 3]
assert 分析器.按语法分词(分词器.分词('[1 -2 3 -4 5 6 -7]')) == [1, -2, 3, -4, 5, 6, -7]
全通过~,才发现不需要 strip() 数末的空格,这么妙么?
]]>InfoQ:争议与热度并存,越来越多开发者正在抛弃他们的旧语言转向 Rust 3 赞同 · 0 评论文章
现在转为的这种组织架构让我想到了 Eclipse、RISC-V。Eclipse 从2001年诞生到2010年前后的顶峰花了十年,然而20多年后的现在已在边缘。RISC-V 从 2014年发布至今也快十年,趋势仍待观察。
Rust 2015 年发布。
]]>因为稍微有点sense的外人都看得出,没人愿意在两岸统一过程中亲手下场和大陆扳手腕。
而以当下的发展趋势,越来越多台湾岛内民众会发觉,亲近大陆能获得的益处远超过反其道而行之。
在此背景下,轻启战端不仅不必要,而且会起到反作用。
统一路途上的争端和冲突有太多非战争方式进行磨合,以避免步俄乌兄弟阋墙的后尘。
再强调一次:争取和平是实力的体现。没有足够实力的话,没有选择战争和和平的自由。换句话说,如果大陆综合实力不够,台湾海峡早就燃起战火了。
当下最大的风险,是两岸的各种应急交流渠道的稀缺。被媒体甚至网络留言牵动双方民意,进而影响官方决策,是最低成本引发对立的最常见基本操作。有意或是无意的情绪输出,实际效果都与阿拉巴斯坦射中蔻砂的子弹类似。
]]>Console.WriteLine(“吃了么!”);
string 名 = "大黄";
int 邮件数 = 3;
float 温度 = 34.4F;
Console.WriteLine("嘿," + 名 + "! 收件箱有 " + 邮件数 + " 封邮件。气温 " + 温度 + " 度。");
Console.WriteLine(34.40M);
二维数组(节选):
void 显示各组(string[,] 各组) {
for (int i = 0; i < 各组.GetLength(0); i++) {
Console.Write($"组 {i + 1}: ");
for (int j = 0; j < 各组.GetLength(1); j++) Console.Write($"{各组[i,j]} ");
Console.WriteLine();
}
}
Random 币 = new Random();
Console.WriteLine(币.Next(0, 2) == 0? "花" : "字");
string 所有权限 = "管理员|经理";
int 级别 = 55;
if (所有权限.Contains("管理员")) {
Console.WriteLine(
级别 > 55
? "欢迎您,超级管理员用户。"
: "欢迎您, 管理员用户。");
} else if (所有权限.Contains("经理")) {
Console.WriteLine(
级别 >= 20
? "联系管理员请求访问。"
: "权限不足");
} else {
Console.WriteLine("权限不足");
}
【随想】用 if … else if … else;相对 if … elif … else,只需用 if else 两个词,减少一个 elif
for (int 数 = 1; 数<=100; 数++) {
string 行 = "" + 数;
if (数%3 == 0) {
if (数%5 == 0) 行 += " - FizzBuzz";
else 行 += " - Fizz";
} else if (数%5 == 0) 行 += " - Buzz";
Console.WriteLine(行);
}
【随想】方法的命名风格开头大写,有点不习惯。但 之后练习 又有小写开头 tellFortune
,不明所以。
Console.WriteLine("生成随机数");
显示随机数();
void 显示随机数() {
Random 生成器 = new Random();
for (int i = 0; i < 5; i++) {
Console.Write($"{生成器.Next(1, 100)} ");
}
Console.WriteLine();
}
Random random = new Random();
int 运 = random.Next(100);
string[] 开头 = {"You have much to", "Today is a day to", "Whatever work you do", "This is an ideal time to"};
string[] 上 = {"look forward to.", "try new things!", "is likely to succeed.", "accomplish your dreams!"};
string[] 下 = {"fear.", "avoid major decisions.", "may have unexpected outcomes.", "re-evaluate your life."};
string[] 中 = {"appreciate.", "enjoy time with friends.", "should align with your values.", "get in tune with nature."};
Console.WriteLine("算命的轻声而言:");
算命();
void 算命() {
var 命 = (运 > 75 ? 上 : (运 < 25 ? 下 : 中));
for (int i = 0; i < 4; i++)
{
Console.Write($"{开头[i]} {命[i]} ");
}
}
Random 随机生成 = new Random();
Console.WriteLine("试试?(Y/N)");
if (玩否()) 开玩();
bool 玩否() {
string 意向 = Console.ReadLine();
return 意向.ToLower().Equals("y");
}
void 开玩() {
var 继续 = true;
while (继续) {
var 目标 = 生成目标();
var 手气 = 丢色子();
Console.WriteLine($"大于 {目标} 即胜!");
Console.WriteLine($"你丢了 {手气} 点");
Console.WriteLine(判胜负(手气, 目标));
Console.WriteLine("\n继续?(Y/N)");
继续 = 玩否();
}
}
int 生成目标() {
return 随机生成.Next(1, 6);
}
int 丢色子() {
return 随机生成.Next(1, 7);
}
string 判胜负(int 手气, int 目标) {
return 手气 > 目标 ? "You win!" : "You lose!";
}
var message;
error CS0818: 隐式类型化的变量必须已初始化
error CS0818: Implicitly-typed variables must be initialized
var 问好 = "吃了吗";
问好 = 10.703m;
中英文报错:
error CS0029: 无法将类型“decimal”隐式转换为“string”
error CS0029: Cannot implicitly convert type 'decimal' to 'string'
类似:
error CS0029: 无法将类型“int”隐式转换为“string”
error CS0103: 当前上下文中不存在名称“ShouldPlay”
float 温度 = 34.4;
【随想】这里 Double 和 double 的语义区别值得推敲
error CS0664: 无法将 Double 类型隐式转换为“float”类型;请使用“F”后缀创建此类型
error CS0664: Literal of type double cannot be implicitly converted to type 'float'; use an 'F' suffix to create a literal of this type
error CS1002: 应输入 ;
【待续】
安装 vsc简体中文包 并重启切换vsc语言后,报错等信息即变为中文如:error CS1003: 语法错误,应输入“(”
常用命令
% dotnet new console -o ./CsharpProjects/TestProject
% dotnet build;dotnet run
https://learn.microsoft.com/en-us/training/modules/challenge-project-develop-branching-looping-structures-c-sharp/1-introduction
ms-dotnettools.csharp requested to download the .NET Runtime. ms-dotnettools.csharp requested to download the .NET Runtime. ms-dotnettools.csharp tried to install .NET 7.0.15~arm64 but that install had already been requested. No downloads or changes were made. Downloading .NET version(s) 7.0.15~arm64 …….. Done! .NET 7.0.15~arm64 executable path: /Users/xuanwu/Library/Application Support/Code/User/globalStorage/ms-dotnettools.vscode-dotnet-runtime/.dotnet/7.0.15~arm64/dotnet
安装.net core arm64
]]>个人看来,“难”是个很模糊且直接与畏难情绪相关的字眼,一直尽量避免对娃/学生交流时使用。不止数学等学科,任何生活相关技能都是。更重要的是,不想让自己觉得“难”的东西直接传到下一代。
娃的可塑性很强,且有天生的不畏难天赋,所谓初生牛犊不怕虎。
多试,大胆试,随便用什么办法试,无论试对试错,过程中就会学到不少,大人在恰当时机点拨一二,让他们知道解决方案不唯一,让他们自己体会孰长孰短,这是个人理想的教学。
可惜大多数情况下时间精力不允许,尽力而为吧。
一些相关随想:
如何看待初中学生大面积补课的现状?3 赞同 · 0 评论回答
单位换算的例子,看起来有点死记硬背。包括方程,也许结合应用题让其体会未知数的含义。
]]>这问题和把某家国内媒体收录的时评标以”中国媒体称xx“的标题大肆宣扬的某些外媒有何区别?
德国有很多媒体,很多撰稿人,很多编辑。
已所不欲勿施于人。
对了,美国不少产品把本地生产作为卖点之一,小城里一些居民在条件允许下优先支持本地商户。
即便相距万里,各地的人有很多共性。
平常心。
]]>小编为了赶上热榜,那么明显的“不,一”笔误都不顾啊。
2020年三月的三次美股熔断忘了?
美股可没有单天个股下跌幅度限制。
希望股市机制逐渐透明,让更多人明白“为何涨跌”,国内外都是。
一年前的分析回顾一下:
]]>当前开源软件的商业模式仍延续传统行业,尚未进一步挖掘开源尤其是商业数据的潜力。
延续 这个思路,开源软件项目的直接相关的工具和原材料包括:
间接相关的就更多如开发期间生活相关用品。
开源产生的数据包括软件开发历史,典型的有历次提交历史(对阅读代码相当有价值)、版本历史、问题讨论细节、悬赏任务 等。
这些尤其是直接相关的部分都可共享并从广而告之中获利。同时,不少软件开发工具或平台 对开源项目都有折扣甚至免费待遇,被优待者宣传一下合情合理。
总之,在向终端使用者收费的老路之外,可以尽早开拓与工具和材料提供者互相扶持进而节流、挖掘开源过程中产生数据的价值进而“开源”的新路。
]]>