Coder Social home page Coder Social logo

eden's People

Contributors

chenvivi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

eden's Issues

网易云音乐下载链接 API 分析

网易云音乐下载链接 API 分析

通过音乐的 id 获取歌曲文件下载链接的各种语言实现方法,由于 网易云 API 更新,现已失效

go版

func encrypt_id(id string) string {
	byte1 := []byte("3go8&$8*3*3h0k(2)2")
	byte2 := []byte(id)
	for i := 0; i < len(byte2); i++ {
		byte2[i] = byte2[i] ^ byte1[i%len(byte1)]
	}
	m := md5.New()
	m.Write(byte2)
	s := base64.StdEncoding.EncodeToString(m.Sum(nil))
	m.Reset()
	s = strings.Replace(s, "+", "-", -1)
	s = strings.Replace(s, "/", "_", -1)
	return s
}

php版

import md5

def encrypted_id(id):
    byte1 = bytearray('3go8&$8*3*3h0k(2)2')
    byte2 = bytearray(id)
    byte1_len = len(byte1)
    for i in xrange(len(byte2)):
        byte2[i] = byte2[i]^byte1[i%byte1_len]
    m = md5.new()
    m.update(byte2)
    result = m.digest().encode('base64')[:-1]
    result = result.replace('/', '_')
    result = result.replace('+', '-')
    return result

python版

# 歌曲加密算法, 基于https://github.com/yanunon/NeteaseCloudMusic脚本实现
def encrypted_id(id):
    magic = bytearray('3go8&$8*3*3h0k(2)2', 'u8')
    song_id = bytearray(id, 'u8')
    magic_len = len(magic)
    for i, sid in enumerate(song_id):
        song_id[i] = sid ^ magic[i % magic_len]
    m = hashlib.md5(song_id)
    result = m.digest()
    result = base64.b64encode(result)
    result = result.replace(b'/', b'_')
    result = result.replace(b'+', b'-')
    return result.decode('utf-8')

Java版

private static String getUrl (String songId, String albumId){
	String url = "";
	String response = HttpRequest.sendGet("http://music.163.com/api/album/"+albumId,"");
	try {
		JSONObject json = new JSONObject(response);
		JSONArray songs = json.getJSONObject("album").getJSONArray("songs");
		for (int i = 0; i < songs.length(); i++){
			JSONObject song = songs.getJSONObject(i);
			String id = song.getString("id");
			if (id.equals(songId)){
				url = song.getString("mp3Url");
				if (!url.equals("")){
					return url;
				}
				String dfsId;
				dfsId = song.getJSONObject("hMusic").getString("dfsId");
				if (dfsId.equals("0")){
					dfsId = song.getJSONObject("mMusic").getString("dfsId");
				}
				if (dfsId.equals("0")){
					dfsId = song.getJSONObject("lMusic").getString("dfsId");
				}
				url = "http://p1.music.126.net/" + encrypt_id(dfsId) + "/" + dfsId + ".mp3";
			}
		}
	}
	catch (JSONException e) {
		return url;
	}
	return url;
}
private static String encrypt_id(String dfsId) {
	byte[] b1 = "3go8&$8*3*3h0k(2)2".getBytes();
	byte[] b2 = dfsId.getBytes();
	for (int i = 0; i < b2.length; i++){
		b2[i] = (byte) (b2[i] ^ b1[i%b1.length]);
	}
	try {
		MessageDigest md5 = MessageDigest.getInstance("MD5");
		md5.update(b2);
		byte[] encryption = md5.digest();
		String encrypt_id = new String(Base64.getEncoder().encode(encryption));
		md5.reset();
		encrypt_id = encrypt_id.replace("+", "-");
		encrypt_id = encrypt_id.replace("/", "_");
		return encrypt_id;
	}
	catch (NoSuchAlgorithmException e) {
		return "";
	}
}

记一些以前不知道的 Gradle 配置

记一些以前不知道的 Gradle 配置

前言

关于 Gradle 的使用,最多的操作就是导库,顶多也就配置过自动签名,因为实战上没这个需求自己也不太主动学。我一向都是用什么学什么,只要我需要做一个东西,跨技术甚至跨领域都没关系。可能今天想做 Android 程序后天就觉得有个想法需要学建站技术才能实现,然后打游戏需要 记 BOSS 技能 CD 时间又做了个桌面定时软件,我甚至接触过编曲。但是如果我不需要做的功能,可能就瞟一眼完事,不会去深入理解,超懒

发现了个官方文档:https://google.github.io/android-gradle-dsl/current/index.html

另外,Gradle 编译默认不是多线程的

ABI 管理

我甚至都不知道这个东西的专有名词是叫 ABI

啥是 ABI

ABI 是 Application Binary Interface 的缩写

典型的 ABI 包含以下信息:

  • 机器代码应使用的 CPU 指令集
  • 运行时内存存储和加载的字节顺序
  • 可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型(例如 .so)
  • 用于解析内容与系统之间数据的各种约定。这些约定包括对齐限制,以及系统如何使用堆栈和在调用函数时注册
  • 运行时可用于机器代码的函数符号列表 - 通常来自非常具体的库集

Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64

arm64-v8a ,x86_64 这两个 ABI 应用并不是必须要做支持,手机一般都会提供自动兼容,像微信就是一个 armeabi打天下

在 Gradle 中配置应用支持的 ABI

ndk {
    abiFilters "armeabi"
}

参考

https://developer.android.com/ndk/guides/abis?hl=zh-cn

https://blog.csdn.net/justFWD/article/details/49308199

Lint

啥是 Lint

Lint 在项目编译时会检查一些导致代码质量不佳的错误,比如 有个 layout 文件没有用到什么的

gradle 配置 Lint 提示

android {
    lintOptions {
        // true--关闭lint报告的分析进度
        quiet true
        // true--错误发生后停止gradle构建
        abortOnError false
        // true--只报告error
        ignoreWarnings true
        // true--忽略有错误的文件的全/绝对路径(默认是true)
        //absolutePaths true
        // true--检查所有问题点,包含其他默认关闭项
        checkAllWarnings true
        // true--所有warning当做error
        warningsAsErrors true
        // 关闭指定问题检查
        disable 'TypographyFractions','TypographyQuotes'
        // 打开指定问题检查
        enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
        // 仅检查指定问题
        check 'NewApi', 'InlinedApi'
        // true--error输出文件不包含源码行号
        noLines true
        // true--显示错误的所有发生位置,不截取
        showAll true
        // 回退lint设置(默认规则)
        lintConfig file("default-lint.xml")
        // true--生成txt格式报告(默认false)
        textReport true
        // 重定向输出;可以是文件或'stdout'
        textOutput 'stdout'
        // true--生成XML格式报告
        xmlReport false
        // 指定xml报告文档(默认lint-results.xml)
        xmlOutput file("lint-report.xml")
        // true--生成HTML报告(带问题解释,源码位置,等)
        htmlReport true
        // html报告可选路径(构建器默认是lint-results.html )
        htmlOutput file("lint-report.html")
        //  true--所有正式版构建执行规则生成崩溃的lint检查,如果有崩溃问题将停止构建
        checkReleaseBuilds true
        // 在发布版本编译时检查(即使不包含lint目标),指定问题的规则生成崩溃
        fatal 'NewApi', 'InlineApi'
        // 指定问题的规则生成错误
        error 'Wakelock', 'TextViewEdits'
        // 指定问题的规则生成警告
        warning 'ResourceAsColor'
        // 忽略指定问题的规则(同关闭检查)
        ignore 'TypographyQuotes'
    }
}

参考

https://developer.android.com/studio/write/lint?hl=zh-cn

https://blog.csdn.net/berber78/article/details/60766091

dex 编译

啥是 dex

搞不懂 dex,就反编译玩过。大概查了一下,dex 对于 Davlik虚拟机, 就像 exe 对于 Windows一样吧。也就是 dex 编译 必然是 Android 编译的一部分咯

Gradle 配置 dex 编译

android {
    dexOptions {
    	//是否开启增量编译, 当dex 对应的文件有修改的时候才去编译dex优化编译效率,这个功能 android studio 默认是关闭的,如果开启multi dex 此句无效
        incremental false
        //是否预加载 dex 库依赖项以加快您的增量构建速度
        preDexLibraries = false
        //是否忽略方法数限制的检查
        jumboMode = false
        //进行 dex 编译的进程所使用的最大栈内存,太小可能导致OOM而无法通过编译
        javaMaxHeapSize "2048M"
    }
}

参考

https://stackoverflow.com/questions/28927255/how-can-i-use-android-dexoptions

https://www.cnblogs.com/zhaoyanjun/p/5736305.html

https://stackoverflow.com/questions/26779552/what-does-the-incremental-dex-option-in-android-studio-do

https://stackoverflow.com/questions/33750404/android-gradle-what-is-javamaxheapsize-4g

packagingOptions(打包选项)

packagingOption的选项

简单翻译一下官方文档就理解了

First-pick

First-pick 选项对应的文件会被打包到 apk 中,如果有多个对应文件,只有第一个会被打包,其他的会被忽略

packagingOptions {
    pickFirst "anyFileWillDo"
}

Merge

Merge 选项对应的文件会被合并到 apk 中。例如,当合并两个文件的时候,如果第一个文件的结尾不是换行符变会自动添加一个换行符,然后第二个文件的内容会被合并到第一个文件的末尾,这样就构成了合并后的文件

packagingOptions {
    merge "/LICENSE.txt" // Same as: merges += ["/LICENSE.txt"]
}

