Category程序相关

Android KMS

最近又有不少朋友人向我问起怎么方便的激活Win系统了(果然我就是个修电脑的)_(:3」∠)_

不过事实上的确,目前网上流传的激活软件十有八九…不,应该是必定会带有各种流氓软件以及病毒木马的捆绑,让人非常头疼。
但是实际上目前比较通用的系统激活方式,也是网上激活工具95%以上使用的方式,都是通过一种叫KMS的批量激活通道来达成的。

KMS激活原理其实非常简单——告诉电脑KMS服务器地址,然后再让电脑主动请求激活。

那么接下来就简单介绍一个装逼利器:用自己的Android手机运行KMS服务器端激活Win系统。


首先是准备工作,你需要准备一个拥有Root权限的安卓手机,一个终端模拟器软件,一个支持Root权限文件管理的文件管理软件。

之后需要到My Digital Life 论坛的这个帖子里下载一个压缩包。(也可在度盘下载

解压之后(解压密码:2017),找到解压目录中的binaries\Android\arm\static\vlmcsd-android15-armv7-static文件,并将其单独复制出来,改名kms。

将这个文件粘贴至手机根目录下/system/bin/文件夹中,并如下图设置文件权限——

设置完毕之后打开终端模拟器,输入kms并且按下回车键就在手机上成功运行KMS服务端了。


接下来是如何进行Win的激活,首先你要拥有一个可以进行批量激活版本的Win系统,目前可以下载到的所有VL版本(Win7、Win8)以及Multiple Editions(Win8.1、Win10)的系统ISO都是可以通过批量激活进行系统激活的(个人不推荐使用Win7系统_(:3」∠)_),具体的原版ISO可以到这里进行下载

总之这里假设你已经通过原版支持批量激活的系统ISO装好了系统,这时候系统处于非激活状态。

首先我们需要让电脑和手机处于同一个局域网下,如果没有条件的话可以让手机分享wifi热点,电脑上手机的wifi热点(担心跑流量可以关掉手机流量开关)。

然后打开终端模拟器,输入ifconfig, 你会获取一大堆字母,请注意下图部分:

找到wlan0(没找到?注意一下你是否连接了wifi或者是否共享给电脑了wifi),找到之下的inet addr:192.168.*.*部分,记住这个IP地址(以下记为192.168.0.1)。

之后回到Win,右键开始菜单,选择命令提示符(管理员),然后在弹出的窗口中输入(注意替换192.168.0.1为刚才你记录的IP地址):
slmgr /skms 192.168.0.1
这时候会提示密钥管理服务计算机名称成功地设置为 192.168.0.1。

然后继续输入下面的命令
slmgr /ato
等待10-20秒,系统会提示正在激活 Windows(R), Enterprise edition (*****) .. 成功地激活了产品。

这时候就大功告成了,现在你可以选择回到终端模拟器上输入killall kms来关闭KMS服务器。


激活完了Win,这时候还会有Office需要激活,我们需要下载VL版本的Office,然后和激活Win一样在手机上开启KMS服务端,在电脑的命令提示符(管理员权限)中输入以下内容(注意请将C:/Program Files/Microsoft Office/Office15更换成你Office的安装目录)

cd "C:/Program Files/Microsoft Office/Office15"
cscript ospp.vbs /sethst:192.168.0.3
cscript ospp.vbs /act

以上就是通过手机激活Win和Office的方式,不过因为走的是KMS,所以和一般KMS激活一样,只能维持3个月的激活。但是其实问题不大,只要到时候再用手机激活一下就行了。

文章最开头的那个压缩包里其实也不只有Android版本,还有Mac和Win的版本(注意Win版不可用于激活本机,也就是说一定要有第二台机器才可使用)。

Win版:binaries/Windows/intel/vlmcsd-Windows-x64.exe
Mac版:binaries/MacOSX/intel/vlmcsd-MacOSX-x64

有兴趣的朋友也可以尝试一下

Merusuto Character Assistant Calc

梅露可日服出了一个新的角色支援系统,根据角色之间的相关性来给角色增加属性。
那么世纪难题就出现了:我们如何搞出最高的加成?

刚好看到了日本那边有玩家制作了一个看加成的页面,但是角色名都没有带称号(毕竟中国人对汉字更敏感,全假名看起来会很累_(:3」∠)_),于是我将那个页面抓下来配上称号又修改了部分内容,做了一份界面汉化版的成品。

页面链接:梅露可支援系统计算器

原作者:
原页面:

Kancolle API-Serial_Id

本文档仅供学习交流之用途,一切法律相关纠纷概不负责

 目前算法已发生变化,此算法不再适用(貌似是有插值的样子)

划水一上午,终于把新增的api_serial_id算法给搞定了。反编译出来的代码各种奇怪的正则简直没法看,花了好长时间去研究。
先进行一目了然的数据解析:

取一个数据:
	api_serial_id=143341807852814784074
前十位:
	1433418078 点击海域/选择远征时的时间戳
后十一位:
	52814784074/下述的ret.f,本例为3394=15561221
	15561221-10011000=5550221
得到鼠标坐标:
	555 221

api_serial_id的结构已经很明显的显露出来了。那么进行计算生成也将不是难事。
首先是核心数组:

//其实只用了0-9十个数字 搞不懂10、11是干啥的
//貌似部分有计算错误 这边放出来仅供参考 还是要根据实测值来计算
private static int[] arr = 
	{3394,537,9267,9421,6913,3654,5463,3460,2055,1547,2684,2316};

然后是一些功能用方法:
(不要问我方法名和变量名为什么这么蛋疼,源AS里面就是这样的名字_(:3」∠)_)

//获取10位时间戳
private static long time() {
	long time = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds / 1000;
	return time;
}

//对时间戳进行提前化处理
private static long c(){ 
	return time() - random(5) + 1;
}

//获取0~input-1的随机数
private static long random( long input ) {
	return (int)Math.Floor(new System.Random().NextDouble() * input);
}

//取输入数值的末位
private static int f(long member_id){
	return int.Parse((member_id % 10).ToString());
}
//鼠标坐标计算中用到的一个数值
private static long s = 1000;  

//对鼠标X轴坐标进行模拟
private static long mouseX(int map_area){
	int left = 0;
	int right = 0;
	switch (map_area) {
	case 1:
	case 3:
		left = 140;
		right = 430;
		break;
	case 2:
	case 4:
		left = 470;
		right = 670;
		break;
	case 5:
	case 6:
		left = 190;
		right = 770;
		break;
	default:
		break;
	} 
	return random(right - left) + left + s;
}

//对鼠标Y轴坐标进行模拟
private static long mouseY(int map_area){
	int top = 0;
	int bottom = 0;
	switch (map_area) {
	case 1:
	case 2:
	case 5:
		top = 145;
		bottom = 260;
		break;
	case 3:
	case 4:
	case 6:
		top = 290;
		bottom = 400;
		break;
	default:
		break;
	} 
	return random(bottom - top) + top + s;
}

然后就是具体算法了,算法如下:

private static long a = 10000;

public static string api_serial_id(long member_id,int map_area){
	return (c().ToString() + ((mouseX(map_area)* a + mouseY(map_area) + a)*arr[f(member_id)]).ToString());
} 

至于更新后Array更新的问题,只要截取2-3个api_serial_id去求一个最大公约数就可以得出新的Array数据。

Kancolle API-Port

在2015/06/26的维护后算法发生变化,此算法不再适用

本文档仅供学习交流之用途,一切法律相关纠纷概不负责

这段时间研究了一下舰娘游戏中api_port的计算方法
目前得出成果如下(语言为C#)
首先是api_port核心数组:

//5,17基本不变,0,1,2,4,7,8,9,11,14,15每次更新改变,3,6,10,12,13,16至今未变
//3,6,12未曾被此方法使用过
private static long[] array = { 
    1912, 3185, 7519, 2139, 6887, 4131807, 8897, 1224, 6367, 
    1052, 13, 4992, 3791, 10, 7839, 4727, 1000, 1876153 
};

一看就可以明白的辅助用的方法:

//返回0~input-1的一个随机数
private static long random( long input ) {
    return (int)Math.Floor(new System.Random().NextDouble() * input);
}

//返回当前时间的10位时间戳
private static long time() {
    long time = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds / 1000;
    return time;
}

//返回一个数字的前四位
private static long firstFour( long input ) {
    long a = long.Parse(input.ToString().Substring(0, 4));
    return a;
}

然后是每次api_port更新后变化的主要来源:

//返回一个由根号13计算出来的数据串
private static long func( long input ) {
    long[] arr = { 1, 7, 8, 0, 11, 4, 2, 9, 15, 14 };
    return arr[input % 10];
}

其实这个方法已经经过简化,原始方法是:

    string sqrt = Math.Sqrt(array[array[13]]).ToString(“f15”); 
    //上式结果是3.605551275463989
    sqrt = sqrt.Replace(".","0");
    int counter = 0;
    string str = (input % 10).ToString();
    while (str != sqrt.Substring(counter, 1)) {
        counter++;
    }
    return counter;

好了,至此api_port计算所需的方法已经全部说明完毕。接下来开始解说api_port的计算方法:

public static string api_port( long member_id ) {
    //5位 取值32768-65535 
    long part_0 = random(32768) + 32768;
    //4位
    long part_1 = (random(9) + 1) * 1000 + (member_id % 1000);
    //14位 最重要的部分
    long part_2 = (((firstFour(member_id) + 1000) * (array[5] + part_0) - time()) + (array[17] + (9 * part_0)) - member_id) * array[func(member_id)];
    //4位 若array[16]一直保持不变,则取值1000-9999
    long part_3 = random(9 * array[16]) + array[16];
    //返回完整的api_port数据串
    return string.Join("" ,
        part_1.ToString(), part_2.ToString(), 
        part_3.ToString(), part_0.ToString()
    );
}

很明显,api_port由4部分组成,而其中part2是整个api_port的核心内容。
从上述计算过程可知计算part2需要以下数据:

part_0			--> 可直接于api_port数字串中获得
member_id		--> 可通过其他API获得
array[5]		--> 版本更新后需计算
array[17]		--> 版本更新后需计算
time			--> 可通过抓包获得
array[func(member_id)]	--> 版本更新后需计算

结合之前对api_port中数组的分析,可以得出结论:
一般情况下每次更新后只需使用member_id尾数分别为0-9的10个账号进行反向计算就可获得新的完整api_port数组。
而即便array[5]与array[17]发生了变化,在同一个账号下获取三个api_port也同样可以反向计算出新的array[5]与array[17],进而计算出整个数组。
array[5]与array[17]没有变化时计算方法如下:

array[func(member_id)] = long.Parse(api_port.Substring(4, 14)) / ((firstFour(member_id) + 1009) * long.Parse(api_port.Substring(22, 5)) - member_id + (firstFour(member_id) + 1000) * array[5] + array[17] - time);

Kancolle Huang Li Mk-II

今天一时兴起,把舰娘老黄历改造了下。

这东西去年中旬做好以后基本没有改动过,这次改动了蛮多地方,还加入了玄学配方(你好,我是资源杀手老黄历)

配色仍然没有头绪,就让它继续这样吧_(:3」∠)_

老黄历链接点我

源码点我

KancolleDataViewer

这东西好久以前就开始弄了,不过前些日子官方变更了可以通过api获取的数据,导致大量数据无法像以前一样获取,旧版本的舰娘数据一览彻底报废。
于是进行了些修改,其实上个月就弄好了的不过一直没发上来_(:3」∠)_

目前内容有:我方舰娘数据查看、敌方舰娘数据查看、装备数据查看

kdv

因为是直接从游戏服务器获取数据,所以可能会有些慢。有岛风go或者自己有代理的朋友可以用记事本打开这个文件,将其中的代理设置变量数值进行修改:

var EnableProxy = false; //true为开启代理 false为关闭
var ProxyAddress = "127.0.0.1:8099"; //代理地址

点我下载

Github EDU Student pack

今天 +wicast 和 +Cee 先后告诉了我Github有学生优惠的活动,其中还提供了DO的$100的Promo Code

果断拿出封尘已久的edu邮箱去参加了。

成功后,看了一下Student pack里面的具体内容,发现一起赠送的还有DNSimple铜套餐2年免费、.me域名1年免费、SSL证书1年免费,真心太良心_(:3」∠)_

建议还没有领取的朋友赶紧去来一发→ https://education.github.com/

Student pack详情:

Atom
 Open Source by GitHub, free for everyone
Bitnami
 Business 3 plan (normally $49/month) for one year
CrowdFlower
 Access to the Crowdflower platform (normally $2,500/month) and $50 in worker credit
DigitalOcean
 $100 in platform credit
DNSimple
 Bronze hosted DNS plan (normally $3/month) for two years
GitHub
 Micro account (normally $7/month) with five private repositories while you're a student
HackHands
 $25 in platform credit
Namecheap
 One year domain name registration on the .me TLD (normally $8.99/year)
Namecheap
 One year SSL certificate (normally $9/year)
Orchestrate
 Developer account (normally $49/month) while you're a student
Screenhero
 Individual account (normally $9.99/month) while you're a student
SendGrid
 Student plan 15K free emails/month (normally limited to 200 free emails/day) while you're a student
Stripe
 Waived transaction fees on first $1000 in revenue processed
Travis CI
 Private builds (normally $69/month) while you're a student
Unreal Engine
 Unreal Engine (normally $19/month) while you're a student

题外:原本打算DO余额用光就去换Linode的,结果这样一搞余额完全花不光了_(:3」∠)_

Pixiv Ugoira2GIF

因为之前+Herrington Darkholme 写的转换js脚本在我电脑上运行的太慢了(虽然其他人还是报告正常运行)……
所以干脆自己写一个Ugoira转GIF的程序。

写了一个暑假的java,回来碰C#有點手生。不過幸好马上就恢复了状态。
GIF处理方面真心头疼,不过有谷大哥帮忙,网上查了各种资料终于搞定了……

貌似C#本身并没有合成GIF的组件(?),于是我在GIF处理方面调用了Gif.Components。并使用其中的AnimatedGifEncoder类用来合成GIF动画。
在zip解压方面方面用了SharpZipLib

然后东拼西凑,这里加一点,那边改一点,这里换一个,那里删一个。总之就这么完成了这个毫无技术含量的程序。
之后可能考虑继续加些功能,今晚太晚了就算了_(:3」∠)_


使用方法

javascript:window.location.href=pixiv.context.ugokuIllustFullscreenData.src;
先把上面的js代码加入标签栏(新建一个标签 名字随意 网址栏填写上面的代码)
在Ugoira动图页面点击这个标签可以下载到一个ZIP
下载完毕以后将这个ZIP拖到这个软件里即可完成輸出。
注:压缩值越低,gif质量越好,输出速度越慢。
下载地址:
度盘下载
本站下载(有些地方貌似下不動?)