0%

人类与寄生物的生存在历史中不断出现,流行性病毒感染并不是现在社会出现的问题,它们一直都在,在罗马衰亡的背后,在蒙古征战的路上,在冒险者踏上美洲的船舶中,它们一直都在。

Read more »

音乐的美学本质

音乐怎么听?

艺术怎么懂?

视觉、文学、听觉,三大艺术,关键在于感知和共鸣,而不是能够用文字和数理去解释它。

音乐何需懂!

Read more »

什么是爱情?什么是婚姻?

《围城》 一直听说但确没读过,这次碰巧翻阅,发现文笔清淡有趣,完全没有想象中的沉重,对男女情爱、婚姻的描写真是精妙,在这里做下部分文摘。

Read more »

1. 什么是网络重定向 what

HTTP重定向(HTTP redirect)就是将各个网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向),也称为URL 重定向、 URL 转发;

常见的HTTP重定向状态码是301(Moved Permanently/永久移动)、302(Found/已定位),差别在于301表示已为目标资源分配了新的永久URI,以后对该资源的任何引用都应使用新的URI,302表示目标资源临时位于其他URI下。由于重定向有时可能会更改,因此客户端应继续将有效请求URI用于将来的请求。

Read more »


title: iOS 获取UIImage上某一点的颜色
date: 2018-06-07 18:12:21
tags: iOS
categories: IT


获取图片上某一点的颜色

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
- (UIColor *)colorAtPixel:(CGPoint)point {
if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) {
return nil;
}

UIColor* color = nil;

CGImageRef inImage = self.CGImage;

// Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue
CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];
if (cgctx == NULL) { return nil; /* error */ }

size_t cgimageWidth = CGImageGetWidth(inImage);
size_t cgimageHeight = CGImageGetHeight(inImage);
point = CGPointMake(point.x/self.size.width*cgimageWidth, point.y/self.size.width*cgimageHeight);
CGRect rect = {{0,0},{cgimageWidth,cgimageHeight}};


// Draw the image to the bitmap context. Once we draw, the memory
// allocated for the context for rendering will then contain the
// raw image data in the specified color space.
CGContextDrawImage(cgctx, rect, inImage);

// Now we can get a pointer to the image data associated with the bitmap
// context.
unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
//offset locates the pixel in the data from x,y.
//4 for 4 bytes of data per pixel, w is width of one row of data.
int offset = 4*((cgimageWidth*round(point.y))+round(point.x));
CGFloat alpha = data[offset];
int red = data[offset+1];
int green = data[offset+2];
int blue = data[offset+3];
color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];
}

// When finished, release the context
CGContextRelease(cgctx);
// Free image data memory for the context
if (data) { free(data); }

return color;
}


- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef)inImage
{
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;

// Get image width, height. We'll use the entire image.
size_t pixelsWide = CGImageGetWidth(inImage);
size_t pixelsHigh = CGImageGetHeight(inImage);

// Declare the number of bytes per row. Each pixel in the bitmap in this
// example is represented by 4 bytes; 8 bits each of red, green, blue, and
// alpha.
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);

// Use the generic RGB color space.
colorSpace = CGColorSpaceCreateDeviceRGB();

if (colorSpace == NULL)
{
fprintf(stderr, "Error allocating color space\n");
return NULL;
}

// Allocate memory for image data. This is the destination in memory
// where any drawing to the bitmap context will be rendered.
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
fprintf (stderr, "Memory not allocated!");
CGColorSpaceRelease( colorSpace );
return NULL;
}

// Create the bitmap context. We want pre-multiplied ARGB, 8-bits
// per component. Regardless of what the source image format is
// (CMYK, Grayscale, and so on) it will be converted over to the format
// specified here by CGBitmapContextCreate.
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL)
{
free (bitmapData);
fprintf (stderr, "Context not created!");
}

// Make sure and release colorspace before returning
CGColorSpaceRelease( colorSpace );

return context;
}


