MoreRSS

site iconPewae | 破袜子修改

大致 生于1980 魔羯 C/C++程序员 爱抬杠,爱讽刺,爱反语,爱隐喻
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Pewae | 破袜子的 RSS 预览

【去过】页面上线

2025-09-12 09:40:36

最终效果见这里

我这个人既不喜欢旅游,也不喜欢摄影,没出过国也没在国内溜达过几个地方,但这并不妨碍我也有一颗上线足迹地图的心。无奈谷歌地图连不上,百度地图不想连,OSM(OpenStreetMap)既连不上也连不明白,就搁置了。
直到上周,@Dayu上线了他的地图插件,试用之后发现表现形式与期待值有差距,想在帖子下面留言发建议的时候,发现了明明同学的另一份方案。虽然主要是js实现的,只需要知道leaflet这个开源库的名字,我就知道以Wordpress的海量扩展,这回成了!

找到了一个插件和插件的插件,配置之后,算是达到了心目中的效果。
插件使用比较复杂,这里记录一下,给自己个备忘,能帮到人更好。

插件Leaflet Map的配置

插件地址:Leaflet Map
逐一说明一下后台的配置项:
Default Latitude
地图默认纬度
Default Longitude
地图默认经度
Default Zoom
地图默认缩放比
Default Height
默认高度
Default Width
默认宽度
上面五个值可以以短代码参数的形式加到leaflet-map中,如果不加则使用后台的默认参。

Fit Bounds
是否令地图随标记点的范围进行缩放。如果为true,那么地图会自动计算当前所有Marker的中心位置,以及包括所有Marker点的合适的缩放比。可以用默认值,也可以在map中单独设置。

Show Zoom Controls
是否显示缩放按钮

Scroll Wheel Zoom
是否允许滚轮缩放
这项设置之后,在地图上并不是直接用滚轮缩放,而是需要用Ctrl,感觉不便所以我自己没加。

Double Click Zoom
是否允许双击放大
注意如果不显示缩放按钮的话,放大之后就回不来了。

Default Min/Max Zoom
最小和最大放大倍数。最终的放大倍数不仅跟这个后台设定项有关,也跟使用的地图瓦片API有关。

Default Tiling Service
有两个选项,“I will provide my own map tile URL”和MapQuest。MapQuest我考察了一番,感觉太难看,没继续尝试。所以重点说第一个选项,自定义tile URL。
先解释一下什么是tile URL。本插件所依赖的地图服务,叫做Map Tile Server(地图瓦片服务)。它分成Raster、Vector和Static三种形式。本插件使用的是Raster形式,而Dayu和明明同学用的都是Vector形式。Vector的参数更加丰富,Raster配置起来更简便。

※※※Map Tile URL※※※
重中之重!!因为默认的OSM服务访问不了,所以这里必须填一个自定义的。
明明同学找的cartocdn就挺好用的。他使用的light_nolabels是不带标签的版本,换成light_all就是带标签的版本。至于他为什么用不带标签的,自己悟。

https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png
http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png

这里的{z}{x}{y}都不要动,第一个{s}是指地址里的subdomain,也就是接下来的配置项【Map Tile URL Subdomains】。
有的API是需要API Key的。这样的API都有说明文档,把Key按照人家给的例子粘贴进来即可。
cartocdn对我来说有点太素了,于是周末花了一天时间寻找能用的瓦片服务,结果惨不忍睹,汇报一下成果:
maptiler.com:要注册、被墙。
opentopomap.org:免注册、丑。
stadiamaps.com:要注册、比较流畅、免费用户限流严重
tomtom.com:要注册、慢、地图不详细
here.com:要注册、中文地名乱七八糟
geoapify.com:要注册、速度尚可、账号登录验证需要梯子,服务本身不需要。
至于为啥不找国内的地图服务,是我不想吗?本插件所支持的是Raster服务,也叫zxy服务,客户端GET的结果必须是一张PNG/JPG/WEBP图片。国产的高德和天地图我也试了,根本不是一样的格式。甚至有种说法,说国内不允许提供这种服务。
然后呢,这服务也可以自己搭建,数据和教程也都有,但总觉得这种行为像为了吃顿酱肘子先花一年时间晒酱油,没必要。
兜兜转转一圈,还是要回到cartocdn。什么功不唐捐,屁咧!

Map Tile URL Subdomains
具体填什么要看API的文档说明,像openstreetmap和cartocdn都是abcde或a,b,c,d,e。有的API前面没有前缀那就不填。

Detect Retina
是否检测高清设备。如果上面的瓦片服务中支持@2x,那么选中这项以后,如果leaflet发现使用者用的是高清屏幕,就会自动使用高清地图。窃以为意义不大。

Tile Size
一般情况下服务本身已经设好了,留空即可。

Tile Id
Access Token
用Mapbox的服务才有用。但是我的Mapbox没配明白,只有一个默认的卫星地图能用,这两项也没用上。

