对兼容各操作系统的Anki选择题模板的更新——提供更方便的笔记修改功能

2021年当我想做一个兼容各操作系统的Anki选择题模板的时候,到处搜索茧中网,根本找不到相关内容,直到偶然在github上看到Simon Lammer的Anki持久化模块,才算真正实现。现在再在茧中网上搜索兼容各种操作系统的Anki选择题模板,已经有很多结果了——我不免猜想是不是直接或间接从我这里得了点启示?如果真得了启示,也不用声明,不妨留个赞。^_^^_^只想拷贝卡片模版内容的可直接滚动到文末,无需看前面的更新说明。

后来看到一个anki插件Edit Field During Review(安装代码:1020366288),提供了在复习界面修改修改笔记内容的功能,十分方便。我对这个插件做了一点微小的修改,使它在复习界面修改笔记时不但可以修改文本内容,还支持用HTML标签改变文本的显示样式,插入表格和图片等,详见anki插件Edit Field During Review的使用及改造。当时有人说还是不够方便,因为还要靠手工输入HTML代码,如果直接有按钮一点就实现文字样式的修改那就好了。今年刚好又打算考试,于是弄个Anki题库帮助学习,复习的时候修改笔记,很多时候只是想把某些文字加个粗换个颜色突出显示一下,输入HTML代码确实比较麻烦,因此对原来的模板进行了更新,实现了在复习界面按几下按钮就改变被选择的文本的显示样式的功能。演示见下图:

目前,这个选择题模板设置有五个字段:Question——选择题题干;Options——选择题选项,Answer——正确答案;Extra——解析;Section——相关知识点所属教材章节。要让上面的演示图片中做的样式修改永久保存到笔记中,必须安装anki插件Edit Field During Review(安装代码:1020366288),并且必须要按照anki插件Edit Field During Review的使用及改造这篇文章的介绍修改插件的源代码,并且在模版中的字段前增加“edit:”过滤器,否则复习时的修改不能保存到笔记中。当然,如果不需要将复习时的修改保存到笔记中,就无需这个插件了。

除了插件支持外,笔记卡片的样式文件要包含如下内容:

/*说明:以下用u,a,i,b四个标签和4个css类定义相同的样式。
卡片背面模板中创建的临时HTML元素可以是u,a,i,b,也可以是span。
创建span元素时为不同样式指定不同类名,创建u,a,i,b时无需指定类名。
创建u,a,i,b时笔记最终保存的HTML字符串较短。
*/
u, .red{color:red;font-weight: bold;text-decoration:none;
}.orange, a,a:visited,a:hover,a:link,a:active{color:#F90;font-weight:bold;
}.green, i{font-weight: bold; font-style:normal;color: #0f0;
}.blue, b{ font-weight: bold; font-style:normal;color: #3cf;
}

卡片背面内容模版中添加以下HTML代码增加4个按钮:

<div id='styleButtons'> <button id="blue_bold">蓝色加粗</button><button id="red_bold">红色加粗</button><button id="green_bold">绿色加粗</button><button id="orange_bold">橙色加粗</button>
</div>

用于为以上按钮提供样式修改功能的JavaScript代码如下:

