「JavaScript」- String(数组)

问题描述
该笔记将记录:在 JavaScript 中,与字符串 String 类型有关的操作,以及相关问题处理。
解决方案
定义字符串

const name = ‘ram’;
const name1 = “hari”;

const result = `The names are ${name} and ${name1}`; // 能够在字符串中使用变量

字符串替换
通过正则表达式,来进行字符串替换:

“sttring/”.replace(/\/$/, “”); // 替换结尾的 / 字符

// 中文、字母、数字,并移出连续的空格
let str = ‘就爱仏oqfofa,.- 2+= 撒123ffds’
let newStr = str.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, ” “)
newStr = newStr.replace(/\s+/g, ‘ ‘)

// 替换全部字符串
strFoo.replaceAll(‘dog’, ‘monkey’)

字符转义

strFoo.replaceAll(“‘”, “\\'”)

提取字符串
通过正则表达式,来提取字符串:

// 我们提取中文、字母、数字
let str = ‘就爱仏oqfofa,.-+=撒123ffds’
let result = str.matchAll(/[a-zA-Z0-9\u4e00-\u9fa5]+/g)
let matchAll = Array.from(result)
console.log(matchAll)

// 我们在正则表达式中使用 + 以保持其连贯,而不是拆成单独字符

参考文献
JavaScript Array length Property Array is not a data type in Javascript? – Stack Overflow javascript – Return string without trailing slash – Stack Overflow Methods of RegExp and String String.prototype.replaceAll() – JavaScript | MDN[……]

READ MORE

「JavaScript」- Events(学习笔记)

问题描述
该笔记将记录:在 JavaScript 中,与 Events 有关的内容,以及常见问题的处理。
解决方案
当页面加载完成时,执行代码(JavaScript):

window.addEventListener(‘load’, function () {
alert(“It’s loaded!”)
})

参考文献
Event – Web APIs | MDN javascript – How to execute a function when page has fully loaded? – Stack Overflow[……]

READ MORE

「Node.js」- 4.Packages and Build Tools

[……]

READ MORE

「NPM」- 调整日志等级

通过命令行指定日志等级,如下:

npm install –verbose
npm install –loglevel silly

根据 npm-config 文档: 1)可用的日志等级有 “silent”, “error”, “warn”, “notice”, “http”, “timing”, “info”, “verbose”, “silly”, 2)越往后日志等级越高,输出日志信息也就越多; 3)如果日志写入失败,将写入当前目录下的 npm-debug.log 目录; 4)默认日志为 notice 级别;
参考文献
How to get more info from npm install?[……]

READ MORE

「JavaScript」- 操作 HTML 文档

解决方案
获取元素属性

var href = aTag.href
var value = input.value

追加 HTML 元素、修改 HTML 内容
原始 JavaScript 代码

//get the target div you want to append/prepend to
var someDiv = document.getElementById(“targetDiv”);

//append text
someDiv.innerHTML += “Add this text to the end”;

//prepend text
someDiv.innerHTML = “Add this text to the beginning” + someDiv.innerHTML;

// after
someDiv.outerHTML += “Add this text to the end”;

// before
someDiv.outerHTML = “Add this text to the end” + someDiv.outerHTML;

使用 jQuery 类库
向元素内部的最开始追加新元素:.prepend()

<div class=”container”>
<div class=”inner”>Hello</div>
</div>

$( “.inner” ).prepend( “<p>Test</p>” );

<div class=”container”>
<div class=”inner”>
<p>Test</p>
Hello
</div>
</div>

参考文献
How can I implement prepend and append with regular JavaScript? – Stack Overflow[……]

READ MORE

「JavaScript」- 常见 HTTP、Ajax、URL 操作

URL Encode / URL Decode
decodeURIComponent() – JavaScript | MDN encodeURIComponent() – JavaScript | MDN
encodeURIComponent()

// encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent(‘test?’)}`);
// expected output: “?x=test%3F”

console.log(`?x=${encodeURIComponent(‘шеллы’)}`);
// expected output: “?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B”

decodeURIComponent()