Zoom Offset
好像是在zoom的时候自动加减一下这个值,没理解意义。

No Wrap (tiles)
地图是否与经线对齐。(这有啥用?)

JavaScript URLCSS URL
css和js的位置,默认即可。

Default Attribution
地图做成后,右下角的一串版权信息。尊重服务商要求即可。

再往后没用上。
插件装好后,其实已经可以编辑地图了。但因为还有个插件的插件,所以怎么用放后面再说。

插件Extensions for Leaflet Map的配置

插件地址:Extensions for Leaflet Map
跟主插件正相反,这个插件的后台,大多数时间在说怎么用。

Marker Clustering–When you mouse over a cluster it shows the bounds of its markers.
聚合显示时,默认会将聚合的标记点连接起来形成一个多边形。我嫌不好看,勾掉了。

When you click a cluster we zoom to its bounds.
点击聚合点时,直接缩放到所有聚合点的范围。

增加一个leaflet map

语法和关键字很多,但能用上的不多。通常只需要地图、标记点、地形json文件。

leaflet-map
主插件的主函数,用于插入一张leaflet-map。参数就是配置页面的那些,没什么特别的。

leaflet-marker
标记一个地点。参数比较多,挑有用的说。
– lat,lng / address:用于定位标记的位置。lat是纬度,lng是经度。经纬度可以从OpenStreetMap.org上查。国产地图查到的经纬度与OSM查到的有一些偏差,注意要保持一致。而address的数据库偏差非常大,不建议。
– iconUrl:标记用图标。可以是网址,也可以是相对路径,甚至base64代码。如果不设,使用默认的蓝色pin图标。
– title:鼠标移动到标记点上时显示的提示信息。这个与点击标记后显示的内容是两码事。
– iconanchor:图标的锚点偏移。这个参数有点意思,它表示的是你图标的“尖”所在的位置。以默认图标为例,规格是19*25,“尖”在最下方,所以iconanchor就应该是宽的一半和全部的高,也就是10,25。这个参默认项是0,0。每个标记都要自己手动加,相当烦。不过也能够理解,一旦有人用的是左箭头呢?
– opacity:图标的透明度。
– 【leaflet-marker】【/leaflet-marker】之间,放置弹出的html内容。放啥都行,也可以定义css。
另外还有一些参数,我都没用上官网说明文档里都有。

leaflet-geojson
地理信息的json文件。中国的地理信息文件可以在阿里云下载,或者直接引用。建议下载后到mapshaper进行优化后上传,在本地使用。这里非常感谢明明桑,一个优化工具解决了困扰我许久的问题。
– src:地理信息源文件的路径,可以是相对路径或网址。
– color:leaflet提供的属性,边框颜色。
– weight;leaflet提供的属性,边框宽度。
– opacity:leaflet提供的属性,边框透明度。默认的3px蓝色实在是有点虎。缺点是每个marker都需要单独设置。
– fill:leaflet提供的属性,布尔型,是否填充。默认true
– fillColor:leaflet提供的属性,填充颜色,不设则默认使用color
– fillOpacity:leaflet提供的属性,填充颜色的透明度,默认0.2
想一个省一个省点亮的,就下载省级json,想像我这样一个市一个市点亮的,就下载市级json,一次勾一个边即可。话说,我一直认为用省划分习俗非常不科学,甚至用市来划分都不科学。毕竟有粤南粤北、胶东鲁西南,还有江苏十三太保这样的众所周知的文化差异。我甚至觉得应该精确到县。毕竟我们旁边就有一个散装的地级市,我认识一堆人,他们分别来自鲅鱼圈、熊岳、盖州、老边、大石桥,就没有一个称自己是营口人的。但是真正实装以后才发现,县级太困难了,我甚至都没在普兰店歇过脚,自己家都没搞定。

markerclustergroup:聚合分组方法,这是“扩展的扩展”的功能,也是安装它的主要目地。cluster是指将临近的点进行聚合,group是通过关键字对追加的点进行分组。只聚合可以用cluster,只分组可以用leaflet-optiongroup。
– feat:适配项目。可以是【leaflet-marker】中的title或者iconUrl中的一个。参数以部分匹配的方式,对title或者iconUrl形成过滤,然后在右上角形成组别。
– strings:分组过滤用的字符串,用半角逗号间隔。
– groups:分组后显示的字符串。
– position :分组显示位置
– collapsed :分组是否折叠

多说无益,直接举例

