暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《极客星球》创刊致辞

yBmZlQzJ 2023-12-19
571

Cover

Table of Contents

前言

第 1 章 移动应用开发

使用 ionic 将数据保存到本地存储中

运行时的挂钩 C 函数

在 iOS 开发中使用 TWITTERKIT & DIGITS

用 Go 语言来看 Android! 出发, Android, 出发!

第 2 章 Web 开发

不懂 JavaScript?那你就不是一个 Web 开发者

Angular 与 React 的比拼

现代 Javascript 工具漫游指南

20 个有用的 Angular.js 工具

第 3 章 后端开发

为什么是 Node.js ? 什么时候使用 Node.js ?

第 4 章 大数据及商务智能

理解 Cassandra 压缩储存的作用

从 HDFS 中使用分布式的 MAP REDUCE JOB 写入 CASSANDRA

第 5 章 游戏开发

在游戏开发中获得成功

第 6 章 智能硬件

如何开发一个简单的 Android Wear 应用程序

第 7 章 云计算与安全

玩转 Dcoker:Hello World, 开发环境和你的应用

如何使用安卓密钥库存储密码和其他敏感信息


DevTools 摘要: 处理条带化数据时给条带化数据的一个新家

谷歌加入 OpenStack 基金会的 4 个理由

第 9 章 产品与设计

15个很有用的面向设计师的 UI 和 UX 设计工具及资源

5 个提示助你设计出精妙的 Apple Watch 应用软件

第 10 章 职业规划与加薪

如何成为一个超级软件开发者

前言

《极客星球》创刊致辞

----极客学院创始人 & CTO 姚尚朗(IceskYsl)

2015 年 7 月 30 日,《极客星球》期刊创刊。伴随着首刊的发布,一本专为国内互联网开发人员提供全球最新互联网 IT 技术译文的期刊诞生了。

《极客星球》名称的含义:

极客,《极客星球》期刊是极客学院旗下的 IT 技术类期刊,我们相信,我们的读者都是具有极客精神的优秀开发人员。

星球,我们都生活在这个神奇的星球上,我们相信,通过我们的努力,能够使每一位读者在极客的星球上变得更加与众不同。

《极客星球》期刊要解决的是目前国内开发者的两个痛点:

  1. IT 类文章的时效性
    众所周知,IT 行业的特点是更新速度快,尤其是当下最热门的互联网技术,技术发展更是日新月异。只有最新、最快的技术文章才能够适应互联网的节奏,为读者创造价值。
  2. IT 类文章的全球性
    计算机及互联网技术自诞生以来,以美国为主的西方国家始终引领着计算机技术的发展,国内的文章已经不能完全满足我们技术人员的需求,需要引进国外先进的技术类文章来使我们的技术更加接近甚至超越全球 IT 技术最高水平。

针对这两个痛点,《极客星球》给出了自己的解决方案:

  • 我们选取的所有文章,发表时间均在当期期刊发布日一个月以内
  • 我们只精选国外互联网热门领域的文章并通过我们专业的翻译团队呈现给大家

《极客星球》期刊内容涵盖的互联网技术领域包括:

移动应用开发、Web 开发、后端开发、大数据及商务智能、游戏开发、智能硬件、云计算与安全、产品与设计及职业规划与加薪。

我们希望,从这个起点出发,《极客星球》期刊能走的更远,站在全球 IT 技术前沿的视角,引进更多全球最新 IT 技术知识,与极客学院平台一起服务更多 IT 从业人员,让学习变得更加有效!

PS:《极客星球》与 极客学院 Wiki 的故事:

《极客星球》的诞生离不开极客学院,也离不开极客学院 Wiki,没有 Wiki 的基础,就没有《极客星球》的诞生。

我们从 2015 年 3 月份上线极客学院 Wiki,仅四个月的时间,已经有超过 200 门 IT 图文教程上线。《极客星球》此时的推出,是希望在极客学院 Wiki 系统化学习的基础上,补充时效性更强的 IT 技术类文章, 打造立体式的学习体验。

如果读者在读到某些知识点,希望更深入、更系统的了解与学习,请移步极!

2015 年 7 月 30 日

关于极客学院

