2009年3月11日星期三

赫尔辛基 (Helsinki) 一日游杂记

从Tallinn去了Helsinki两次, 写这个杂记全当记录一下自己的经历.

为什么去Helsinki? 嗯, 好问题, 但是为什么不去呢? 一个距离塔林只有80多公里的航海行程的城市, 可能会是一个很不同于塔林的城市(或者很类似, 但是不去怎么知道呢?); 波罗的海虽然不大, 但是或者在其中航行也会是一个不错的体验呢 :D. OK, 那么就让我们开始计划吧:

* 时间
千万, 千万不要选择周日去, 如果你不想看到一个空旷(特别是冬天)的城市的话. 据闻芬兰(或者赫尔辛基)的法律规定在教堂做礼拜的时候, 商场不能营业. 当然, 有得必有失: 你可以在教堂看到做礼拜 :) 只是缺少了港口集市的赫尔辛基似乎少了些啥.

* 交通工具
乘船自然是非常经济的方式了 :) Viking Line 是不错的选择, 你可以在塔林的码头买到票, 不需要提前太多订票, 前一天就可以了. 往返会便宜不少, 而如果定同一天往返的会更加便宜: 往返票花了200 EEK (约合133 RMB). 买好了票那么就好好准备2.5小时的航程 :D

小Tip: 最好带好护照去买票, 当然, 如果没有护照, 也可以提供姓名和出生日期即可. 不过最后也不会做任何检查 (至少我们没有碰上).


* 准备
2.5小时的航程的确不用准备什么, 不过有一些简单的知识要了解一下:
  1. 在赫尔辛基消费是使用EUR, 欧元的, 所以可以准备一些EUR现金
  2. 船上可以使用EEK, 也可以EUR

* 安排在赫尔辛基的行程
如果是一天的行程, 那么一个好的行程安排可以省事不少. 个人推荐:
  1. 芬兰堡: 在市区东南方向, 航程为15分钟的一个小岛, 以前是一个军事基地. 在码头就可以是使用自助的机器购船票, 3.8 EUR 往返.
  2. 赫尔辛基大教堂: 可以算是地标型的人文建筑了
  3. 岩石教堂: 可以算是最有特色的教堂了, 必须去看看:D
  4. 东正大教堂: 嗯, 还是教堂:P
  5. 赫尔辛基火车站: 具有一百多年历史的火车站
  6. Hietaniemi cemetery: 国家公墓, 纪念曾经为国家奋斗的烈士们
  7. Sibelius Academy: 让·西贝柳斯纪念碑, 他本人出现在了芬兰的钞票上 (当时还有芬兰本地货币)
当然还有不少博物馆之类的, 不过都需要不错的英语知识才能很快地了解. 本人英文有限, 加上时间有限, 就不参与了. 不过很多博物馆的建筑也都很有意思, 可以去看看. 不得不说, 这是个非常简单的旅行Tips, 特别是对于一个10多个小时的行程而言.


* 在赫尔辛基
抵达赫尔辛基后, 除了沿路去码头的观光外, 最好尽早在码头/大教堂附近的旅游中心(Tourist Information Office)去找到免费的城市地图和旅游指南, 以上的推荐项目都在旅游指南之中, 而所需要做的就是根据自己的观光计划安排好路线和时间计划 :D

对了, 观光之外, 也不要忘记在市区的Shopping Mall或者小店逛逛, 说不定有什么意外的发现, 这也是旅游的乐趣之一; 还有就是别忘记坐下来, 安静地享受咖啡, 阳光, 享受片刻宁静的心情~~~

嗯, 还有什么呢? 对于吃/购物/旅馆/娱乐 等都没有太多了解, 只能看官自行发掘了:P

还有就是一些小的Tips:
  1. 免费的自行车: 据闻, 花2EUR就可以有免费的自行车, 最后在还车处可以退还那2EUR. 我曾经在夏天时见过, 但是冬天却没有看到. 全市有很多这样的自行车自助服务点, 但是还是得说: 限量供应 :D (反正我是没有享用过...)
  2. 鉴于主要的观光地点都在市区, 而西贝柳斯纪念碑(在市区西北角)算是最远的一个观光点了, 所以建议: 上午抵达后先去芬兰堡 (整个行程2小时左右, 最后计划好回城的时间以及观光的进程, 因为渡轮不是什么时候都有的), 回市区吃午饭, 然后乘车前往西贝柳斯纪念碑, 然后往市区进发, 途径岩石教堂, 国家公墓, 国家博物馆等等 :D 至于大教堂 / 码头集市 / 东正教堂 / 火车站, 距离都很近, 且都在市区中心, 所以先去, 抑或回来再去都可以.
  3. 夜景也是不错的, 不过如果夏天去的话, 就估计赶不上夜景就得回塔林了

