教你如何在大陆直接使用谷歌搜索

一、环境准备

我们需要一个nginx的模块来进行设置,ngx_http_google_filter_module。前

提我们是有一个海外的VPS,并且可以访问谷歌,我的VPS是亿速云香港的。

首先先感受一下我的成果吧,请点击https://google.qinyj.top

二、软件安装

我的操作系统是CentOS 6.x 64位操作系统,如果为了快速搭建的话,直接使用我编译好的RPM包,可以加我VX索取,几分钟就可以搞定。

cd /root/

wget https://nginx.org/download/nginx-1.7.8.tar.gz

git clone https://github.com/cuber/ngx_http_google_filter_module

git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_moduletar xzf nginx-1.7.8.tar.gz

cd nginx-1.7.8

./configure

--prefix=/usr/local/nginx

--user=nginx

--group=nginx

--with-http_ssl_module

--with-http_flv_module

--with-http_stub_status_module

--with-http_gzip_static_module

--with-pcre

--add-module=/root/ngx_http_google_filter_module

--add-module=/root/ngx_http_substitutions_filter_module

make && make install

三、配置nginx

1 vim /usr/local/nginx/conf/nginx.conf

在http模块里面增加如下内容

upstream google {

server 173.194.38.1;

server 173.194.38.2;

server 173.194.38.3;

server 173.194.38.4; #通过dig -t A www.google.com获取谷歌的IP地址}

server {

resolver 8.8.8.8;

location / {

google on; #启用谷歌镜像功能

#google_scholar on; #启用谷歌学术搜索,可以不设定

#google_robots_allow on; #允许蜘蛛爬镜像站点,可以不设定

google_language en; #设定谷歌的语言,语言可以自己随意定义,支持的语言请看附录

#google_ssl_off "google"; #不适用https访问} }

server {

listen 80;

server_name google.qinyj.top;

location / {

proxy_pass https://google; #反向代理到upstream }

}

谷歌发布了Android 12 beta 5的最终版本,官方版本将在几周内推出

【手机中国新闻】今日谷歌正式发布了Android 12的最新测试版Android 12 Beta 5,据悉这将是Android 12的最终测试版本,也就是说未来正式发布的版本将会同该版本差不多,Android 12 Beta 5或许已经作为最终正式发布版本的候选版本也是有可能的。如果一切顺利,正式版本将在几周之内发布。

Android 12 Beta 5发布(图源来自网络)

在此之前,Android 12过往的Beta版本都在不断地完善各种功能,谷歌表示此次Android 12已经达到了“平台稳定性”的里程碑,开发者可以通过此次Android 12 Beta 5的发布来检查测试他们的应用程序是否匹配新的Android 12系统。

此次Android 12 Beta 5的更新具体内容如下:

Nearby Share现可设置为“所有人”可见

Pixel手机会在因过热而限制充电时通知用户

谷歌计算器进行了Material You重新设计

电源菜单中默认显示锁定按钮(无法在设置中移除)

新增彩蛋桌面小组件,可展示Material You动态调色板

锁屏界面的日期/时间显示、推送通知的位置调整

锁屏界面提供用于智能家居的“识别控制”快捷方式

设备搜索功能现必须从 App 抽屉顶部访问

Google Clock 7.0获得 Material You 重新设计

9月安全补丁

Android 12 Beta 5部分更新内容(图源来自网络)

另一方面,现在Pixel 5a的用户也可以下载测试本次Android 12 Beta 5,各个版本Pixel手机目前都可以前往官网下载工厂镜像/ OTA 文件,参与此次最终测试了,有兴趣的朋友们可以不要错过这个快人一步的机会哦。

Docker图像管理基础知识

  • 镜像的概念
  • docker镜像层
  • docker存储驱动AUFSOverlayFSDeviceMapper
  • docker registry
  • docker镜像的制作Docker Hubdocker镜像的获取镜像的生成基于容器制作镜像
  • 镜像的导入与导出

镜像的概念

镜像可以理解为应用程序的集装箱,而docker用来装卸集装箱。

docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。

docker镜像采用分层构建机制,最底层为bootfs,其上为rootfs

  • bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源
  • rootfs:位于bootfs之上,表现为docker容器的根文件系统传统模式中,系统启动之时,内核挂载rootfs会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层

注意:当删除容器时,这个容器自有的“可写”层会一起被删除

docker镜像层

位于下层的镜像称为父镜像(parrent image),最底层的称为基础镜像(base image);最上层为“可读写”层,其下的均为“只读”层。

docker存储驱动

docker提供了多种存储驱动来实现不同的方式存储镜像,下面是常用的几种存储驱动:

  • AUFS
  • OverlayFS
  • Devicemapper
  • Btrfs
  • VFS

AUFS

AUFS(AnotherUnionFS)是一种Union FS,是文件级的存储驱动。AUFS是一个能透明覆盖一个或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container。

AUFS文件系统据说有3W行代码,而ext4文件系统却只有4000-5000行左右代码,这些代码是要被整合进内核的,后来AUFS申请要被合并进内核代码的时候,linuz觉得它这代码太过臃肿,于是拒绝了。因此AUFS这个文件系统一直以来就不是linux内核中自有的文件系统,想用AUFS这个文件系统的话,必须自己向内核打补丁并去编译使用它,但redhat系列的操作系统一向以稳定著称,不会干这种出格的事,所以在redhat系列操作系统中使用AUFS并无可能。而ubuntu上的docker默认使用的就是AUFS。

OverlayFS

Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。在Docker中,底下的只读层就是image,可写层就是Container。目前最新的OverlayFS为Overlay2。

AUFS和Overlay都是联合文件系统,但AUFS有多层,而Overlay只有两层,所以在做写时复制操作时,如果文件比较大且存在比较低的层,则AUSF会慢一些。而且Overlay并入了linux kernel mainline,AUFS没有。目前AUFS已基本被淘汰。

DeviceMapper

Device mapper是Linux内核2.6.9后支持的,提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。AUFS和OverlayFS都是文件级存储,而Device mapper是块级存储,所有的操作都是直接对块进行操作,而不是文件。Device mapper驱动会先在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的基本设备,所有镜像都是这个基本设备的快照,而容器则是镜像的快照。所以在容器里看到文件系统是资源池上基本设备的文件系统的快照,并没有为容器分配空间。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。

OverlayFS是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显然要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。

docker registry

启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地。

Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry,亦可使用官方的Docker Hub。

docker registry的分类:

  • Sponsor Registry:第三方的Registry,供客户和Docker社区使用
  • Mirror Registry:第三方的Registry,只让客户使用
  • Vendor Registry:由发布docker镜像的供应商提供的registry
  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

docker registry的组成:

  • Repository由某特定的docker镜像的所有迭代版本组成的镜像仓库一个Registry中可以存在多个RepositoryRepository可分为“顶层仓库”和“用户仓库”用户仓库名称格式为“用户名/仓库名”每个仓库可包含多个Tag(标签),每个标签对应一个镜像
  • Index维护用户帐户、镜像的检验以及公共命名空间的信息相当于为Registry提供了一个完成用户认证等功能的检索接口

Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境。

docker镜像的制作

多数情况下,我们做镜像是基于别人已存在的某个基础镜像来实现的,我们把它称为base image。比如一个纯净版的最小化的centos、ubuntu或debian。

那么这个最小化的centos镜像从何而来呢?其实这个基础镜像一般是由Docker Hub的相关维护人员,也就是Docker官方手动制作的。这个基础镜像的制作对于Docker官方的专业人员来说是非常容易的,但对于终端用户来说就不是那么容易制作的了。

Docker Hub

Docker Hub is a cloud-based registry service which allows you to link to code repositories, build your images and test them, stores manually pushed images, and links to Docker Cloud so you can deploy images to your hosts.

It provides a centralized resource for container image discovery, distribution and change management, user and team collaboration, and workflow automation throughout the development pipeline.

Docker Hub provides the following major features:

  • Image RepositoriesFind and pull images from community and official libraries, and manage, push to, and pull from private images libraries to which you have access.
  • Automated BuildsAutomatically create new images when you make changes to a source code repository.
  • WebhooksA feature of Automated Builds, Webhooks let you trigger actions after a successful push to a repository.
  • OrganizationsCreate work groups to manage access to image repositories.
  • GitHub and Bitbucket IntegrationAdd the Hub and your Docker Images to your current workflows.

docker镜像的获取

To get Docker images from a remote registry(such as your own Docker registry)and add them to your local system, use the docker pull command:

# docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

The is a host that provides the docker-distribution service on TCP (default:5000)

Together, and identify a particular image controlled by at the registry

  • Some registries also support raw ;for those, is optional
  • When it is included, however, the additional level of hierarchy that provides is usefull to distinguish between images with the same

The additional level of hierarchy of

Namespace

Examples(<namespace>/<name>)

organization

redhat/kubernetes, google/kubernetes

login(username)

Alice/application, bob/application

role

devel/database, test/database, prod/database

镜像的生成

镜像的生成途径:

  • Dockerfile
  • 基于容器制作
  • Docker Hub automated builds

基于容器制作镜像

Create a new image from container's changes

Usage:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Options

Default

Description

—author, -a

Author (e.g., "John Hannibal Smith hannibal@a-team.com")

-c, –change list

Apply Dockerfile instruction to the created image

-m, –message string

Commit message

-p, –pause

true

Pause container during commit

[root@localhost ~]# docker pull busybox

Using default tag: latestlatest: Pulling from library/busyboxbdbbaa22dec6: Pull complete Digest: sha256:6915be4043561d64e0ab0f8f098dc2ac48e077fe23f488ac24b665166898115aStatus: Downloaded newer image for busybox:latest

docker.io/library/busybox:latest

[root@localhost ~]# docker run –name b1 -it busybox

/ # ls

bin dev etc home proc root sys tmp usr var

/ # mkdir data

/ # echo 'Busybox page test.' > data/index.html

/ # cat data/index.html

Busybox page test.

在创建镜像时,我们不能关闭容器,必须使其处于运行状态,所以我们必须要另起一个终端,然后执行

[root@localhost ~]# docker commit -p b1sha256:b84e7e2972700a24f675182818666bf22c6c0cd95bf30643513020d4d9f3920d

[root@localhost ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

<none> <none> b84e7e297270 3 seconds ago 1.22MB

busybox latest 6d5fcfe5ff17 6 weeks ago 1.22MB

[root@localhost ~]# docker tag b84e7e297270 seancheng1002/b1:v0.1

[root@localhost ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

seancheng1002/b1 v0.1 b84e7e297270 58 seconds ago 1.22MB

busybox latest 6d5fcfe5ff17 6 weeks ago 1.22MB

此时要注意的是,我们的仓库名叫b1,所以我们要在Docker Hub上创建一个名为b1的仓库,然后再将我们做好的镜像push上去

[root@localhost ~]# docker login

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.

Username: seancheng1002

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[root@localhost ~]# docker push seancheng1002/b1:v0.1

The push refers to repository [docker.io/seancheng1002/b1]

b91c804c38c2: Pushed 195be5f8be1d: Mounted from library/busybox

v0.1: digest: sha256:67be9d39f8a31405078567f51a447fe60b52f398bc6c0e9f351c083e5e512e2d size: 734

使用新生成的镜像创建容器

[root@localhost ~]# docker run –name t1 -it seancheng1002/b1:v0.1WARNING: IPv4 forwarding is disabled. Networking will not work.

/ # ls

bin data dev etc home proc root sys tmp usr var

/ # ls data/

index.html

/ # cat data/index.html

Busybox page test.

由此可见,新生成的镜像中是包含了新增的内容的,但是此时有一个问题,那就是容器默认要启动的进程是什么?在这里,默认情况下是启动的sh进程,但我们是要启动一个http站点,所以我们要在创建镜像时将容器默认启动的进程设为httpd,这样一来我们就可以通过新生成的镜像来快速构建一个简单的http站点了。

使用docker inspect命令查看b1容器启动的默认进程是什么

[root@localhost ~]# docker inspect b1

[

…此处省略N行

"Cmd": [

"sh"

],

…此处省略N行

"Gateway": "172.17.0.1",

"IPAddress": "172.17.0.2",

…此处省略N行

]

重新生成镜像并上传

[root@localhost ~]# docker commit -a 'sean <sean1002@126.com>' -c 'CMD ["/bin/httpd","-f","-h","/data"]' -p b1 seancheng1002/b1:v0.2

[root@localhost ~]# docker push seancheng1002/b1

使用新生成的镜像创建容器

[root@localhost ~]# docker run –name t2 -d seancheng1002/b1:v0.298708886e332243bb64dac32f7e5210c8219e30495150c8fde4938d5d748ada7

[root@localhost ~]# docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES98708886e332 seancheng1002/b1:v0.2 "/bin/httpd -f -h /d…" 7 seconds ago Up 5 seconds t2

a2e954da2011 busybox "sh" About an hour ago Up About a minute b1

使用docker inspect命令查看t2容器启动的默认进程是什么,以及其IP地址,然后用curl命令访问该IP,看是否能访问到网页

[root@localhost ~]# curl 172.17.0.3

Busybox page test.

镜像的导入与导出

假如有2台主机,我们在主机1上做了一个镜像,主机2想用这个镜像怎么办呢?

我们可以在主机1上push镜像到镜像仓库中,然后在主机2上pull把镜像拉下来使用,这种方式就显得比较麻烦,假如我只是测试用的,在一台主机上做好镜像后在另一台主机上跑一下就行了,没必要推到仓库上然后又把它拉到本地来。

此时我们可以在已有镜像的基础上把镜像打包成一个压缩文件,然后拷贝到另一台主机上将其导入,这就是镜像的导入和导出功能。

docker中我们使用docker save进行导出,使用docker load进行导入。

在已生成镜像的主机上执行docker save导出镜像

docker save -o myimages.gz seancheng1002/b1

在另一台没有镜像的主机上执行docker load导入镜像

docker load -i myimages.g

谷歌发布安卓安全公告:OTA和工厂图片开放下载

【PConline 资讯】手机系统一般都会有漏洞,只是时间发现早晚的问题,随着时间推移厂商会相继推出修复补丁,据外媒报道,谷歌近日发布3月份Android安全公告,并面向支持的Nexus和Pixel系列设备发布了全新的工厂和OTA镜像更新。

据谷歌介绍称,今年3月的安全公告中,所披露的所有漏洞都是合作商在2017年2月6日及更早时候发现的,公告中写道:“2017年3月5日或之后发布的安全补丁级别都已经解决了该日期之前的所有报告漏洞。”

据悉,OTA更新已经于今天开始面向Google设备开始推送;用户可通过Google的网站为支持的Nexus和Pixel设备找寻最新的OTA镜像文件,而且最新工厂镜像也上线。尽管最新补丁已经在AOSP库上线,但其他OEM厂商为旗下设备更新这些安全补丁依然需要做进一步的审查和测试,尤其是运营商版本,因此还需要等待一段时间。(OTA地址)(工厂镜像)

建议使用撰写论文、查阅文献、查阅语法、截图、查阅副本等工具

凡是写论文的人,查资料的找文献绝对是最让人头疼的地方。论文和平常写文章不同,需要确凿的证据来证明你的观点,那么下面就推荐给大家最好的几个网站吧。

1、 中文各大学术网站

绝大部分人都使用的三个学术网站:知网、维普、万方。经过了多年的发展,中文数据库最具权威性的三个网站,想必不用过多介绍了吧。

2、 大木虫学术导航

这个网站真是一个神奇的网站,涵盖了几乎所有文献下载,文献翻译,国外学术网站导航,科研工具等等,缺点就是第一次进入网站,一定要公主号的口令,以后不会有了,总体来说还是不错的。

3、 Google学术

这个网站绝对是任何做学术躲不开的一个网站,覆盖近2亿篇文章数据库,除了文献格式丰富,还提供相关文章等多种功能,在学术搜索上面几乎完美,不过我们是无法实用的,除非你会魔法,或者用谷歌镜像。

4、 比菲尔德学术

这个搜索引擎也是比较知名的搜索引擎了,它拥有着世界级海量内容的搜索引擎之一,对所有用户免费开放。可保存搜索结果,具有分层分页的搜索选项等多种特点。

5、 sic-hub

这是一个开放式的文献获取平台,里面提供了大量且备受关注的论文,而且全部都是免费下载,不过域名经常换,要访问的话需要一些魔法和技巧。

6、 语法检查

这个Grammar Check Online是在某乎找到的神奇工具,针对于写外国学术论文的作者很有帮助,可以通过此插件检查出论文中的语法错误,不管是对学习学术,还是学习语法都很有帮助。当然了,要用魔法才能使用哦。

7、 截图神器

除了部分职业,绝大部分人的电脑只有一个显示屏,写论文时资料切换起来异常麻烦。而snipaste,能将截图的同时,将论文所需资料贴在桌面上,直接搜索名字就能下载使用。

还有刊大师、天若OCR、papers、Doctranslator等多种好用的工具和网站,对大家的写作都很有帮助哦,对论文和期刊有问题的也欢迎私信。

不想再使用百度了?谷歌搜索在中国的几种方法

这篇文章不知道能不能发出来,写了再说。

众所周知,国内搜索百度一家独大,但是百度的搜索体验却很差劲。

下面是几种在国内用谷歌搜索的方法。

谷歌镜像站

https://www.hlhmf.com。(镜像站有很多,这只是其中之一)

这是我本人常用的谷歌镜像网站,用户体验可以,唯一的缺点是时不时的打不开,适合轻度搜索。

谷歌镜像站之一

浏览器插件

推荐两个

  1. 谷歌上网助手。可以免费使用谷歌搜索,如果想要完整的Google体验(Youtube、Gmail等),请充值会员。
  2. 谷歌访问助手。免费使用Google搜索,不过缺点是你得把浏览器主页设置成2345。

谷歌上网助手

谷歌访问助手

本人推荐谷歌上网助手。

微屁恩

多说了就会被和谐,具体方法自行百度。


如果大家只是轻微的使用谷歌搜索,那么推荐用镜像站或者浏览器插件。

如果你追求速度、稳定、完整的体验,那么……

谷歌发布nexus9安卓5.0工厂镜像

谷歌发布Nexus9安卓5.0出厂镜像

出处:IT之家 原创(蓝莲)

2014-11-5 13:48:35 评论

谷歌今天发布了Nexus9安卓5.0的出厂镜像,并推出了Nexus Player;Nexus9和Nexus Player是目前唯一两款已向用户推出的运行Android 5.0的设备。

对于Android玩家来说这几乎是必需品,因为出厂镜像是恢复原厂设置的基本配备。当用户不断刷机时,需要出厂文件来以防万一,要是出错或设备不能重启只能使用出厂镜像解决。

该出厂镜像的型号与这两款设备中的安卓5.0型号一致:LRX21L。

由于LTE版Nexus9尚未开卖,因此谷歌还没有提供这个型号的出厂镜像下载。(via:androidbeat)

API的官方版本确认Google Android 12L beta 1已经发布

IT之家 12 月 9 日消息,在 10 月份的 Android 开发者峰会上,谷歌强调了平板电脑、可折叠设备和 Chromebook 等大屏幕设备的增长,以及如何通过新的 Jetpack API、工具和指南,让开发者们更容易为这些设备构建出良好的应用体验。谷歌还发布了 Android 12L 的开发者预览版,这是一个专为大屏幕设计的 Android 12 功能更新。

Android 开发者峰会

https://developer.android.google.cn/events/dev-summit

Android 适配大屏幕的 3 个重点

https://android-developers.googleblog.com/2021/11/android-developer-summit-21-large-screens.html

Android 12L

https://developer.android.google.cn/12L

IT之家获悉,通过 12L,谷歌为大屏幕优化和打磨了系统界面,使多任务处理更加强大和直观,并改善了兼容性支持,让应用在默认情况下也有更好的视觉效果。12L 还为开发者提供了一些新的 API,如空间音频以及改进的拖放操作,以打造更好的大屏幕体验。

今天,谷歌正式发布 Android 12L 的第一个 Beta 版,供大家对应用进行测试并提交反馈,从而为明年年初发布的功能更新做好准备。你可以在 Android Studio 中设置 Android 模拟器来尝试新的大屏幕功能。Android 12L 也适用于手机,只需注册参与测试,即可在受支持的 Pixel 设备上获取 Android 12L Beta 1。如果你已经参与 Android 12 Beta 测试,则会自动获得 12L 更新。谷歌与联想合作,让你也可以在联想 Tab P12 Pro 平板电脑上体验 Android 12L。

获取 Android 12

https://developer.android.google.cn/about/versions/12/get

参与 Beta 版测试

https://www.google.com/android/beta

Android 12L Beta 1 内容一览

今天发布的 Beta 1 版本包含对功能和用户体验的改进,最新的 bug 修复和优化,以及 2021 年 12 月安全补丁。对于开发者来说,谷歌提早完成了 API,因此 Beta 1 还包含 Android 12L 的正式版 API (API 级别 32),更新的构建工具,以及用于测试的系统映像。你可以用这些来测试应用在 Android 12L 的各种功能中的表现。

在 Android 12L 中,谷歌专注于完善大屏幕设备上的用户界面,包括通知、快捷设置、锁屏、概览、主屏幕等等。例如,在 600dp 宽度以上的屏幕里,通知栏、锁屏和其他系统界面会采用全新的双列布局,以充分利用屏幕面积。

△ 双列布局可以显示更多内容,更易于使用

多任务处理也更加强大和直观 —— Android 12L 在大屏幕上提供了一个新的任务栏,让用户可以随时切换到喜爱的应用,或将应用拖放至分屏模式。请记住,在 Android 12 及以后的版本中,用户可以将任何应用以分屏模式启动,无论该应用是否声明为可以调整大小。所以请务必在分屏模式下测试你的应用!

△ 将应用拖放至分屏模式

在分屏模式下测试你的应用

https://developer.android.google.cn/about/versions/12/12L/summary#what-to-test

最后,通过改进兼容模式的视觉效果和稳定性,谷歌为用户带来了更好的黑边模式体验,并帮助应用在默认情况下看起来更好。如果你的应用还没有针对大屏幕进行优化,请测试其在新的黑边模式中的表现:

https://developer.android.google.cn/about/versions/12/12L/summary#what-to-test

更多 API 和工具助力大屏幕构建

谷歌新推出的这些 API 和工具可以在你为大屏幕优化应用时更轻松地为用户打造流畅体验:

适用于大屏幕的 Material 模式 – 新的 Material 设计指南可以帮你在所有尺寸的屏幕上扩展应用界面:

https://m3.material.io/foundations/adaptive-design/overview

支持自适应界面的 Jetpack Compose – Jetpack Compose 可以让你非常轻松地处理不同屏幕尺寸或组件中的界面变化。请通过在 Compose 中构建自适应布局指南了解这方面的基础知识:

https://developer.android.google.cn/jetpack/compose/layouts/adaptive

用于管理用户界面的窗口大小分类 – 窗口大小分类 (Window Size Classes) 是一组按照视窗大小作为分类 (称为 "断点") 的意见性指导,有助于简化设计、开发和测试可调整大小的应用布局。此 API 即将在 Jetpack WindowManager 1.1 中推出。

窗口大小分类

https://developer.android.google.cn/guide/topics/large-screens/support-different-screen-sizes#window_size_classes

WindowManager

https://developer.android.google.cn/jetpack/androidx/releases/window

Activity Embedding – 通过 Activity Embedding API,你可以利用大屏幕上的额外显示区域一次显示多个 Activity,从而实现如 "列表-详情" 的布局模式,并且几乎不需要 (或只需少量) 重构应用。此 API 在 Jetpack WindowManager 1.0 Beta 03 及之后的版本中可用。

Activity Embedding API

https://developer.android.google.cn/guide/topics/large-screens/activity-embedding

WindowManager

https://developer.android.google.cn/jetpack/androidx/releases/window

Android Studio 中的视觉 lint 工具 – 在 Android Studio Chipmunk 中提供了新的视觉 lint 工具,它能在布局验证 (Layout Validation) 中主动给出界面方面的警告和建议,以帮助你识别大屏幕布局中的潜在问题:

https://developer.android.google.cn/studio/preview

可调整尺寸的模拟器 – 这是随 Android Studio Chipmunk 一同推出的全新模拟器配置,让你可以在四个参考设备 (手机、可折叠设备、平板电脑和台式机) 之间快速切换,以便于测试。

请务必查看谷歌准备的大屏幕开发者资源,以了解这些以及更多 API 和工具的详细信息:

https://developer.android.google.cn/about/versions/12/12L#optimize-for-large-screens

在设备上开始体验 Android 12L!

Android 12L 功能更新将在明年初正式发布,现在是时候开始为大屏幕优化自己的应用了。对于开发者来说,谷歌强烈建议检查你的应用在各种尺寸窗口分屏模式下的工作情况。如果你还没有优化应用,请查看一下它在不同屏幕朝向中的视觉效果,并尝试一下新的兼容模式 (如果适用的话)。

想要开始使用大屏幕功能,最简单的方法就是使用 Android 模拟器的可折叠设备或平板电脑设置,请参阅完整设置说明:

https://developer.android.google.cn/about/versions/12/12L/get

你也可以将 Android 12L 刷入大屏幕实体设备中。谷歌与联想合作,让你可以在联想 Tab P12 Pro 上体验 Android 12L 的预览版本。目前,联想提供的是开发者预览版 1,未来几周内会有更新。

Android 12L 也将运行在手机中。虽然大屏幕功能不会出现在小屏幕设备中,但谷歌也欢迎你体验这一功能更新的最新改进。只需用受支持的 Pixel 设备完成注册,就可以通过 OTA 更新获得最新的 Android 12L Beta 版。如果你已经参与 Android 12 Beta 测试,则会自动获得 12L 更新。

最小化Java映像的常见技巧

背景

随着容器技术的普及,越来越多的应用被容器化。人们使用容器的频率越来越高,但常常忽略一个基本但又非常重要的问题 – 容器镜像的体积。本文将介绍精简容器镜像的必要性并以基于 spring boot 的 Java 应用为例描述最小化容器镜像的常用技巧。

精简容器镜像的必要性

精简容器镜像是非常必要的,下面分别从安全性和敏捷性两个角度进行阐释。

安全性

基于安全方面的考虑,将不必要的组件从镜像中移除可以减少攻击面、降低安全风险。虽然 docker 支持用户通过 Seccomp 限制容器内可以执行操作或者使用 AppArmor 为容器配置安全策略,但它们的使用门槛较高,要求用户具备安全领域的专业素养。

敏捷性

精简的容器镜像能提高容器的部署速度。假设某一时刻访问流量激增,您需要通过增加容器副本数以应对突发压力。如果某些宿主机不包含目标镜像,需要先拉取镜像,然后启动容器,这时使用体积较小的镜像能加速这一过程、缩短扩容时间。另外,镜像体积越小,其构建速度也越快,同时还能减少存储和传输的成本。

常用技巧

将一个 java 应用容器化所需的步骤可归纳如下:

  1. 编译 java 源码并生成 jar 包。
  2. 将应用 jar 包和依赖的第三方 jar 包移动到合适的位置。

本章所用的样例是一个基于 spring boot 的 java 应用 spring-boot-docker,所用的未经优化的 dockerfile 如下:

FROM maven:3.5-jdk-8
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
ENTRYPOINT [“java”,”-jar”,”/usr/src/app/target/spring-boot-docker-1.0.0.jar”]

由于应用使用 maven 构建,dockerfile 中指定maven:3.5-jdk-8作为基础镜像,该镜像的大小为 635MB。通过这种方式最终构建出的镜像非常大,达到了 719MB,这是因为一方面基础镜像本身就很大,另一方面 maven 在构建过程中会下载许多用于执行构建任务的 jar 包。

多阶段构建

Java 程序的运行只依赖 JRE,并不需要 maven 或者 JDK 中众多用于编译、调试、运行的工具,因此一个明显的优化方法是将用于编译构建 java 源码的镜像和用于运行 java 应用的镜像分开。为了达到这一目的,在 docker 17.05 版本之前需要用户维护 2 个 dockerfile 文件,这无疑增加了构建的复杂性。好在自 17.05 开始,docker 引入了多阶段构建的概念,它允许用户在一个 dockerfile 中使用多个 From 语句。每个 From 语句可以指定不同的基础镜像并将开启一个全新的构建流程。您可以选择性地将前一阶段的构建产物复制到另一个阶段,从而只将必要的内容保留在最终的镜像里。优化后的 dockerfile 如下:

FROM maven:3.5-jdk-8 AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
FROM openjdk:8-jre
ARG DEPENDENCY=/usr/src/app/target/dependency
COPY –from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY –from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY –from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT [“java”,”-cp”,”app:app/lib/*”,”hello.Application”]

该 dockerfile 选用maven:3.5-jdk-8作为第一阶段的构建镜像,选用openjdk:8-jre作为运行 java 应用的基础镜像并且只拷贝了第一阶段编译好的.claass文件和依赖的第三方 jar 包到最终的镜像里。通过这种方式优化后的镜像大小为 459MB。

使用 distroless 作为基础镜像

虽然通过多阶段构建能减小最终生成的镜像的大小,但 459MB 的体积仍相对过大。经调查发现,这是因为使用的基础镜像openjdk:8-jre体积过大,到达了 443MB,因此下一步的优化方向是减小基础镜像的体积。

Google 开源的项目 distroless 正是为了解决基础镜像体积过大这一问题。Distroless 镜像只包含应用程序及其运行时依赖项,不包含包管理器、shell 以及在标准 Linux 发行版中可以找到的任何其他程序。目前,distroless 为依赖 java、python、nodejs、dotnet 等环境的应用提供了基础镜像。

使用 distroless 的 dockerfile 如下:

FROM maven:3.5-jdk-8 AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
FROM gcr.io/distroless/java
ARG DEPENDENCY=/usr/src/app/target/dependency
COPY –from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY –from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY –from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT [“java”,”-cp”,”app:app/lib/*”,”hello.Application”]

该 dockerfile 和上一版的唯一区别在于将运行阶段依赖的基础镜像由openjdk:8-jre(443 MB)替换成了gcr.io/distroless/java(119 MB)。经过这一优化,最终镜像的大小为 135MB。

使用 distroless 的唯一不便是您无法 attach 到一个正在运行的容器上排查问题,因为镜像中不包含 shell。虽然 distroless 的 debug 镜像提供 busybox shell,但需要用户重新打包镜像、部署容器,对于那些已经基于非 debug 镜像部署的容器无济于事。 但从安全角度来看,无法 attach 容器并不完全是坏事,因为攻击者无法通过 shell 进行攻击。

使用 alpine 作为基础镜像

如果您确实有 attach 容器的需求,又希望最小化镜像的大小,可以选用 alpine 作为基础镜像。Alpine 镜像的特点是体积非常下,基础款镜像的体积仅 4 MB 左右。

使用 alpine 后的 dockerfile 如下:

FROM maven:3.5-jdk-8 AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
FROM openjdk:8-jre-alpine
ARG DEPENDENCY=/usr/src/app/target/dependency
COPY –from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY –from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY –from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT [“java”,”-cp”,”app:app/lib/*”,”hello.Application”]

这里并未直接继承基础款 alpine,而是选用从 alpine 构建出的包含 java 运行时的openjdk:8-jre-alpine(83MB)作为基础镜像。使用该 dockerfile 构建出的镜像体积为 99.2MB,比基于 distroless 的还要小。

执行命令docker exec -ti <container_id> sh可以成功 attach 到运行的容器中。

distroless vs alpine

既然 distroless 和 alpine 都能提供非常小的基础镜像,那么在生产环境中到底应该选择哪一种呢?如果安全性是您的首要考虑因素,建议选用 distroless,因为它唯一可运行的二进制文件就是您打包的应用;如果您更关注镜像的体积,可以选用 alpine。

其他技巧

除了可以通过上述技巧精简镜像外,还有以下方式:

  1. 将 dockerfile 中的多条指令合并成一条,通过减少镜像层数的方式达到精简镜像体积的目的。
  2. 将稳定且体积较大的内容置于镜像下层,将变动频繁且体积较小的内容置于镜像上层。虽然该方式无法直接精简镜像体积,但充分利用了镜像的缓存机制,同样可以达到加快镜像构建和容器部署的目的。

想了解更多优化 dockerfile 的小窍门可参考教程 Best practices for writing Dockerfiles。

总结

  1. 本文通过一系列的优化,将 java 应用的镜像体积由最初的 719MB 缩小到 100MB 左右。如果您的应用依赖其他环境,也可以用类似的原则进行优化。
  2. 针对 java 镜像,google 提供的另一款工具 jib 能为您屏蔽镜像构建过程中的复杂细节,自动构建出精简的 java 镜像。使用它您无须编写 dockerfile,甚至不需要安装 docker。
  3. 对于类似 distroless 这样无法 attach 或者不方便 attach 的容器,建议您将它们的日志中心化存储,以便问题的追踪和排查。具体方法可参考文章面向容器日志的技术实践。

作者:吴波bruce_wu

方舟的手机游戏配置有哪些要求?我的世界:我会站起来让你表演!

尽管在画面表现力上,《方舟》相较于马赛克风格的《我的世界》更为精致一些,但这也成为了它的负担,较高的配置要求令许多普通玩家望而却步。而事实上,对于一款沙盒类生存建造游戏而言,我们更看重于它内容的多样性以及玩法的可创造性,画面也就不再是玩家们的硬性要求了。有趣的是,当所有的游戏削尖了脑袋向高画质靠拢的时候,《我的世界》却以一种返璞归真的方式赢得了玩家们的青睐。

近日,有消息称《方舟》手游即将上线,随后官方在推特中证实此消息,并确定6月14日全球双平台同步上线。

不过令人可惜的是目前仅支持少量手机如华为Mate10、一加等高端旗舰手机,对于手机处理器有一定要求,无形之中提高了游戏的入门门槛,与端游一样,其对设备的配置要求不是那么亲民。

不过抛开这些不谈,就单单游戏而言,《方舟》无疑是一款非常优秀的沙盒生存游戏。

玩家可以在《方舟》所展现给你的世界里,自由地建造、采集、狩猎、种植、驯服,凭借其逼真的画质,令你身临其境,置身于一片原始森林之中,用双手开拓一片属于你的天地,这也是这个游戏的乐趣所在。

我想游戏中最让人激动的,莫过于亲手驯服一头恐龙了,当你驾驭着这些万年前的地球霸主,巡视着自己的领地的时候,自豪感便会油然而生吧。

而此次《方舟》上线移动端,可以说给了更多玩家体验这款游戏的机会。国内下载该游戏还需谷歌三件套,想要玩上还是有点小麻烦的。

《方舟》画质精美,缘何比不过《我的世界》?

正如前文所提到,出色的画面表现力也成为了制约玩家们在《方舟》中的创造力,游戏中太过于具象化的道具造成了功能性的单一,阻碍了游戏的无限可能性;而反观《我的世界》,在这款游戏发布之初,相信许多玩家心理有这样一个疑问,为什么要采用像素风这样一个“返璞归真”的风格?以至于很多人并不看好这款游戏,然而当玩家们细细品味这款游戏之后,才发现像素风正是《我的世界》的魅力所在。

看似平淡无奇甚至有些丑陋的小方块,经过玩家们天马行空的想象力组合拼接之后,奇迹便出现了。

《我的世界》给了玩家们无限的可能性,这也是为什么《方舟》同为沙盒生存游戏稍稍逊色于《我的世界》的原因之一。

另一方面,《方舟》端游一百多的售价再加上较为高的配置要求,使得这款游戏只活跃在小部分玩家视野之中。抛开那些MOD不谈,《我的世界》的配置要求就平民化许多啦~~~

网易代理《我的世界》手游后一片唱衰?《方舟》手游表现能否扳回一局?

比较奇怪的是,自从网易代理《我的世界》之后,无论是端游还是手游,喜爱MC的玩家都表示网易毁了这款游戏。但在我看来,网易代理之后所推出的《我的世界》综合性登录器对于像我这样的轻度玩家是很有利的,我可以很方便的添加一些组建(如果不收费的话……),好友、互联网联机也十分快速,各个游戏版本之间的切换也很方便,不用再担心在联机平台上一样这不匹配那不匹配了。

当然,这也只是我个人的观点而已,纵观大多数玩家们的评价,《我的世界》正处于一个下滑阶段,那么,这次《方舟》手游的上线,能否再掀建造热潮呢?让我们拭目以待!