极客学院是中国最大的 IT 职业在线教育平台。极客学院的理念是通过最新实战课程,帮助职业开发者系统学习 Android、Cocos2d-x、iOS、HTML5、Java 等⾼薪所需的职业开发技能。⽬前,超过 45 万专业技术开发者通过极客学院学得了更有竞争力的最新 IT 技能。

2014 年,中国几乎所有的热门技术及应⽤用课程,都由极客学院首发。包括:中国第一个 「Flappy Bird」课程、中国第一个「2048」的课程、中国第一个「围住神经猫」等诸多中国乃至全球首发课程。在六月份,WWDC 苹果发布全新的 Swift 开发语言时,极客学院更是 7 个小时就上线了 Swift 的开发课程。

极客学院官

关于极客学院 Wiki

极客学院 Wiki 是集高质量内容、技术分享、作品出版及技术交流为一体的 IT 在线学习与共享的图文平台。采用先进的课程制作工具,以图文教程的方式,将成体系的IT课程带给用户。历经 4 个月的积累,Wiki已经形成了超过 200 门课程,40 多种品类,课程数还在快速攀升,并覆盖了最新、最前沿的技术。所有内容全部免费,并可离线下载,方便IT从业者随时随地进行学习。科学的课程设置体系,也让知识点更加通俗易学。

Wiki 拥有一支专门的运营团队,成员均拥有多年技术社区运营经验,自身也从事技术开发工作,非常了解用户的需求。团队除了翻译国外前沿技术,收集国内开源技术知识,也在签约外部顶尖技术作者,进行内容体系的完善。后续,还将会增加更多创新功能,包括:课程专题、课程推荐、课程搜索、API 在线文档查询以及用户自主贡献内容(UGC)等。

极客学院 Wiki 网

联系我们


1

移动应用开发

使用 ionic 将数据保存到本地存储中

01

图片 1.1 01

文章翻译:周倍同
发表时间:2015 年 7 月 23 日
原文作者:TROY MILES
文章分类:移动应用开发

关于本文

如今越来越多的移动 App 采用 HTML5 的方式来进行开发,同时还有一部分的 Web App 是通过浏览器来访问的,这就使得用户在离线的状态下无法使用 App 。本文要介绍的就是通过使用 ionic 将数据保存到本地中,实现离线存储,这样即使在离线的情况下用户也能正常使用 App。

文章内容

用户希望移动 App 中某些功能能够简单的运行。如果事情不像他们期望的那样的话,用户会删除你的 App,甚至是给你的产品一个差评。用户希望 App 的设置功能(Settings)能够简单好用。无论何时用户在设置界面做出更改,他们希望这些更改能生效并且正确的保存下去。这样当下一次他们启动 App 的时候,就不需要再重新设置一遍了。

让一个使用 ionic 代码库开发的 App 一直正确的执行任务不是一件很难的事情,但是这篇文章能帮你避免开发过程中的一些小麻烦。比如说,我们可以使用 ionic 的侧边菜单启动模板再给它添加一个设置界面(本文中使用的版本是 beta 14 of Ionic)。设置界面没有什么特别的地方,但是实际上 App 的设置能在应用的任何地方保存。设置界面只是提供了一个展示全部设置的地方。下面我们就来看看如何保存被用户改变的值。

我们设置策略的第一部分就是将我们所有的个人设置都保存在 Settings object 中。这是我的一个个人喜好。我的 App 通常都会将 Settings object 中的所有属性顺序化和序列化。任何我想保存一些东西的时候,我就会把它加入到 Settings object 中,系统就会完成剩下的部分。

接下来,我们使用一个 Angular Value object 来保存设置。value(值)是 angular 的提供者,就像工厂、服务、提供者和常量一样。和常量不同的是,values 是可以改变的。所以 value 能让我们很好的保存我们的 settings object ,同时我们输入的值充当默认值。

angular.
module
(
'starter'
)

.
value
(
"Settings"
,

{

searchRadius
:

{
value
:

"5"
}
,

acceptsPushNotification
:

true
,

hasUserSeenMessage
:

false
,

pagesPerLoad
:

20


}
)
;

