一、字段设计

1、Question:选择题题干;

2、Options:选择题选项;

3、Answer:正确答案;

4、Extra:题目解析等附加信息。

二、目标

选择题计分规则为:单选正确得1分,错误得0分;多选如选择错误选项得0分,完全正确得2分,没有错误选项但是正确选项选择不完整(部分正确),所选的每个选项得0.5分。卡片正面显示题干和选项,选择选项后,点击显示答案进入背面,背面显示正确答案,累计得分,单多选题正确率等情况及解析信息。其中,正面显示的选项顺序随机排列,背面显示的选项顺序与正面要一致。正面和背面显示内容见以下图示。

正面:

背面

背面做错时:

三、实现分析

有个Monokai风格的选择题模板在windows系统里基本实现了上述功能,但不能跨平台,另外我原来下载的那个版本js代码也写得稀乱的(特别是选项组合部分,居然用字符串拼接而不用DOM操作),不过只要解决跨平台问题以及重新改写下js代码就可以达到目的了。实现以上功能的关键在于将做练习时在正面所选择的选项以及正面显示的选项顺序传递到背面,此外还需要在整个一次练习中共享已做练习数量、已做练习正误情况及得分等信息。要在记忆卡正面和背面以及不同练习题之间共享信息,就需要将这些信息用js脚本持久化。而不同平台(windows、mac、android、ios、linux等)对js对象持久化的支持并不统一,anki本身在不同平台上的实现在对卡片的解析方式也不统一,Anki的android客户端没有持久化的窗口属性,而桌面客户端不允许使用sessionStorage属性,对于linux和mac 2.1客户端,还需要额外的考虑:window属性,在审查模式下是持久的,在预览模式下是存在的--但不是持久的。github上有一个项目anki-persistence,提供了兼容各种平台实现anki中js对象持久化的功能,作者为Simon Lammer。该脚本内容如下:

// v0.5.3 - https://github.com/SimonLammer/anki-persistence/blob/7107e73086189c190c4d326ef11ebbcded9a08c6/script.jsif (void 0 === window.Persistence) {var _persistenceKey = "github.com/SimonLammer/anki-persistence/",_defaultKey = "_default";if (window.Persistence_sessionStorage = function() {var e = !1;try {"object" == typeof window.sessionStorage && (e = !0, this.clear = function() {for (var e = 0; e < sessionStorage.length; e++) {var t = sessionStorage.key(e);0 == t.indexOf(_persistenceKey) && (sessionStorage.removeItem(t), e--)}}, this.setItem = function(e, t) {void 0 == t && (t = e, e = _defaultKey), sessionStorage.setItem(_persistenceKey + e, JSON.stringify(t))}, this.getItem = function(e) {return void 0 == e && (e = _defaultKey), JSON.parse(sessionStorage.getItem(_persistenceKey + e))}, this.removeItem = function(e) {void 0 == e && (e = _defaultKey), sessionStorage.removeItem(_persistenceKey + e)})} catch (e) {}this.isAvailable = function() {return e}}, window.Persistence_windowKey = function(e) {var t = window[e],i = !1;"object" == typeof t && (i = !0, this.clear = function() {t[_persistenceKey] = {}}, this.setItem = function(e, i) {void 0 == i && (i = e, e = _defaultKey), t[_persistenceKey][e] = i}, this.getItem = function(e) {return void 0 == e && (e = _defaultKey), void 0 == t[_persistenceKey][e] ? null : t[_persistenceKey][e]}, this.removeItem = function(e) {void 0 == e && (e = _defaultKey), delete t[_persistenceKey][e]}, void 0 == t[_persistenceKey] && this.clear()), this.isAvailable = function() {return i}}, window.Persistence = new Persistence_sessionStorage, Persistence.isAvailable() || (window.Persistence = new Persistence_windowKey("py")), !Persistence.isAvailable()) {var titleStartIndex = window.location.toString().indexOf("title"),titleContentIndex = window.location.toString().indexOf("main", titleStartIndex);titleStartIndex > 0 && titleContentIndex > 0 && titleContentIndex - titleStartIndex < 10 && (window.Persistence = new Persistence_windowKey("qt"))}}