Exclude

Exclude 选项对应的文件不会被编译到 apk 中

packagingOptions {
	exclude 'META-INF/LICENSE'
	exclude 'META-INF/LICENSE.txt'
	exclude 'META-INF/NOTICE'
	exclude 'META-INF/NOTICE.txt'
 }

参考

https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html

productFlavors(打包特性)

用于多渠道打包

配置多渠道

在 Android Studio 3.0 中,需要加入 flavorDimensions

flavorDimensions "versionCode"

添加 demo 渠道

productFlavors {
	demo {}
}

打包命令

打包 demo 渠道的 apk

./gradlew assembleGoogleRelease

打包所有渠道的 apk

./gradlew assembleRelease

参考

https://juejin.im/entry/577383c66be3ff006adc92a3

https://blog.csdn.net/mynameishuangshuai/article/details/51783303

https://blog.csdn.net/SYIF88/article/details/75009663

在 CentOS 部署 Node.js 服务端心得

前言

因为项目需要,现需将NeteaseCloudMusicApi部署到服务器上运行,此项目是 Node.js 写的,所以服务器上需要安装Node.js 。在实际操作的过程中,我遇到了一些问题,现记录于此文。

问题

运行时报错

原因:此项目对于 Node.js 版本有要求,不能使用 5x 以下的版本运行。

解决过程:安装不同版本的 Node.js,直到找到可以运行程序的版本。

经验:Node.js 迭代较快,下次遇到 Node.js 项目时一定要考虑其版本是否合适。

关闭控制台后程序停止运行

原因:需要运行 forever 命令来保持程序始终在后台运行

解决过程:安装forever命令

sudo npm install forever -g
forever start app.js

npm 安装 forever 命令失败

原因:npm 版本过低