设置策略的基础是 HTML5 的本地存储。本地存储能让网页应用以基于键值对的方式通过字符串来存储数据。如果你还对我们如何存储各种类型的包括字符串在内的数据有疑问的话,不用再多想了。我们选择将所有数据保存在单个对象中的理由是我们能通过使用 JSON 实现单个对象与字符串之间的相互转换。

文件 localstorage-service.js 中只有两种方法在 services API 中。第一个是 serializeSettings,另外一个是 deserializeSettings。两者分别实现的功能和名字的描述一样。在 Local Storage 和 checkLocalStorage 中同样有一个内部唯一的方法。这个方法只用于诊断,因为它只用来将设备有本地存储的位置写入控制台。

Local Storage 做的最后一件事就是在启动的过程中调用 deserializeSettings,并赋予 settings object 上一次存储的值。如何没有任何保存的值,那么就使用存储在 value 中的 Settings object。另外一个需要解释的点就是为什么我们在使用 angular extend 时要复制属性而不是简单的将整个对象拷贝过来。如果我们曾经修改过整个 angular value object,它就会变回到默认值,做出的更改也就失效了。我们可以选择写一个函数来复制这些属性,但是 angular extend 拷贝属性的方式正是我们需要的。

function
deserializeSettings
(
)

{


var
newSettings
,
rawSettings
=
localStorage
[
settings
]
;


if
(
rawSettings
)

{

newSettings
=
JSON.
parse
(
rawSettings
)
;


if

(
newSettings
)

{


// use extend since it copies one property at a time

angular.
extend
(
Settings
,
newSettings
)
;

console.
log
(
"Settings restore"
)
;


}


}

}

在 Settings controller 中,我们将 Settings object 中的 values 与界面中的 widget 绑定在一起。将 $scope object 和 Settings object 的属性取成相同名字,会让更新属性值变得更容易,如果我们使用 JavaScript 括号表示法来访问对象的话,我们就能同时访问 $scope object 和 Settings object。当任何一个 widget 的 value 发生改变的时候,onChange 方法就会被调用,然后我们就可以用到之前提到的方法同时访问两个对象。

if

(
!
Settings.
hasUserSeenMessage
)

{

Settings.
hasUserSeenMessage

=

true
;

LocalStorageService.
serializeSettings
(
)
;

$ionicPopup.
alert
(
{

title
:

'Hi There'
,

template
:

'<div class="text-center">You are a first time user.</div>'


}
)
;

}

 
// set the initial values for the widgets

$scope.
searchRadius

=
Settings.
searchRadius
;

$scope.
acceptPush

=
Settings.
acceptPush
;

 
// when a widget is changed, come here and update the setting object too

$scope.
onChange

=

function

(
type
,
value
)

{

$scope
[
type
]

=
value
;

Settings
[
type
]

=
value
;

LocalStorageService.
serializeSettings
(
)
;

}
;

我们也演示了如何系统的保存变量。在代码中,hasUserSeenMessage 属性会被检查。如果用户没有看见我们发送的一次性消息,我们就会将 value 设为 true,将 value 保存在本地存储中,然后再次显示消息。任何时候你想要保存设置,只要调用 LocalStorageService.serializeSettings 就行了。


运行时的挂钩 C 函数

文章翻译:邵凯阳
发表时间:2015 年 7 月 27 日
原文作者:Thomas Finch
文章分类:移动应用开发

关于文本

钩子(Hook)是 Windows 消息处理机制的一个平台,该技术可以实现对消息的监视,具有很强大的功能。本文就是基于钩子的主要功能实现钩子在 C 中的应用,主要介绍了运行时挂钩 C 函数的基本步骤、相关代码和一些局限性。

文章内容

这是一份我最近尝试的关于在 C 中运行时函数挂钩的快速记录。对于钩入一个函数最基本的思想是用您自己的代码替换函数的代码,所以在调用该函数时,您的代码将被执行。运行时挂钩允许您在被执行的程序没有自己的代码或者没有以任何方式对其文件进行实际修改的时候更改程序的运行方式。运行时函数挂钩并不少见,并且用于 iOS 越狱调整(通过 Cydia SubstrateSubstitute 平台提供技术支持)以及 Xposed 框架 在 Android 程序中的使用。

如果您想在您自己的计算机上了解这篇文章,您需要使用 Xcode 和 Xcode 命令行工具安装的 Mac。这些代码能够在 Github 上找到。