2008年8月26日星期二

note: security validation in perl

今天同事碰到一个奇怪的问题, 在debian/etch 下restart/stop/start postgresql-8.1 时无法成功:
Restarting PostgreSQL 8.1 database server: main* Insecure directory in $ENV{PATH} while running with -T switch at /usr/bin/pg_ctlcluster line 352.
Insecure directory in $ENV{PATH} while running with -T switch at /usr/bin/pg_ctlcluster line 360.(does not shutdown gracefully, now stopping immediately)
failed!
首先是以为postgresql出了问题, 所以在google中寻找有postgresql关键字的信息, 没有太多有用内容, 只找到了
http://archives.postgresql.org/pgsql-admin/2006-10/msg00219.php


提议将/usr/bin/pg_ctlcluster 中第一行的 "#!/usr/bin/perl -wT" 改成 "#!/usr/bin/perl -wt", 但是这个建议显然非常hacky, 根据 (不熟悉perl :( ):

http://www252.pair.com/comdog/mastering_perl/Chapters/03.taint-checking.html

现在看来肯定是$ENV{PATH}存在安全隐患, 而根据'perlsec' page (i.e. Perl security help):

For "Insecure $ENV{PATH}" messages, you need to set $ENV{'PATH'} to a known value, and each directory in the path must be non-writable by others than its owner and group.
看来这个问题就来源与可能有人修改了环境变量PATH中对应目录列表的权限, 果不其然, /usr/local/bin被修改:
drwxrwxrwx 2 root staff 4.0K 2007-12-25 16:43 bin
drwxrwxrwx 2 root staff 4.0K 2007-12-25 16:43 etc
drwxrwxrwx 2 root staff 4.0K 2007-12-25 16:43 games
drwxrwxrwx 2 root staff 4.0K 2007-12-25 16:43 include
drwxrwxrwx 5 root staff 4.0K 2008-08-25 13:57 lib
drwxrwxrwx 5 root staff 4.0K 2008-08-01 13:43 lps-3.1
lrwxrwxrwx 1 root staff 9 2007-12-25 16:43 man -> share/man
drwxrwxrwx 2 root staff 4.0K 2007-12-25 16:43 sbin
drwxrwxrwx 8 root staff 4.0K 2008-08-25 13:58 share
drwxrwxrwx 2 root staff 4.0K 2007-12-25 16:43 src
如此的安全隐患检查的确很有意思 :P

2008年7月1日星期二

Shortcut Keys

In Mac's text input area, for example Safari's location bar, Text editor etc.,
even some of them work well in Terminal input:

Ctrl + D: delete the next character
Ctrl + A : Go to the beginning of the line you are currently typing on
Ctrl + E : Go to the end of the line you are currently typing on
Ctrl + H : Same as backspace.
Ctrl + Y : to paste it (as in delete and copy) all text in front of the cursor.
Ctrl + U : Clears the line before the cursor position. If you are at the end of the line, clears the entire line.
Ctrl + K : Clear the line after the cursor.
Ctrl + Y: paste the the last line deleted with Control-K
Ctrl + T : Swap the last two characters before the cursor.
Esc + T : Swap the last two words before the cursor.

Linux shell shortcut keys or in the Terminal.app in OS X:

Ctrl + R : Let you search through previously used commands.
Ctrl + D : exit a terminal, same as typing `exit`
Ctrl + L : clears the screen, same as `clear`
Ctrl + W : Delete the word before the cursor.
Ctrl + C : breaks/cancels an ongoing operation
Ctrl + Z : pauses (stops) an ongoing operation. Type `fg` (foreground) to resume it or `bg` (background) to continue the process in the background
Alt + F : Move cursor forward one word on the current line. (have no idea how to make it work in Mac)
Alt + B : Move cursor backward one word on the current line. (have no idea how to make it work in Mac)

Option-G: will move the cursor back one word (ONLY for Mac, and does not work in "screen")
Option-F: will move it forward one word. (ONLY for Mac, and does not work in "screen")

2007年10月16日星期二

SSH tips - configuring ~/.ssh/config to make your ssh command shorter

  有时候在家工作, 而我平时在办公室的工作环境是一台服务器, 所以在家时就需要以公司网关服务器做一些端口映射到我工作的服务器上. 但是经常敲一大串ssh command的确很烦恼, 所以就尝试着配置一下~/.ssh/config文件, 示例如下

Host gateway.com
Hostname gateway.company.com
User jacky
#forwarding of the authentication agent connection
ForwardAgent yes
GatewayPorts yes
#local ports forwarding for working servers
LocalForward localhost:9079 forge:9079
LocalForward localhost:9060 forge:9060
LocalForward localhost:9078 forge:9078
LocalForward localhost:9099 forge:9099
LocalForward localhost:9090 forge:9090
# local ports forwarding for vnc server
LocalForward localhost:5900 jacky:5900


(PS) Mac OS X Directory Structure explained

pasted from: http://osxdaily.com/2007/03/30/mac-os-x-directory-structure-explained/

If you have ever looked at your Mac’s root directory and wondered what some of those other directories are for, you’re probably not alone. Mac OS got a whole lot more complex with the advent of OS X, adapting a unix file structure that is largely unfamiliar to Mac OS 9 and Windows users. So just what is /System, /Library, /usr, and all the others for anyway? Here’s a brief explanation of each directory as found in Mac OS X.


By default, if you look in the root of your Mac’s hard disk you’ll see some unfamiliar sounding directories. From the command line, you will see even more if you type ls /. Explained in no particular order:

Directory Description
/Applications Self explanatory, this is where your Mac’s applications are kept
/Developer The Developer directory appears only if you have installed Apple’s Developer Tools, and no surprise, contains developer related tools, documentation, and files.
/Library Shared libraries, files necessary for the operating system to function properly, including settings, preferences, and other necessities (note: you also have a Libraries folder in your home directory, which holds files specific to that user).
/Network largely self explanatory, network related devices, servers, libraries, etc
/System System related files, libraries, preferences, critical for the proper function of Mac OS X
/Users All user accounts on the machine and their accompanying unique files, settings, etc. Much like /home in Linux
/Volumes Mounted devices and volumes, either virtual or real, such as hard disks, CD’s, DVD’s, DMG mounts, etc
/ Root directory, present on virtually all UNIX based file systems. Parent directory of all other files
/bin Essential common binaries, holds files and programs needed to boot the operating system and run properly
/etc Machine local system configuration, holds administrative, configuration, and other system files
/dev Device files, all files that represent peripheral devices including keyboards, mice, trackpads, etc
/usr Second major hierarchy, includes subdirectories that contain information, configuration files, and other essentials used by the operating system
/sbin Essential system binaries, contains utilities for system administration
/tmp Temporary files, caches, etc
/var Variable data, contains files whose contents change as the operating system runs

If we forgot anything, or if something isn’t properly described, feel free to chime in with comments.

2007年8月13日星期一

"爱国"的百度


  因为工作缘故, 来到了爱沙尼亚出差. 当发现这里访问youtube很方便后, 便常常上去看看. 看过几个Linkin Park的MV后, 突然有点喜欢这个乐队了, 特别是那首what I've done的MV. 结果就习惯性地去了百度打算下载些mp3来听, 结果确发现了个意外的现象, 无论任何搜索都是得到如下的结果:

  只是觉得很奇怪, 为什么让百度如此聚集人气的服务为什么突然不行了. 所以试着从国内我在公司的台机上试试看, 结果发现:
  从某个角度来看, 如此的百度与google.cn有异曲同工之妙, 不同的是, 百度是更'民族的', 更'爱国的'.

2007年7月22日星期日

Linux 技术杂记 1

1) Ubuntu 中如何启动vncserver (reference https://help.ubuntu.com/community/VNCOverSSH)
曾经写过一篇关于如何在debian/sarge中配置vncserver来建立kde测试环境 (因项目需要)的杂记, 不过经过验证, 发现在ubuntu/edgy中已经不管用了 :( .
不过现在的vncserver已经变得很容易使用了. 参考上面的链接, 我很容易地使得vncserver又开始正常工作了
* 删除 $HOME/.vncrc 文件
* 在terminal中执行vncserver :1, 就会发现它会自动建立一个$HOME/.vnc/xstartup文件, 其中的默认脚本内容是:
#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
x-window-manager &

你只要将最后一行的"x-window-manager &"用你所需要的windows manager startup command 替换就可以了: startkde &  /  startxfce4 & / gnome-session & / metacity & 等等.


2) 让Firefox支持ed2k://链接 (reference http://www.amule.org/wiki/index.php/Ed2k_links_handling)
* 在地址栏中输入 about:config, 打开firefox的配置脚本
* 在配置列表中点击右键, 选择新增一个配置项: 类型: Boolean; 名称: network.protocol-handler.external.ed2k; 参数值: true
* 再新增另一个配置项: 类型: String; 名称: network.protocol-handler.app.ed2k; 参数值: /path/to/ed2k (ed2k命令的绝对路径, 例如在ubuntu/edgy中是 /usr/bin/ed2k)
这样, 点击ed2k链接, 就会自动在amule中下载了.
ps: 在ubuntu/debian中, 需要安装amule-utils包.

2007年7月10日星期二

Europython之旅杂记2

终于没有办法继续睡下去了, 于是我在本地时间凌晨6:30爬了起来: 只睡了5个小时. 看来倒时差还真是有点辛苦啊, 想到回去估计也得小倒一下, 顿时有点无奈. 想象一下那些空中飞人们, 肯定也是很不容易啊. 我住的房间在Reval Hotel Lietuva宾馆的19层, 而很明显的是城市没有什么高层建筑, 所以举目望去, 有点高屋建瓴之势, 就可以看到城市的概况: 有一条河在宾馆的南边, 河水缓缓地流着, 再往南, 就是老城区. 不同于河北边的中高层现代建筑, 老城区大多是6层左右的老式风格的建筑, 伴随着很多的绿树, 很是恬静的感觉. 相比旧式的建筑, 非常引人注意的是很多的教堂. 你可以很容易辨认出来是因为那些高高的十字架. (事实的确如此, 在宾馆提供的城区地图上, 可以看到很多教堂的标志).

早饭自然是西餐, 可以预见的是, 接下来几天都是西餐 (真是废话 :-)). 在餐厅我遇到了Tobias. Nordicbet就来了他一个人, 还是凌晨时间到的旅馆. Europython会议也将在这个宾馆举行, 而主要的会议聚集地就在餐厅外的大堂里面. 在会议的注册处看到了Laura Creighton(Europython President) 和 Aiste Kesminaite, 是她们的帮忙才让我的签证能顺利通过, 虽然经过了诸多波折. 领取了一份会议安排日程, 发现整个会议安排了很多的演讲, 基本上是半个小时一场, 在若干个会议场同时进行, 中午会有些简短的用餐和1个小时左右的休息时间.