【leaflet-map fitbounds】//用fitbounds,就不用关心点的位置和缩放了
【fullscreen】//增加一个全屏按钮
【leaflet-marker lat=38.87430121 lng=121.55204380 iconUrl="/path_to/marker-blue.png" iconanchor="15,40" 】<b>辽师附中</b><i>2012 /04 /<a href="/2012/04/ancient-school-motto.html" target="_blank" rel="noopener">沙河口黑石礁尖山街</a> /街拍 </i><img src="/path_to/imag0114.jpg" alt="imag0114" />【/leaflet-marker】
【leaflet-marker lat=38.88611421 lng=121.63731716 iconUrl="/path_to/marker-blue.png" iconanchor="15,40"  opacity=0.5】<b>西岗中学</b><i>2003 /05 /<a href="/2023/06/post-truth-and-something-before-my-graduation.html" target="_blank" rel="noopener">西岗八一三环街</a> /其他 </i><img src="/path_to/vlcsnap-2023-05-21-17h15m27s675.jpg" alt="vlcsnap-2023-05-21-17h15m27s675" />【/leaflet-marker】
【leaflet-marker lat=38.88890 lng=121.70665 iconUrl="/path_to/marker-yellow.png" iconanchor="15,40"  】<b>棒棰岛</b><i>1993 /08 /中山老虎滩迎宾路 /海滩 </i>【/leaflet-marker】
【leaflet-marker lat=38.93471 lng=121.19765 iconUrl="/path_to/marker-yellow.png" iconanchor="15,40" 】<b>北海王家村</b><i>2018 /08 /旅顺北海王家村 /海滩 </i>【/leaflet-marker】
【leaflet-marker lat=38.98562089 lng=121.65895298 iconUrl="/path_to/marker-yellow.png" iconanchor="15,40"  】<b>蟹子湾</b><i>2015 /04 /<a href="/2015/04/chemical-factories-stories.html" target="_blank" rel="noopener">甘井子甘井子海茂路</a> /海滩 </i><img src="/path_to/BF59AEE251904BC4.jpg" alt="BF59AEE251904BC4" />【/leaflet-marker】
【markerclustergroup feat="iconUrl" strings="blue, yellow" groups="学校, 海滩" collapsed=true】
【leaflet-geojson src="/path_to/dalian.json" color="#FF8888" weight=2 fillOpacity=0.3】//加入大连地图
【zoomhomemap】//调整缩放比
[fullscreen ] [markerclustergroup feat=iconUrl strings=blue, yellow groups=学校, 浴场 collapsed=true ] [zoomhomemap ]

就到这。总之有现成儿的我才不会亲自动手呢。

每夫吐槽(109)

2025-08-29 20:33:05

某夜。看漫画看得犯困,又没到直接睡过去的程度,把电子书合上放在胸口,酝酿情绪。毛孩子2号猛地跳上我胸口跟我互动。撸了几下之后,猫和我都就都睡着了。
第二天早起发现,被9斤的小猫踩了一脚之后,酱婶了:

这玩意儿叫做墨案Air6。

我这人遇到好东西一般不会夸,但遇到差东西就一定会骂。既然坏了,那就得说道说道了。墨案Air6只有一个优点,就是轻便。
剩下全是缺点。它的破系统我早就想吐槽了。买的时候是本来冲着开放系统去的,到手之后发现除了自带市场里的小猫两三只,自己找的软件80%都是装不上或者闪退,10%会在3分钟之内卡死或自动退出。电量也不太能打,连续用不到5个小时就歇菜了。
倒不会把它加到黑名单里,因为估计这牌子也坚持不了几年。

在最后尝试抢救的时候,意外发现墨案号称是杂粮生态链上的。
哟吼吼,把屎盆子扣杂粮头上我可是一点儿心理负担都没有。杂粮在我心中本就离“永不录用”一步之遥

真正在黑名单上的是创维。我姑娘早上9点出门的时候电视没关,下午4点回来,发现白屏了,断电重启都不好使的那种白屏。
自己尝试刷机无效,还是找了修家电的师傅上门。
拆机用表量了几个脚,说是板烧了,屏没事。换板550,问还修不修。
这电视修的,根本也不去给你查是板子的哪个零件坏了,也根本没有动烙铁的意思。
我自己上还真不行。首先我没法判断是板坏了,其次这板的型号我在某宝上还真没搜到。
这个价格拿捏得刚刚好。平常确实是几个月都不开,可明年还得看球,2028年还得看球,2030年还得看球……

拆!
十年前的电视,电路板分成泾渭分明的两部分,一半就是个机顶盒,另一半负责控制屏幕,两板间有几组排线。
一周后新板到货,涛声依旧了。师傅走前特意叮嘱:“这板子已经不太好找了,我跟你说啊,用创维的电视,千万别升级,就当成个显示屏用就行。反正我看你也是配了机顶盒。”
从善如流,干脆网络都不配。

公司又换名字了。这次工资卡也会同时换成浦发。
上门办工资卡的同时推销的信用卡,“开卡豪礼”可以是个小风扇或者某视频网站的VIP季卡。部门还真有人要了那个VIP季卡。
回家充会员的时候,发现这卡也太狗了:每个月可以激活VIP7天,到下个月可以再激活VIP7天,下下个月还可以激活7天,最后失效。
就问你跨了3个月是不是一季吧!