示例程序

//testProgram.c


#include <stdio.h>

 
int
hookTargetFunction
(
)

{


printf
(
"Calling original function!
\n
"
)
;


return

5
;

}

 
int
main
(
)

{


printf
(
"The number is: %d
\n
"
,
hookTargetFunction
(
)
)
;


return

0
;

}

编译和运行该程序可以得到下面的输出:

Calling original function!
The number is: 5

我们的目标是钩入 hookTargetFunction
这个函数并且更改该函数的返回值,使返回值不再是 5。

挂钩目标函数

我们挂钩目标函数的方法是通过创建一个动态库,当程序运行时加载它。这个动态库的构造函数会在 main
函数的目标可执行文件前执行,所以我们就可以在目标可执行文件运行之前在内存中修改它。若要运行我们替换的代码,我们需要在挂钩函数的开头插入跳转指令的机器代码。换句话说,当计算机尝试运行目标函数时,他将跳转到我们替换函数所在的位置并运行我们的代码。

这个过程的第一步就是创建包含一个构造函数和一个替换函数的动态库。

//inject.c


#include <stdio.h>

 
int
hookReplacementFunction
(
)

{


printf
(
"Calling replacement function!
\n
"
)
;


return

3
;

}

 
__attribute__
(
(
constructor
)
)

static

void
ctor
(
void
)

{


printf
(
"Dylib constructor called!
\n
"
)
;

}

当他使用了 DYLD_INSERT_LIBRARIES
环境变量的目标程序被编译和加载后,我们能够看到他的构造函数在主程序之前被执行。

$ ls
inject.c testProgram testProgram.c
$ clang -dynamiclib inject.c -o inject.dylib
$ DYLD_INSERT_LIBRARIES=inject.dylib ./testProgram
Dylib constructor called!
Calling original function!
The number is: 5

为了钩入目标函数,现在我们可以开始向构造函数中添加代码。由于 x86 跳转指令使用相对寻址,所以我们不能简单的在内存中给计算机一个地址让其跳转。首先,我们需要从目标函数中找到替换函数的抵消函数,这些可以通过获得进入每个函数的指针,然后从另一个指针中减去一个函数的指针。

void

*
mainProgramHandle
=
dlopen
(
NULL
,
RTLD_NOW
)
;

int64_t

*
origFunc
=
dlsym
(
mainProgramHandle
,

"hookTargetFunction"
)
;

int64_t

*
newFunc
=

(
int64_t
*
)
&
hookReplacementFunction
;

int32_t
offset
=

(
int64_t
)
newFunc
-

(
(
int64_t
)
origFunc
+

5

*

sizeof
(
char
)
)
;

在这个示例代码中有一些值得关注的事情。首先是使用 dlopen
来获得进入目标可执行文件的指针。dlopen
通常被用来加载共享库,但是 根据其文档,如果传递 NULL 作为文件名,它也可以用于访问主可执行文件。其次应该注意的是,跳转的偏移量实际采取的是下一条指令的地址,在这种情况下目标函数将增加 5 bytes,因为插入跳转指令的大小为 5 bytes。

在这篇文章中我省略了一小步,那就是使目标函数所在的内存是可写的,因为处于安全的考虑,在默认情况下内存仅仅是可读的和可执行的。一旦这些被完成,最后一步就是创建和插入跳转指令。x86 操作码是 E9,他与立即数偏移寻址一起是无条件跳转,因此我们将这作为指令的第一个字节,紧跟的是偏移。

int64_t
instruction
=

0xE9

|
offset
<<

8
;

*
origFunc
=
instruction
;

这里是完成的 inject.c
文件:


#include <stdio.h>


#include <dlfcn.h>


#include <stdint.h>


#include <sys/mman.h>


#include <unistd.h>

 
int
hookReplacementFunction
(
)

{


printf
(
"Calling replacement function!
\n
"
)
;


return

3
;

}

 
__attribute__
(
(
constructor
)
)

static

void
ctor
(
void
)