九点一到, 就见python-er们各自去冲自己喜欢的演讲的会议室奔去, 而每半个小时后就会有许多人来回的穿梭, 往返于四个会议室之间. 也有些人可能在这个时间段没有什么喜欢的演讲要听, 就抱着本本在大堂那里坐着, 敲者键盘, 或者是聊着天.

说到演讲,  有各种各样的人演讲. 你经常会发现一些不擅长于演讲的人在介绍自己做的框架或者产品, 有点紧张, 说话也有些走调 (当然在这个international聚会里面, 各种英语口音的人都会有:)),当然也有很多人能很好的驾驭演讲. 而演讲的内容大多是以介绍和推广为主, 因为毕竟时间有限. 也有一些比较晦涩难懂的主题, 和与python不是很相关的内容, 例如XP, MySQL等. 不过可以看出来, 所有的演讲都是经过比较精心准备的, 而参与的听众也都有能够参与讨论的背景和经验, 所以经常可以看到一个演讲者还在回答听众的问题, 另一个演讲者就开始上台在准备自己的演讲了.

除了演讲以外, 还有一种叫做lighting-talk的讨论方式: 每个人都只简单地将三到五分钟, 而演讲的内容也大多是即兴的, 至少准备的时间都不需要很长, 不像正式的演讲那样. 那样更是一种畅快的一种体验, 无论是对听众还是演讲者.