某日早上,工作机提示密码即将过期。改完密码后登邮箱,停在在二次验证的弹窗画面上,死活刷不出来。
找IT的小伙来解决。我们彼此能叫上名字,他知道我搞不定的问题一般都不太常见,一进门便神色紧张。
我说:“给你看个稀罕东西,Outlook把IE给弄出来了。Win11下的IE你见过吗?”
哥们当时就懵了。试着给我清用户清缓存,又登录网页版反复修改邮箱配置。又用他的管理员账号配置他自己的邮箱,也卡在同样的地方。
一个多小时毫无效果。
他忽然想起来:“你给我打电话之前,重启过没有?”
一阵振聋发聩的沉默。

臭宝学校的军训开始了。感觉学校根本就怕出事,千方百计地在拖延时间——每天训练,上午8:00开始,午休11:30到14:00,下午16:00回教室写当天的军训总结。
教官是从某军校找来的大二学生。
原本的计划是7天,第一天之后缩短到6天,第二天又通知要抽出半天看电影。刚才又通知,最后一天的汇报表演原定是下午3小时,改成早上2小时。
总之就是一副赶进度跳流程的样子。
这种糊弄让我觉得这学校目前看还挺务实的,没苦硬吃样子货就应该这么糊弄。

注:夫=大姨夫。

如何让MFC的Dialog类型窗口在高度超出屏幕高度时出现比例合适的垂直滚动条

2025-08-20 22:31:00

客户提了个需求:因为他们的显示器(32吋)大,所以经常把缩放比设成125%或者150%,希望我们的APP在这两个缩放比下能够正常显示。
但是我们干活用的只是普通的24吋,设成150%之后高度就出溢出屏幕了,这就需要加滚动条。而工作这个东西,到了二鬼子领导那里就会加码,变成100%-225%都得能正常运行,并且因为增加的高度与原来的高度相比没多太多,所以要大滑块,不要分的细碎的小滑块。
这个功能本身不难。通常的做法是取屏幕放大后的窗口新高度,然后减去桌面有效视窗高度,得到的差值除以一个系数,然后用SetScrollRange的第三个数给传进去。然后重写OnVScroll方法,从系数反推滑块位置。
但是,这样得到的是小滑块,而且最后一屏的空白部分也不准确,往往会出现大片空白。

研究了好几天,终于找到了还算不错的方案。在此分享一下。
注意,我只写了垂直滚动条,因为我们的窗体就是瘦长型,即使增加到225%也没超出屏幕宽。给公家干活的一个要务就是不干多余的事,所以要添加水平滚动条的自己酌情修改,我这里就不提供了。

开始。

第一步,在OnInitDialog()中,增加垂直滚动条

如需要增加则对垂直滚动条进行初始化。初始化时,不使用简化版的SetScrollRange(),而改用SetScrollInfo()。利用结构体SCROLLINFO的nPage和nMax配合实现大滑块。这里的逻辑是:nPage与nMax的比值也就是滑块占总高度的比值,比值越接近一,滑块越大。nPage和nMax都是相对值,只要二者单位统一即可。方便起见直接使用真实值。
一个很坑的点是nMax不能用窗口Rect的高,而要取最下边控件的下沿,原因未知。
下面是代码:

BOOL CMFCAppDemoDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

        //取窗口位置
	CRect rcThis;
	GetWindowRect(&rcThis);

        //取最下面控件的位置,如果有动态创建的控件,可以遍历取得。
	CRect rcLastButton;
	GetDlgItem(IDCANCEL)->GetWindowRect(rcLastButton);

        //取放大倍数,96.0是100%时候的DPI
	float fScale = static_cast<float>(GetDpiForWindow(m_hWnd)) / 96.0;
        
        //取桌面工作区大小
	CRect rcScreen;
	::SystemParametersInfo(SPI_GETWORKAREA, 0, &rcScreen, 0);

        //对话框的工作区域理想高度:比最后一个控件多一丢丢。
	int nHeightImage = rcLastButton.bottom + rcLastButton.Height() * fScale;

        //如果想象高度比工作区域高,那么将窗口高度设为与工作区等高。
	if (nHeightImage > rcScreen.Height())
	{
		m_blHasVScrollBar = true; //成员变量,用于标记是否有滚动条
		rcThis.bottom = rcThis.top + rcScreen.Height();
		this->MoveWindow(&rcThis, TRUE); //修改Dialog自身高度
		SCROLLINFO si{};
		si.cbSize = sizeof SCROLLINFO;
		si.fMask = SIF_RANGE | SIF_PAGE | SIF_PAGE;
		si.nPage = rcScreen.Height(); //Windows桌面可利用高度作为Page高
		si.nMax = nHeightImage; //窗口高度最大值。
		SetScrollInfo(SB_VERT, &si, TRUE); //激活滚动条
	}
        //否则没用滚动条
	else
	{
		SetScrollRange(SB_VERT, 0, 0, FALSE);
	}

	return TRUE; 
}

