by kevin
16.
一月 2021 16:13
>
github上有个项目roadmap,归纳了一下it岗位的学习路线,前端和后端的东西我帮到这里。 项目地址:https://github.com/github/roadmap 前端 后端
by kevin
2.
十一月 2020 10:18
>
没有直接的方法,变通的方法是外层加一个th:block,内层写一个或者多个th:if和th:unless。 举个例子: 1: <th:block th:each="i:${#numbers.sequence(0,10)}" >
2: <a class="active" href="javascript:void(0);" th:if="${i==5" th:text="${i}"></a>
3: <a th:href="/${i}" th:unless="${i==5}" th:text="${i}"></a>
4: </th:block>
by kevin
4.
十月 2020 09:20
>
新鲜 飞机靠近地面飞行时,机翼和下方的平面之间会形成气压,这会在飞机下方形成空气垫。这被称为机翼的地面效应,简称 WIG。 冷战期间,苏联利用这个效应,研发了大型的水上飞行器 Ekranoplan。它看上去像飞机,但其实是气垫船,只能在水面上升起十厘米左右。它有八台前置涡轮喷气发动机,最高时速达到每小时600公里。 资源分享 MacOS 的安全和隐私指南 https://github.com/drduh/macOS-Security-and-Privacy-Guide/blob/master/README-cn.md 言论 科技是一种力量,决定它是工具还是武器,取决于使用科技力量的人。 “武”是“止”和“戈”组成的。 经济的意思是在相互联系的基础上进行帮助。 大数据以为的大范围和大规模的数据,当然也意味着大投入。 我深知我的情绪感染不了你,所以我不言不语。 有能力的做选择题,没能力的做必答题。 旅游和读书,其实都是去感知世界。 军队为什么要实行军衔制度?这是为了部队被打散,临时拼建时,能够迅速确定指挥关系。 人权就像是消防队。只有当你处于危险境地,才会在意其存在。 你会在20个方向上走一步,还是在一个方向上走20步? 理性的人使自己适应世界,不理性的人不愿意妥协,坚持要求世界适应他的方式。因此,一切进步都取决于不理性的人。 大公司如何合法避税 有一家世界著名的大型互联网公司,姑且称它为 X 公司,每年有500亿美元的收入。这家公司希望能够合法少缴税。 它就先在开曼群岛,注册了一家 Y 公司。开曼群岛不对公司收税,只收取注册费。然后,它把所有的知识产权,比如商标和特许技术都转移到 Y 公司。 X 公司每年需要向 Y 公司支付很大一笔知识产权许可费用,导致它的利润为零,所以就不用缴税了。而 Y 公司由于注册在开曼群岛,即使有很大一笔利润,也不用缴税。
by kevin
6.
九月 2020 14:34
>
定义 Thymeleaf是一个Java库。它是一个XML / XHTML / HTML5模板引擎,能够对模板文件应用一组转换,以显示应用程序生成的数据和文本。 它更适合在Web应用程序中提供XHTML / HTML5服务,但是它可以处理任何XML文件,无论是在Web中还是在独立应用程序中。 Thymeleaf的主要目标是提供一种优雅且格式正确的模板创建方法。为了实现这一点,它基于XML标签和属性,这些属性定义了DOM(文档对象模型)上预定义逻辑的执行,而不是将该逻辑作为模板中的代码显式编写。 它的体系结构允许依靠已解析文件的智能缓存来快速处理模板,以便在执行过程中使用尽可能少的I / O操作。 重要的一点是,Thymeleaf从一开始就设计了XML和Web标准,允许您在需要时创建完全验证的模板 特点 动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。 开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,同时开发人员也可以扩展和创建自定义的方言。 多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。 与SpringBoot完美整合:SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。 表达式 ${}:变量表达式,@{...}:链接URL表达式,#{...}:消息表达式 *{}:选择变量表达式 字符串拼接 我们经常会用到普通字符串与表达式拼接的情况: <span th:text="'欢迎您:' + ${user.name} + '!'"></span>
字符串字面值需要用'',拼接起来非常麻烦,Thymeleaf对此进行了简化,使用一对|即可:
<span th:text="|欢迎您:${user.name}|"></span>
默认值
有的时候,我们取一个值可能为空,这个时候需要做非空判断,可以使用表达式 ?: 默认值简写:
<span th:text="${user.name} ?: '二狗'"></span>
当前面的表达式值为null时,就会使用后面的默认值。
注意:?:之间没有空格。
循环
循环也是非常频繁使用的需求,我们使用th:each指令来完成:
假如有用户的集合:users在Context中。${users} 是要遍历的集合,可以是以下类型:
Iterable,实现了Iterable接口的类;Enumeration,枚举;Interator,迭代器;Map,遍历得到的是Map.Entry;Array,数组及其它一切符合数组结果的对象
<tr th:each="user,stat : ${users}">
<td th:text="${user.name}">Onions</td>
<td th:text="${user.age}">2.41</td>
</tr>
stat对象包含以下属性:
index,从0开始的角标
count,元素的个数,从1开始
size,总元素个数
current,当前遍历到的元素
even/odd,返回是否为奇偶,boolean值
first/last,返回是否为第一或最后,boolean值
逻辑判断
Thymeleaf中使用th:if 或者 th:unless ,两者的意思恰好相反。
<span th:if="${user.age} > 24">老油条</span>
如果表达式的值为true,则标签会渲染到页面,否则不进行渲染。
以下情况被认定为true:
表达式值为true;表达式值为非0数值;表达式值为非0字符;表达式值为字符串,但不是"false","no","off";表达式不是布尔、字符串、数字、字符中的任何一种
其它情况包括null都被认定为false
分支控制
<div th:switch="${user.role}">
<p th:case="'admin'">用户是管理员</p>
<p th:case="'manager'">用户是经理</p>
<p th:case="*">用户是别的玩意</p>
</div>
th:case="*"表示默认,放最后
读取配置文件的值
${@environment.getProperty('server.port')}
设置任何属性的值
<form action="subscribe.html">
<fieldset>
<input type="text" name="email" />
<input type="submit" value="Subscribe me!" />
</fieldset>
</form>
使用th:attr标签就可以达到如下效果
<form action="subscribe.html" th:attr="action=@{/subscribe}">
<fieldset>
<input type="text" name="email" />
<input type="submit" value="Subscribe me!" th:attr="value=#{subscribe.submit}"/>
</fieldset>
</form>
如果需要一次设置多个属性,采用逗号分隔就可以
<img src="../../images/gtvglogo.png"
th:attr="src=@{/images/gtvglogo.png},title=#{logo},alt=#{logo}" />
样式追加和前置
运用的场景为我们往往可能因为某个值的取值来决定某个样式的变化
<input type="button" value="Do it!" class="btn" th:attrappend="class=${' ' + cssStyle}" />
我们设置cssStyle值为warning来使class属性后面添加这个值
<input type="button" value="Do it!" class="btn warning" />
还有两个特定的附加属性:th:classappend和th:styleappend属性,用于在不覆盖现有属性的情况下向元素添加CSS类或样式片段。
<tr th:each="prod : ${prods}" class="row" th:classappend="${prodStat.odd}? 'odd'">
模板布局
1.定义和引用
定义:th:fragment=".名称"
引用:th:insert="":简单地插入指定的片段作为正文的主标签
th:replace="":用来指定实际片段来替换其主标签
th:include="":类似于th:insert,但是不是插入片段,他只是插入此片段的内容
我们创建了一个foot.html的文件
<div th:fragment="copy">
© 2011 The Good Thymes Virtual Grocery
</div>
在其他页面引用:
<body>
<div th:include="footer :: copy"></div>
</body>
2.引用片段不带th:fragment
<div id="copy-section">
© 2011 The Good Thymes Virtual Grocery
</div>
我们可以使用上面的片段,简单地通过其id属性引用它,类似于CSS选择器:
<div th:include="footer :: #copy-section"></div>
3.参数化的引用
使用定义的th:fragment可以指定一组参数
<div th:fragment="frag (onevar,twovar)">
<p th:text="${onevar} + ' - ' + ${twovar}">
</p>
</div>
在如下代码进行引用
<div th:include="::frag (${value1},${value2})">...</div>
<div th:include="::frag (onevar=${value1},twovar=${value2})">...</div>
父子组件的模板布局语法:layout
1.需要在pom文件引入依赖
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>2.3.0</version>
</dependency>
2.编写模板页面
3.模板页面的使用
4.简便的写法
5.数据传输到页面
6.配置标题
该layout:title-pattern处理器采用一个简单的字符串,有2个节点的标记:$LAYOUT_TITLE和$CONTENT_TITLE。在结果页面中,每个节点将被其各自的标题替换。
结果的页面是
7.可重复使用的模板
现在,可以使用layout:insert处理器插入此模板并实现modal-content片段,但是您需要通过在调用模板的insert元素内创建相同名称的片段来实现:
笔者感觉这种自定义的模板很适合css样式不同但是html布局相同的自定义页面
8.head元素合并
结果:
脚本内联
<script th:inline="javascript">
const user = /*[[${user}]]*/ {};
const age = /*[[${user.age}]]*/ 20;
</script>
在script标签中通过th:inline="javascript"来声明这是要特殊处理的js脚本因为Thymeleaf被注释起来,因此即便是静态环境下, js代码也不会报错,而是采用表达式后面跟着的默认值。且User对象会被直接处理为json格式。
Thymeleaf内置对象
Thymeleaf中提供了一些内置对象,并且在这些对象中提供了一些方法,方便我们来调用。获取这些对象,需要使用#对象名来引用。
一些环境相关对象
对象
作用
#ctx
获取Thymeleaf自己的Context对象
#requset
如果是web程序,可以获取HttpServletRequest对象
#response
如果是web程序,可以获取HttpServletReponse对象
#session
如果是web程序,可以获取HttpSession对象
#servletContext
如果是web程序,可以获取HttpServletContext对象
Thymeleaf提供的全局对象:
对象
作用
#dates
处理java.util.date的工具对象
#calendars
处理java.util.calendar的工具对象
#numbers
用来对数字格式化的方法
#strings
用来处理字符串的方法
#bools
用来判断布尔值的方法
#arrays
用来处理数组的方法
#lists
用来处理List集合的方法
#sets
用来处理set集合的方法
#maps
用来处理map集合的方法
#aggregates
用于在数组或集合上创建聚合的实用程序方法
#messages
实用程序方法,用于获取变量表达式内的外部化消息,与使用#{…}语法获得消息的方法相同。
#ids
用于处理可能重复的id属性的实用方法(例如,由于迭代的结果)
举例:当后台传过来一个时间类型的对象可以用Thymeleaf全局对象来进行格式化
<span th:text="${#dates.format(today,'yyyy-MM-dd')}"></span>
Springboot中使用Thymeleaf
1.引入pom依赖
2. 这里注意添加属性,设定版本,设定版本是为了不再日志中显示thymeleaf的日志,使用3.0的版本是为了提高效率,并且解决标签闭合问题
3. 在application.properties中进行thymeleaf的配置
4在resources下面建立templates文件夹,放置html文件,创建页面,切记要在页面中引入thymeleaf
by kevin
16.
八月 2020 14:55
>
新鲜 座椅面料的秘密科学 乘坐公共交通工具(地铁、公共汽车、电车、火车)时,人们通常不会对座椅面料留下印象,那只是一块不好看、也不十分干净的纺织品而已。 但是,座椅面料其实大有学问。 首先,它必须经久耐用,因为每个座椅每天都有很多人坐。它必须用上几年,而不会有大的磨损。 其次,它必须易于清洁,能够抵抗或掩盖各种污渍。而且,它也必须看上去不十分脏,让人们坐得下去。 最后,可能是最重要的一点。它必须安全,不能着火、冒烟和闷烧,这些可能都会造成致命后果,尤其是在通风不良的地下几十米的地铁。 幸运的是,人们真的找到了这样一种材料。大多数欧美国家的公共交通工具都采用一种叫做 Moquette(法语为"地毯"的意思)的面料。这是一种羊毛和短绒棉的混合织物。 羊毛是天然的阻燃剂,绒毛织物的特殊织法又比平织布具有更高的耐用性。 由于这种面料没有平坦的表面,所以可以抵抗污渍,也可以隐藏掉其中的小颗粒。它的表面还可以加上各种涂层,确保符合安全标准,并且可以定期进行大力清洗。另外,它还具有柔软的质感和触感,并可以织出复杂的图案。 幸存者公寓 美国堪萨斯州大草原一个废弃的导弹发射井内有一个豪华的末日避难所,被称为“幸存者公寓”。这个公寓深入地下50米,共15层,最多可容纳75人居住。除了齐全的现代化生活设备外,避难所内还有游泳池、电影院、图书馆,甚至是攀岩墙壁。发射井顶部加装了穹顶,里面停放着装甲运输车辆。对于一些有末日情结的百万富翁们来说,这里无疑是一个躲避经济崩溃、太阳耀斑、恐怖袭击和传染病流行的理想之所。 这个“幸存者公寓”由开发商拉里-霍尔建造,霍尔说:“一些人总是担心灾难发生,例如太阳耀斑、经济崩溃、传染病大流行、恐怖袭击和食品短缺。”这些人被称之为“末日准备族”,渴望拥有一个安全之所,躲避末日灾难。对于他们来说,霍尔建造的末日避难所无疑是个不错的选择。 工具 drawio,类似visio。 https://github.com/jgraph/drawio-desktop 言论 如果你花钱买,你就是客户,如果你免费获得,你就是产品。 许多 AI 研究人员追求的目标是开发与人类智能原理相同的人工智能,但是这永远不可能实现,因为人的思维基本上没有算法。 一家公司获得垄断地位以后,就不需要从任何形式的产品开发获益了,只通过市场营销或金融工程就能增加利润。最终,公司就会被销售人员和财务人员控制。 公司刚成立时,需要瑞士军刀型人才。公司一旦发展壮大,需要菜刀型人才。
by kevin
19.
七月 2020 10:59
>
新鲜 斑头雁之迷 斑头雁(bar-headed geese)冬季生活在印度中部,夏季生活在哈萨克斯坦或蒙古。每年,它都要从印度飞到蒙古,然后再飞回来。从印度到蒙古,斑头雁必须越过世界最高的喜马拉雅山脉,现在已知这些鸟类的飞行高度可以达到8500米。这是如何做到的?8000米以上的高度,氧气极为稀薄,人类呼吸非常困难。但是,斑头雁可以顺畅地呼吸,这就是它们能飞越喜马拉雅山的主要原因:它们的肺远比人类的肺强大高效,即使在那样的高度,身体也能得到足够的供氧。鸟类的肺事实上,所有鸟类(蜂鸟,鸵鸟,鸽子)都有超高效的肺部。人类和其他哺乳动物的肺,跟它们一比,看起来都很低级。人类和哺乳动物的呼吸,进出都是同一个口,嘴和鼻子同时用于呼气和吸气。但是,鸟类不这样,呼吸的进口和出口是分开的,有两个口,气体在体内永远是单方向流动,空气被吸收氧气后,不会再次经过肺部,这样的效率更高。而且,鸟类的骨头里面有气囊和中空的空间,可以储存空气,进一步使得呼吸更容易。 恐龙的肺 鸟类是如何获得这样强大的肺呢? 答案很简单,它们从恐龙那里继承来的。鸟类的祖先是恐龙!恐龙的肺也是高效的,所以它们的体积才会变得这么大!它们的肺可以支持庞大身体的供氧。 大气含氧量的变化 恐龙的肺的进化,与地球环境的变化密切相关。 几亿年前,陆地上刚刚出现植物,这时地球大气的氧气含量很高,超过了30%。相比之下,今天空气里的氧气含量只有21%。 由于氧气太多,使得呼吸效率低下的昆虫,可以繁殖得很大。蜻蜓的翼展能达到1米左右,蜈蚣长2米多,青蛙等两栖动物像饭桌一样大。 氧气太多就容易发生燃烧,也容易与腐烂植物里面的碳元素结合,产生二氧化碳。因此时间一长,地球大气的氧气含量就开始下降了,从石炭纪(3亿年前)30%的高点,快速下降到二叠纪(2.5亿年前)的12%左右。地球上百分之九十五的生命体,由于无法适应氧气含量的下降而死亡,这是地球历史上最大的生物灭绝事件。 还活着的5%的生命体,必须适应低含量的氧气,才能生存下去。恐龙就是在那个时候出现的,慢慢进化出了高效的肺系统。 后来,空气的含氧量又开始回升,达到20%以上。恐龙由于具有强大的肺,体积就越长越大。而且,它们空心的骨头,也有助于减轻整体重量。 鸟类从恐龙演化而来,具有同样的肺系统,专门适应低含氧量的环境,这就是为什么它们能飞越珠穆朗玛峰的原因。 科学家在海拔6700米的安第斯山脉的山顶,发现了老鼠。这是已知生活区域最高的哺乳动物。这些老鼠吃什么,目前还是一个迷,那个高度没有植物,氧气只有海平面的一半。 学习 如何不靠运气变得富有 https://github.com/taosue/how-to-get-rich-without-getting-lucky/ 资源分享 雷· 布雷德伯里 :雨一直下 https://www.sohu.com/a/337866552_771944 言论 创建一家大型互联网公司的最佳方法,就是帮助人们去做他们想做的事情,并使事情变得容易10倍。 唯一不适应远程工作的是中层管理人员。 基层员工对于在家工作感到很高兴,只要把活做好就可以了。高层管理人员只需要对销售和产量数字负责。中层管理人员的不适应在于,他们的职责是直接监控基层员工,最常用的判断方法是通过是否坐在座位上等迹象,来判断工作量和工作是否勤奋。 创业公司不要专注于创造产品,而要专注于解决问题。 创新型的创业公司,一开始的目标用户应该是对新产品最有兴趣的那2%的人群,并设法与剩下的那 98%的人建立一座桥梁,把那些人推向未来。
by kevin
4.
七月 2020 09:12
>
新鲜 美国生态学家16年前做了一个实验,说服哥斯达黎加国家公园,允许一家果汁公司将12000吨桔子皮,倾倒在一块贫瘠的土地上,卡车整整运送了1000次。 16年后,他们重新访问这块土地,发现那里已经是一片郁郁葱葱的森林了,跟旁边的土地形成巨大的对比,地面生物量(以树木的木材量计算)增加了176%。生态学家认为,这对如何回收食品工业的生产残余物,有很大的启示意义。 工具 一个开源桌面软件,隔一段时间(默认25分钟)就跳出一个提示,提醒你离开电脑运动一下。 https://hovancik.net/stretchly/downloads/ 资源分享 宫崎骏动画图片 http://www.ghibli.jp/info/013251/ 言论 互联网的行为模式就是"游牧"。没人在网上有固定住所,网上也没有故乡。我们在互联网上都是游牧民族。 几乎一切罪恶都扎根于未来,感恩是在回顾过去,爱着眼于现在,恐惧、贪财、色欲和野心在眺望着未来。 能解释为愚蠢的,就不要解释为恶意。 计算机科学与计算机无关,就像天文学与望远镜无关。-- Edsger Dijkstra
by kevin
31.
八月 2019 20:08
>
最近想要对svn提交的日志进行管理。 考虑到使用bat命令进行正则校验感觉比较麻烦,而且灵活性也不好,所以选择python来实现。 首先添加svn钩子pre-submit 1: Setlocal
2: set sd=D:\Repositories\hooks
3: set py="D:\Program Files\Python37\python" %sd%\pre-commit.py %1 %2
4: for /F %%i in ('%py%') do (set r=%%i)
5: echo %r% 1>&2
6: if %r%==1 (
7: exit 1
8: ) else (
9: exit 0
10: )
11: Endlocal
上面的代码调用了pre-commit.py,具体代码如下
1: import sys, os, re
2:
3: if(len(sys.argv)<3):
4: print(1)
5: exit()
6:
7: repos = sys.argv[1]
8: txn = sys.argv[2]
9: svnserver = os.environ["VISUALSVN_SERVER"]
10: svnlook = "\"" + svnserver + "bin\\svnlook.exe" + "\""
11: logcmd = ("\"{0}bin\\svnlook.exe\" log \"{1}\" -t \"{2}\"").format(svnserver, repos , txn)
12: loghandler = os.popen(logcmd)
13: log = loghandler.read()
14: loghandler.close()
15: if(not log):
16: print(1)
17: exit()
18:
19: mr = re.match("^\\d+\\s.*", log)
20: if(mr == None):
21: print(1)
22: else:
23: print(0)
24: exit()
by kevin
17.
八月 2019 11:15
>
最近使用svn碰到的一些情况,记录一下。 说明一下: 服务的:VisualSVN-Server 客户端:TortoiseSVN 1. 高版本客户端提交的日志,低版本的客户端查看不了。 svn客户端升级之后,最好还是svn clear一下。 2. 高版本的客户端提交的日志导致低版本服务端的钩子无法正常运行。 大概的原因是,高版本的客户端提交的日志可能包含一些分隔符(比如换行符),导致服务端无法正常调用钩子。
by kevin
18.
三月 2019 18:42
>
最近,碰到一些网页屏蔽了复制功能。写个简单的解决办法。 1. 下载google浏览器(或者360极速浏览器) 2. 再网页上点击鼠标右键,点击弹出菜单中的“检查” 3.在下图左边的小窗口中,找到body,点击body;在右边的小窗口中,找到-webkit-user-select 把前面的勾去掉。