宾馆提供免费的WiFi, 而大会也提供了一个专门的WiFi. 当你对于演讲中不了解的技术名称, 框架名称等, 以及需要了解更详细的主题内容时, 你可以很方便的google, 或者是记录一下摘要在自己的博客上. 我还发现了有些人一边听演讲, 一边就在写代码 (工作?).

虽然我使用python两年有余, 不过对于工作以外的python知识了解不多, 所以这几天的演讲就像是给大脑灌水似的, 突然之间灌入了很多各种各样的python知识, 还有一些XP的新体验和观点, 真是一种让人很新鲜和激动的感觉. 估计这种感觉也是组织这样的聚会的初衷吧.


2007年7月9日星期一

Europython 之旅杂记1

第一次出国, 一个人走, 从北京走, 终点立陶宛的维尔纽斯. 有人怕我土老冒, 丢了国人的脸, 弄的有点我有点心虚. 行程是从北京到赫尔辛基 (Beijing 11:00 -- Helsinki 14:00, 八个小时, 时差5个小时), 然后转机到维尔纽斯 (Helsinki 16:15 -- Vilnius 17:30, 时差5个小时), 全部行程大概11个小时. 行程整体比较顺利, 就是在Helsinki转机的时候误点了半个小时.

离京:

虽然是首都国际机场, 不过国际航班的安检通道明显不如国内航班的安检通道数量多, 那个队排得~~~. 有经验的游客说这才不算啥呢, 更长的队都也很常见. 填写出境登记表, 安检表, 再排队, 安检, 顺利地登机, 就开始了出国之旅.

