Web 面试题汇总(一)

1.Doctype作用?标准模式与兼容模式各有什么区别?

A: 告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。

2.HTML5 为什么只需要写 <!DOCTYPE HTML>?

A: HTML5 不基于 SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运行;而HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型。

3.行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

A:

  • 行内元素有:a b span img input select strong(强调的语气)
  • 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
  • 常见的空元素:br hr img input link meta
  • 鲜为人知的空元素:area base col command embed keygen param source track wbr

4.页面导入样式时,使用link和@import有什么区别?

A:

  • link属于XHTML标签,除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS;
  • 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
  • import是CSS2.1 提出的,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题;
  • link支持使用js控制DOM去改变样式,而@import不支持;

5.介绍一下你对浏览器内核的理解?

6.简述一下你对HTML语义化的理解?

A:用正确的标签做正确的事情。

  • html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析;
  • 即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的;搜索引擎的爬虫也依赖于HTML标记
  • 确定上下文和各个关键字的权重,利于SEO;
  • 使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。

7.HTML5的离线储存怎么使用,工作原理能不能解释一下?

8.浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?

继续阅读

Blocks 的实现

Block 的实现是面试中高频出现的问题,背后的原因我想是希望借此考察面试者对 Block 的掌握程度,在日后的工作中能够用好它;同时能从侧面反映面试者有没有深入钻研技术,以及独立思考能力如何,可谓一举多得。

下面我们就来看看 ObjC 中的 Blocks 是如何实现。Clang 的 -rewrite-objc 选项可以将含有 Block 语法的源代码转换为 C++,说是 C++,其实也仅使用了 struct 结构,其本质是 C 语言。

下面我们先转换一个简单的文件试试:

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
#import <Foundation/Foundation.h>

int main(int argc, char ** argv)
{
    @autoreleasepool {
        void (^blk)(void) = ^{
            printf("Block\n");
        };

        blk();
    }

    return 0;
}

// 使用命令:
$ clang -fobjc-arc -ObjC -rewrite-objc -mios-version-min=6.0.0 -fobjc-runtime=ios-6.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk -arch arm64 block-essense.m  -o block-essense-in-c.c

//限于篇幅,省略不相关的部分,结果如下:
struct __block_impl {
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;
};

struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {

            printf("Block\n");
        }

static struct __main_block_desc_0 {
  size_t reserved;
  size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
int main(int argc, char ** argv)
{
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;
        void (*blk)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));

        ((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk);
    }

    return 0;
}
继续阅读

OpenLDAP 学习笔记

最近业余时间在自学 Java,接触到 JNDI,继而牵扯出 LDAP。在倒腾过程中感觉是个复杂的主题,决定做个简要的笔记,梳理下思路,也方便日后忘记时容易拾起。

OpenLDAP 是 LDAP 协议的一个开源实现。LDAP 服务器本质上是一个为只读访问而优化的非关系型数据库。它主要用做地址簿查询(如 email 客户端)或对各种服务访问做后台认证以及用户数据权限管控。(例如,访问 Samba 时,LDAP 可以起到域控制器的作用;或者 Linux 系统认证 时代替 /etc/passwd 的作用。)

以 slap 开头的命令如: slapacl, slapadd 等是服务端工具;以 ldap 开头的命令如: ldapadd, ldapcompare 等是客户端命令工具。

安装

Mac 内置了 OpenLDAP 软件包,所以可以直接使用。

配置

服务端

服务端支持两种配置方法:动态运行时配置引擎和老式的 slapd.conf 文件。这里介绍通过老式的 slapd.conf 文件转换成动态运行时配置引擎来配置服务器的方法。

服务器的配置文件位于 /etc/openldap/slapd.conf。在 Mac 上第一次配置时该文件还不存在,但有一个 slapd.conf.default 文件,从文件名可知,这应该是一个默认配置文件,所以我们可以在它基础上来配置。

1
$ sudo cp /etc/openldap/slapd.conf.default /etc/openldap/slapd.conf

需要编辑后缀和 rootdn。典型的后缀通常是你所用的域名,但这并非强制要求,而是依赖于你如何使用你的目录。下例中以 tenneshop 做为域名,tld 为 com,rootdn 则是 LDAP 管理员的名字(这里用 Manager)。

继续阅读