// “JavaScript_шеллы”
decodeURIComponent(‘JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B’);

try {
var a = decodeURIComponent(‘%E0%A4%A’);
} catch(e) {
console.error(e); // URIError: malformed URI sequence
}[……]

READ MORE

「JavaScript」- 通过 JS 代码,来完成批量操作

问题描述
在浏览网页时,我们需要进行某些操作,而这些操作又属于重复操作,因此我们希望能够通过 JavaScript 代码自动完成。
该笔记将记录:在 Console 中(浏览器),如何使用 JavaScript 代码完成自动化操作,以及常见问题处理。
解决方案
通过代码,来点击按钮
HTML DOM click() Method

document.getElementById(“myCheck”).click();

选择页面的全部选择框
javascript – Check all Checkboxes in Page via Developer Tools – Stack Overflow
我们需要选择在页面中的全部选择框,但页面未提供全选按钮,而我们又不想依次点击每个选择框。
这需要我们在浏览器的 Console 中,执行一段 JavaScript 代码,以完成工作:

var inputList = document.getElementsByTagName(“input”);
for (var i =0; i < inputList.length; i++){
if (inputList[i].type == ‘checkbox’) {
inputList[i].checked = true;
}
}

参考文献
JavaScript HTML DOM[……]

READ MORE

「JavaScript」- jQuery(学习笔记)

问题描述
现在是 04/26/2021 我们依旧在使用 jQuery 库:-),而且觉得非常方便好用,毕竟我们用的比较肤浅。我们不是前端,即使学习新的前端框架也不会经常使用,所以在这方完全就是“能用就行”、“解决问题就行”的态度(我们甚至连很多前端的基础概念都不清楚,毕竟我们没有遇到需要深入的问题:-)。
该笔记将记录:在 JavaScript 中,如何使用 jQuery 完成常见任务,以及相关问题处理方法。
解决方案
引入 jQuery 类库
jQuery:

<script src=”http://code.jquery.com/jquery-migrate-1.2.1.min.js”></script>

<!– 支持版本:2.0.3, 2.0.2, 2.0.1, 2.0.0,1.11.1, 1.10.2, 1.10.1, 1.10.0, 1.9.1,
1.9.0, 1.8.3, 1.8.2, 1.8.1, 1.8.0, 1.7.2, 1.7.1, 1.7.0, 1.6.4, 1.6.3, 1.6.2,
1.6.1, 1.6.0, 1.5.2, 1.5.1, 1.5.0, 1.4.4, 1.4.3, 1.4.2, 1.4.1, 1.4.0, 1.3.2,
1.3.1, 1.3.0, 1.2.6, 1.2.3 –>
<script src=”http://libs.baidu.com/jquery/2.0.0/jquery.min.js”></script>

jQueryUi:

<!– 支持版本:1.10.2, 1.10.1, 1.10.0, 1.9.2, 1.9.1, 1.9.0, 1.8.24, 1.8.23, 1.8.22,
1.8.21, 1.8.20, 1.8.19, 1.8.18, 1.8.17, 1.8.16, 1.8.15, 1.8.14, 1.8.13, 1.8.12,
1.8.11, 1.8.10, 1.8.9, 1.8.8, 1.8.7, 1.8.6, 1.8.5, 1.8.4, 1.8.2, 1.8.1, 1.8.0,
1.7.3, 1.7.2, 1.7.1, 1.7.0, 1.6.0, 1.5.3, 1.5.2 –>
<script src=”http://libs.baidu.com/jqueryui/1.8.22/jquery-ui.min.js”></script>

操作 HTML 元素

$(‘<selector>’).prepend(html) // 在[……]

READ MORE

「JavaScript」- 常用代码段

Append text to textarea with javascript – Stack Overflow 获取或修改 textarea 元素的内容,应该使用 value 属性。
相关链接
NodeSource Node.js Binary Distributions[……]

READ MORE

「JavaScript」- 写入剪贴板、复制

