WebActivatorEx重复执行?不!那是作为使用者的我们傻逼!!

作者:V君 发布于:2018-6-15 22:42 Friday 分类:挖坑经验

TL;DR:

如果在发布新版本后出现疑似WebActivatorEx启动入口被执行多次的情况

首先检查bin里面是否有上个版本残留的DLL,干掉它们就解决了,然后把锅甩给运维

 

那么,开始我的故事。


~前奏~


由于首次在正式项目引入git源代码管理体系,仓库结构设计的相当散乱。

这不赶上重组git仓库,重新建立了解决方案,命名空间和项目名称也重新规划了。



好不容易发布一个新版本到测试环境,运行起来出现致命错误的黄页。

连最开始的初始化都没完成,错误处理也措手不及,好久不见的黄页就这样呈现出来。


~扯一扯~


由于不喜欢Log4Net这种只能用配置文件的充满Java味道的东西。

现在项目中的日志组件是由我自己实现的,有以下特性:

  • 由写入时间决定文件名
  • 6个级别,外加可选启用的虚拟级别“ALL”将其他级别内容凑一起输出
  • 按指定大小分文件
  • 多次启停可续写
  • 自动删除指定天数的旧文件

写入方式是基于线程安全的FileStream共享只读打开,方便边写边看。

内容格式是三行一空行的条目:

  • 第一行写时间、级别、线程信息(如果有写程序集,也能快速发现这次的问题。之后补上吧)
  • 第二行写摘要,由开使用者定义的简短摘要
  • 第三行写详情的JSON,有日志位置堆栈,可以加入任意对象作为附加信息

在日志组件初始化之后,我通常会打一句“Logger Init”在日志中体现应用程序启动。

我们有为此专门做了个小工具来分析日志,用上了Chris NielsenJSON可视化界面实现。


~诊断~


打住,话题收回来,黄页的错误信息是“文件被占用”,堆栈显示正在打“Logger Init”时…

一开始的时候很有自信,以为自己写的实现没问题,可能被文件共享出来占用了。

用Procexp查文件句柄,一个都没查出… 

但作为应用程序启动的体现“Logger Init”却被打进日志文件里…

老大的意思是想让我先把多节点负载均衡砍掉,以单节点跑起来,降低复杂度再诊断。

当时没辙只好听话照办喽,然并卯。

还是掏出诊断大杀器ProcMon看看“是谁动了我的奶酪”,看到结果时开始觉得自信不足了:

——真的是ASP.NET程序池进程访问的文件,而且是同一条原生线程访问了两次。

——第一次成功打开,第二次打开失败,最后还把文件关闭了——由CLR,程序都崩溃了嘛!

难道是自己的实现有问题,多线程竞态现象?

.NET的托管线程可能会复用原生线程,出现TID一样的情况也不能排除多线程。

在初始化的地方加了锁,然而问题依旧存在。其实并不是我的代码写的不严谨,这是后话。


咋办?


让文件打开的共享模式可读可写吧,想到了这样高风险的激进尝试。

然而——还是失败了,但仔细观察发现ProcMon监视条目详情有蹊跷:

第一次打开文件的共享模式是只读,第二次才是符合激进尝试的可读可写。

两次打开文件的原生堆栈有差异,很可惜看不到托管堆栈,如果能看到程序集就能解决问题了。

远程调试吧。没办法的办法了,在日志初始化的地方打个断点看看会不会两次命中。

调试结果令人十分失望,只命中了一次,打开失败的第二次。天知道第一次在哪儿打开?

这时猫同事建议我把“Logger Init”改一下,看看有没有打出来。这才恍然大悟。

我拒绝了建议,且断言上个版本残留程序集,去服务器bin看看,断言成立!

抓住运维的肩膀使劲晃,“你让我浪费了两天的时间排查” 乂目


~结语~


甩完锅之后还是要总结一下教训的,发布版本应该将之前的文件干掉,再把新的包部署上去。

标签: 软件开发 C# ASP.NET 软件故障诊断

评论(0) 引用(0) 浏览(10)

使用Adobe Audition制作Arcaea背景音乐REMIX单曲无缝循环

作者:V君 发布于:2018-5-22 13:59 Tuesday 分类:折腾手记

点击查看原图

在开始之前先上一张猪圈云的截图→

这次又不针对性的解决一个问题,标题些不完整.

这次没有TL;DR, 但大纲总可以有吧!

 

●从游戏中提取BGM和封面