Hints: 1) 建议早点去机场, 避免排队带来的"失误".
2) 似乎没有闻讯处可以打听出境需要什么手续, 见人家填表, 跟着填就是了
3) 新规定: 可以随身携带的液体不能超过100ml, 所以最好放在托运行李中

飞机耽搁了半个小时, 起飞了. 天气不错, 再加上是商务11点, 所以在高空可以比较清楚地俯覧大地, 有点航拍的感觉. 特地挑了靠窗户的座位, 呵呵.. ;) 机上华人不少, 所以出国的感觉不是特别强烈 (相比从Helsinki去Vilnius的飞机上, 就我一个黑发黄皮肤的人). 前面就是两个华人, 一个在芬兰定居了十多年, 做医生的; 另一个在波兰定居. 听着她们的聊天, 也了解了一点芬兰: 人少, 都很遵守规则, 生活悠闲, 唯一不好的地方就是太过于冷清 :)


Helsinki:

飞机穿过波罗地海, 直奔Helsinki而去, 近8个小时的行程终于要结束了, 真是不容易啊, 坐得人都快麻木了. 虽然本地天气是多云, 但是只是局部地方多云, 所以当飞机降低高度时, 可能很清楚地看到城市. 城市似乎不大, 放眼看去主色调是绿色: 大片的森林, 绿地;再加上位于芬兰湾, 与蓝色的大海几乎就是溶为一体. 黄色, 红色, 灰色的屋顶; 高速公路上象为数不多的甲壳虫一样蠕动着的汽车; 芬兰湾里面有很多船坞, 游艇开过后留下的长长涟漪... 长途的飞机旅程后看到这些, 让人终于来了点精神. ( 遗憾的是不能开DC照相:( )

Helsinki机场不大, 看起来很新的感觉, 所以比较干净.比较有意思的是机场有些提示标牌还有中文翻译:) 转机过程中安检非常严格, 如果安检装置有警报, 安全人员会非常仔细搜遍全身, 连裤脚都不放过. 在我前面的老外把皮带都卸下来, 放入篮子里面. 不过显然他裤子的腰围有点大, 所以就拎着裤腰过安检 :). 机场没有WI-FI, 在机场的咖啡店可以买卡来上网, 我就省点是点了, 两个小时打打PSP就过去. 当登上去Vilnius的飞机, 在跑道滑行的时候, 看到远远的天边有道彩虹, 可惜不能开DC :(

未解之谜: 去Vilnius飞机, 是四个座位一排的, 奇怪的是四个座位的编号是 ACDF, 例如11A, 11C, 11D, 11F. 不知道为什么没有了B, E?

Hints: 1) 还是随身携带的液体问题, 所以建议在离京时就放在托运行李中.