function copyTextToClipboard(text) {

// 如果支持 navigator.clipboard 时使用
if (navigator.clipboard) {
navigator.clipboard.writeText(text);
return true; // 我们不理会异步,假装成功
}

// 当浏览器不支持 navigator.clipboard 时使用
var textArea = document.createElement(“textarea”);
textArea.value = text;

// Avoid scrolling to bottom
textArea.style.top = “0”;
textArea.style.left = “0”;
textArea.style.position = “fixed”;

document.body.appendChild(textArea);
textArea.focus();
textArea.select();

try {
return document.execCommand(‘copy’);
} catch (err) {
return false;
} finally {
document.body.removeChild(textArea);
}
}

在 Console 中,写入剪切板
Firefox

window.navigator.clipboard.writeText(123)

Promise { <state>: “rejected”, <reason>: DOMException }
<state>: “rejected”
<reason>: DOMException: Clipboard write was blocked due to lack of user activation.

在 Firefox 中,需要进入 Brower Console 界面:Ctrl+Shift+J,但是这不能针对页面执行代码。
# TODO 在 Console 中,复制到剪切板 我们经常在 Console 中执行代码,以快捷地完成任务,但是复制剪切板不可用。使用 tampermonkey 勉强解决问题。
参考文献
Browser Console – Firefox Developer Tools | MDN javascr[……]

READ MORE

「JavaScript」- 从页面中,提取图片

问题描述
在页面中,包含我们需要的图片。
但是,图片数量巨多,我们无法依次右键保存。
该笔记将记录:如何批量下载网页中的图片。
解决方案
问题的解决方案有很多,我们无法一一列举,本文仅仅记录我们采用的方法。
在浏览器控制台中,执行如下 JavaScript 代码:

list = “”
$x(“//img[contains(@data-src, ‘http’)]”).forEach(function (item, idx) {
imageType = item.getAttribute(“data-type”)
imageLink = item.getAttribute(“data-src”)
list = list + “wget -O ” + idx + “.” + imageType + ” ” + imageLink + “\n”
})
console.log(list)

执行如上代码,将生成 wget 下载链接,类似如下:


wget -O 81.jpeg https://mmbiz.qpic.cn/sz_mmbiz_jpg/pUm6Hxkd435PzG5tgPApm9hic9aNPXP5J2cDGyQ07IctgudX4WjiaicuOzcP4yHsDGI8Z7MUY2D8iajCeMG0DJM5pw/640?wx_fmt=jpeg
wget -O 82.jpeg https://mmbiz.qpic.cn/sz_mmbiz_jpg/pUm6Hxkd435PzG5tgPApm9hic9aNPXP5JQCRX1pjZj9l8xNrWm9dNSPmicmTsiciaMu2YZewmfjkH2HiaQmCpibdjPHA/640?wx_fmt=jpeg
wget -O 83.jpeg https://mmbiz.qpic.cn/sz_mmbiz_jpg/pUm6Hxkd435PzG5tgPApm9hic9aNPXP5J8g3ZTovp4joJ7QbqP92sFhko2I8jaBicEcictpdvsA4wMoEbafqktbvQ/640?wx_fmt=jpeg
wget -O 84.png https://mmbiz.qpic.cn/sz_mmbiz_png/pUm6Hxkd435PzG5tgPApm9hic9aNPXP5JOd2slUKZCzUTu90BhfU7aTiagKrCvTRc2rA8Khibibj6ch0ibXHfRK8ewg/640?wx_fmt=png
wget -O 85.jpeg https://mmbiz.qpic.cn/sz_mmbiz_jpg/pUm6Hxkd435PzG5tgPApm9hic9aNPXP5Jwq2g[……]

READ MORE

「JavaScript」- 从页面中,提取下载链接(多用于视频网站)

问题描述
某些页面,提供多个下载链接,但是没有提供批量复制链接的功能(或者批量复制存在问题)。
该笔记将记录:在 Console 中,如何使用 JavaScript 及 XPath 提取页面的下载链接。
解决方案
我们要获取在 老友记第六季迅雷下载 中的下载链接,可以在 Conosle 中执行如下代码:

list=””
$x(“//ul[@id=’ul1′]//input[contains(@class, ‘1addr’) and contains(@value, ‘thunder://’)]”).forEach(
element => list = list + element.value + ‘\n’
)
console.log(list)