此脚本有两个独立的持久性的内部实现:Persistence_sessionStorage和Persistence_windowKey。前者使用sessionStorage属性,而后者将一个新的属性附加到窗口对象现有的持久化(不会在anki记忆卡的正面和背面之间改变)属性上,并使用该附加属性来持久化和检索数据。使用方法是在正面模板和背面模板最开头用<script>标签将上述脚本包裹起来,在需要持久化js对象时调用Persistence.setItem(value)方法(当然还有Persistence.setItem(key, value)方法,具体见上述脚本代码),在需要读出持久化的对象时调用Persistence.getItem()方法。利用Simon Lammer的anki-persistence脚本,实现如前所述的选择题模板如下:

1、正面模板

<script>
// v0.5.3 - https://github.com/SimonLammer/anki-persistence/blob/7107e73086189c190c4d326ef11ebbcded9a08c6/script.js
if(void 0===window.Persistence){var _persistenceKey="github.com/SimonLammer/anki-persistence/",_defaultKey="_default";if(window.Persistence_sessionStorage=function(){var e=!1;try{"object"==typeof window.sessionStorage&&(e=!0,this.clear=function(){for(var e=0;e<sessionStorage.length;e++){var t=sessionStorage.key(e);0==t.indexOf(_persistenceKey)&&(sessionStorage.removeItem(t),e--)}},this.setItem=function(e,t){void 0==t&&(t=e,e=_defaultKey),sessionStorage.setItem(_persistenceKey+e,JSON.stringify(t))},this.getItem=function(e){return void 0==e&&(e=_defaultKey),JSON.parse(sessionStorage.getItem(_persistenceKey+e))},this.removeItem=function(e){void 0==e&&(e=_defaultKey),sessionStorage.removeItem(_persistenceKey+e)})}catch(e){}this.isAvailable=function(){return e}},window.Persistence_windowKey=function(e){var t=window[e],i=!1;"object"==typeof t&&(i=!0,this.clear=function(){t[_persistenceKey]={}},this.setItem=function(e,i){void 0==i&&(i=e,e=_defaultKey),t[_persistenceKey][e]=i},this.getItem=function(e){return void 0==e&&(e=_defaultKey),void 0==t[_persistenceKey][e]?null:t[_persistenceKey][e]},this.removeItem=function(e){void 0==e&&(e=_defaultKey),delete t[_persistenceKey][e]},void 0==t[_persistenceKey]&&this.clear()),this.isAvailable=function(){return i}},window.Persistence=new Persistence_sessionStorage,Persistence.isAvailable()||(window.Persistence=new Persistence_windowKey("py")),!Persistence.isAvailable()){var titleStartIndex=window.location.toString().indexOf("title"),titleContentIndex=window.location.toString().indexOf("main",titleStartIndex);titleStartIndex>0&&titleContentIndex>0&&titleContentIndex-titleStartIndex<10&&(window.Persistence=new Persistence_windowKey("qt"))}}</script><!--正面模板-->
<div class="text" id="question">{{Question}}</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: '' //当前所作练习题选中的选项是否正确};}} else {
/*如果Persistence.isAvailable()返回false,就只能指望window持久化属性还能工作,那么至少支持
window持久化属性的平台可以正常使用(实际上至本文为止Persistence.isAvailable()在做练习时还没
返回过false,但在windows平台编辑模板时会返回false,鉴于这一情况,实际上对于
Persistence.isAvailable()的if-else判断可以删掉以简化代码,这里还是保留这个判断*/myinfo = window.myinfo;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 optionList = document.getElementById("optionList"),options = document.getElementById("options");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 = "checkbox";input.value = 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);function clickOption(ev) {//在选项li标签所在区域点击时,实际触发事件的可能是li、label或者input组件,无论是那个组件,都定位到checkboxvar checkbox = ev.target;var tagName = checkbox.tagName;if (tagName == 'LI') {checkbox = checkbox.children[0];} else if (tagName == 'LABEL') {checkbox = checkbox.parentNode.children[0];}        var s = checkbox.value;//在打乱顺序后的索引数组中找到选项的新数字序号,再转换成对应的字母编号var ch = String.fromCharCode(65 + indexs.join('').indexOf(s.toString()));if (myinfo.choiced.indexOf(ch) == -1) {//点击的选项没有被选中myinfo.choiced += ch;checkbox.checked = 'checked';} else { //点击已选中的选项则取消该选项的选中状态myinfo.choiced = myinfo.choiced.replace(ch, '');checkbox.checked = null;}//选项被点击后状态发生变化,持久化改变后的状态if (Persistence.isAvailable()) {Persistence.setItem(myinfo);} else {window.myinfo = myinfo;}//改变被点击的选项的外观checkbox.parentNode.className == "choiced" ? "unchoiced" : "choiced";}
</script>

2、背面模板

<!--背面模板-->
<script>
// v0.5.3 - https://github.com/SimonLammer/anki-persistence/blob/7107e73086189c190c4d326ef11ebbcded9a08c6/script.js
if(void 0===window.Persistence){var _persistenceKey="github.com/SimonLammer/anki-persistence/",_defaultKey="_default";if(window.Persistence_sessionStorage=function(){var e=!1;try{"object"==typeof window.sessionStorage&&(e=!0,this.clear=function(){for(var e=0;e<sessionStorage.length;e++){var t=sessionStorage.key(e);0==t.indexOf(_persistenceKey)&&(sessionStorage.removeItem(t),e--)}},this.setItem=function(e,t){void 0==t&&(t=e,e=_defaultKey),sessionStorage.setItem(_persistenceKey+e,JSON.stringify(t))},this.getItem=function(e){return void 0==e&&(e=_defaultKey),JSON.parse(sessionStorage.getItem(_persistenceKey+e))},this.removeItem=function(e){void 0==e&&(e=_defaultKey),sessionStorage.removeItem(_persistenceKey+e)})}catch(e){}this.isAvailable=function(){return e}},window.Persistence_windowKey=function(e){var t=window[e],i=!1;"object"==typeof t&&(i=!0,this.clear=function(){t[_persistenceKey]={}},this.setItem=function(e,i){void 0==i&&(i=e,e=_defaultKey),t[_persistenceKey][e]=i},this.getItem=function(e){return void 0==e&&(e=_defaultKey),void 0==t[_persistenceKey][e]?null:t[_persistenceKey][e]},this.removeItem=function(e){void 0==e&&(e=_defaultKey),delete t[_persistenceKey][e]},void 0==t[_persistenceKey]&&this.clear()),this.isAvailable=function(){return i}},window.Persistence=new Persistence_sessionStorage,Persistence.isAvailable()||(window.Persistence=new Persistence_windowKey("py")),!Persistence.isAvailable()){var titleStartIndex=window.location.toString().indexOf("title"),titleContentIndex=window.location.toString().indexOf("main",titleStartIndex);titleStartIndex>0&&titleContentIndex>0&&titleContentIndex-titleStartIndex<10&&(window.Persistence=new Persistence_windowKey("qt"))}}</script><div id="performance">正确率:100%</div>
<hr />
<div class="text">{{Question}}</div>
<ol class="options" id="optionList"></ol>
<hr />
<div id="key" class="cloze">正确答案:{{text:Answer}}</div>
<hr>
<div class="extra"><sapn class="cloze2">【解析】</sapn><br>{{Extra}}</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: '' //当前所作练习题选中的选项是否正确};}} else {myinfo = window.myinfo;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: '' //当前所作练习题选中的选项是否正确};}}//计算成绩的函数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;if (Persistence.isAvailable()) {Persistence.setItem(myinfo);} else {window.myinfo = myinfo;}}//显示选项var optionOl = document.getElementById("optionList");for (var i = 0; i < myinfo.newOrderOps.length; i++) {var ch = String.fromCharCode(65 + i);list = document.createElement("li");label = document.createElement("label");label.innerHTML = myinfo.newOrderOps[i];var input = document.createElement("input");input.type = "checkbox";list.appendChild(input);list.appendChild(label);optionOl.appendChild(list);if (myinfo.newOrderAnswer.indexOf(ch) >= 0) {//该选项为正确选项if (myinfo.choiced.indexOf(ch) >= 0) {//设置被选择的正确选项外观list.className = 'cloze';input.checked = 'checked';} else {//设置未被选择的正确选项外观,起提示正确答案作用list.className = 'cloze2';}} else {//该选项为错误选项if (myinfo.choiced.indexOf(ch) >= 0) {//设置被选择的错误选项外观list.className = 'wrong choiced';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 = "正确答案:<span class='imp'>" + myinfo.newOrderAnswer +";</span>你的答案:<span class='imp'>" + myinfo.choiced +";</span>结果判定:<span class='imp'>" +myinfo.ifright + "</span>;本题得分:<span class='imp'>" +myinfo.score + "</span>。";}
</script>

3、样式

.card { font-family: 微软雅黑; font-size:16px; text-align:left; color: white; background-color:#272822;}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;}hr{border: none;height: 5px;background-color:yellow;}p{text-indent:2em;}div{margin:5px auto }.vertical {  width: 20px;  margin: 0 auto;  line-height: 24px;  font-size: 20px;}.text{color:#e6db74; text-align:left;}.imp{color:red;font:normal bold 16px 微软雅黑,sans-serif;}.hint{color:#a6e22e;}.unchoiced{ color: white;}.choiced{font-weight: bold; color: yellow;}.extra{ margin-top:15px; font-size:16px; color: #eeeebb; text-align:left;}.cloze{  font-weight: bold; color: green;}.cloze2{ font-weight: bold; color: blue;}.wrong{  font-weight: bold;  color: red;text-decoration:line-through;}.options{ list-style:upper-latin;}.options *{ cursor:pointer;}.options *:hover{ font-weight:bold;color: #eeeebb;}.options li{ margin-top:0.8em;}#performance{ text-align:left; font-size:16px;}
</style>

上述模板中js代码逻辑比较简单,并且有不少注释,不再细述。代码有些是拷贝的以前的,所以风格不完全一致,也没有做模块化的函数包装,各位可以自行优化。css样式最小的需要只有代码里出现过的类名需要定义,上面的样式可以简化以及重新编写,仅供参考。此前在csdn中看到一篇帖子问pc可以正常运行的选择题模板为什么在手机上不能正确运行,当时我回了个帖子说有空了直接贴代码,希望那一位真的能看到这个代码。顺便说下,我用这个模板做了全套一建二建的题库,使用效果良好。

兼容各操作系统平台的Anki选择题库模板相关推荐

  1. java.library.path hadoop_java - Hadoop“无法为您的平台加载native-hadoop库”警告

    java - Hadoop"无法为您的平台加载native-hadoop库"警告 我目前正在运行CentOs的服务器上配置hadoop. 当我运行hadoop-env.sh或sto ...

  2. 计算机基础知识题库选择题,计算机基础知识篇选择题库

    计算机基础知识篇选择题库 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 15.9 积分 计算机基础知识篇选择题库1.微型计算机的性能指标不包括___ ...

  3. 大数据可视化模板、模板框架、动态控件、可视化大数据原型、监控平台、图表元件库、数据看板、驾驶舱、统计图表、大数据驾驶舱、大屏展示、联勤治理、旅游、运输、车辆、校园、舆情、信息监测看板原型

    大数据可视化模板.模板框架.动态控件.可视化大数据原型.监控平台.图表元件库.数据看板.驾驶舱.统计图表.大数据驾驶舱.大屏展示.智慧安防.党建.旅游.运输.医疗.校园.工业园区环境监测看板原型 适用 ...

  4. windows平台的游戏运行库

    每一个都在PC上玩过游戏的人,都知道要安装一些必备的游戏运行库,游戏才能运行,这里指的PC是特指Windows操作系统平台.一般来说最常见的运行库是DirectX.Microsoft Visual C ...

  5. 如何在龙芯架构和国产化操作系统平台上运行javacv

    前言 在上一篇中讲到,在全面国产化替换即将到来之时,聊聊如何在国产芯片龙头"龙芯"和国产操作系统平台上运行c/c++.java.nodejs.等编程语言,go/rust等静态编译型 ...

  6. 大数据可视化模板、模板框架、动态控件、可视化大数据原型、监控平台、图表元件库、数据看板、驾驶舱、统计图表、大数据驾驶舱、大屏展示、智慧安防、党建、旅游、运输、医疗、校园、工业园区环境监测看板原型

    大数据可视化模板.模板框架.动态控件.可视化大数据原型.监控平台.图表元件库.数据看板.驾驶舱.统计图表.大数据驾驶舱.大屏展示.智慧安防.党建.旅游.运输.医疗.校园.工业园区环境监测看板原型 适用 ...

  7. 工商管理学计算机应用基础题,计算机应用基础全国网考选择题库(计算机基础知识篇).pdf...

    计算机应用基础全国网考选择题库(计算机基础知识篇).pdf 1 2010 年计算机应用基础全国网考选择题库(计算机基础知识篇) (注计算机应用基础题库已变更,原教材附带蓝色光盘内选择题库不全.) 1. ...

  8. 欢迎中国工商银行浙江分行正式加入龙蜥社区,打造 Linux 操作系统平台

    近日,龙蜥社区(OpenAnolis)在理事成员单位综合评估中国工商银行股份有限公司浙江省分行公司的发展.行业口碑等多维度企业实力后,经过一致评审讨论,决定正式接受中国工商银行浙江省分行加入龙蜥社区, ...

  9. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system )

    文章目录 一.运行环境搭建 Android 模拟器安装 二.拷贝 Android 平台可执行文件和动态库到 /data/system 目录下 一.运行环境搭建 Android 模拟器安装 使用低版本的 ...

最新文章

  1. 创业公司如何巧用工具提高团队生产力——豌豆荚创始人王俊煜讲述团队背后的“利器”...
  2. 日产ftt传感器是什么_日产将发布最牛自动驾驶:选最棒的陪驾,走最快的车道...
  3. linux复制目录命令夹,linux复制目录(文件夹)和打包命令
  4. linux自动挂载windows磁盘
  5. poi生成word不可以修改_操作不懂技术就可以做小程序无限生成平台的创业项目实操教程...
  6. java 求集合真子集_【同步练习】高一高中数学必修1集合的关系与元素性质
  7. CSDN《IT人才成长路线图》重磅开源!60+ 专家,13 个技术领域,绘出 35 张图谱...
  8. 通常情况下登录linux桌面环境需要,在通常情况下,登录Linux桌面环境,需要。...
  9. linux第三课:一些注意点
  10. python编写简单运动会管理系统
  11. java freepascal_Free Pascal
  12. linux zip文件无法解压,无法解压zip文件在linux centos
  13. 随机过程(联合平稳随机过程)
  14. 读v_JULY_v整理笔试题博客有感,整理些答案。
  15. 计算机专业技术个人小结,计算机专业技术个人小结.doc
  16. ue富文本编辑器使用
  17. cat3速度 rj45_RJ45公对母延长线 网络线纯铜cat5宽带5类0.3米长线
  18. 非期望产出的sbm模型_兼顾非期望产出的工业用地效率测度、分异与溯因 ——以东北三省为例...
  19. 基于时延法的麦克风阵列声源定位分析
  20. centos7 安装mysql5.7.37 实操说明

热门文章

  1. App Store,“穷人靠变异”的爬虫路
  2. nRF 扫描条件过滤做法
  3. MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
  4. 用python制作电子时钟包装_使用电子水墨屏和树莓派制作的时钟,Epaper_clock
  5. 用ps增加照片的气氛--镜头光晕
  6. 对接科大讯飞AIUI心得
  7. stata最大值最小值命令_用Stata实现数据标准化
  8. 成为一名合格Android架构师,移动APP开发框架盘点,面试资料分享
  9. 互联网公司的中台到底是什么
  10. 新一代云数据库的引领者---AWS