第二步,重写WM_VSCROLL的消息响应函数OnVScroll()

没有难点。只要每个消息处理时,nPage与nMax的比例关系一致即可。

BEGIN_MESSAGE_MAP(CMFCAppDemoDlg, CDialogEx)
	ON_WM_VSCROLL()
END_MESSAGE_MAP()

void CMFCAppDemoDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
        //取之前的滚动条信息
	SCROLLINFO si{};
	GetScrollInfo(SB_VERT, &si, SIF_ALL);

        //滚动条上一次的位置
	int nCurPos = si.nPos;
	const int FACTOR(100);
	switch (nSBCode)
	{
	case SB_LINEUP:          //Scroll one line up
		nCurPos -= (si.nPage / 50); //点击一次箭头,或者按一次↑,移动页面的1/50,注意方向
		break;
	case SB_LINEDOWN:           //Scroll one line down
		nCurPos += (si.nPage / 50); //注意方向
		break;
	case SB_PAGEUP:            //Scroll one page up
		nCurPos -= (si.nPage / 50* 20); //PgUp键的处理。所有的响应要统一单位标准即可。注意方向
		break;
	case SB_PAGEDOWN:        //Scroll one page down        
		nCurPos += (si.nPage / 50* 20); //注意方向
		break;
	case SB_THUMBPOSITION:  //Scroll to the absolute position. The current position is provided in nPos
		nCurPos = nPos; //从缩略图直接确认位置
		break;
	case SB_THUMBTRACK:     //Drag scroll box to specified position. The current position is provided in nPos
		nCurPos = nPos; //从滚动条直接确认位置
		break;
	case SB_ENDSCROLL:
		break;
	default:
		break;
	}
        //确认没有超出最小值和最大值范围。最小值一般是0,最大值是nMax - nPage。
	nCurPos = max(si.nMin, min(nCurPos, si.nMax - static_cast<int>(si.nPage)));
        //当位置移动时,滚动窗口内容
	if (nCurPos != si.nPos)
	{
		int nDelta = si.nPos - nCurPos; //注意方向,原始值减目标值
		si.nPos = nCurPos;
		si.fMask = SIF_POS;
		SetScrollInfo(SB_VERT, &si, TRUE); //设滚动条
		ScrollWindow(0, nDelta); //滚动窗口
		UpdateWindow();
	}
}

第三步,重写WM_MOUSEWHEEL的消息响应函数OnMouseWheel()

同样没有难点,只是鼠标滚动一下会转化成多次向上或向下的消息。

BEGIN_MESSAGE_MAP(CMFCAppDemoDlg, CDialogEx)
	ON_WM_MOUSEWHEEL()
END_MESSAGE_MAP()
BOOL CMFCAppDemoDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
        //确认滚动条有效
	if (!m_blHasVScrollBar) {
		return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);
	}
	CONST INT WHEEL_SCROLL_LINES(3);
	UINT8 ucDirection(SB_LINEUP);
        //根据zDelta方向确定消息重量
	if (zDelta < 0) {
		ucDirection = SB_LINEDOWN;
	}
        //把鼠标滚动值换算成N个箭头消息并发送。次数是没有方向的。
	UINT unLines = (abs(zDelta) * WHEEL_SCROLL_LINES) / WHEEL_DELTA;
	while (unLines--)
	{
		SendMessage(WM_VSCROLL, MAKEWPARAM(ucDirection, 0), 0);
	}
	return TRUE;
}

总之,最难的其实还是开头。nPage与nMax虽然设什么数都可以,但只有用真实值才是最符合拖动规律的。

每夫吐槽(108)

2025-08-06 20:58:31

去重庆之前,我把属于自己的BUG都改完了,而项目的BUG还剩3个。我满心以为他们能在4天里把剩余的BUG改好,这样的就不用回伊尔廷一下飞机就加班了。
结果,这帮人改好1个,又新测出了3个,我还在重庆观音桥喝冷饮的时候就收到了PM的电话,确认6月29日的加班。
其中一个新增的BUG确实诡异,现象是播放视频的过程中突然崩掉。这几个人实在太勤快了,4天时间写了2000多行的代码,因为没有头绪,所以只能一版一版回退,然后差分定位问题。光是找原因就花了一周。
原来是leader小雨嫌视频的加载过程太慢,想出了给每帧各自起一个线程加载的大聪明办法。通常来说这种用资源换时间的做法倒也无可厚非,只不过我们自行开发的那个写日志的DLL自从2008年以来就没更新过,是进组时间仅次于我的第二老的家伙。当初写DLL的哥们根本没想到会被这么用,接入线程的最大数随手写了个32。
源代码倒还在,不过升级的成本有点高。直接把线程里的写日志注掉了事。
这么个破玩意儿改了6天,心情大坏。