/*以下对在复习界面中选择的文本的显示样式进行处理*/var styleButtonDiv = document.getElementById('styleButtons');var styleButtons = styleButtonDiv.getElementsByTagName('button');for(i=0;i<styleButtons.length;i++){styleButtons[i].onclick=function(ev){var selection = document.getSelection();var selectStr = selection.toString();if (selectStr.trim() != '') {var rang = selection.getRangeAt(0);//卡片样式如果用u,b,i,a等标签名定义,只需声明tmpElevar tmpEle//卡片样式如果用.red之类的类名定义,可创建span元素//var tmpEle = document.createElement('span');var eleId=ev.target.getAttribute('id')//获取触发事件的元素的id				if(eleId=='blue_bold'){//如果是蓝色加粗按钮//用标签名定义样式,需创建相应样式的元素tmpEle = document.createElement('b');//用类名定义样式,为前面创建的span元素指定类名//tmpEle.className = 'blue';}else if(eleId=='red_bold'){//如果是红色加粗按钮//用标签名定义样式,需创建相应样式的元素tmpEle = document.createElement('u');//用类名定义样式,为前面创建的span元素指定类名//tmpEle.className = 'red';}else if(eleId=='green_bold'){//如果是绿色加粗按钮//用标签名定义样式,需创建相应样式的元素tmpEle = document.createElement('i');//用类名定义样式,为前面创建的span元素指定类名//tmpEle.className = 'green';}else{//如果是橙色加粗按钮//用标签名定义样式,需创建相应样式的元素tmpEle = document.createElement('a');//用类名定义样式,为前面创建的span元素指定类名//tmpEle.className = 'orange';}//将选中的文本插入临时元素内部rang.surroundContents(tmpEle);rang.deleteContents(); // 删除选中内容rang.insertNode(tmpEle); //插入临时元素替换内容} else {alert('请先选择文本!');}}}	

最后,将整个选择题卡片模板文件提供如下:

正面内容模板:

<script>
// v1.1.8 - https://github.com/SimonLammer/anki-persistence/blob/584396fea9dea0921011671a47a0fdda19265e62/script.js
if(void 0===window.Persistence){var e="github.com/SimonLammer/anki-persistence/",t="_default";if(window.Persistence_sessionStorage=function(){var i=!1;try{"object"==typeof window.sessionStorage&&(i=!0,this.clear=function(){for(var t=0;t<sessionStorage.length;t++){var i=sessionStorage.key(t);0==i.indexOf(e)&&(sessionStorage.removeItem(i),t--)}},this.setItem=function(i,n){void 0==n&&(n=i,i=t),sessionStorage.setItem(e+i,JSON.stringify(n))},this.getItem=function(i){return void 0==i&&(i=t),JSON.parse(sessionStorage.getItem(e+i))},this.removeItem=function(i){void 0==i&&(i=t),sessionStorage.removeItem(e+i)},this.getAllKeys=function(){for(var t=[],i=Object.keys(sessionStorage),n=0;n<i.length;n++){var s=i[n];0==s.indexOf(e)&&t.push(s.substring(e.length,s.length))}return t.sort()})}catch(n){}this.isAvailable=function(){return i}},window.Persistence_windowKey=function(i){var n=window[i],s=!1;"object"==typeof n&&(s=!0,this.clear=function(){n[e]={}},this.setItem=function(i,s){void 0==s&&(s=i,i=t),n[e][i]=s},this.getItem=function(i){return void 0==i&&(i=t),void 0==n[e][i]?null:n[e][i]},this.removeItem=function(i){void 0==i&&(i=t),delete n[e][i]},this.getAllKeys=function(){return Object.keys(n[e])},void 0==n[e]&&this.clear()),this.isAvailable=function(){return s}},window.Persistence=new Persistence_sessionStorage,Persistence.isAvailable()||(window.Persistence=new Persistence_windowKey("py")),!Persistence.isAvailable()){var i=window.location.toString().indexOf("title"),n=window.location.toString().indexOf("main",i);i>0&&n>0&&n-i<10&&(window.Persistence=new Persistence_windowKey("qt"))}}</script><!--正面模板-->
<div class="text" id="question">{{Question}}<span class='imp'>【所属章节:{{Section}}】<span></div>
<ol class="options" id="optionList"></ol>
<div id="options" style="display:none">{{Options}}</div>
<div id="answer" style="display:none">{{text:Answer}}</div><script>var myinfo;//if (Persistence.isAvailable()) {myinfo = Persistence.getItem();if (myinfo == null) {myinfo = {single: 0, //本次已做全部练习题中单选题数量singleCorrect: 0, //本次已做全部练习题中单选题正确数量multi: 0, //本次已做全部练习题中多选题数量multiCorrect: 0, //本次已做全部练习题中多选题完全正确数量partCorrect: 0, //本次已做全部练习题中多选部分正确数量multiScore: 0, //本次已做全部练习题中多选题得分score: 0, //当前所作练习题得分sum: 0, //本次已做全部练习题累计得分total: 0, //本次已做练习总数量totalScore: 0, //本次已做练习满分newOrderOps: [], //当前所作练习题打乱顺序后的选项newOrderAnswer: '', //当前所作练习题打乱选项顺序后新的正确答案编号choiced: '', //当前所作练习题选中的选项ifright: '' //当前所作练习题选中的选项是否正确};}myinfo.total++;myinfo.choiced = '';myinfo.newOrderAnswer = '';myinfo.newOrderOps = [];var question = document.getElementById("question");//读入答案,去掉多余字符和空格var correctAnswer = document.getElementById('answer').innerHTML.toUpperCase().replace(/[^A-Z]+/, "");if (correctAnswer.length > 1) { //正确答案大于一个为多选题myinfo.totalScore += 2;myinfo.multi++;question.innerHTML = "<span class='imp'>【多选题】</span>" + question.innerHTML;} else { //单选题  myinfo.totalScore++;myinfo.single++;question.innerHTML = "<span class='imp'>【单选题】</span>" + question.innerHTML;}var options = document.getElementById("options"),optionList = document.getElementById("optionList");var s = 0;var indexs = [];//处理原始顺序的选项,将div标签和br标签以及多余的换行替换掉var options = options.innerHTML;options = options.replace(/<\/?div>/g, "\n");options = options.replace(/\n+/g, "\n");options = options.replace(/<br.*?>/g, "\n");options = options.replace(/^\n/, "");options = options.replace(/\n$/, "");//以换行符分隔选项为数组options = options.split("\n");//随机组合选项for (var op in options) {//随机产生一个索引,如果产生的索引已处理过,继续产生下一个索引,没处理过就中断循环开始处理do {s = Math.random() * (options.length);s = Math.floor(s);if (indexs.join().indexOf(s.toString()) == -1) {indexs.push(s);myinfo.newOrderOps.push(options[s]);break;}} while (true);//将随机产生的选项组合成li包着的input和labellist = document.createElement("li");label = document.createElement("label");label.innerHTML = options[s];var input = document.createElement("input");//根据答案字符长短判定应该用多选框还是单选框input.type = correctAnswer.length > 1?"checkbox":"radio";input.value = s;input.name = "opts";//将选项成组,以防单选题可选择多个选项input.id = "opts_" + s;label.for = "opts_" + s;list.addEventListener("click", clickOption);list.appendChild(input);list.appendChild(label);optionList.appendChild(list);}for (i = 0; i < options.length; i++) {//将正确答案的字母序号转换成打乱顺序后的字母编号,并记录到myinfo.newOrderAnswer中if (correctAnswer.indexOf(String.fromCharCode(65 + indexs[i])) >= 0) {myinfo.newOrderAnswer += String.fromCharCode(65 + i);}}
Persistence.setItem(myinfo);//在选项li标签所在区域点击时,实际触发事件的可能是li、label或者input组件,无论是那个组件,都定位到checkboxfunction clickOption(ev) {var checkbox = ev.target;var tagName = checkbox.tagName;if (tagName == 'LI') {checkbox = checkbox.children[0];} else if (tagName == 'LABEL') {checkbox = checkbox.parentNode.children[0];}checkbox.checked = 'checked';var s = checkbox.value;//在打乱顺序后的索引数组中找到选项的新数字序号,再转换成对应的字母编号var ch = String.fromCharCode(65 + indexs.join('').indexOf(s.toString()));if (myinfo.choiced.indexOf(ch) == -1) {if(correctAnswer.length > 1){//多选题,在已选择项上加上一个新选项myinfo.choiced += ch;}else{//单选题,将已选择项变更为刚选的选项myinfo.choiced = ch;						}} else { //点击已选中的选项则取消该选项的选中状态myinfo.choiced = myinfo.choiced.replace(ch, '');checkbox.checked = null;}//if (Persistence.isAvailable()) {Persistence.setItem(myinfo);/*} else {window.myinfo = myinfo;}*///根据选项是否被选择赋予不同的显示样式for (var j=0;j<optionList.children.length;j++) {var ch = String.fromCharCode(65 + j)if (myinfo.choiced.indexOf(ch) == -1) {optionList.children[j].className = "unchoiced";} else {optionList.children[j].className = "choiced";}}}/*} else {//无法持久化js对象,只能针对单面单题练习}*/
</script>

背面内容模版:

<!--背面模板-->
<script>
// v1.1.8 - https://github.com/SimonLammer/anki-persistence/blob/584396fea9dea0921011671a47a0fdda19265e62/script.js
if(void 0===window.Persistence){var e="github.com/SimonLammer/anki-persistence/",t="_default";if(window.Persistence_sessionStorage=function(){var i=!1;try{"object"==typeof window.sessionStorage&&(i=!0,this.clear=function(){for(var t=0;t<sessionStorage.length;t++){var i=sessionStorage.key(t);0==i.indexOf(e)&&(sessionStorage.removeItem(i),t--)}},this.setItem=function(i,n){void 0==n&&(n=i,i=t),sessionStorage.setItem(e+i,JSON.stringify(n))},this.getItem=function(i){return void 0==i&&(i=t),JSON.parse(sessionStorage.getItem(e+i))},this.removeItem=function(i){void 0==i&&(i=t),sessionStorage.removeItem(e+i)},this.getAllKeys=function(){for(var t=[],i=Object.keys(sessionStorage),n=0;n<i.length;n++){var s=i[n];0==s.indexOf(e)&&t.push(s.substring(e.length,s.length))}return t.sort()})}catch(n){}this.isAvailable=function(){return i}},window.Persistence_windowKey=function(i){var n=window[i],s=!1;"object"==typeof n&&(s=!0,this.clear=function(){n[e]={}},this.setItem=function(i,s){void 0==s&&(s=i,i=t),n[e][i]=s},this.getItem=function(i){return void 0==i&&(i=t),void 0==n[e][i]?null:n[e][i]},this.removeItem=function(i){void 0==i&&(i=t),delete n[e][i]},this.getAllKeys=function(){return Object.keys(n[e])},void 0==n[e]&&this.clear()),this.isAvailable=function(){return s}},window.Persistence=new Persistence_sessionStorage,Persistence.isAvailable()||(window.Persistence=new Persistence_windowKey("py")),!Persistence.isAvailable()){var i=window.location.toString().indexOf("title"),n=window.location.toString().indexOf("main",i);i>0&&n>0&&n-i<10&&(window.Persistence=new Persistence_windowKey("qt"))}}</script><div id="performance">正确率:100%</div>
<hr />
<div class="text">{{edit:Question}}</div>
<ol class="options" id="optionList"></ol>
<hr />
<div id="key" class="text"><span class="small_text">上面的选项以<span class="green">此种形式</span>显示的为被你选中的正确选项,以<span class="blue">此种形式</span>显示的为未被你选中的正确选项,以<span class="wrong">此种形式</span>显示的不是正确选项却被你选中了。本题结果如下:</sapn><br/></div>
<hr>
<div class="extra"><sapn class="imp">【解析】</sapn><br>{{edit:Extra}}</div>
<div id='styleButtons'> <button id="blue_bold">蓝色加粗</button><button id="red_bold">红色加粗</button><button id="green_bold">绿色加粗</button><button id="orange_bold">橙色加粗</button>
</div><script>/*以下对在复习界面中选择的文本的显示样式进行处理*/var styleButtonDiv = document.getElementById('styleButtons');var styleButtons = styleButtonDiv.getElementsByTagName('button');for(i=0;i<styleButtons.length;i++){styleButtons[i].onclick=function(ev){var selection = document.getSelection();var selectStr = selection.toString();if (selectStr.trim() != '') {var rang = selection.getRangeAt(0);//卡片样式如果用u,b,i,a等标签名定义,只需声明tmpElevar tmpEle//卡片样式如果用.red之类的类名定义,可创建span元素//var tmpEle = document.createElement('span');var eleId=ev.target.getAttribute('id')//获取触发事件的元素的id				if(eleId=='blue_bold'){//如果是蓝色加粗按钮//用标签名定义样式,需创建相应样式的元素tmpEle = document.createElement('b');//用类名定义样式,为前面创建的span元素指定类名//tmpEle.className = 'blue';}else if(eleId=='red_bold'){//如果是红色加粗按钮//用标签名定义样式,需创建相应样式的元素tmpEle = document.createElement('u');//用类名定义样式,为前面创建的span元素指定类名//tmpEle.className = 'red';}else if(eleId=='green_bold'){//如果是绿色加粗按钮//用标签名定义样式,需创建相应样式的元素tmpEle = document.createElement('i');//用类名定义样式,为前面创建的span元素指定类名//tmpEle.className = 'green';}else{//如果是橙色加粗按钮//用标签名定义样式,需创建相应样式的元素tmpEle = document.createElement('a');//用类名定义样式,为前面创建的span元素指定类名//tmpEle.className = 'orange';}//将选中的文本插入临时元素内部rang.surroundContents(tmpEle);rang.deleteContents(); // 删除选中内容rang.insertNode(tmpEle); //插入临时元素替换内容} else {alert('请先选择文本!');}}}	/*以下处理对做题结果的判断和输出*/var myinfo;myinfo = Persistence.getItem();//计算成绩的函数function calcScore() {if (myinfo.choiced.length == 0) {myinfo.ifright = "为什么一个都不选?"myinfo.score = 0;} else {myinfo.score = 1;for (var i = 0; i < myinfo.choiced.length; i++) {if (myinfo.newOrderAnswer.indexOf(myinfo.choiced.charAt(i)) == -1) {myinfo.score = 0;myinfo.ifright = "错误";break;}}if (myinfo.score != 0) {if (myinfo.newOrderAnswer.length == 1) {myinfo.singleCorrect++;myinfo.score = 1;myinfo.ifright = "完全正确";} else {if (myinfo.choiced.length == myinfo.newOrderAnswer.length) {myinfo.multiCorrect++;myinfo.multiScore += 2;myinfo.score = 2;myinfo.choiced = myinfo.newOrderAnswer;myinfo.ifright = "完全正确";} else {myinfo.partCorrect++;myinfo.score = myinfo.choiced.length * 0.5;myinfo.multiScore += myinfo.score;myinfo.ifright = "不完全正确";}}}}myinfo.sum += myinfo.score;Persistence.setItem(myinfo);}//显示选项var optionOl = document.getElementById("optionList");ops = myinfo.newOrderOps;for (var i = 0; i < ops.length; i++) {var ch = String.fromCharCode(65 + i);list = document.createElement("li");label = document.createElement("label");label.innerHTML = ops[i];var input = document.createElement("input");//根据选择的答案是否有多个字符判断应选用多选框还是单选框input.type = myinfo.choiced.length > 1?"checkbox":"radio";list.appendChild(input);list.appendChild(label);optionOl.appendChild(list);if (myinfo.newOrderAnswer.indexOf(ch) >= 0) {if (myinfo.choiced.indexOf(ch) >= 0) {list.className = 'green';input.checked = 'checked';} else {list.className = 'blue';}} else {if (myinfo.choiced.indexOf(ch) >= 0) {list.className = 'wrong';input.checked = 'checked';} else {list.className = 'unchoiced'}}}//显示成绩calcScore();var performance = document.getElementById("performance");var key = document.getElementById("key");var total = myinfo.single + myinfo.multi;if (typeof(myinfo) != "undefined") {var singlePer = myinfo.single == 0 ? "100.00" :((myinfo.singleCorrect / myinfo.single) * 100).toFixed(2);var multiErr = myinfo.multi - myinfo.multiCorrect - myinfo.partCorrectvar multiPer = myinfo.multi == 0 ? "100.00" :((myinfo.multiScore / (myinfo.multi * 2)) * 100).toFixed(2);var scorePer = ((myinfo.sum / myinfo.totalScore) * 100).toFixed(2)performance.innerHTML = "本次练习<span class='imp'>" + total +"</span>题---单选题<span class='imp'>" + myinfo.single +"</span>题---多选题<span class='imp'>" + myinfo.multi +"</span>题;<br>单选正确<span class='imp'>" + myinfo.singleCorrect +"</span>题---单选正确率<span class='imp'>" + singlePer +"%</span>;<br>多选正确<span class='imp'>" + myinfo.multiCorrect +"</span>题---多选部分正确<span class='imp'>" + myinfo.partCorrect +"</span>题---多选错误<span class='imp'>" + multiErr +"</span>题---多选得分<span class='imp'>" + myinfo.multiScore +"</span>分---多选得分率<span class='imp'>" + multiPer +"%</span>;<br>累计得分:<span class='imp'>" + myinfo.sum +"</span>分---已做题目满分<span class='imp'>" + myinfo.totalScore +"</span>分---得分率<span class='imp'>" + scorePer + "%</span>";key.innerHTML += "<div>正确答案:<span class='imp'>" + myinfo.newOrderAnswer +";</span>你的答案:<span class='imp'>" + myinfo.choiced +";</span>结果判定:<span class='imp'>" +myinfo.ifright + "</span>;本题得分:<span class='imp'>" +myinfo.score + "</span>。</div>";}//} else {}
</script>

样式:

.card { font-family: Cambria-modify,Aa虎头虎脑,哈天随性体,干就完事了简,微软雅黑; font-size:1.3em; text-align:left; color: white; background-color:#000000;}table{border-collapse:collapse; }td{padding:5px;text-align:center;border:2px solid green;vertical-align: middle;}td.left{text-align:left;}td.red{border-right: solid thick red;}span {display:inline-block;}hr{border: none;height: 5px;background-color:yellow;}p{text-indent:2em;}div{margin:5px auto }.text{color:#ff0;font-weight:bold;font-size:1.2em;}.orange, .imp,a, a:visited,a:hover,a:link,a:active{color:#F90;font-weight:bold;}u, .red{color:red;font-weight: bold;text-decoration:none;}.unchoiced{ color: white;}.choiced{font-weight: bold; color: #f00;background-color:green;}.extra{ margin-top:15px; font-size:1.2em; color: #eeeebb; text-align:left;line-height:1.5em;}.green,i{  font-weight: bold; font-style:normal;color: #0f0;}.blue,b{ font-weight: bold; font-style:normal;color: #3cf;}.wrong{  font-weight: bold;  color: red;text-decoration:line-through;}.options{ list-style:upper-latin;font-size:1.2em;}.options *{ cursor:pointer;}.options *:hover[class="options"]{ font-weight:bold;color: #f90;}.options li{ margin-top:0.8em;}/*下面两行样式定义决定是否显示选项前面的圆形或方形框,注释掉就会显示*/.options input[type="radio"]{display:none;}.options input[type="checkbox"]{display:none;}#performance{ text-align:left; font-size:16px;}0

最后说明:由于本文的功能用到了Anki插件,因此不支持插件的安卓和iOS版的Anki不能应用本文的功能。本文在windows11及Anki2.1.54上完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/32511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android蓝牙开发(一)之打开蓝牙和设备搜索

private BluetoothManager bluetoothmanger; private​ BluetoothAdapter bluetoothadapter; /** 判断设备是否支持蓝牙 */ bluetoothmanger (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); bluetoothadapter bluetoothmanger.getAdapter(); if (bl…

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell Jenkins弱口令 默认用户一般为jenkins/jenkins 使用admin/admin123登陆成功 Jenkins反弹shell 格式为 println"命令".execute().text 在/tmp目录中生成shell.sh文件&#xff0c;并向其中写入反弹shell的语句 new…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 局域网中的服务器个数(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

keepalived高可用,nginx+keepalived+apache架构的实现

目 录 一、概述&#xff1a; 二、实验架构图如图所示&#xff1a; 三、实验环境&#xff1a; 四、实现效果&#xff1a; 五、实验解析及步骤&#xff1a; 六、具体实现&#xff1a; 6.1 先关闭防火墙和核心防护&#xff1a;两条命令&#xff1a; 6.2 后端apache服务…

头歌资源库(16)分苹果

一、 问题描述 二、算法思想 首先&#xff0c;我们可以初始化一个数组apple来记录每个孩子分配的苹果数量&#xff0c;将所有元素初始化为1&#xff0c;表示每个孩子至少分配到一个苹果。 然后&#xff0c;从左到右遍历评分数组ratings&#xff0c;判断当前孩子的评分与前一个…

文件操作<C语言>

导言 平时我们在写程序时&#xff0c;在运行时申请内存空间&#xff0c;运行完时内存空间被收回&#xff0c;如果想要持久化的保存&#xff0c;我们就可以使用文件&#xff0c;所以下文将要介绍一些在程序中完成一些文件操作。 目录 导言 文件流 文件指针 文件的打开与关闭 …

Android进程间通信 Messenger详解

//这里服务端Service是运行在单独的进程中的 android:process“:other” class MessengerService : Service() { private lateinit var mMessenger: Messenger override fun onBind(intent: Intent): IBinder { log(TAG, “onBind~”) //传入Handler实例化Messenger mMes…

Golang | Leetcode Golang题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; func calculateMinimumHP(dungeon [][]int) int {n, m : len(dungeon), len(dungeon[0])dp : make([][]int, n 1)for i : 0; i < len(dp); i {dp[i] make([]int, m 1)for j : 0; j < len(dp[i]); j {dp[i][j] math.MaxInt32}}dp[…

mysql数据库切换成kingbase(人大金仓)数据库时遇到的字段不存在问题

一、问题描述 mysql数据库切换成国产数据库人大金仓&#xff08;kingbase&#xff09;数据库的遇到的字段不存在的问题,根本原因其实是没有找到相对应的表&#xff0c;报错示例如下图所示&#xff1a; 二、问题解决 1、如果所有的表都发生上述的错误&#xff0c;kingbase的…

基于matlab的不同边缘检测算子的边缘检测

1 原理 1.1 边缘检测概述 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;其目的在于标识数字图像中亮度变化明显的点。这些变化通常反映了图像属性的重要事件和变化&#xff0c;如深度不连续、表面方向不连续、物质属性变化和场景照明变化等。边缘检测在特征提取中…

OSPF 2类LSA详解

概述 上图为2类LSA : Network LSA 的报文格式 , 我们重点关注3个报文字段即可 , 其他内容没有实际的信息 Link State ID : DR的接口IP地址 Network Mask : 该MA网络的掩码 Attached Router : 连接在该MA网络的所有路由器的Router ID 2类LSA一定是DR产生的 , 关于OSPF DR的细节…

数据结构之二叉树的超详细讲解(3)--(二叉树的遍历和操作)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 数据结构之二叉树的超详细讲解(3)--(二叉树链式结构的实现) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在…

展讯-QMI8658和气压传感器驱动调试

1.调试QMI8658 参考demo&#xff0c;添加QMI8610相关内容 当前驱动路径位于&#xff1a;bsp/modules/input/misc/qmi8610/qmi8610.c 编译使用make sockoimage 用fastboot烧录 1.确定驱动被正常加载 代码添加之后&#xff0c;首先确定有没有进入当前驱动文件 dmesg |grep …

如何用GO语言实现冒泡排序算法?

本章教程,介绍一下如何用GO语言实现基础排序算法中的冒泡排序。 一、程序代码 package mainimport ("fmt""math/rand""time" )// bubbleSort 函数实现冒泡排序算法 func bubbleSort(arr []int) {n

32 - 判断三角形(高频 SQL 50 题基础版)

32 - 判断三角形 select *,if(xy>z and xz>y and zy > x,Yes,No) triangle fromTriangle;

Day9 —— 大数据技术之ZooKeeper

ZooKeeper快速入门系列 ZooKeeper的概述什么是ZooKeeper&#xff1f;ZooKeeper的特点和功能使用ZooKeeper的原因 ZooKeeper数据模型ZooKeeper安装ZooKeeper配置ZooKeeper命令行操作常见服务端命令 ZooKeeper的概述 什么是ZooKeeper&#xff1f; ZooKeeper是一个开源的分布式协…

jarvisoj_level2

首先检查checksec 可以看见no canary found 说明可能是栈溢出 运行一下程序 随便输一个,得到hello world(感觉这一步好像没啥用,没有RE那用) IDA 32 打开 后门 漏洞点 buf: 代码思路:利用溢出,把buf填满,然后构造程序,得到获取shell的目的 exp来自 BUUCTF—jarvisoj_level…

【Qt】学习Day1

文章目录 Qt简介创建第一个Qt程序创建过程介绍main函数工程文件头文件控件源文件快捷键按钮控件常用API对象树坐标系 信号和槽自定义信号自定义槽函数触发自定义的信号案例-下课后&#xff0c;老师触发饿了信号&#xff0c;学生响应信号&#xff0c;请客吃饭重载信号连接信号La…

Paxos分布式共识算法

Paxos分布式共识算法 一、简介 Paxos算法是由莱斯利兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。它主要用于解决分布式系统中如何就某个值达成一致&#xff0c;并保证整个系统的一致性&#xff0c;即使在部分节点发生故障的情况下…

论文浅尝 | 基于生成模型的多模态实体链接

笔记整理&#xff1a;郭凌冰&#xff0c;浙江大学博士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/abs/2306.12725 1. 动机 多模态实体链接&#xff08;Multimodal Entity Linking&#xff0c;MEL&#xff09;旨在将带有多模态上下文的提及映射到知识库…