{


//Get pointers to the original and new functions and calculate the jump offset


void

*
mainProgramHandle
=
dlopen
(
NULL
,
RTLD_NOW
)
;


int64_t

*
origFunc
=
dlsym
(
mainProgramHandle
,

"hookTargetFunction"
)
;


int64_t

*
newFunc
=

(
int64_t
*
)
&
hookReplacementFunction
;


int32_t
offset
=

(
int64_t
)
newFunc
-

(
(
int64_t
)
origFunc
+

5

*

sizeof
(
char
)
)
;

 

//Make the memory containing the original funcion writable




size_t
pageSize
=
sysconf
(
_SC_PAGESIZE
)
;


uintptr_t
start
=

(
uintptr_t
)
origFunc
;


uintptr_t
end
=
start
+

1
;


uintptr_t
pageStart
=
start
&

-
pageSize
;

mprotect
(
(
void

*
)
pageStart
,
end
-
pageStart
,
PROT_READ
|
PROT_WRITE
|
PROT_EXEC
)
;

 

//Insert the jump instruction at the beginning of the original function


int64_t
instruction
=

0xe9

|
offset
<<

8
;


*
origFunc
=
instruction
;

}

当他编译和执行完后,他确实改变了主程序的输出!

$ ls
inject.
c
testProgram testProgram.
c

$ .
/
testProgram
Calling original
function
!

The number is
:

5

$ clang
-
dynamiclib inject.
c

-
o inject.
dylib

$ DYLD_INSERT_LIBRARIES
=
inject.
dylib
.
/
testProgram
Calling replacement
function
!

The number is
:

3

这里是另外一个执行过程和一些调试输出,显示了跳转指令插入目标函数的开始:

$ DYLD_INSERT_LIBRARIES
=
inject.
dylib
.
/
testProgram
Original
function
address
:

0x1078abee0

Replacement
function
address
:

0x1078b4c40

Offset
:

0x8d5b

Before replacement
:

*
(
origFunc
+
0
)
:

554889e5

*
(
origFunc
+
4
)
:
488d3d73
*
(
origFunc
+
8
)
:
00e84c00
*
(
origFunc
+
12
)
:

00000089

After replacement
:

*
(
origFunc
+
0
)
:
e95b8d00
*
(
origFunc
+
4
)
:
488d3d73
*
(
origFunc
+
8
)
:
00e84c00
*
(
origFunc
+
12
)
:

00000089

Calling replacement
function
!

The number is
:

3

局限性

挂钩这种方法的一个局限性是他要求目标函数至少是 5 bytes,用于插入跳转指令。这看起来似乎是一个愚蠢的限制,但创建这样小的函数也肯定是可能的(例如,只有单字节大小的 ret
指令)。我想不出解决这一问题的方式,毕竟对单字节进行操作时很艰难的。最直截了当的解决方法就是不挂钩小于 5 bytes的指令。

我遇到的另外一个问题是让这些代码运行在 Linux 上。出于某些原因,Linux 始终在一个高地址加载动态库,地址如此之高以至于偏移量溢出了可用的 32 bits。我不认为这是可以修复的,尽管也使用了跳转指令,因为偏移量的最大尺寸是 32 bits。但是,这个函数能够被挂钩通过另外一种方法——例如,将替换函数的地址压入堆栈,然后通过 ret
指令跳转到改地址。这种方法将会比简单的跳转花费更多的空间,但是这是我现在仅能想到的方法。

我希望您能够喜欢这篇文章!再一次,自由下载并且在您自己的计算机上测试这些代码。当您自己动手尝试时,您会体会到更多的乐趣!


01

图片 1.2 01

文章翻译 :周倍同 发表时间:2015 年 7 月 20 日 原文作者:DORON KATZ 文章分类:移动应用开发

关于本文

相信大家都或多或少的通过 QQ 账号登录过网站或者 App,现在 Twitter 账号也能实现相同的功能了。Twitter 为开发者提供 TWITTERKIT 和 DIGITS ,让用户使用他们的服务,简化用户登录的步骤,在很大程度上能增加网站的转化率,同时还能更加有效的防止账号泄露。本文中将会介绍到如何使用 TWITTERKIT & DIGITS 实现通过 Twitter 账号登录。

文章内容

什么是 TwitterKit & Digits?