另外一个BUG是视频保存的处理太慢。看下现象,打开任务管理器瞅一眼就知道原因了。
跟小木头说:“内存满了。想办法加快写的速度。每帧单独落盘,或者弄个磁盘映射试试。”
小木头的回复出乎我的意料:“大致哥,什么是磁盘,什么是内存?大的那个是磁盘,小的那个是内存,对吗?”
“在你的开发机上可以这么理解。”
“那手机上呢?”
“手机厂商现在比较缺德,都给都叫成内存了,实际上以前叫内存和闪存。叫运存那部分没问题,剩下那块爱咋叫咋叫吧。”
“那换你怎么叫?”
“Memory和Storage。”

疫情之前的那一年,公司邮件推荐过一家培训机构,考职业资格证有优惠。对我们来说有意义的是健康管理师、人力资源师、导游之类门槛低又能抵税的证。好事的女同事们有不少人报名参与。考过的话补贴加上抵税省的钱,减去报名费,还略有盈余。只是这家培训机构跟公司的合作只有一年,后续她们每年都是在群里报新的培训,跟公司没什么关系了。
忽然有一天,政策变了,国家的补贴是没了还是变少了什么的。培训机构也随之变了脸,只给发教材和网课网址,甚至有几门课都没给考试报名。同事找过去,先是推脱,继而跑路了。
有人一怒之下打了12345,也有人报了警。报警之后统计了一下(我们部门的)受害者名单,然后也没了下文。
又过去一年。上个月忽然有110给牵头的小琳打电话,让她去公安局了解情况。这路子太像诈骗了,她也没搭理。最后警察叔叔打到了公司前台,算是正式发出了协助调查的邀请。
小琳于是只好请了半天假去了公安局。原来,是培训学校在政府部门的内线出了问题——给不具备考试资格的学员非法安排考试资格(比如高级心理咨询师本来需要前置条件,但是该培训学校在内线的安排下交钱就能考),连带着搜集一下培训学校违法的证据。
小琳顺便问一下,钱能不能给退。
答曰等着吧。并且友情提示,让回来后别的同事也注意随时接110电话,配合调查。
几个老娘们就以这个为由,申请带手机进开发间。PM睁一眼闭一眼同意了。
这一个月过去了,并没有任何一个人接到110来电。
也许是因为只有小琳自己报了高级心理咨询师吧。

走廊对面的开发间被另外的部门占据了。又是一个严格要求控制手机的项目,他们比我们更惨,手机放在类似澡堂子里那种透明的抽屉里,谁手机没锁一目了然。而我们好歹还是不透明的铁皮柜子。
这个部门有很多年轻的妹子。不知道公司现在的着装规定是不是过期了,这帮妹子经常穿吊带上班。也有穿凉拖的。也有把头发焗成粉色蓝色绿色的。甚至还有纹身和打鼻环的。
难到我们公司收购了某个商K?
这帮妹子穿着打扮方面违反规定跟我半毛钱关系也没有,只是看着不忿。但有一样违规是实实在在妨碍到我了。
这些人不按规定在食堂吃饭,非要在开发楼层吃。

你以为我要抱怨饭味儿?错!
我忍不了的是,这帮人吃完饭要在洗手间聚众刷碗!三个面池全占,边刷边聊,特别的慢!这导致了我中午上完厕所没法洗手!我总不能站在她们身后一直盯着屁股看吧。
尿个尿而已,为此走到别的楼层去洗手又特别不甘心。
没办法,只好拉长上午带薪拉屎的时间,尽量排空了。

7月25、26日(周五、周六)时代少年团在伊尔廷开两场演唱会。
演唱会的票那是一定没抢到的。问了个比较靠谱的票贩子,给的报价是,480的山顶票4000;680的票最抢手,6000;1680的性价比最高,只要12000。但是,不保证有,票贩子也得乖乖去主办方那里排号。
那就只好去你妈的了。
7月22日臭宝高中学校报到。去报到前,让臭宝把考完试做的美甲给卸了。她们娘俩做好了约定,演唱会臭宝要去场外,去场外前要把美甲再做回来。
报到当天(周二),衔接班更改了上课时间,12:30到晚上20:30,这样她就没有时间去做美甲。
接下来的周三和周四又都是有其他学校报到,上课时间同样变成12:30到20:30。
这样一来,臭宝就没有时间做美甲了。是的,我此时才知道做个美甲要2~4个小时甚至更久。
为了不耽误课的同时还能做上美甲,娘俩在某音、某团和小某书上找到半夜,找到一家早上8:30就开门营业并且有优惠价的美甲店。这样臭宝周四上午去做美甲,后面的课完全不耽误。
只是这家店所在的地方有点偏,臭宝之前从没去过,让她自己去我们两口子都不放心。
于是决定,我请假半天,带臭宝去做美甲。
一个皆大欢喜但只有我受伤的世界达成了。