●用Audition制作单曲循环串烧重混

 (这游戏的BGM都太短了

  (´∀((☆ミつ 音游BGM你想有多长?)

●用NeroAAC编码,再用taglib嵌入封面并导入猪圈云

 (先用PS在封面盖个REMIX章)

 

 


开始扯吧:



~前言~

最近玩起了手机音游Arcaea,觉得里面的BGM很不错.

在猪圈云上面搜,结果只有一个电台,只提供96K的音质.

恼火! 接着咕狗发现原来可以轻易的从游戏中提取出来.


~提取~

在把Arcaea安装完之后,可以在obb找到BGM资源包main.180.moe.low.arc.obb.

用7-Zip可以解开内容 (至于为啥是fat就不清楚了, 或许可以直接mount?)

专辑封面可以直接把apk打开找里面的assets\songs.

大部分曲名和封面是相同的, 部分只有preview的那也没办法, 选择性忽视或手动改吧.

(preview才十几秒, 听啥?)



~重混~

点击查看原图

就算是非preview的base版本,还是感觉短了点,

而且还不能无缝循环播放.

你也不能要求音游单曲太长吧.

那就自己动手丰衣足食啰!

掏出音频编辑神器Audition.

将BGM作为素材导入.

然后像右图这样编辑若干次.(有没有DJ的感觉?)

选择适当的切入点,调整淡出淡入交替.一气呵成!

(专业老鸟不要吐槽我这外行(´∀((☆ミつ)


~嵌入封面~

这一步遇到坑了, 如果不将封面嵌入音频文件, 手机端猪圈只会显示一个黑胶唱片, 很不爽.

于是直接来个批量嵌入然后导入猪圈云盘在手机试着播放.

掉坑里了.猪圈不认直接嵌入封面的MP3,识别不出长度, 要转成M4A之后嵌入才正确识别.


~结语~

循(xi)环(nao)多了跟上节奏, 打出FULL RECALL啦! 然而Rank最多只能打出AA _(:з」∠)_

总之,Enjoy it!


 


标签: 音乐 电子音乐制作 多媒体 音频

评论(0) 引用(0) 浏览(60)

造一个轮子:自动嵌入专辑封面到音频文件

作者:V君 发布于:2018-5-22 10:16 Tuesday 分类:我的应用

TL;DR

[ 本体 ][ 源代码 ]

效果:对指定的音频文件嵌入专辑封面图片并另存.

用法:参见代码或无参执体输出的用法提示 可能频繁改动 (´∀((☆ミつ

  -尽管如此还是列举一下初衷:当准备好一堆MP3或M4A还是其他格式(得按需修改源码)

  -且还准备好一堆同名的jpg图片作为专辑封面时,你可能需要一个工具来执行批量嵌入.

  -可以使用目前已实现的操作捷径[embcover_mp3_jpg_dir]或[embcover_m4a_jpg_dir]

  -栗子:在z:\mp3andjpg里面准备一堆MP3并放入同名的jpg图片

  -执行:Id3TagBatchProcess.exe embcover_mp3_jpg_dir z:\mp3andjpg\ z:\embedded\

  -刷一下屏就可以在z:\embedded\得到自动嵌入好专辑封面的输出.

  -为了满足即兴操作还提供了[embcover]操作,分别将源文件,图片,输出和可选的mime

  -作为参数传入就可以执行单个文件的专辑封面嵌入

限制:尚不明确,使用了[ taglib sharp ]几乎所有常见的格式都支持

环境:需要.NET 4.6. XP? 那是什么? 好吃吗 (´∀((☆ミつ


扯一句:

 只是为了将自己REMIX的游戏BGM导入猪圈云,并带上自己盖了章的专辑封面

 网上兜了一圈发现并没有满意的工具, 不爽就自己现炒个轮子, 这次是个粗暴的万向轮

标签: 音乐 多媒体 批量音频编辑

评论(0) 引用(0) 浏览(45)

通过NuGet.config改变packages目录位置

作者:V君 发布于:2018-4-12 15:45 Thursday 分类:挖坑经验

TL;DR: 在解决方案文件旁边创建一个 NuGet.config 文件,里面指定 repositoryPath .


参考: M$DN 爆赞 


不扯,继续搬砖 (´∀((☆ミつ

标签: 软件开发 VisualStudio

评论(0) 引用(0) 浏览(103)

首次体验Live2D SDK (DirectX),成功运行自带示例

作者:V君 发布于:2018-4-1 22:31 Sunday 分类:折腾手记

TL;DR: 

安装 VS2008 (只需要选上C++开发,其余的都不重要,稍后再扯扯用2015遇到的坑)

下载安装 DirectX SDK,下载 Live2D SDK 包,随便找一处地方解压,

进入 sample 文件夹打开解决方案,然后运行。

点击查看原图

 

扯一扯:

现在Live2D已经发布了新版本,叫做Cubism SDK,资料比较少的样子。

于是咱还是从较低的版本开始倒腾,毕竟有中文文档

刚开始的时候抱着试一试的心态在2015上面进行编译,

解决了老版本依赖的错误之后总算编译成功,

但运行不起来:提示让我去看事件日志。发现有VC90的依赖。

于是切换到发布版本的库,又是一个坑:运行起来了,走到初始化的时候出现访问违规。。。

还好留有2008的安装包,掏出来搞起。非常顺利的完成安装,然后顺畅地运行起示例

接下来想基于这伙把玩CppSharp然后看看能不能做成痛IDE插件 乂目!

想象一下接下来左手2008右手2017的玩法,是不是有些蛋疼啊?

其实只是用2008来编译DLL,然后CppSharp胶到我大井,然后把你放一边,哼~

标签: C++ DirectX

评论(0) 引用(0) 浏览(138)

Powered by emlog 去你妹的备案 sitemap