在本文中,我们会接触到 Twitter 在今年早些时候发布的新的登录 API,TwitterKit 和 Digits,封装为 Fabric 这以整套开发套件的一部分,同样也为你提供了两段简短的代码让你能在你的 iOS App 中引入 Twitter 的登录机制。

developing-twitterkit-digits-ios-1.png

Facebook 和 Google 通过他们在 iOS 开发中的 SDK 或者 Accounts.framework 在一段时间内统治了单点登录范式,鼓励开发者们为他们的用户提供一种统一的登录样式。Twitter 最终决定登上这辆顺风车并通过增加增加登录参与和提供一种更加准确的方式让用户无需记住个人密码就能登录自己喜爱的 App 来提升自己的品牌。

通过允许用户通过 Twitter 账号登录,开发者会获得用户的 Twitter 信息和发布的推文以及人际关系。只要 Twitter 账号得到确认,App 就能通过账号、接触用户的推文记录或者联想一些特定的关键字或标签让用户更好的参与进来。

除了提供单点登录,Twitter 同样也提供了 Digits,允许用户通过使用电话号码实现匿名登录,与 Facebook 新的匿名登录 API 有异曲同工之处。

developing-twitterkit-digits-ios-2.png

使用 Digit 的好处

Digits 的基本原理是用户相信你的 App 或者网站,并提供他们的 Twitter 账号信息用于登录。对于那些想要保护自己的社交隐私的用户来说,还有另外一个选择,就是提供一个独一无二的号码,通常是手机号,作为身份验证。

developing-twitterkit-digits-ios-3.png

对用户来说另一个好处就是登录和注册变得非常简单,而不需要填写一些非常麻烦的身份验证问题,你只需要从用户那里获得他们收到的作为身份验证确认短信的验证码,就能允许他们登录了。

接下来就简短的介绍一下 TwitterKit 和 Digits 以及如何使用他们。

通过 TwitterKit 登录

Twitter 想要让他们的验证机制对开发者来说更加简单有效、更具吸引力,事实上他们正是这么做的。通过使用 SDK 作为 Twitter 的 Fabric 开发套件的一部分,你需要将你的 Twitter App 准备就绪,为了使用提供的 SDK 而注册。TwitterKit 目的是使用 Accounts.framework 对 iOS 上存在的 Twitter 账号施加影响。Accounts.framework 是使用比较广泛的一个基础框架,作为替代可以使用 OAuth 机制。

使用 Twitter 验证登录的最简单的方法就通过创建的按钮,TWTRLogInButton,下面我们就通过使用 iOS 的 Swift 语言来试一下。

let authenticationButton = TWTRLogInButton(logInCompletion:
{ (session, error) in
if (session != nil) {
//We signed in, storing session in session object.
} else {
//we get an error, accessible from error object
}
})

整段代码非常简单,创建了一个 TWTRLoginButton 子类,可以增加你的视图层次,实现与用户之间的交互。

通过 Digits 登录

上面我们使用 TwitterKit 创建了一个登陆按钮,接下来我们就用 Digits 来完成同样的功能。Digits 使用起来也是非常简单,下面我们再次通过一个简单的方法创建按钮,DGTAuthenticateButton。

let authenticationButton = TWTRLogInButton(logInCompletion:
{ (session, error) in
if (session != nil) {
//We signed in, storing session in session object.
} else {
//we get an error, accessible from error object
}
})

总结

使用 TwitterKit 和 Digits 开发 iOS 都非常直截了当,虽然意图不同。TwitterKit 允许开发者有全部的权限接触到用户的历史记录,Digits 则相对来说比较受限,能更好的保护用户的账号隐私。

如果用户相信你的 App 并且很放心的把他/她的历史记录权限提供给你的话,你可以选择在之后的 App 运行中使用它们。关于使用 TwitterKit 和 Digits 的完整的 iOS 参考资料在这里

TwitterKit 是否能被广泛的接受和使用还有待观察,但另一方面,TwitterKit 能为开发者提供更多的选择,包括 Facebook 和 Google+ 的登录机制在内,用户可以选择他们比较相信的社交媒体账号作为自己的登录验证。

提供一种匿名登录方式的意图正好与如今世界对隐私的重视相契合,Digits 无疑提供了一种不会造成信息泄露的登录方式,用户能直接的使用自己的电话号码进行登录。