解决过程:安装 nodejs-6x(参考:https://nodejs.org/en/download/package-manager/)

curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -
sudo yum -y install nodejs

网件 R6400 折腾笔记

网件 R6400 折腾笔记

前言

武汉房子里的路由器是以前的租客留下的,信号超差,差到我妈都受不了,于是批准我买新的路由器。作为萌新啥都不懂,于是就去搜知乎,然后打开了新世界的大门。头一次听说路由器还可以刷机,还可以搭建 nas,还能配置 shadowsocks,并且 get 到各种新知识

新手科普

买硬件从来不敢瞎买,必然是一堆科普过后才敢下手

并不是带宽够就一定能拥有快速的网络呢

我对路由是一有一定了解的,有个好朋友是个运维。他这么跟我说:想要通过无线WIFI享受100M网络,一定要使用基于 802.11ac 的 5G 频段。因此,你是要必须拥有可以接收 5G 信号的无线网卡和路由器

2.4G 和 5G

路由器的频段粗分为两个,2.4G 频段和 5G频段 单频的其实就指的是只支持2.4G的802.11b/g/n三种协议 双频又叫ac路由器指的是同时支持802.11bgn和802.11ac

2.4G 里的协议分为三代 802.11b:理论最高 11Mbps(1.375MB 每秒钟这个的确可以做到) 802.11g:理论最高 54Mbps(6.75MB每秒这个的确很虚了) 802.11n:理论最高 600Mbps(能做到就见鬼了)

5G 的话细分是也有不少
但是主流的是 802.11n 和 802.11ac
802.11n 可以在 5G 频段工作,不过性能远不如 ac 的好
用公司里的优科 Ruckus 的无线 ap 测验过
100M 宽带下的实际下行速度其实就 8MB/s 不到甚至更低
802.11ac 的话,最高可以达到 40-60MB/s,100M 宽带可以轻松跑满
重要的是,在 802.11ac(个人认为这个叫真 5G)环境下
无线设备和路由器的连接,延迟可以媲美有线
在 Netgear R6100 配上5G usb 网卡的情况下,打 MC 在线完全没问题

网络上行与下行

目前我们消费者接触的运营商(ISP)的宽带,上行速率和下行是有很大区别的
比如100M的电信光纤,家用的话,下行带宽是100M,但是上行只有8M,即1MB每秒
如果是8M的宽带上行顶多就1M,即128KB/s
这样做的目的
1,普通家用的人根本用不着太高的上行带宽,最耗费上行带宽的QQ或者微信视频聊天
亲测只需要128KB/s的稳定上传就可以完全不卡,测试情况是城中村宽带和日本的微信视频聊天
2,多余的上行带宽可以卖给有需要的大企业,比如上下行对等的20M宽带(专线)
用的是静态ip不是随机分配,**电信的报价是八九千一个月。。。

路由器带机量

带机量由这些东西决定:处理器性能,运行内存大小,支持多少出入以及哪种MIMO技术 普通的路由比如那台99包邮的,处理器主频400Mhz,运行内存8M,闪存2M,支持3T3R 这样的机子明显不适合带多个的,就那小破运存玩啥。。

信号强度与路由器发射功率

工信部把无线路由器的发射功率限制死了在100毫瓦
100毫瓦是个啥概念?手机天线的发射功率都有800毫瓦
所以某些品牌说自己的路由器有穿墙模式,顶多就个噱头
当然也有些品牌会隐藏自己更改发射功率的能力
比如磊科的某些路由器可以开到200mw,D-link的某些路由器可以开到300mw左右
Netgear的某些路由器,通过更改固件,换运行区域或者插代码,可以达到500mw的发射功率
不过呢,发射功率越大不见得效果越好,发射功率和接受信号优劣仅仅是部分正相关
如果发射功率太高,而本身路由器天线质量很差,这样信噪比会变得很恶劣
而如果路由器本身的承载能力处理能力不足,你会在很远的地方都收到路由器信号
而且,网络根本连接不上,俗称假信号。
路由器的NAT能力远远比无线信号功率更重要

参考:

【知乎】有哪些家用无线路由器值得推荐?

【知乎】家庭用 100M 光纤使用什么无线路由器才能发挥最大带宽?

购买

大家最推荐的就是网件了,于是去狗东一搜,沃日!

正当陷入纠结的时候,我不知从哪儿鬼使神差的看到 R6400 这个型号,狗东 618 领券到手价 400。果断变身销售人员以三寸不烂之舌说服了母上。因为电脑上 1T 硬盘真的不够用了,而且 Android 上用影梭开 SS 老是容易杀进程真的烦,花 400 如果能解决这两个痛点而且还有各种功能等着我折腾我真的觉得值。跟妈说如果不给我钱我下个月发工资也会买的,这样就得忍受现在这个破路由器一个月。母上自己也烦现在的路由器网速慢信号差,于是就恩准了

验货

正面一个 USB 3.0,放到正面确实人性化,设计师干得好!

各种指示灯和让人摸头不知脑的操作按钮

四个 LAN 口 + 一个USB 2.0

与之前的三流路由器对比

初始化

插好电源和 WAN 口后启动,按照机子反面给出 WIFI 名和密码连接,浏览器会自动打开配置向导界面让你配置 WIFI 名和密码,然后路由器会重启来应用你的配置,搞定之后就进入主界面了

梅林固件

想折腾,梅林固件就是第一步

啥是梅林固件

Asuswrt-merlin 是一个对华硕 Asuswrt 固件二次开发进行各种改进和修正的项目。Merlin 固件拥有更多的功能,由于第三方不断维护代码,各种新功能也在不断增加

KoolShare论坛 | KoolShare 固件列表

开整

Merlin 固件使用的是华硕官方的闭源驱动,而不是其他人使用的开源驱动,稳定性相比开源驱动要高很多,同时也就意味着非华硕的路由器想用梅林纯看运气,碰巧跟华硕某个版本硬件一致了就能用,不一致就别指望能有支持了

由于网件和华硕多少硬件上有些不一致,所以需要从 .chk后缀的梅林固件过渡,然后再刷入.chk后缀的高版本固件

下面讲的刷机教程仅限网件 R6400,其他型号请自行搜索教程,自行下载对应型号刷机文件,变砖后果自负

以下是待会用到的固件,再重复一遍,不是 R6400 不要用下面的固件刷,会砖

下载 R6400_380.63_2_X7.2.1.chk | 下载 R6400_380.65-X7.4.trx

原生固件 -> 梅林7.2

高级 –> 管理 –> 路由器升级 -> 上传 R6400_380.63_2_X7.2.1.chk

点上传后,会提示你是否继续,点确定

点确定后,就提示固件或升级将花2分钟,请勿关闭电源或按复位键。。中途不能断电

若等3分钟后,浏览器界面会转到梅林的界面,若不会自动跳转,等路由器的电源灯变为白灯时,浏览器直接输入192.168.1.1。看见梅林界面后,点最上方的“跳过设置向导”

需要你设置无线密码后才能进入路由器设置主界面

首次进入梅林主界面,需要设置管理员用户名与管理员密码

设置好管理员和密码后就进入梅林主界面

梅林7.2 ->梅林7.4

系统管理 -> 固件升级 -> 新固件文件 -> 选择文件 -> 选择 R6400_380.65-X7.4.trx

刷机过程中,千万不要去手动重启或关机路由器,后果可以很严重。升级完成后,浏览器也会自动跳转登录页面。如下图:填上你之前设置过的用户名和管理员密码登录就行

登录后回到梅林设置主界面,使用7.4前,先进行一次恢复出厂设置。为了减少问题

恢复出厂重新进入界面,在系统管理内的系统设置里找到下图红框的2个选项,都勾选上”是“,应用后重启路由器,就可以设置上网设置无线打开软件中心使用了

参考

小白R7K请别用TT当过渡固件

网件R6400刷梅林固件教程

shadowsocks

shadowsocks 是一种神奇的魔法(你懂得),不了解 shadowsocks 的童鞋可以看看我的这篇文章:

史上最详细的零基础新手傻瓜教程,使用 shadowsocks 搭建自己的 VPN

受魔法屏障的影响,现在梅林固件的软件中心里已经不再提供shadowsocks的在线安装。不过依然可以通过离线安装完成

不过我们可以 从 github 下载 shadowsocks 安装包

点击左侧菜单最下面的Software Center,使用离线安装的方式安装

然后你的软件中心就会多出一个叫做科学上网的应用,自己到里边配置代理服务器吧

参考:梅林固件安装shadowsocks

开启Samba服务

待填坑...

下载工具

待填坑...

参考:梅林固件折腾笔记二--搭建小型NAS

搞机!搞机!搞死这只机

搞机!搞机!搞死这只机

起因

想要root

想要Google服务

想要Xpose

权衡了EMUI5与EMUI4的优缺点,我选择EMUI4

流程

去年就试过用KingRoot之类的软件了,可想而知是想不通的。百度搜出了一些root教程,刚开始看得我一脸懵逼,但是傻瓜教程不用懂为什么,跟着做就好了,当时没有多管。现在明白了整个流程是酱紫的:

1.去官网弄到解锁码

2.使用adb进fastboot,然后输入解锁指令,解锁指令的参数就是解锁码

3.然后这样就可以刷第三方recovery了,可能是因为原生recovery无法刷包吧

4.然后有了第三方recovery,就可以刷包了。可以单刷SuperSu包,也可以刷rom包

5.有了SuperSu,就可以装Google服务或Xpose了

解锁码

听说华为手机需要解锁码才能搞机,于是去官网弄解锁码。网站上总是提示我的华为账号没有在手机上登陆超过14天,其实早就超过14天了。于是就一直卡在这块了,渐渐的就不去在意root的事了

后来偶然看到大家也有遇到同样状况的,有几个人说是官方故意限制用户开rooy,打客服就解决了

刚开学这几天,不知怎么地,又燃起了搞机的欲望,于是试着打客服了。客服记下了好几个难念的手机序列号之后,不知道为啥,我在网上又操作了一遍,就这么轻松地弄到了解锁码

解锁

这个倒是没啥,咱搬来就是Android程序员,adb不至于不会用,3个指令搞定

adb devices
adb reboot-bootloader
fastboot oem unlock <解锁码>

刷recovery

这一步就是个大坑了,以前玩的是 Android4.4 手机,没有刷过 recovery,因为原版的 recovery够用,所以对这方面没有什么经验,鬼知道 recovery 与手机的系统存在兼容性问题,固定版本的 EXUI 必须刷固定版本的 recovery

然后我的手机就一直停在开机画面进不去了,当然也进不了recovery。以之前的搞机经验,只要硬件没事,recovery还在,无论发生什么事我都会处惊不变。但是这次我真的无法风轻云淡了,我明白搞机有变砖的风险,但是,当事情真的发生在我身上,啊不,我手机身上,我开始方了

度娘再次拯救了我,原来华为有一种神奇的机制。开机时持续按音量+键3秒就可以联wifi下载官方系统恢复手机,这一点确实很良心

这一恢复,没有还原成 EMUI5,而是直接退回到了 EMUI4.1,庆幸服务器上的系统还没有更新。我以为这下好了,不是 EMUI5 就不会有 recovery 不兼容的问题了,结果再一次重演悲剧

后来查询到怎么还原到以前版本的系统后,下载了华为的手机助手 HiSuite,还原到了 EMUI4.0,终于成功刷入了 recovery

刷包

本来下到了 SuoerSU 的包准备刷的,但是我的心脏经不起折腾了,觉得刷 rom 比较稳,于是刷了个第三方 rom

狗带

到此为止,终于 root 了,第一件事就是装上酷安,下载自己备份的应用集,有了 root,装 app 终于可以不用一个一个点确定了。于是我又向往常一样刷起了排行,在排行上刷到了 Xpose,想起自己还没装这个呢,于是点了下载

打开Xpose,上来就是一个写着英文警告的提示框,翻译成中文就是不会搞机的别瞎tm刷Xpose,我错误的选择了相信自己

再次不能开机。这一次,recovery 能进,但是不能联 WIFI 恢复官方系统了,提示服务器连接失败什么的。关于这个提示,我在系统为官方 EMUI4.1 时也有发生过,所以可以排除因为是第三方ROM所以接口响应失败这个原因

这我就不明白了,按理来说,这个接口的传参应该是手机型号,而手机型号不会根据现在的系统而变化,如果真跟系统扯上关系,为什么 EMUI5 就能成功,而其他版本就不行呢?也许是我多想了,华为的技术还是很优秀的/,不至于写出这么没有鲁棒性的接口,可是硬说是 WIFI 原因也是说不通的,因为之前都成功刷入了,而且 WIFI 不止我一个人在用

当时是没有像这么多的,无法刷官方系统就刷第三方系统好了。可是重刷了一遍,一点改善都没有,还是死死的停在开机画面

当时已经到了凌晨,我是记不住学校的事情的人,其中当然包括课表。而且,我也真没招了,如果再去问度娘,又不知道要试到第几个方法才能好。于是只好睡了,也不知怀着怎样的心情睡着了

大清早被吵醒,这是早上有课的凶兆,厕所被占无法洗漱,于是又开始折腾手机,能打开的就只有recovery,看到了一个格式化 data 分区的选项,以开发者的经验来看,所有的软件都安装在data里边,如果格式化 data 分区,Xpose 作为一款软件应该也会被清除掉,于是就死马当活马医地点了下去,重启之后,还是卡在开机界面,死马只是被我又鞭尸了一次而已

反正已经鞭尸一次了,不如再鞭一次,可能是data里还有其他重要的东西带着一起删了所以无法重启,于是我再次刷包,手机神奇的复活了,开心得我恨不得马上下一堆我手机原来的软件,可惜一上午的课,想了想还是别逃了,不过能拯救我的手机我已经很开心了

感想

其实这个故事已经是精简版本了,虽然是昨天才发生的事情,但是记不太清了,以上的每一步,其实都不是一遍成功的

由于我的行为,整个过程中屡屡发生让人心惊的事情,刚开始一股后悔涌上心头,但是不一会儿我就看开了。咋一看发生那么多屁事都是因为我手贱,但是仔细一想,这并不是可以避免的事情

因为心理上不可避免,而心理决定行为。好奇与探索是从我一生下来就植根于基因的东西,以此惹过麻烦,也饱受折磨。这种心理并不会强烈到完全不受外界事物的影响,但是根深蒂固。我尊重他人隐私所以不好奇,我珍惜生命所以绝不探索与死亡有关的事物。但是我可以毫不在意千元手机的死活瞎折腾,也不顾老师的点名而逃课不折腾好不罢休

补充一下,关于珍惜生命的理解。珍惜生命绝不等同于害怕死亡,生命是重要的,但对于我来说,却不是最重要的。虽然比生命重要的事物不多,但还是有一些的。个人觉得那种把生命放在第一位的人是可悲的人

后续

嗨呀,Xpose 还是没有安装上,好气哦,有时间还得再折腾手机

话说寒假装 ubuntu 因为总是死机而告终,后来把电脑弄得不能启动了,差点被维修人员骗了 70RMB,虽然最后还是成功自救了,但是没有装好 ubuntu 还是好气哦。最近听朋友说他也遇到这个问题,说是当前linux 内核对 skylake 架构的 cpu 支持不是很好,要翻墙下驱动貌似

如果不出意外,明天去泡咖啡厅蹭网吧。解决方案留在这里方便明天用

http://blog.csdn.net/xjz18298268521/article/details/52788133

http://www.jianshu.com/p/34236a9c4a2f?winzoom=1

我的网站导航

因为 vultr 上搭的 vpn 看不了 p 站,于是果断删掉了服务器买了一年的搬瓦工小鸡。买 vps 光用来科学上网简直是浪费,于是参考这篇文章:VPS有什么有趣的用途?,疯狂折腾了一番。这个过程中,发现百度的自定义导航已经满足不了我的需求了,现有的产品有是有,但是全部都用户体验极差,UI 辣眼睛,有很多直接使用表格来布局一眼望去全是字根本找不到想要的网站,于是乎想自己写一个导航。

导航无非就两个功能呗:1.提供搜索引擎 2.跳转到常用网站。当初的想法是结合数据库。从数据库中加载网站和搜索引擎,甚至想支持多用户自定义配置。想法是美好的,现实是我这边用java做后台遇到了一些迷之状况,有些地方用纯 html 能完美运行,但是一加上 js 就不行了,我始终找不出原因,于是就用纯html 随便挂服务器上了。结果用了一个星期发现好用得不得了,以至于每次打开主页都会惊叹于自己的才华(自恋中)。每次打开都会随机一张背景图,而且 UI 设计上既能看到背景又能看到控件。自定义搜索引擎,不管是谷歌度娘,还是淘宝京东,甚至想搜 Github 或 Maven 都随你。网站分类 Tab,自动获取网站logo,基本不用鼠标辊轮就可以快速找到想要的网站。左下角T ab,用来做个人向的链接跳转,比如自己的博客,Github 主页啥的。老娘tm就是个天才!不接受反驳。网站大概长这样:

现在越来越想按照当初的想法结合数据库做了,一是觉得我的导航真是又好看又好用,二是觉得需求应该是有的,而且现有的产品真没有一个我看的上的。百度首页做导航固然不错,但是百度导航只有百度搜索,而百度搜索甚至害死过一条命,珍爱生命,远离百度。360导航,hao123 这种恶心东西谁要是用,我都会不由自主的对这个人产生偏见。Github 上有些部署在服务器上就能运行的导航源码,但是 UI 太丑了。总结:我的导航配合数据库做多用户将是世界上最好用的导航。

吹归吹,但是落到实际上,我写网站的功底是菜鸡级别的,毕竟整个大学基本用来学Android了。例如,我试过各种方法想让网站 logo 在网站名称的左边开头那儿,可是 Google 到的方法怎么弄都不好使。关于怎么用 js 获取 radio 选取的值,还有搜索部分,点击搜索按钮和回车要怎么处理,这里是好不容易瞎实现的,对就是瞎实现的。如果这个真的做到有别人用的程度,访问速度又是个问题。exm,CDN 是个啥东东来的?完全布吉岛啊 ORZ。鉴于之前用 Java 作后台会出现一点迷之状况,想转战 php 的说,这又是新的挑战。

总之如果这个东西做成了,可能会再写一些别的小玩意,我还蛮想给自己博客加一个类似QQ空间的版块,不写技术,用来扯闲话的地方,希望是双端的。说道这里,我也好想换个更酷炫的博客主题,作为私飞斋真的很想要二次元的主题了。之前有试过轻改过博客主题,但是我一只前端菜鸡很难办到吧ORZ。好羡慕别的大佬,知道的东西多,文章写得有水平,博客又酷炫,访问量又高。像我这种辣鸡,写的东西没有营养,访客约等于只有自己,写了啥都没有人看TAT,但是就算这样,我也会好好写博客的呢(擦干眼泪)。

2018-5-13 补充:

目前是已经做出来个demo版本的东西了,https://github.com/ChenViVi/portal,算是勉强能用,现在日常使用上没有致命性的毛病,而且确实是有一定实用性的,至少我天天都在用,而且少了它不行。但还是各种 bug 各种 low,还有很多地方需要完善,预计7月份再次开工吧

Hexo 博客,我新的纪录方式

Hexo 博客,我新的纪录方式

今天刚从张哥的小密圈里了解了几种搭建博客的方法,其中就有Hexo。去网上搜到教程,这个教程就是用Hexo写的,(在这里)但是翻到搭好时的效果图的时候,我就想放弃了。嗨呀,这还不如我之前用模板拼的博客好看,看来这画风怎么会有些博客的动力嘛。后来一眼瞟到教程中写的主题那块了,既然可以换主题,那我就放心了

教程中的步骤很全,很快就搭好了,但是稍有不足的是,没有放上每一步的截图。那么我这里再写一遍吧,趁热...打铁

准备工作

安装Node.js

走你

作用:用来生成静态页面的

安装Git

走你

作用:把本地的hexo内容提交到github上去

申请Github账号并建立代码仓库

走你

作用:这里是准备把博客托管到github上

注册登录就不说了,这里讲讲怎么建立代码仓库。Github老鸟只需要知道,这个仓库的名称的格式必循是是your_user_name.github.io就可以自己弄好然后进入下一步了。

如果没用过github,跟着下面图中的红框一路走吧

仓库名必须为your_user_name.github.io,比如我的用户名是ChenViVi,那么仓库名称为ChenViVi.github.io

安装Hexo

win键+r键打开终端,输入如下指令

npm install -g hexo

npm是安装了Node.js才能使用的指令,然后安装了hexo咱们就能使用hexo命令了

初始化

创建一个文件夹,这里我创建的文件夹的名字是hexo,然后用cd命令进入这个文件夹。不懂cd命令的童鞋看图

然后执行如下命令

hexo init

生成静态页面

执行如下命令

hexo g

本地启动

启动本地服务,进行文章预览调试,执行如下命令

hexo server

浏览器输入http://localhost:4000,即可看到你的博客

然后终端中按下Ctrl+C退出服务吧

与Github建立关联

1.Win+R打开终端,输入如下命令

git config --global user.name "此处替换为你的Github用户名"
git config --global user.email "此处替换为你的Github绑定邮箱"

2.用记事本打开_config.yml,翻到文本最末尾,将deploy:后面的内容修改如下,其中repository: 后写你的仓库地址

deploy:
  type: git
  repository: https://github.com/ChenViVi/ChenViVi.github.io.git
  branch: master

: 后面要有一个空格

执行如下命令来安装hexo-deployer,这样才能使用hexo来执行git部署

npm install hexo-deployer-git --save

将代码部署到Github

hexo deploy

如果你在第6步中没有正确的写好_config.yml文件,此时将出现YAMLException

新建并上传文章

1.执行如下命令来新建文章

hexo new "new article"

2.打开你当前网站目录下的source_posts路径,里边会有一个new-aritcle.md文件,打开它开始写文档吧,不懂MarkDown的童鞋戳这里

3.执行如下3条命令来上传文章

清除现在的静态网页

hexo clean

重新生成静态网页

hexo g

上传到Github

hexo deploy

以后写文章就是无限循环这几步

其他常用命令

hexo new "postName" #新建文章
hexo new page "pageName" #新建页面
hexo generate #生成静态页面至public目录
hexo server #开启预览访问端口(默认端口4000,'ctrl + c'关闭server)
hexo deploy #将.deploy目录部署到GitHub
hexo help  #查看帮助
hexo version  #查看Hexo的版本

博客主题

博客的画风好不好会直接影响到一个人阅读与写作的心情,所以为了改善博客的画风,可以配置博客主题,可以直接百度一下hexo主题

这里推荐http://hexo.io/themes这个网站,里边有很多主题,还可以直接预览效果

下面介绍一下最常见的主题安装步骤,以hueman主题为例。一般来说,github里会介绍主题安装与额配置的步骤的,或许会稍有不同

打开hueman主题的主页

下载主题

在你的hexo博客根目录下,在终端执行如下命令

git clone https://github.com/ppoffice/hexo-theme-hueman.git themes/hueman

这行命令后面的第一个参数是主题的地址,如果希望使用其他主题,更改此参数即可,查看参数的方法如图所示

第二个参数是主题存放的文件夹,这里把下载的主题保存在根目录下的 themes/hueman文件夹

设置配置文件

1.打开根目录下的_config.yml文件,将语言设置为中文

2.翻到_config.yml文件的文本末尾,将主题设置为hueman

这里 theme: hueman 中的hueman对应着你刚才的主题的下载目录,也就是根目录下的 themes/hueman文件夹,如果需要使用其他主题,把hueman改成其他themes目录中的文件夹即可

3.设置主题配置

将根目录下的 themes/hueman文件夹中的_config.yml.example文件重命名为_config.yml

每一个主题的配置文件都叫做_config.yml,这里是直接把默认的示例配置文件作为配置文件直接使用,如果需要自定义主题,可以打开配置文件自行修改,修改的方法每一个主题的说明文档里都有介绍

安装搜索功能(可选,如果不执行这一步,将无法使用博客搜索功能)

在终端执行如下命令

npm install -S hexo-generator-json-content

完成以上步骤,你的博客主题就配置完成了,执行以下命令,查看效果吧

hexo clean
hexo g
hexo server

打开http://localhost:4000/

CentOS Java Web 服务器配置

CentOS Java Web 服务器配置

环境

本机环境:CentOS 6.5

将要配置的环境:

jdk 1.8

tomcat 7

mysql 5.7

Java

安装

把 Java 安装包传到 /usr/share

运行如下命令

tar -zxvf jdk-8u144-linux-x64.tar.gz

配置环境变量

/etc/profile 末尾添加三行内容并保存

export JAVA_HOME=/usr/share/jdk1.8.0_144
export CLASSPATH=.:%JAVA_HOME%/lib/dt.jar:%JAVA_HOME%/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

运行如下命令

source /etc/profile
javac

Tomcat

安装

把tomcat安装包传到 /usr/share

运行如下命令

tar -zxvf apache-tomcat-7.0.81.tar.gz

启动服务

运行如下命令

cd /usr/share/apache-tomcat-7.0.81/bin
./startup.sh

开机运行服务

参考:http://blog.csdn.net/huxu981598436/article/details/54863298

在/etc/init.d下新建一个文件 tomcat

vi /etc/init.d/tomcat

写下如下代码

#!/bin/bash
# chkconfig: 2345 10 90
# description: Starts and Stops the Tomcat daemon.
# /etc/init.d/tomcatd
# Tomcat auto-start
# Source function library.
#. /etc/init.d/functions
# source networking configuration.
#. /etc/sysconfig/network
RETVAL=0
export JAVA_HOME=/usr/share/jdk1.8.0_144
export JRE_HOME=/usr/share/jdk1.8.0_144/jre
export CATALINA_HOME=/usr/share/apache-tomcat-7.0.67
export CATALINA_BASE=/usr/share/apache-tomcat-7.0.67
start()
{
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            echo $"Starting Tomcat"
                $CATALINA_HOME/bin/startup.sh
            RETVAL=$?
            echo " OK"
            return $RETVAL
        fi
}
stop()
{
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
                $CATALINA_HOME/bin/shutdown.sh
            RETVAL=$?
            sleep 1
            ps -fwwu root | grep tomcat|grep -v grep | grep -v PID | awk '{print $2}'|xargs kill -9
            echo " OK"
            # [ $RETVAL -eq 0 ] && rm -f /var/lock/...
            return $RETVAL
        fi
}

case "$1" in
 start)
        start
        ;;
 stop)
        stop
        ;;

 restart)
         echo $"Restaring Tomcat"
         $0 stop
         sleep 1
         $0 start
         ;;
 *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac
exit $RETVAL

执行 :wq

设置权限

chmod 755 /etc/init.d/tomcat

设定开机启动服务

sudo chkconfig tomcat on

测试

service tomcat start  
service tomcat stop  
service tomcat restart  

Mysql

参考:http://www.cnblogs.com/starof/p/4680083.html

安装

如果使用 yum 命令直接安装,CentOS 6.5会直接安装 mysql5.1。而笔者希望安装 mysql5.7,所以需要添加 mysql5.7 的源

wget http://repo.mysql.com//mysql57-community-release-el6-8.noarch.rpm

启用添加的源

rpm -ivh mysql57-community-release-el6-8.noarch.rpm

查看是否启用 mysql5.7 的源

yum repolist enabled | grep mysql

安装 mysql5.7

yum install mysql-community-server

注意:这里不要使用 'yum install mysql' 来安装,不然会安装 'mysql-client',而不是'mysql-server'

初始化mysql

新版本需要这一步

mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql

如果出错,试试如下命令

rm -rf /var/lib/mysql/*

原因分析:

mysqld 服务会检查数据目录是否存在

如果数据目录不存在,mysqld 则会创建它。

如果数据目录存在,且不是空目录(即包含有文件或子目录),mysqld 会显示一条错误信息并中止

启动服务

service mysqld start

开机自启

chkconfig mysqld on

中文编码

/etc/my.cnf中相应位置添加如下内容

[mysql]
default-character-set =utf8

修改密码

参考:http://jingyan.baidu.com/article/495ba841ef412d38b30edeb2.html

mysqladmin -uroot -p password 123456

打开 3306 端口

/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
/etc/rc.d/init.d/iptables save

远程登录

参考:http://www.cnblogs.com/starof/p/4680083.html

mysql -uroot -p123456
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

亲手打造萌萌哒的新键盘

亲手打造萌萌哒的新键盘

前言

这是一个完全不懂硬件的菜鸟一步一步组装GH60键盘的故事。

之前那个 ThinkPad 坏得不能再写代码了,于是我换了新电脑,但是不习惯战神的键盘,太硬了好难摁下去,还是 ThinkPad 的键盘爽,但是目前也只好再买一个键盘,于是去网上了解什么键盘好用。

知乎上有人推荐 GH60,头一次知道还可以自己组装键盘,而且是开源的,感觉非常有意思啊,于是就下手了。

组件

  1. PCB( Printed Circuit Board),中文名称为印制电路板。这里是指键盘的主板,貌似有带底灯和无底灯两种 PCB 可选。
  2. LED 底灯。可选项,如果不需要底灯就不需要买。
  3. 轴。机械键盘之所以为机械键盘的原因。
  4. 定位板。没有这个的话,到时候焊轴会焊歪,别问我怎么知道的,文章后面会有详细反例。但是好像也有老司机不喜欢用定位板干脆去掉定位板的。
  5. 卫星轴一套。用于固定比较长的键,如空格键,enter 键等,都需要卫星轴来支撑。
  6. MiNi USB 数据线一条。用于连接电脑和键盘。
  7. 键盘外壳。
  8. 键帽。真贵啊。

开始组装

刷固件

这一步卖家写得挺详细,就不多说了

https://mp.weixin.qq.com/s/N_kdfWUl1c_9EscuJ_nMoA

装卫星轴

卫星轴塑料部分由两部分组成,暂且叫做 A 部分和 B 部分

首先,我们需要把 B 怼进 A 里边,然而B的两侧和A的两侧的构造都是不同的,应该朝什么方向呢?这里有一个辨别方法。

如下图,A 的两端一端是圆型,一端是角型。画红框的那一端就是圆型。

如下图,B 的一端是上面有横梁的。

将A的圆型那一端与 B 的有横梁端朝同一面套进去就行。然后,两个一个对穿上钢丝

最后,把卫星轴装到 PCB 上。圆型端对着大孔,角型端对着小孔。角型端会比小孔稍微大一点,需要用力摁下去。

一共有 5 对卫星轴需要装配

正确安装好的卫星轴,应该是紧贴 PCB 的。不然说明你没有将卫星轴紧摁进去。

PCB 倒立时卫星轴的 B 部分应该是自然下垂的,不然就说明你 A 与 B 部分装反了方向,换方向重新安装即可。

装轴

如果你不适用定位板,你可能会焊成这个样子。仔细一看,就能发现轴焊得歪歪扭扭。所以对于新手,还是用定位板的好。先把轴固定在定位板上,然后盖到 PCB 上,然后再焊。

需要注意的是,有些地方一个键位可以以有两种位置可以选择,这可不能随便瞎选一个,最好把键帽套在轴上试一试这个位置是否适合你的键帽然后再焊,不然可能会出现焊完后套键帽,几个键帽挤在一起根本没办法把键按下去的问题。

这是焊好所有的轴之后的样子

先别急着做下一步,赶紧插上键盘试试每个键是否好用吧。

装底灯,装键帽

注意区分正负极,LED 灯长的那一端是正极。

当你在 PCB 正面装好灯,准备翻去反面焊的时候,灯会往下掉,直到碰到桌面。千万不能这就开焊,由于 PCB 反面放置于桌面时,支撑它的是轴,那么现在灯的顶端和轴的顶端是在同一水平面的。而当键按下去的时候,键帽会忘下压,这轴时也忘下压,而灯不会和轴一样弹性,于是会阻止你按下这个键。

针对上面提到的问题,我有个可行方案。先把 LED 灯的正负极插在 PCB 上,然后装上键帽,拿焊锡的手把 PCB 压住,确保这个键是按下状态,然后开焊。一定要确保这个键是按下去的状态下才焊灯,这很重要,不然还是可能出现上面的状况。

装外壳

如果你想刷配列,不必刷完配列再装外壳,装好外壳后,你会发现键盘背面有个的孔正好可以按到重置键。

刷配列

刷配列可以说是开源键盘最让人心动的原因之一。想一想,输入默认账号密码,打开某个软件,或者某个键的功能让你不满,现在这些功能只需要你通过编程告诉键盘你想让哪个键做什么事,键盘就能如你所愿,这简直太棒了。

首先,打开这个网站http://yang.tkg.io/ydkb/

点击【读取 KeyMao 】来读取你键盘现在的配列

点击【上放区域】中你想修改的键,然后到【下方区域】选择你希望这个键位达到的功能。

人如果你希望你的键盘有多个配列,点击【上方区域】中的 Tab 来切换到另一个配列并进行编辑。

现在你已经编辑了多个配列了。怎么告诉键盘你要使用哪个配列呢?当然是通过按键了。所以,下一步就是设置 Fn 键。

因为我的怠惰所以断更了额,等勤勉的再补回来......

哀家敲代码就是一把梭!

哀家敲代码就是一把梭!

前言

以个人的实际经历为例,分享一下当不会技术却需要研读源码时,可能会有所帮助的技巧。希望各位写代码都是一把梭,拿起键盘就是干!

搞事

这几天搞的大事就是自己把现在博客用的indigo主题自己折腾了一下,参考raytaylorism主题加了一个读书页面。raytaylorism主题确实有很多我非常中意的特性,但是依我个人的审美观还是觉得indigo主题更加美观,所以写了一篇文章分析了一下indigo主题没有的功能,自己研究研究源码改一下,就是这篇:indigo主题尚待完善的功能。我最想要的就是读书这个板块了,这个板块稍微改一下就能把看过的电影或番剧,听过的音乐都记上去,并不是要装文艺,但是有些东西如果忘了真的可惜

读书页面

研究代码的第一步是使用它

要了解代码的工作方式,就应该先使用它。我把我的主题切换成raytaylorism主题,发现想要改变如上图读书页面中的内容,只需要改变source/_data/reading.json中的内容就行了,json大概是这种结构,不用多解释,看到就一目了然的结构

{
    "define": {
	    "readed": "已读",
        "reading": "在读",
        "wanted": "想读"
    },
    "contents": {
        "readed": [{
            "title": "众妙之门:网站UI设计之道",
            "cover": "https://img3.doubanio.com/lpic/s23139051.jpg",
            "review": "推荐非UI人士了解UI阅读。",
            "score": "7",
            "doubanLink": "http://book.douban.com/subject/20281463/"
        }, {
            "title": "JavaScript模式",
            "cover": "https://img1.doubanio.com/lpic/s11337059.jpg",
            "review": "书很薄,但内容相当实用。",
            "score": "8.5",
            "doubanLink": "http://book.douban.com/subject/11506062/"
        }, {
            "title": "JavaScript语言精粹",
            "cover": "https://img3.doubanio.com/lpic/s27993864.jpg",
            "review": "这是一本前端人员的基础书,强烈推荐阅读,而且越早看受益越多!",
            "score": "9.5",
            "doubanLink": "http://book.douban.com/subject/11874748/"
        }],

		"reading": [{
            "title": "网络游戏核心技术与实战",
            "cover": "https://img1.doubanio.com/lpic/s27881888.jpg",
            "review": "",
            "score": null,
            "doubanLink": "http://book.douban.com/subject/25850090/"
        }],

        "wanted": [{
            "title": "计算机程序的构造和解释",
            "cover": "https://img5.doubanio.com/lpic/s1113106.jpg",
            "review": "",
            "score": null,
            "doubanLink": "http://book.douban.com/subject/1148282/"
        }]
    }
}

粗看源码

但是单从使用的角度无法明白具体的实现方式。就算知道了这个页面由这个json文件控制,但是为什么是这个json文件,而且数据是怎么被抓取并生成静态页面的,并不知道,所以接下来要看源码了

全局查找,定位要看的源码

源码中很多文件,我这里只需要了解读书页面,不需要理解所有的源码,所以需要定位哪一个部分才是需要看的源码

不管看什么代码,如果不知道要看什么部分,全局查找多半能定位到需要看的代码。这里我的具体做法如下:

  1. 在火狐浏览器中,鼠标停留在某一本书上,点击右键->查看元素。如图,可以看到,这个元素的class是book-item col s12 m6

  2. 在Atmo编辑器中全局查找关键字:book-item col s12 m6,如图,定位到reading.ejs这个文件,毫无疑问,看着名字就知道这个文件就是生成读书页面的文件

不惧怕陌生的代码,代码都是相通的

笔者是一个基本不会前端技术的人,水平是属于上学校的Web课也就能及个格的那种。.ejs是什么东西我是完全不知道的,Node.js也只是听过名字而已。但是当我打开reading.ejs看到陌生的代码,却能把代码逻辑看懂个大概,因为不管是什么代码都有相似之处

下面是reading.ejs的代码。显然<%......%>中的都是逻辑代码,以var开头可以声明了一个变量,
readingData这个变量名一看就知道是reading.json中的数据,tabCount是Tab的数量,其值为3,因为一共3个Tab,分别是“已读”,“在读”,“想读”.第二段和第三段,外层都有for循环,分别用来生成Tab和book-item

无论是什么代码,都有相似点,这里列举一下

  1. var开头一看就是变量
  2. 有new关键字知道在创建对象
  3. if else for switch,逻辑控制语句所有语言都得有
  4. a.b.c 一看就知道在调用成员
  5. a.b.c()是在调用函数
  6. 文件的名字,变量的名字,对象的名字,函数的名字描述了它的作用
<% var readingData = site.data.reading;
    var tabCount = Object.keys(readingData.define).length;
%>

<div class="container main-container">
    <% if (readingData) { %>
        <div class="">
            <div class="row">
                <ul class="tabs ">
                    <% for (var key in readingData.define) { %>
                        <li class="tab col s<%= 12 / tabCount %> ">
                            <a class="<%= theme.color.tab %>-text " href="#<%= key %>"><%= readingData.define[key] + '(' + readingData.contents[key].length + ')'%></a>
                        </li>
                    <% } %>
                </ul>
            </div>

            <% for (var key in readingData.contents) { %>
                <div id="<%= key %>" class="row" style="margin-top: 20px;">
                    <% var bookList = readingData.contents[key]; %>
                    <% for (var i in bookList) { %>
                        <div class="book-item col s12 m6">
                            <div class="card small hoverable">
                                <div class="card-image waves-effect waves-block waves-light">
                                    <img class="card-cover-image activator" src="<%= bookList[i].cover %>">
                                </div>
                                <div class="card-content <%= theme.color.link %>-link-context">
                                    <span class="card-title truncate activator grey-text text-darken-4"><%= bookList[i].title %>
                                    </span>
                                    <p><%= __('reading.score') %>: <%= bookList[i].score || '???' %>
                                        <a class="external-link right" href="<%= bookList[i].doubanLink %>" target="_blank">

                                            <i class="fa fa-external-link"></i>
                                        </a>
                                    </p>
                                </div>

                                <div class="card-reveal">
                                    <span class="card-title grey-text text-darken-4"><%= __('reading.comment') %>
                                        <i class="fa fa-times-circle-o right"></i>
                                    </span>

                                    <p><%= bookList[i].review %></p>
                                </div>
                            </div>
                        </div>
                    <% } %>
                </div>
            <% } %>

        </div>
        <%- partial('_partial/plugin/comment', {page_id: 'reading'}) %>
    <% } else { %>
        <%- partial('_partial/construction') %>
    <% } %>
</div>

自己写Demo

当时试着直接把reading.ejs拷到indigo主题中,但是当我执行hexo -g时报一堆错误信息,果然事情不可能这么简单。应该是缺失了一些必要的文件,可是我不了解需要哪些页面才能构成一个页面,要了解这一点,就需要知道Hexo博客主题是怎么构成的,所以到网上找教程做个Demo,这是我找到的一个手把手教程:从零开始制作 Hexo 主题

按照教程走一遍后,大概知道了整个工作方式:

  1. 除了其子目录下的文件,/layout目录下的文件会生成Html页面
  2. 通过如下代码导入其他ejs文件(这里导入了header.ejs文件)
<%- partial('_partial/header') %>
  1. /layout/layout.ejs,通过<%- body %>来引用/layout目录下的ejs文件,/layout目录下的子目录下的ejs文件除外
  2. /source目录下的文件是Html页面中会用到的css,font,js
  3. 你的博客/source/_data下的yml文件和json文件中的内容会记录到你的博客/db.json文件中,并在ejs代码中可以引用其中的数据

那么现在我清楚为什么代码会报错了,因为显然读书页面导入了css和js,而这些文件并不能被找到

想知道代码的作用就删除它

显然raytaylorism主题的作者不是在reading.ejs中引入css和js的,上面通过写Demo而得知决定读书页面生成的代码不止是reading.ejs,还有layout.ejs,下面是其代码

<%- partial('_partial/head') %>

<body>
    <img src="/weixin_favicon.png" style="position: absolute; left: -9999px; opacity: 0; filter: alpha(opacity=0);">

    <%- partial('_partial/header') %>
    <main>
        <%- body %>
        <%- partial('_partial/float') %>
    </main>
    <%- partial('_partial/footer') %>

    <%- partial('_partial/after_footer') %>
</body>
</html>

可以看到layout.ejs中引用了一大堆文件,鬼才想一个一个去看引用文件的代码,我只关心什么代码会影响读书页面。最简单粗暴的弄懂代码的方式就是删除它,于是我依次删掉那些引用文件的代码,发现只有最后一项引用会让读书页面没有css和js。然后看after_footer.ejs,又是一堆引用,方法当然还是删除!删除!删除!

复制,粘贴,拿起键盘就是干!

上一步中已经提取到了所有与读书页面的相关代码,接下来要做的就是把它们插分到indigo主题中,indigo主题中有它自己的layout.ejs,而且头部布局需要在每个掌管页面的ejs中添加代码引用而不是在layout.ejs中直接引用,还有就是需要把引用css和js的代码直接写reading.ejs中。总之,需要稍微改造一把,然后就大功告成啦

感想

这篇文章,对于我来说,叙事部分和方法部分都是有用的。但是对于其他读者,可能叙事部分会看得一脸懵逼,但是希望看文章的人能多少学到一些研读源码时可能会用到的方法,我以后研读源码时也会借鉴自己这次的经验

我认为自己拥有不错的阅读理解能力,不止是在研读代码方面。我能冷静下来阅读并理解晦涩难懂的书,或者是英文文章,我对此感到高兴。并不是炫耀我有多厉害,只是从很多事情中得出的结论。我既能以平常心对待自己的优点,也能以平常心对待自己的缺点

其实这个故事是精简版本,其实我并不能一下子就想到什么时候该怎么做才是对的,有时会因为选择了错误的方法卡在一些地方而产生负面情绪,然而情绪可以调整,方法可以不断去尝试和改变,所以最后还是成功啦

后续

  1. 我会把我改动后的主题传到github,链接会留在这里

  2. 手动写json一点都不优雅,写个代码自动生成吧,new一个对象多一本书的方式多么优雅

  3. 把看过的书、电影、,番剧还有听过的歌都搬到博客上吧

  4. 其实我在这一个星期再次失去了人生的方向,会研究Hexo博客主题的源码是因为我实在不知道什么才是有意义事情了。这是个大事,没有方向,谈何努力,我必须在下周之前找到人生的方向

补充

后续中的1,2两条已经做到啦,具体看这篇吧,走你

如何将 NetBeans 中的 Java 程序导出可执行文件 exe

如何将 NetBeans 中的 Java 程序导出可执行文件 exe

前言

昨天刚刚给自己的 Hexo 主题增加了一个安利模块,把这个主题上传到 Github 了,链接在此:angui

没错,这个主题的名字是安轨,因为我是个前端小白,所以改这个主题让我的心情很爆炸,简直是 m安轨,所以主题名叫 angui

刚刚在博客上利用这个板块放了几首歌上去,并不是测试数据,我有很用心的写乐评的,有兴趣就听一听吧,吃我安利

效果预览

安利模块中的内容是由一个json文件生成的,每次要添加新内容,就需要手动编写json。当内容繁多的时候,这样的方式就特别不方便,而且还容易写错,于是寻思着做一个图形界面直接生成json,这样方便快捷,而且不容易出错。

这个程序放在Github了,链接在此:ReadingGenerator。也可以直接下载exe

效果预览

Json 的处理方面我也算是半个老司机了,所以程序很快就写出来了。但是怎么导出 exe 我还是真不知道,以前一直都是直接在 IDE 里编译运行,总不能以后想添加个什么内容就打开编译器运行一遍呀,所以就开始找解决办法了,按照这篇文章完美解决了问题,但是我还是想在这里把步骤再过一遍

实际步骤

下载并安装 Inno Setup

走你

添加环境变量

将你的 Inno Setup 安装路径添加到环境变量中

重启NetBeans

这是为了使新的环境变量生效

在 IDE 中启用本机打包

  1. 鼠标停在项目上,右键->属性

  2. 点击【部署】面板,打勾

进行打包

鼠标停在项目上,右键->属性

安装 exe

生成的 exe 文件在 你的项目\dist\bundles目录下,双击来安装这个程序吧。

如果安装失败,并且弹出的对话框提示找不到主类,可能你的程序没有设置主类,在NetBeans中,主类会有特殊标志,如图红框所示

后续

  1. 抽时间把安利页面完善一下吧,加点电影,书籍,番剧什么的

  2. 稍微拾起一点对 Swing 的映像了,趁热打铁,把作业做了吧

  3. 并没有在这周成功的找回人生方向。如果问我方向和努力那个重要,我会毫不犹地回答方向更重要。现在的我,再怎么努力都是南辕北辙,所以需要尽快回到人生的方向,可这偏偏是件欲速而不达的事情。虽然如此,我还是会加油的

CentOS Php 服务器配置

CentOS Php 服务器配置

前言

我本打算弄完 Java Web 所需要的运行环境就完事的,但是我发现我已经用惯了 phpMyAdmin 了,再换成 WorkBench 开始有点抓狂了,于是干脆为了 phpMyAdmin 把 php 的运行环境也配一遍

可是中途出了点事,我装完 php5.6 之后再装 phpMyAdmin,结果需要的 php 是5.3版本的,卸载 php 和各种呕熏的依赖神烦,于是打算重装系统

我之前写的那个如何配置 Java Web 服务器的文章帮到了我,但是按照文章的流程走的也不是特别顺畅,甚至发现了好几处纰漏。

因为这次重装意外的发现并修复了这些纰漏,真是让人惊喜。回想起来,当初为了详记如何搭建 hexo 博客,我甚至重走流程以便记录每个细节,但是还是在使用文章来搭 hexo 博客时发现纰漏。后来修正过之后,朋友们看了此文之后还是有疑惑而亲自问我。于是我后来又添加一些补充。这正与这次事件相似。

我不会为我不能以清楚且完整的思维来写好文章而责备自己,这对我来说是强人所难。反而,我感谢这次意外的事件,让我认识到了即使再怎么努力的想一次性做好一件事,也是很难达成的。但是,反复地,多角度的审查,就能让事物变得更完备。

mysql 已在配置Java Web运行环境时配置,在此不叙述,详情参考Centos Java Web 服务器配置

环境

本机环境:

CentOS 6.5

mysql 5.7

将要配置的环境:

php 5.3

Apache

phpMyAdmin

Php

不添加其他 php 源的话,Centos6.5 会安装 php5.1

添加 php5.3 的源

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

启用源

rpm -Uvh epel-release-6-8.noarch.rpm

安装

yum install php

可以看到此时 php 版本是 5.3

php -verson

Apache

安装

yum install httpd

启动

/etc/init.d/httpd start

开机自启

chkconfig httpd on

打开访问权限

打开/etc/httpd/conf/httpd.conf

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

修改为

<Directory />
  Options FollowSymLinks
  AllowOverride None
  Order deny,allow
  allow from all
</Directory>

重启服务生效

/etc/init.d/httpd restart

phpMyAdmin

添加源

rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

下载

yum install phpmyadmin

关联 mysql 账号密码

打开/etc/phpMyAdmin/config.inc.php

$cfg['Servers'][$i]['user']          = '账号';
$cfg['Servers'][$i]['password']      = '密码';

打开访问权限

打开/etc/httpd/conf.d/phpMyAdmin.conf 复制并替换如下内容到相应位置

<Directory /usr/share/phpMyAdmin/>
  AddDefaultCharset UTF-8

  <IfModule mod_authz_core.c>
   # Apache 2.4
   <RequireAny>
    Require all granted
   </RequireAny>
  </IfModule>
  <IfModule !mod_authz_core.c>
   # Apache 2.2
   Order Deny,Allow
   Allow from All
  </IfModule>
</Directory>

<Directory /usr/share/phpMyAdmin/setup/>
  <IfModule mod_authz_core.c>
   # Apache 2.4
   <RequireAny>
    Require all granted
   </RequireAny>
  </IfModule>
  <IfModule !mod_authz_core.c>
   # Apache 2.2
   Order Deny,Allow
   Allow from All
  </IfModule>
</Directory>

重启Apache生效

/etc/init.d/httpd restart

排序算法

排序算法

冒泡排序

#include<stdio.h>

void bubble_sort(int a[], int n);

int main(){
	int a[] = {50,40,63,20,98,41,65,78,21,34};
	sort2(a,10);
	for(int i = 0;i < 10 ;i ++)	printf(" %d",a[i]);
    return 0;
}

void bubble_sort(int a[], int n){
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-i;j++){
			if(a[j]>a[j+1]){
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
}

选择排序

#include <stdio.h>

void insert_sort(int a[], int n);

int main(){
    int a[]={32,12,7, 78, 23,45};
    insert_sort(a,6);
    for(int i=0; i<6; i++) printf(" %d", a[i]);
    return 0;
}

void insert_sort(int a[], int n) {
    for (int i=0; i<n; i++) {
        int k = i;
        for (int j=i+1; j<n; j++)
            if (a[k]>a[j]) k=j;
        if (i!=k) {
            int tmp=a[i];
            a[i]=a[k];
            a[k]=tmp;
        }
    }
}

快速排序

#include <stdio.h>
void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex){
	int i = startIndex, j=midIndex+1, k = startIndex;
	while(i!=midIndex+1 && j!=endIndex+1){
       if(sourceArr[i] > sourceArr[j]) tempArr[k++] = sourceArr[j++];
	   else tempArr[k++] = sourceArr[i++];
	}
	while(i != midIndex+1) tempArr[k++] = sourceArr[i++];
	while(j != endIndex+1) tempArr[k++] = sourceArr[j++];
	for(i=startIndex; i<=endIndex; i++) sourceArr[i] = tempArr[i];
}

void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex){
	int midIndex;
	if(startIndex < endIndex){
		midIndex = (startIndex + endIndex) / 2;
		MergeSort(sourceArr, tempArr, startIndex, midIndex);
		MergeSort(sourceArr, tempArr, midIndex+1, endIndex);
		Merge(sourceArr, tempArr, startIndex, midIndex, endIndex);
	}
}

int main(){
	int a[8] = {50, 10, 20, 30, 70, 40, 80, 60};
	int i, b[8];
	MergeSort(a, b, 0, 7);
    for(i=0; i<8; i++) printf("%d ", a[i]);
	return 0;
}

并归排序

#include <stdio.h>

void Merge(int a[],int b[], int start, int mid, int end);
void MergeSort(int a[], int b[], int start, int end);

int main(){
	int a[8] = {50, 10, 30, 20, 70, 40, 80, 60};
	int i, b[8];
	MergeSort(a,b,0,7);
    for(i=0;i<8;i++) printf("%d ",a[i]);
	return 0;
}

void MergeSort(int a[], int b[], int start, int end){
    int mid;
    if(start<end){
        mid = (start+end)/2;
        MergeSort(a,b,start,mid);
        MergeSort(a,b,mid+1,end);
        Merge(a,b,start,mid,end);
    }
}

void Merge(int a[],int b[], int start, int mid, int end){
    int i=start, j=mid+1, k=start;
    while(i!=mid+1 && j!=end+1){
        if(a[i]>a[j]) b[k++]=a[j++];
        else b[k++]=a[i++];
    }
    while(i!=mid+1) b[k++]=a[i++];
    while(j!=end+1) b[k++]=a[j++];
    for(i=start;i<=end;i++) a[i]=b[i];
}

从零开始使用shadowsocks搭建自己的VPN

从零开始使用 shadowsocks 搭建自己的 VPN

前言(纯属瞎白活,忙人勿看)

做完了事,想着怎么用剩下的点钱提高自己的生活质量。去知乎上瞅了瞅,都是电动牙刷、收纳盒、尤克里里这种我根本不感兴趣的东西。有点想买小米智能音箱,kindle,平板电脑之类的硬件,但是仔细一思考感觉消费太高也并不是那么需要。各种会员或者是 Steam 游戏这种虚拟消费也有想过。可是会员到期还早,游戏多到放在库里没时间玩。然后不知怎么的想到了科学上网,毕竟不科学上网的程序员不是好程序员。与其说是改善生活,不如说是买必需品。vpn 这个词没有被搜索封印的地方也只剩微博了,然后刷出了一堆垃圾广告。又想了想何必花钱跟别人挤一个服务器,他们的盈利模式很多都是租别人家服务器然后给啥都不懂的人用,真正运营自家服务器的肯定很少,有很多这样的商家都已经狗带了,更多都是赚个差价的中介一样忽悠不懂技术的人。打个比方吧,买 vpn 的客户是旅客,卖 vps 的商家是包租婆,它们卖的vps是房子,卖vpn的人花钱租了一栋房子并把房子盖成了青旅,让买 vpn 的客户花钱挤一个房间,以单人来算是便宜了,但是和你一起挤房间的人花的钱比上 vps 商家那里租一间房的钱还要高,vpn商家赚的就是这个钱。那么自己倒腾个呗,还能顺便多学点知识。于是去知乎搜 vps 这个话题,发现了一个有趣的人冯硕以及他关于 vps 的知乎专栏博客。然后根据他的内容,上vultr上买了 5 刀一个月的玩玩,虽然新用户必须首冲 10 刀比较坑,但是好歹可以按小时收费,随时创建和销毁主机和随时改套餐。如果以后有意愿长期使用的话,还是去BandwagonHost买年费的比较划算,虽然最划算的套餐目前已经被抢光了,等促销吧。

搞事

写这篇文章的初衷一部分是想要记录,另一个就是做傻瓜教程。这里傻瓜的概念是不懂 Linux,英文基础也很薄弱的人(并不 diss 任何人厚~)。希望这些内容能尽可能适用于没有基础的人,所以对于老司机而言超级啰嗦。

购买 VPS

参考:如何挑选适合自己的vps

这个博客里还有各种测评呀促销啊啥的,可以自己多看看。我自己觉得的话,长期使用的话最好的就是BandwagonHost,但是它家月租超贵。短期的话看你自己了,反正最便宜的基本都是5刀/月,这里笔者使用vultr

唔,对了,这些卖 vps 的网站必然也是被墙了,关于这一点大家得各显神通了。这里推荐一个傻瓜办法:使用 QQ浏览器。虽然腾讯产品的用户体验不想说,但还真没想到腾讯有这种黑科技。不管是PC还是手机客户端的 QQ浏览器,都能访问一些被墙的网站。PC 版还自带 Google 访问助手这个插件。

在vultr上购买vps

点击进入官网

注册登录以及邮箱号需要认证这种东西就不说了,登录之后点击这里

进入购买页面

选择服务器地区。基本上,想要网速快就选东京(Tokyo)的,如果有吃鸡这种只有美国有服务器的特殊需求之类的,就选洛杉矶(Los Angeles)

选择操作系统类型

由于CentOS有默认防火墙设置,所以导致不懂防火墙如何设置的新手配置好后连不上 vpn,最好的解决方法是选择不带防火墙的 Ubuntu。
参考:shadowsocks issues #133 连接不上服务器,Error: connect ETIMEDOUT

选择套餐类型

每次进入购买页面,都会默认选中 10 刀/月的套餐来诱导用户选择。这里可以自己选择 5 刀/月的套餐。

后面的4-7步选项怎么选都没关系,不选也没关系。然后新用户必须充值10刀。

筛选ip可用的主机

然后选择主机数量,建议选择 10 台,因为主机的 ip 可能被墙导致根本无法远程登录主机。解决方法是多建几台主机,留下 ip 没被墙的主机,销毁其他主机。参考:Vultr新建的洛杉矶机房服务器本地连接不上,请问怎么解决?

打开这个网站:http://ping.pe/

输入主机的 ip 地址,筛选出全部都能 ping 通的主机。

销毁其他主机,只留下一台 ip 可用的主机。

在服务器上部署 shadowsocks 服务

使用 putty 远程登录服务器

打开putty远程登录服务器。

以 root 的身份登录。

查看或复制 root 密码。复制密码后,在 putty 客户端中点鼠标右键粘贴。

嫌密码不好记,可以用如下命令换个密码。

passwd root

安装 shadowsocks

参考:新手教程六:十分钟搭建shadowsocks科学上网服务器

在putty中输入如下几条命令。

wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go.sh

chmod +x shadowsocks-go.sh

./shadowsocks-go.sh 2>&1 | tee shadowsocks-go.log

安装完成后,脚本提示如下:

Congratulations, shadowsocks-go install completed!
Your Server IP:your_server_ip
Your Server Port:your_server_port
Your Password:your_password
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:http://teddysun.com/392.html
Enjoy it!

卸载方法:

./shadowsocks-go.sh uninstall

使用命令:

启动:

/etc/init.d/shadowsocks start

停止:

/etc/init.d/shadowsocks stop

重启:

/etc/init.d/shadowsocks restart

状态:

/etc/init.d/shadowsocks status

多用户多端口配置文件

使用 putty 命令行输入:

vi /etc/shadowsocks/config.json

键盘按i进入 insert 模式,将文件内容全部替换成如下内容:

{
    "port_password":{
         "8989":"password0",
         "9001":"password1",
         "9002":"password2",
         "9003":"password3",
         "9004":"password4"
    },
    "method":"aes-256-cfb",
    "timeout":600
}

按下esc键,在按下 键,输入 wq,来保存并退出。

重启服务。

/etc/init.d/shadowsocks restart

在客户端使用 shadowsocks 服务

Windows:shadowsocks-windows 点击直接下载安装包

Android:shadowsocks-android 点击直接下载安装包

Linux:shadowsocks-gui 点击直接下载安装包

OSX:Shadowsocks for OSX Help 点击直接下载安装包

iOS:找其他代替工具或者在应用商店花钱下载 Shadowrocket 软件

PAC 配置

PAC 控制哪些地址需要使用代理访问,哪些地址不需要使用代理访问,用以加快无需代理即可访问的地址的访问速度。例如,我们不需要使用代理访问百度,而且使用代理访问百度比直接用本地 ip 访问还要慢,我们就可以通过 PAC 配置文件将百度的地址加入白名单,或者将需要代理服务的地址加入黑名单,来提高访问速度。

可以直接使用网友归纳出的 PAC 配置文件

gfwlist黑名单

PAC 配置文件地址

https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt

gfw_whitelist白名单

PAC 配置文件地址

https://raw.githubusercontent.com/breakwa11/gfw_whitelist/master/whiteiplist.pac

推荐使用白名单。稍微用脚趾甲想一想就知道,如果有新的被墙地址,而黑名单没有及时更新就会导致网站无法访问。而白名单有没有及时更新,都能够访问所有地址。

以 Shadowsocks PC 客户端为例:

至此,你就可以享受科学上网的乐趣了。VPS 的用途不止于此,如果你想探索其他有趣的内容,可以参考这篇文章:VPS有什么有趣的用途?

IDEA 部署项目到远程 Tomcat

IDEA 部署项目到远程 Tomcat

环境

Centos 6.5

tomcat 7

IntelliJ IDEA 2017.1.5

按着教程来

我按照下面的文章几乎一步不漏地执行了相应操作:

参考:http://blog.csdn.net/tianjun2012/article/details/52795202

为什么说是几乎,是因为他文章里提到了,如果服务器的外网地址需要在 /etc/hosts 做映射,然而这里没有详细说明怎么去做映射,我自己也不知道怎么操作,于是仅跳过了这一步

然而当我准备部署时,IDE 报错如下:

还有一个教程,大同小异,该报错还得报错。

参考:http://blog.lanyus.com/archives/197.html

错误,因为错过的细节

去网上搜索,参考如下文章的解释,IDEA 部署默认是需要开启一个叫做 JMX 的功能,但是 Tomcat 默认关闭了此功能。所以要么打开 JMX 功能,要么不使用 JMX 功能。

网上搜索怎么开启 JMX,发现确实是一个很繁琐的操作,tan90°

不使用 JMX 功能,为啥改 host 就能做到呢?host 与 JMX 有毛关系,这一点笔者还是没明白

参考:http://blog.csdn.net/Mark_LQ/article/details/52027363

类似而不一样的错误

既然教程原文中也提到了 host 需要做什么不可描述的映射,笔者考虑可能确实与 host 有关,于是搜索这方面的信息,发现很多人都通过修改 host 而成功解决问题。

http://www.codes51.com/itwd/1482825.html

http://blog.csdn.net/wingsyy_cs/article/details/53585750

http://www.wangchao.net.cn/it/detail_129876.html

但是这个解决方法对应的报错信息和我不一样。

他们的报错信息是Unable to ping server at localhost:1099

我的报错信息是Unable to connect to the [我的主机ip地址]:1099

别人都用这个方法成功解决了问题,而我却还是不行

退而求其次

我很不容易的翻到了唯一一个和我报错信息一致的问答帖

https://stackoverflow.com/questions/14085371/tomcat-intellij-idea-remote-deploy

然而他犯错太容易找出来了,少了一对""而已,很好改过来,我的错误在哪儿我还真是找死都没找出来。还好答主还提供了另一个方案,上传 war 包

其实我已经知道有这个方法了,之前简单学习 JavaWeb 的时候我就知道把工程放到 webapp 目录下就相当于是部署到 tomcat 下了,但是现在弄 spring 这个方法行不通,我就想一定有别的办法,于是知道了有上传 war 包这个方法了。

但是网上的说法是把 war 扔 webapp 下重启服务完事,现在想起来这个说法还真的是一点都没错厚

还是这个答主细心说明要把 war 改成 ROOT.war 然后再扔 webapp 下,不然就不能访问http://youripaddress:8080

刚开始我对手动上传 war 这个方法是拒绝的,这一点都不优雅,直接在 IDE 里点一个按钮就完成上传棒多了。但是鉴于我实在是被逼无奈,怎么行就怎么来吧。经过实践,发现还是得删掉 webapp 下的 ROOT 文件夹,不然还得显示 tomcat 那个页面

总结

我还是不懂改不改 host 和 jmx 有什么关系,我甚至不知道 host 或是 jmx 到底是干啥的

我还没有尝试开启 jmx 这个办法

我还是不能使用 IDEA 一键部署项目,退而求其次采用了上传 war 的方法

愿意好好把话说清楚的人都是大好人。如果教程帖能把关于 host 的东西也说明白就好了。而最后提到的问题答主那样详细的解答与补充,真的详细到让人感动。我不能要求别人怎么样,但是我对于自己写的文章一定是涉及到每个细节,我一直力求把所有的事情都讲得明明白白。不仅是在写文中,其实生活中的每一种信息传达方式,都应该把此放在第一位

emm......

关于我

一时间不知道的从哪里说起

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.