title: ‘iOS:Checklist’
date: 2018-11-21 16:44:38
tags: iOS
categories: IT


App在开发测试阶段可能有多种修改设置,但在上线前需要对某些设置进行隐藏、消除,否则上线版本可能出现意想不到的错误,本质上讲这个问题可以通过测试处理,作为开发者也得注意下测试工作,为了方便检查,记录下上线前的checklist

Debug/Release

Xcode本身区分Debug/Release环境,在Debug环境下,对象释放、内存管理为了调试需要做了很多额外工作,发布一般使用Release,但开发者可能配置多个多个开发环境,在打包上架时要检查下包的环境

Version/Build

app的版本号与编译需要,版本号的规则一般是x.x.x,分别对应大版本.小版本.小更新,上线appStore的更新包build编号不能重复,并且需要大于上一个上传的build

AppStore审核

iOS应用的审核应该是所有应用市场最严格的吧,上线检查是否触犯苹果审查规则,否则被打回来也是浪费时间,注意一些常见的规则

  • 奔溃和错误
  • 商品支付
  • 客户端适配
  • ipv6适配
  • 提供测试账号
  • 出现demo、test等测试信息
  • 绑定对应硬件才能发挥功能,如智能家居相关app
  • 内购
  • Plist文件中请求了某权限
  • 申请后台存活权限但没有说明
  • 出现或要求安装其它第三方应用,比如分享
  • App Store 审核指南
  • UIWebView

支付

支付场景在国内比较复杂,有支付宝、微信、银联、N大银行,国外有Paypal、AppPay、N大国际银行
注意没有安装对应应用就不要显示入口了

内购是苹果商店的大蛋糕,苹果对待内购非常严格,部分平台可能有某些方式绕过内购,一旦发现会被处罚,审核周期变长,严重者会被下架、封号

分享

注意没有安装对应应用就不要显示入口了

iOS版本支持 2018

iOS8~12,可以分成三个梯队,8/9~10/11~12

iOS8在WebView、文本渲染、换行、动态计算列表高度上有坑

奇特的一生,讲述了苏联昆虫学家柳比歇夫56年如一日对个人时间进行定量管理。

柳比歇夫(Alexander Alexandrovich Lyubishchev),以独特的方式实现对时间的准确预判和管理,在长达 56 年的时间里坚持优化自己的时间,向着自己的伟大目标背驰。

对于时间,却由于我总是用文字为她拍照,因此可以时常伴我左右。她原本无情,我却可以把她当作朋友,因为她曾经让我明白,后来也总是经常证明,无论做什么事情,只要我付出耐心,她就会陪我甚至帮我等到结果,并从来都能将结果如实交付与我,从未令我失望。正是因为有了时间作为朋友,我才可能仅仅运用心智就有机会获得解放。

Read more »

我不是在写战争,而是在写战争中的人。我不是写战争的历史,而是写情感的历史。

S.A.阿列克谢耶维奇,对苏联二战女兵的访谈记录,展示战争中被忽略的一面。

我体验痛苦,品味仇恨,经历诱惑,既有温情又有困惑……我试图理解死亡与杀人之间的区别何在,人性与兽性之间的界限何在。人们怎么能与如此疯狂的想法彼此共存:他们竟然有权去杀死同类?而且是理直气壮的杀戮!

我那时还完全是个小姑娘,一边做梦一边长大,一边长大一边做梦。可是就在我做梦的年龄,战争爆发了。我甚至都有些舍不得让你听……

番号是什么,他全记得。可我不行,我只记得我自己,记得我自己的战争。虽然生活在人群中,但总是形单影只,因为在死亡面前,人永远是孤独的。我能记住的就是那种阴森恐怖的孤独感。”

Read more »

如何用脚本批量修改图片md5

分析

文件 md5,本质是文件的体积大小,只要修改了文件的大小 md5 值就会发生变化;

由于图片格式影响,直接在图片后面插入数据是不影响图片的显示效果,所以可以编译图片,插入数据引起图片 md5 改变;

Read more »