上文中我们简短的演示了一下如何通过 iOS 的开发语言 Swift 来使用 Twitter 的 SDK,除此之外还有 Android 的 SDK 版本。据 Twitter 公布,网页版的 SDK 正在准备当中。

总的来说,TwitterKit 和 Digits 是很值得慢慢去探索的,同样的还有 Fabric 开发套件中提供的其他工具,包括 analytics 和 beta-distribution 工具等等。

更多IT技术干货: wiki.jikexueyuan.com
加入极客星球翻译团队: http://wiki.jikexueyuan.com/project/wiki-editors-guidelines/translators.html

版权声明:
本译文仅用于学习和交流目的。非商业转载请注明译者、出处,并保留文章在极客学院的完整链接
商业合作请联系 wiki@jikexueyuan.com
原文地址:https://www.packtpub.com/books/content/developing-twitterkit-digits-ios

用 Go 语言来看 Android! 出发, Android, 出发!

01

图片 1.6 01

文章翻译:王韬懿
发表时间:2015 年 7 月 23 日
原文作者:Chester
文章分类:移动应用开发

关于本文

如今移动开发虽然三分天下,但主要市场还是 Android 和 IOS ,但是对于一些中小型公司来说单独开发的成本明显比较大。2014 年苹果推出了全新的语言 Swift ,而作为对头的 Google 也有一门自己独特的语言,那就是 Go 语言,Go 语言不仅能用来进行 Android 开发,而且也正在适配 IOS 平台,下面让我们来入个门吧。

文章内容

随着 Go 1.5 的即将发布,在 Android 和 IOS 上编译 Go 语言的代码正在被引进。你既可以完全用 Go 语言来写你的应用并用 opengl 来做 UI 界面,也可以写一个可以和原生的 Android 和 IOS 交互的 Go 类库。这为跨平台类库打开了大门,这让我激动不已。Google 为了确保用 Go 语言写出来的 apps 不会被 apple store 拒之门外而做了很多跑腿儿活,比如Ivy

入门指南

让我们开始吧,首先你必须安装一个可运行的 go 1.5. 你可以从源代码编译或者使用一个之前编译好的版本。我在写这篇博客的时候在一台 Linux 机器上使用的是 的 go 1.5 beta2. 我注意到在 Windows 上面使用的时候在 Go 语言源代码里面会有一些警告信息,因此如果你正在使用 Windows 开发,这可能不会起作用。

一旦你要安装 Go 语言,你可以通过下面的命令行来安装:

go
get golang
.
org
/
x
/
mobile
/
cmd
/
gomobile
gomobile init

Android 平台:你需要安装 Android sdk 并且确保你的 adb 在你的环境变量里面,并且你的设备要能够使用 adb 调试。

IOS 平台:很不幸的是 IOS 并不是 100% 适配,因此可能不会有作用。通常在 IOS 上编译你需要安装 xcode 并写使用 OSX 系统。

安装一个示例

让我们看看可不可以编译并且安装一些 go 语言的代码。Google 已经提供了一些我们可以使用的例子 。为了简便起见我这里只安装 android 版本(主要原因是因为我没有 IOS 设备)。

接下来的命令就会安装示例应用:

gomobile install golang
.
org
/
x
/
mobile
/
example
/
basic
gomobile install golang
.
org
/
x
/
mobile
/
example
/
audio
gomobile install golang
.
org
/
x
/
mobile
/
example
/
sprite

虽然看起来不多,但是我觉得这相当酷。上面的应用使用纯 go 语言写的,并且使用 opengl 来做渲染。目前还有一些 api 限制,但是我相信不久就会改善。

分析跨平台开发的应用

好,我们可以编译他人的代码,但是它在干什么?让我们看看在这个基本的示例应用里面发生了什么。

//excerpt from golang.org/x/mobile/example/basic

func
main
()

{

app
.
Main
(
func
(
a app
.
App
)

{


var
c config
.
Event

for
e
:=

range
a
.
Events
()

{


switch
e
:=
app
.
Filter
(
e
)
.
(
type
)

{


更多信息请访问 book_view.png

http://wiki.jikexueyuan.com/project/wiki-journal-201507-1/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论