注:夫=大姨夫。

吃饭太晚的危害一则

2025-07-28 12:52:15

昨天下午3点吃完饭,本来说好不吃晚饭的了。
到晚上8点半多,臭宝忽然嚷嚷饿了要吃东西。
老婆大人不搭理她。
臭宝说:“不给我买的话我就自己煮泡面了。”
我说:“可别。你煮完面还得我刷锅。”
遂到楼下买了一份拌面回来。

一进家门,身后传来“嘎~”的一声,原来在外面的时候一只知了落在我身上,被我带回了家,然后飞上了客厅的吊顶。
我也不知道地方那具体应该怎么形容,就是客厅边上一圈石膏板,石膏板下面是射灯,石膏板上面是一圈灯管的地方。又高又深,我家里没那么高的梯子。用笤帚够了两下,也没给吓出来,放弃了。
只有家里的两只猫一直盯着这会出声的大虫子。

凌晨3点。
臭宝忽然大喊:“妈妈救命!”
老婆大人一脚把我踢下床,叫我去看。
一只知了在臭宝枕头边上垂死挣扎吱哇乱叫,两只小猫床上一只地上一只瞅着。
所以事情很简单,知了不知什么时候飞了下来,被两个小家伙抓住并叼到了臭宝床上玩。
抓起扔出窗外。

这就是臭宝吃了一碗面而导致我没睡好觉的故事。

蜘蛛侠与X战警

2025-07-24 23:19:13

Z2FtZV8wMDAwMDAwMDE3MjY5LmpwZw==
原名:Spider-Man / X-Men: Arcade's Revenge机种:MD厂商:Software Creations类别:ACT发行年月:1994-06耗时:24
童年阴影系列,微笑继续。
1998年的暑假,我的好朋友汤球球把他的MD卖给了我,这样我就有了两台MD。他的几盘游戏卡也在拉扯一番之后不得不送给了我。于是这个冷门游戏成了我的藏品的一部分。这种高难的动作游戏在我手里就是鸡肋,玩又玩不过,换又换不出去。一年之后上了大学,转眼间模拟器遍地开花,MD游戏卡更是成了明日黄花,仅供观赏了。
Spider-Man_and_X-Men_Arcades_Revenge_201

跟上次的《电击作战》类似,本作冷门到连它的同名超任版也算上,我都找不到一个标准的译名。

“蜘蛛侠与X战警”这样的叫法,其实忽略了副标题“Arcade’s Revenge”。话说这个副标题当年可是直接把我干蒙了——什么叫街机的复仇?不应该是街机的复刻吗?Revenge这个词难道还有别的含义?这个小困惑直到20多年后的今天写这篇的时候才得到了答案:有歧义的不是Revenge,而是Arcade。Arcade是漫威的一个反派,能力是创造高科技陷阱和心理战术搞事情,是蜘蛛侠漫画和X战警漫画出现过的反派,也搞过复仇者、夜魔侠、惊奇队长、黑豹什么的。但是他的能力还是偏弱,从未在20世纪福克斯、索尼、迪士尼的任何漫威题材电影、衍生剧或者动画片中出现过!这个过程里,这部以Arcade为最终BOSS,应该被叫做“街机人的复仇”的游戏作品究竟提供了正向还是反向的反馈,不得而知。
Spider-Man_and_X-Men_Arcades_Revenge_014

当年,这个游戏我只能打过白给的第一关。第一关通过后出现金刚狼、镭射眼、暴风女和牌皇四个X战警,加上蜘蛛侠自己,每个角色有两个特色关卡。这些关各有各的难,我一关都过不去!最好成绩是蜘蛛侠和金刚狼的关卡能见到BOSS。两手生疼原地踏步的滋味可不好受。
下面备述一下各关难在哪里。

首先还是得说说起始关,它一点儿也不难,却非常单调无聊。必须控制蜘蛛侠按顺序吃掉地图上的N个道具,完全没有捷径可走。并且这个游戏的片头介绍还特别长,也就是说在后面的关死光以后,必须从头忍受一个无聊的片头和单调冗长的第一关才能回到正题,背好的版子早就忘了大半,还谈什么过关呢!
Spider-Man_and_X-Men_Arcades_Revenge_009

蜘蛛侠的两关难点在于地形复杂。可能是为了突出蜘蛛侠的飞檐走壁能力吧,很多地方需要控制小蜘蛛利用蛛丝荡过去,或者需要忍龙式的爬墙反跳。几个地方设计得咫尺天涯,明明不远却在若干次尝试后发现只能从上方或下方绕过去。蜘蛛侠关卡的背景还特别花,地图也大,对于背版来说特别不友好。
Spider-Man_and_X-Men_Arcades_Revenge_017