注意事项: 1)由于 $x 仅存在于浏览器 Console 中,因此无法在页面中执行该代码; 2)该方法,我们在 Firefox 中测试成功,应该也同样适用 Google Chrome;
参考文献
Array.prototype.forEach() – JavaScript | MDN[……]

READ MORE

「jQuery」- 获取集合中某个元素的所有属性

var arr = []

$(“.class_name”).map(funciton() {
arr.push($(this).attr(“attr_name”))
})

参考文献
Get the attribute value of each element from a jQuery set, into an array[……]

READ MORE

「JavaScript」- 通过文本内容查找元素

方法一、通过 Javascript 过滤
如下代码,可以通过内容选择标签

var aTags = document.getElementsByTagName(“a”);
var searchText = “SearchingText”;
var found;

for (var i = 0; i < aTags.length; i++) {
if (aTags[i].textContent == searchText) {
found = aTags[i];
break;
}
}

方法二、通过 XPath 选择
如下代码,找到所有内容包含 Download 的标签:

$x(“//*[contains(text(), ‘Download’)]”)

注意事项,$x 只能在浏览器的 Console 中使用,如果希望在 Javascript 中使用,需要使用 document.evaluate 方法。
参考文献
How to get element by innerText Is there a way to get element by XPath using JavaScript in Selenium WebDriver? – Stack Overflow[……]

READ MORE

「JavaScript」- 使用 jQuery 实现滚动加载

# 01/05/2021 这段代码是在 20131212 时写的,用于纪念我们当年写过的那些烂代码而保留。
// 依赖jquery

$(document).ready(function () {
var nomore_data = false;// 没有数据了
var is_loading = false;// 正在加载的flag
var current_page = 1;// 页码

//页面滚动执行事件
$(window).scroll(function () {
var scrollTop = $(document).scrollTop(); //整个页面滚动的高度
var scrollHeight = $(document).height(); //整个页面的高度
var windowHeight = $(window).height(); //整个窗口可视化的高度
if (scrollHeight – 240 <= windowHeight + scrollTop) { // 240为缓冲值,不要非到底才加载. 减少等待.
load_data();
}
});

// 显示正在加载动画.
function show_loading_anim(){

is_loading = true;// 设置正在加载标志

//TODO:显示动画.

//由于缓冲值的存在不需要再显示动画.
return;
}

// 移除正在加载动画
function rm_loading_anim(){

is_loading = false;// 取消正在加载的flag

TODO:移除”正在加载”动画.
}

// 数据加载;
function load_data() {

if ((is_loading == true || nomore_data == true)) // 如果”没有数据了”或者”加载中”,返回.
return;

show_loading_anim();// 显示加载动画
$.ajax({
type: ‘GET’,
url: ‘request_url’,
data: ‘page=’ + ++current_page,
dataType: ‘json’,
success: function (re) {
rm_loading_anim();// 移出”正在加载…”动画.

TODO:数据处理;.

nomore_data = goods.length < 30;// 检查是否已经加载结束.30为分页的大小;

} // success end
})[……]

READ MORE

「jQuery」- 显示自动隐藏的消息提示框

问题描述
我们希望 1)在页面上显示消息提示,以提示用户操作完成,2)但是不想有交互,即消息提示自动消失。
该笔记将记录:如何在页面上显示自动消失的提示消息(类似与 Andorid 的 Toast 方法)
解决方法
我们遇到的多数问题,别人都已经遇到过了,我们只要尽量去搜索答案。
jQuery + Notify.js
4.Packages and Frameworks + Notify.js

<script src=”http://libs.baidu.com/jquery/2.0.0/jquery.min.js”></script>
<script src=”https://cdn.bootcdn.net/ajax/libs/notify/0.4.2/notify.min.js”></script>

$.notify(“Access granted”, “success”);
$.notify(“BOOM!”, “error”);

其他方法
10 Free CSS & JS Notification Alert Code Snippets for Web Designers
参考文献
Notify.js notify (v0.4.2) – A simple, versatile notification library[……]

READ MORE

「JavaScript」- sleep()

解决方案

function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

async function doSomeStuff() {
// do some stuff …

console.log(‘Taking a break…’);
await sleep(2000);
console.log(‘Two seconds later, showing sleep in a loop…’);
}

doSomeStuff();

参考文献
What is the JavaScript version of sleep()? – Stack Overflow[……]

READ MORE

「OpenJDK」- 安装(Linux,源码)

各个版本JDK下载地址
JDK 8 http://download.java.net/openjdk/jdk8/ JDK 7 http://download.java.net/openjdk/jdk7/ JDK 6 http://download.java.net/openjdk/jdk6/
Debian
How to install JDK sources?
安装 OpenJDK 的源码包(以OpenJDK 8为例):

apt-get install openjdk-8-source

安装后的目录位于:/usr/lib/jvm/java-8-openjdk-amd64/src.zip[……]

READ MORE

「OpenJDK」- OpenJDK7u6的编译(ubuntu 10.10)

Download: http://www.java.net/download/openjdk/jdk7u40/promoted/b43/openjdk-7u40-fcs-src-b43-26_aug_2013.zip
Wiki: https://wiki.openjdk.java.net/display/jdk7u/Main
系统环境及其创建
类型1:`virtualbox‘ + `ubuntu 10.10 server amd64’ 为了更好的发挥硬件资源,并提高编译速度,我选择「类型2」。
类型2:`chroot‘ + `ubuntu 10.10 server amd64’ 有关chroot环境的制作参考:「任意Linux发行版的chroot环境」
如果需要ubuntu 10.10的源,参考:Linux Package Manager:z.Source List

#!/bin/bash

############################################################
# 进入chroot环境
############################################################

# 定义新的根目录
LFS=/mnt/uui/chos/ubuntu-10.10

# 先挂载「虚拟文件系统」
mount -v –bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620

mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

# 进入chroot环境
chroot $LFS env -i \
HOME=/root \
TERM=”$TERM” \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash –login +h

包依赖
阅读源码目录下的README-builds.html文件,及《深入理解Java虚拟机:JVM高级特性与最佳实践》。
以文档指引为主。
源码获取
Source: https://jdk7.java.net/source.html 以下内容取自源码目录下README-builds.html#get_source部分:
从OpenJDK的Mercurial仓库中下载源码

#!/bin/bash

# 获取整套的源码,包括Forest Extension
hg fclone ht[……]

READ MORE

「openjdk7u6」- 源码目录结构

/
> tree -L 1 . . ├── ASSEMBLY_EXCEPTION ├── build ├── build.log ├── corba ├── get_source.sh ├── hotspot ├── jaxp ├── jaxws ├── jdk ├── langtools ├── LICENSE ├── make ├── Makefile ├── nbproject ├── README ├── README-builds.html ├── test └── THIRD_PARTY_README
10 directories, 11 files
/hotspot
> tree -L 1 hotspot
hotspot ├── agent # HotSpot Serviceability Agent (SA)实现; ├── ASSEMBLY_EXCEPTION ├── build # 编译生成的临时文件和JDK等; ├── LICENSE ├── make # build hotspot 的相关配置文件; ├── README ├── src # 源码; ├── test # 单元测试; └── THIRD_PARTY_README
5 directories, 4 files
/hotspot/src
> tree -L 2 hotspot/src
hotspot/src ├── cpu # CPU 相关代码; │   ├── sparc │   ├── x86 │   └── zero ├── os # 操作系统相关代码; │   ├── bsd │   ├── linux │   ├── posix │   ├── solaris │   └── windows ├── os_cpu # OS 与 CPU 组合的相关代码; │   ├── bsd_x86 │   ├── bsd_zero │   ├── linux_sparc │   ├── linux_x86 │   ├── linux_zero │   ├── solaris_sparc │   ├── solaris_x86 │   └── windows_x86 └── share # 共同代码,与平台无关;

├── tools # 工具;
└── vm # ho[……]

READ MORE

「Books」

虚拟机
KVM
《深度实践KVM》 《Linux KVM 虚拟化架构实践指南》 《KVM虚拟化技术:实战与原理解析》
Java
《Java SE 7虚拟机规范》 《深入Java虚拟机》,对应的英文版是《Inside the Java Virtual Machine》,过时。 《深入理解Java虚拟机:JVM高级特性与最佳实践》,结合实现大概介绍JVM的抽象概念; 《Oracle JRockit: The Definitive Guide》,最深入JVM内部;
《HotSpot实战》 《Java Performance》,有丰富调优建议; 《The Garbage Collection Handbook》,垃圾回收; BLOG:http://rednaxelafx.iteye.com/blog/362738 《计算机组成及汇编语言原理》 《深入嵌入式Java虚拟机》介绍了一种实际的JVM——KVM的实现细节 《The School of Niklaus Wirth》,里面有一章介绍了HotSpot Client Compiler (C1)的原始设计思路 《解析Java虚拟机开发——权衡优化.高效和安全的最优方案》,抄袭;
DVM
《深入解析Android虚拟机》,黑色; 《深入解析Android虚拟机》,绿色; 《Android Dalvik虚拟机结构及机制剖析,I,II》
虚拟机的入门级实现
《Virtual Machines: Versatile Platforms for Systems and Processes》,虚拟机概论; 《Language Implementation Patterns》,入门级实现方式,把高级语言编译器与虚拟机两个概念联系起来; 《プログラミング言語を作る》了解非常简易的、用树遍历式、字节码式解释器实现虚拟机
语言类
《深度探索C++对象模型》,对应的英文版是《Inside C++ Object Model》 《C++程序设计语言》
程序编译、链接、加载类
《链接器和加载器》,对应的英文版是《Linker and Loader》 《程序员的自我修养:链接、装载和库》 《The Compiler Design Handbook》 《Optimizing Compilers for Modern Architectures》
操作系统类
《Linux内核设计与实现》,对应的英文版是《Linux Kernel Development》 《深入理解Linux内核》,对应的英文版是《Understanding the Linux Kernel》 《深入Linux内核架构》,对应的英文版是《Professional Linux Kernel Arc[……]

READ MORE

「How to Set the Look and Feel」

参考文献
How to Set the Look and Feel Java Look and Feel (L&F)[……]

READ MORE

「从命令行中读取系统属性」

You can use the -XshowSettings flag in the Hotspot JVM version 1.7 and up (not supported in 1.6):

java -XshowSettings:properties -version

OpenJDK has had support for this flag since late 2010.
Seen in http://marxsoftware.blogspot.de/2016/02/hotspot-jvm-XshowSettings.html
The Oracle JVM ships with the tool jcmd which allows you to see the flags present in a running JVM. See:
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
For this use case, you could use:

jcmd <pid> VM.system_properties

参考文献
Reading Java system properties from command line[……]

READ MORE

「Java」- 构建工具及包管理器

章节列表
「AWT与Swing的不同之处」 「Java」- BCEL,Byte Code Engineering Library 「Java」- 字体配置[……]

READ MORE

「Java」- BCEL,Byte Code Engineering Library

参考文献
Apache Commons BCEL[……]

READ MORE

「Java」- 字体配置

TODO JAVA中的字体配置
系统环境:Debian 其他环境:JAVA 8
字体配置文件的位置
多个 JDK 版本的 fontconfig.properties 配置文件: 1)JDK 8u73/jre/lib/fontconfig.properties.src 2)JDK 8u73/jre/lib/fontconfig.SuSE.10.properties.src
如果你安装的是JRE,那配置文件的位置为:/path/to/jre/lib/fontconfig.properties 如果你使用的是JDK,那配置文件的路径为:/path/to/JDK/jre/lib/fontconfig.properties
有关配置文件的命名方法要注意的问题 fontconfig.properties配置文件的命名存在一定的问题,有些版本的JDK中fontconfig.properties文件无法正常工作,有关该文件的命名参考Font Configuration中的“Loading Font Configuration Files”部分的说明。但是为了方便描述,这里统一称配置文件为fontconfig.properties。
生成物理字体的XLFD描述
进入系统字体目录(/usr/share/fonts,或者其他的字体目录)。
执行mkfontscale命令,之后会在字体目录中生成fonts.scale文件,即X逻辑字体描述文件。
声明物理字体
修改 fontconfig.properties 文件,加入:

filename.-microsoft-microsoft_yahei-medium-r-normal–*-%d-*-*-p-*-gb18030.2000-0=/usr/share/fonts/yahei/msyh.ttf

参数说明
1. filename:为固定的,后面跟一个点(.);
2. 紧接着是字体的物理名:-microsoft-microsoft_yahei-medium-r-normal–*-%d-*-*-p-*-gb18030.2000-0
字体的物理名在fonts.scale文件中是这样表示的:-microsoft-microsoft yahei-medium-r-normal–0-0-0-0-p-0-gb18030.2000-0,但差别就是:

* 需要用`_‘替换名字中的空格;
* 并且把–0-0-0-0-p-0-改为–*-%d-*-*-p-*-,其中%d用来表示字体大小,运行时会自动填充这个值。

3. 等号右边是字体的绝对路径。

使用物理字体
allfonts.latin-1=-microsoft-microsoft ya[……]

READ MORE

「AWT与Swing的不同之处」

AWT是什么?
AWT是操作系统GUI代码到Java的接口。尽管它尝试着在每个系统上都以相同的方式工作,但实际上多少都有所出入。
AWT是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers。 也就是说,当我们利用AWT来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的”一次编译,到处运行”的概念,AWT不得不通过牺牲功能来实现其平台无关性,也就是说,AWT所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。
Swing是什么?
Swing是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT所能够提供的所有功能,并且用纯粹的Java代码对AWT的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持, Swing利用了AWT中所提供的基本作图方法对树形控件进行模拟。由于 Swing 控件是用100%的Java代码来实现的,因此在一个平台上设计的树形控件可以在其他平台上使用。由于在Swing 中没有使用本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。
Swing是一个或多或少的纯Java GUI。它使用AWT创建一个操作系统窗口,然后将按钮,标签,文本,复选框等的图片绘制到该窗口中,并响应所有的鼠标点击,键条目等,自行决定要做什么而不是让操作系统处理它。因此,Swing是100%可移植的,跨平台是相同的(尽管它是可换肤的,具有“可插入的外观和感觉”,可以使它看起来像本地窗口和小部件的外观)。
二者的不同之处
这些对于GUI工具包来说是非常不同的方法,并且会产生很多后果。
AWT是一个跨平台的接口,因此即使它使用底层操作系统或本地GUI工具包来实现其功能,但它不提供访问这些工具包可以执行的所有操作。另一个平台上可能存在的高级或更新的AWT小部件可能不受支持。在每个平台上都不相同的小部件的功能可能不受支持,或者更糟糕的是,它们在每个平台上的工作方式可能不同。过去,人们投入大量精力来让他们的AWT应用程序跨平台一致地工作 – 例如,他们可能会尝试从Java调用本地代码。
由于AWT使用本地GUI小部件,因此您的操作系统知道它们并将它们放在彼此前面等,而从操作系统的角度来看,Swing小部件在窗口内是没有意义的像素。 Swing自己处理你的小部件的布局和堆栈。混合AWT和Swin[……]

READ MORE

「Java and perf」-

是 Java 这种通过 JVM 来运行的应用程序,运行堆栈用的都是 JVM 内置的函数和堆栈管理。所以,从系统层面你只能看到 JVM 的函数堆栈,而不能直接得到 Java 应用程序的堆栈。
perf_events 实际上已经支持了 JIT,但还需要一个 /tmp/perf-PID.map 文件,来进行符号翻译。当然,开源项目 perf-map-agent 可以帮你生成这个符号表。
此外,为了生成全部调用栈,你还需要开启 JDK 的选项 -XX:+PreserveFramePointer。因为这里涉及到大量的 Java 知识,我就不再详细展开了。如果你的应用刚好基于 Java ,那么你可以参考 Netflix 的技术博客 Java in Flames ,来查看详细的使用步骤。
说到这里,我也想强调一个问题,那就是学习性能优化时,不要一开始就把自己限定在具体的某个编程语言或者性能工具中,纠结于语言或工具的细节出不来。
掌握整体的分析思路,才是我们首先要做的。因为,性能优化的原理和思路,在任何编程语言中都是相通的。问题 3:为什么 perf 的报告中,很多符号都不显示调用栈[……]

READ MORE

「assemble.py」

assemble.py,汇编器。完全支持JAVA8。
命令行语法格式(Usage)
python assemble.py [-out OUT] [-r] [-q] target
命令支持的选项及含义
OUT 汇编生成的class文件的输出目录。默认为当前目录。 如果名字以.zip或者.jar结尾,则会输出一个zip文件。
-r 将汇编所有在target指定的目录中(递归)找到的.j文件。
-q 安静模式,只显示错误和警告。
target 要进行汇编处理的文件或者目录。 如果使用了-r选项,target应该是一个目录。
注意(NOTE)
汇编器使用的语法类似于Jasmin,但具有许多的新功能,最重要的是直接指定常量池引用的功能。
有关语法的更多细节,查看源码目录中的Documentation文件夹。[……]

READ MORE

「JavaSnoop – Java程序安全审计工具」

javasnoop是一个java应用程序安全测试工具,它允许你以拦截的方法,篡改数据和 hack运行在你计算机上的java应用程序。通常在没有源代码的情况下,测试java客户端的安全性最好的结果是不可预知的,最坏的结果是不切实际的。 在有源代码的情况下,你可以运行一个简单的java程序和远程附加一个调试器调试它,单步运行、根据需要改变变量,但对于一个applet来说要想做到这 一点是有点困难的。有时,你可能需要修改客户端和服务器之间的通信,一般的做法是在客户端配置一个代理,在代理上修改数据。问题的关键是,通信的数据通常 不是明文的,它可能使用了自定义的协议、序列化的对象、加密的数据或者多种方式混合应用。这样要想修改通信过程中的数据是比较困难的。JavaSnoop 这个工具就试图来解决这些问题,它允许你直接附加到一个运行中的进程,类似于调试器,然后,立即篡改方法调用、运行自定义代码或者仅仅监视在系统中发生了什么。
针对胖客户端的审计
对于瘦客户端,Burpsutie,Paros,WebInspect等工具可以拦截基于Web的应用的流量,也可以自动化对Web应用进行安全检测。
然而胖客户端也有这种需求,但是我们没有自动化的工具可以用来对胖客户端应用程序进行自动化的安全检测。
目前针对.EXE应用程序流量的拦截和编辑软件已经有很多了,在本篇文章当中将讨论一个可以用于评估JAVA应用程序安全性的工具 – JavaSnoop。
目前想要对「JAVA胖客户端」进行安全测试的各种方法以及各自的优缺点
方法1:拦截编辑流量 应用程序需要使用HTTP进行通讯。 应用程序有配置代理的功能。 应用程序不使用加密、自定义协议或序列化对象。 如果满足上述的所有条件,我们可以使用Burpsuite等代理工具,来捕获并且修改通讯的流量进行安全检测。
方法2:修改和攻击客户端 可以识别的JAR文件; 反编译 审计源代码 可以修改源代码并且重新编译客户端已用来发送自定义的攻击 在反编译class文件时通常会发现反编译后的源代码有多个编译错误,这些错误通常由反编译器本身的错误导致,这表明反编译与重新编译的过程在实践当中并不能100%确定成功。这种方法的缺点是流程复杂、繁琐、因为一些编译错误而浪费大量的时间来调试修改代码。
使用上面的两种方法对JAVA胖客户端应用程序进行安全测试时且少灵活性,并且有一定条件限制,很有可能出现两种方法都无法完成的情况。
Aspect Security开发了一款名为JavaSnoop的工具来解决这些问题。
JavaSnoop简介
JavaSnoop用于对「Java胖客户端」进行安全审计。
JavaSnoop附加到现有进程(如调试器)来进行调试,可以篡改方法调用,运行自定义代码,或者在[……]

READ MORE