Vilnius:

离京以前就已经查过天气预报, 知道Vilnius未来的几天都是阴雨天气, 气温也最高才18-19度. 飞机不大, 穿越云层降落时颠得厉害, 不一会儿就着陆了, 感觉象是被颠到地上的. 飞机降落时发现在下小雨, 比较阴冷的感觉. Vilnius机场在重建中, 所以显得比较破落. 从通道出来, 发现很多来接机的立陶宛人都手里拿着鲜花, 据说是一种传统. 这种接人的方式的确给人感觉很舒服, 特别是旅途疲劳以后看到美丽的花朵, 都让人精神一振. 通过Greg了解到, 这是手拿鲜花是立陶宛的传统. 如果花是复数, 表示好的意思, 如果花是单数, 则一般表示是丧事之类不幸的事情.

在玩了3个多小时的游戏后, 本地的十点钟左右, 终于等到了Ken & Greg. 直到这个时候, 天才黑下来. 接下来几个人品尝了可以说是最刺激的出租车之旅: 出租车司机似乎要给我们这些外来者表现一把, 驾驶风格极其狂野, 见车超车, 转弯也不怎么见减速. 发动时都能把你贴在座位上, 于是我们三个都赶紧抓好了把手. 据坐在前面的Greg同学说, 司机明显喝过了啤酒. 另一个让人"心惊"的是出租车的计价器, 不同于北京的以元为单位跳表, 这里是以分为单位跳, 所以你就看着数字花花地涨, 不停地变.

Hints: 1) 不要在机场的Bank Agent兑换货币, 因为她们给出的汇率一般都会有点"不准". 最好通过ATM兑换.
2) 比较多的立陶宛人不怎么会说英文, 所以要询问东西就需要多找几个人试试

终于到了酒店, 费了点功夫把房间弄好了, 然后一起在酒店大堂吃了点晚餐 (算是宵夜也行). 旁过也有六七个人在喝酒聊天, 看起来就是参加Europython会议的人. 后来Bjorn也来了, 好动的老人家主动和人家搭讪, 然后一起加入了讨论团. 据说其中还有几个个什么牛人, 还提及我们给他发过vim的python语法检查的插件. 已经是困得不行的我, 就不再惨和这些事情了, 直接回去睡了, 这个时候已经是北京时间9日凌晨6点, 本地时间9日凌晨1点了. 开始倒时差了~~~~

2007年6月6日星期三

Some links about Web Service Design

Googled some useful links of web API design.

Web API Patterns: http://ajaxpatterns.org/Web_API_Patterns


RESTful Service: http://ajaxpatterns.org/RESTful_Service

* URLs reflect resources
* HTTP Methods reflect actions
* GET used for queries, and only for queries
* Services should be stateless
* Services should be idempotent
* Embrace hyperlinks
* Service documents itself
-- Error responses should also be in human-friendly language and with examples and hyperlinks.
* Service constrains data formats
* Handling arbitrary actions

Semantic Responses: http://ajaxpatterns.org/Semantic_Response

Semantic Responses can be represented in several different forms. Each of the following is captured as a separate pattern.

* XML Message
* JSON Message
* Plain-Text Message

Each of the above patterns discusses its own strengths and weaknesses. There are several factors involved:

* Browser-Side Environment: Which browser versions are being targeted will affect feasibility of message formats. In particular, XML support is limited in older browsers.
* Server-Side Environment: What sort of support is there for the message formats in the server-side coding environment. If using JSON, for example, is there a suitable binding for the server-side language?
* Developer Skills: What sort of skill base is available to deal with the message format? You might be tempted to use XML because you feel browser-based XSLT is the most elegant solution, but that requires XSLT talent.
* External Agents: The browser and the server may not be the only things that access the message. If the server is offering a generic REST service, the message format will need to be suitable for external applications too.



Some blogs:
http://www.sourcelabs.com/blogs/ajb/2006/08/how_to_provide_a_web_api.html
1. Keep it clean and simple
2. Stick to standards
3. Make it about data
4. Keep it working
5. Design for updates

http://particletree.com/features/how-to-add-an-api-to-your-web-service/