蜘蛛侠第二卡的BOSS是毒液和犀牛。毒液可以被堵角里实施惨案,犀牛行动单调,利用荡蛛丝踢能磨死。当年根本走不到这里。
Spider-Man_and_X-Men_Arcades_Revenge_203

金刚狼的第一关是个普通的动作关卡,大部分时间花在找路和对付杂兵身上。这个游戏的所有杂兵都挺肉的,需要多磨几下才会死。这关里有挺多需要复杂操作才能躲过的机关,跟敌人配合,看着就忍不住想卖血过,但是血这个东西,卖着卖着就空了啊。金刚狼在操作上也有个槽点,就是他那个爪子啊,默认是不伸出来的,按↑+A会切换有爪/无爪状态。有爪的情况下打人特别狠,有些墙也需要用爪子给挠开。岁数大了手不稳,挠着挠着墙爪子忽然收回去了,就很扫兴。金刚狼场景的背景也花得厉害,看着都头疼。
Spider-Man_and_X-Men_Arcades_Revenge_015

金刚狼的第二关是非常讨厌强制逃跑游戏。追兵是著名反派红坦克。之前的20年都以为是简单的逃跑,这次好不容易跑到头没路了,还是被一头撞死。只得上网去找录像,竟然要一边跑一边把路上悬着的各种铁块挠下来砸红坦克的脑袋,并且要尽量利用路上的地雷和敌人小兵扔出的炸弹,最后的悬崖边上还要回头捅几下,把红坦克捅死。关键红坦克又没有血条,不说谁能知道需要这么玩啊!“跑”跟“打一下就跑”可是两种完全不同的游戏。
Spider-Man_and_X-Men_Arcades_Revenge_207

镭射眼的两关可能是最简单的,地图虽然很大,但背景简单很多,有利于找路。这两关的难点是轨道上有一碰就死的敌人,以及轨道跟普通路面的识别不明显,肉身上轨道也是即死。两关末尾都要打哨兵,最后还要打一只巨大的机械哨兵。镭射眼的操作也别扭,按方向键下他就会蹲下,蹲下之后就不能移动了,所以误操作的时候经常把自己陷入想跑跑不了的境地。
但是镭射眼的造型和动作实在太猥琐了。
Spider-Man_and_X-Men_Arcades_Revenge_209
Spider-Man_and_X-Men_Arcades_Revenge_212

暴风女的关卡跟之前说过的《激龟忍者传》的水下关很像,恶心程度还要更甚。至少人家小乌龟在水下是不用考虑换气问题的,而暴风女则需要时刻计算好剩余的气量,及时回到水面上或者找到贝壳呼吸回气。操作不便的同时,这关的美工简直是屎,子弹和食人鱼的颜色跟背景非常像,老眼昏花的,看到就已经来不及了。
Spider-Man_and_X-Men_Arcades_Revenge_214
关底倒是挺简单的,把各个方向的机关打碎即可,如果不考虑换气的话。
Spider-Man_and_X-Men_Arcades_Revenge_027

牌皇关是噩梦级别的难度。首先,这是前有追兵后有堵截的强制卷轴关卡,第一关向右,第二关向上,对跑位的要求非常高。
其次是牌皇的攻击范围超级小,有两个砖块拦路的时候,一张牌只能打碎一块砖,另一块必须移动一小步才能打碎。这一小步经常卡不准,再试两次基本就要被卡死了,容错率特别低。
第三是,有走不通的死路存在,实在是恶意满满。
Spider-Man_and_X-Men_Arcades_Revenge_024
年轻那会儿因为牌皇比另外四位少见,故而青眼有加,投入了不少精力来打,也因此死得最惨。换现在,整个卡我直接就给撇了,玩了我的我不玩。
Spider-Man_and_X-Men_Arcades_Revenge_023
Spider-Man_and_X-Men_Arcades_Revenge_218

每个角色的两个专属关卡通过后,是5个人分别的脱出剧情,这部分就简单了不少。尤其暴风女在陆地上的操作性非常的好,蹦一下嗷嗷高,咋就给安排成水鬼了呢?漫威除了海王就没有会水的了,还是没版权?
Spider-Man_and_X-Men_Arcades_Revenge_224

最终BOSS,由蜘蛛侠主攻,其余四位站在两侧撇道具。BOSS有两种形态,第一种机器人形态会被越打越小,第二种人形状态会分身。
Spider-Man_and_X-Men_Arcades_Revenge_219
Spider-Man_and_X-Men_Arcades_Revenge_221
Spider-Man_and_X-Men_Arcades_Revenge_223

通关是俗套的反派留了个大烟花。
Spider-Man_and_X-Men_Arcades_Revenge_030

蜘蛛侠与X战警》采用署名-非商业性使用-禁止演绎许可协议进行许可。 『破袜子』期待与您交流。

相关推荐: