WordPress错误:无法安装这个包。PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file

WordPress更新或是上传插件或主题错误时出现“无法安装这个包。PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file”错误在某些配置不够完善的主机中可能会出现这种情况。这是因为空间中temp目录没有设置访问权限的问题,需要空间商为你设置目录访问权限,一般这种要求他们是不会理的,所以我们只能改变WordPress的上传临时目录。

解决方法如下

1. 通过网站FTP打开WordPress根目录下的 wp-config.php 文件,找到如下代码:

/** WordPress 目录的绝对路径。 */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');

2. 在下面增加如下代码即可:

/** 指定WordPress的临时目录 */
define('WP_TEMP_DIR', ABSPATH . 'wp-content/temp');

3. 最后在 /wp-content/ 文件夹下新建个一个名为 temp 的文件夹,然后再重新上传或者更新下载插件和主题就可以了。

最好叫 temp 权限和系统中一致为777

Linux Kernel 3.18 LTS 终止支持 请升至 4.9 或 4.4 分支

在发布最后一个维护版本更新之后,Linux 稳定版内核维护者 Greg Kroah-Hartman 宣布 Linux Kernel 3.18 分支走到了生命的尽头。而 3.18 LTS 原计划于今年 1 月终止支持。

Linux Kernel 3.18.48 LTS 是该分支的最后版本,根据短日志显示该版本共计调整了 50 个文件,插入 159 处删除 351 处。升级网络堆栈的同时改善了 Bluetooth, Bridge, IPv4, IPv6, CAIF 和 Netfilter,并升级了 USB, SCSI, ATA, media, GPU, ATM, HID, MTD, SPI 和网络(有线和无线)驱动。新发布的 3.18.48 还修正了 3.18.47 和 3.18.27 中的一个 bug。

LTS 版通常会提供大约两年的支持时间,3.18 是在 2014 年 12 月发布的。如果你当前还在使用该内核分支,那么现在你应该升级至更新的 LTS 版本,例如 Linux Kernel 4.9 或者 4.4,这两个版本要比 3.18 更加的安全和强悍。不过 Linux Kernel 3.18 主要被 Google 和其他供应商应用于一些 Android 设备、部分 Chromebook 上,Kroah-Hartman 建议用户拒绝购买仍然使用 3.18 LTS 的供应商的设备。如果无法升级内核开发者也提供了一些建议。

“如果你在使用 Linux Kernel 3.18 中有困难,那么我可以给你提供一些帮助。首先,你需要和硬件供应商反馈,要求尽快升级否则不再购买他们的产品。如果供应商还是不升级,请致信我们让我们出面和厂商进行沟通,出现这个问题的肯定不止你一个人。”

来源:http://www.oschina.net/news/81799/linux-kernel-3-18-48-released

Mac升级为macOS Sierra系统后xcode项目报错[转]

元旦升级了macOS Sierra系统,顿时感觉入坑了,本来好好的项目报如下错误:

resource fork, Finder information, or similar detritus not allowed
Command /usr/bin/codesign failed with exit code 1

在网上找了很多方法,都不使用我的项目,或者说网上的说法太模糊,现给出解决办法:

  1. 关闭Xcode,打开终端;
  2. 进入项目的文件夹, 有.xcodeproj文件

    ll

    发现有 drwxr-xr-x@ 7 liyunde staff 238B 1 3 12:36 iosapp.xcodeproj
    多了个@符号

  3. 输入指令

    xattr -rc .

  4.  打开项目重新运行,OK了!

网上说的太模糊,资料也少,自己浪费了很长时间,现在给出详细的解决办法,避免同行入坑,节省时间。

参考:http://blog.csdn.net/benpaofengling/article/details/52680542

iOS获取当前app的名称和版本号[转]

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
CFShow(infoDictionary);
// app名称
NSString *app_Name = [infoDictionary objectForKey:@”CFBundleDisplayName”];
// app版本
NSString *app_Version = [infoDictionary objectForKey:@”CFBundleShortVersionString”];
// app build版本
NSString *app_build = [infoDictionary objectForKey:@”CFBundleVersion”];

//手机序列号
NSString* identifierNumber = [[UIDevice currentDevice] uniqueIdentifier];
NSLog(@”手机序列号: %@”,identifierNumber);
//手机别名: 用户定义的名称
NSString* userPhoneName = [[UIDevice currentDevice] name];
NSLog(@”手机别名: %@”, userPhoneName);
//设备名称
NSString* deviceName = [[UIDevice currentDevice] systemName];
NSLog(@”设备名称: %@”,deviceName );
//手机系统版本
NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];
NSLog(@”手机系统版本: %@”, phoneVersion);
//手机型号
NSString* phoneModel = [[UIDevice currentDevice] model];
NSLog(@”手机型号: %@”,phoneModel );
//地方型号  (国际化区域名称)
NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel];
NSLog(@”国际化区域名称: %@”,localPhoneModel );

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
// 当前应用名称
NSString *appCurName = [infoDictionary objectForKey:@”CFBundleDisplayName”];
NSLog(@”当前应用名称:%@”,appCurName);
// 当前应用软件版本  比如:1.0.1
NSString *appCurVersion = [infoDictionary objectForKey:@”CFBundleShortVersionString”];
NSLog(@”当前应用软件版本:%@”,appCurVersion);
// 当前应用版本号码   int类型
NSString *appCurVersionNum = [infoDictionary objectForKey:@”CFBundleVersion”];
NSLog(@”当前应用版本号码:%@”,appCurVersionNum);

Java进程线程 CPU 占用高负载高问题排查

java -jar 运行应用,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高。

问题分析:
1,程序属于CPU密集型,和开发沟通过,排除此类情况。
2,程序代码有问题,出现死循环,或是死锁, 可能性极大。

过程:

1.代码是不能定位,从日志上也无法分析得出。
2.top,发现PID,83021 的Java进程占用CPU高达900%,出现故障。
3.找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:ps -mp 83021 -o THREAD,tid,time | sort -rn | head -n 10

USER     %CPU PRI SCNT WCHAN  USER SYSTEM    TID     TIME
ubox     88.9  19    – futex_    –      –  83032 08:21:49
ubox     88.9  19    – –         –      –  83031 08:21:49
ubox     88.9  19    – –         –      –  83030 08:21:49
ubox     88.9  19    – –         –      –  83028 08:21:49
ubox     88.9  19    – –         –      –  83027 08:21:49
ubox     88.9  19    – –         –      –  83025 08:21:49
ubox     88.9  19    – –         –      –  83024 08:21:49
ubox     88.9  19    – –         –      –  83023 08:21:49
ubox      712   –    – –         –      –      – 2-18:57:53

找到了耗时最高的线程83032,占用CPU时间超过8小时了!
4.将需要的线程ID转换为16进制格式:

printf “%x\n” 83032
14458

5.最后打印线程的堆栈信息:jstack 83021 | grep 14458 -A 5

6.将输出的信息给开发部进行确认,这样就能找出有问题的代码。
通过最近几天的监控,CPU已经安静下来了。

各种排行榜出炉:Java 稳坐冠军宝座、Oracle 岌岌可危,我们的大 PHP 呢

2016年只剩下不到一个月的时间了, IT 界最重要的莫过于各种排行榜,除了加班最狠、待遇最好、妹子最多……的 IT 公司外,程序员们最关心的是不是各种编程语言、数据库的排行榜里,PHP 是最好的编程语言还是最好的“数据库”?

C 语言自 2015 年 11 月以来就有下降趋势。在今年之前的整个 15 年的时间内,其评分都在 15%-20% 之间波动,但今年却一反常态,评分跌至 10% 以下,并且没有看到回升的势头。C 语言到底发生了什么?为何一蹶不振?

看来 Java 坐稳 2017 年热门编程语言排行榜冠军宝座了,你的语言上榜没?冠军总是比较忙,这会正和 Kotlin 比编译速度,到底谁更快呢~

除了编程语言,2016 年全球数据库排名也尘埃落定,Oracle 、MySQL 和 Microsoft SQL Server 依然稳坐三甲宝座,不过,Oracle 的地位可就没那么稳固了,跟第二名 MySQL 的差距已缩小至 30 分!看来明年的排行榜有看头了,不知道是@美国网友:”php是世界上最好的数据库“,还是@凡行:“MySQL是世界上最好的编程语言!”说得对呢~@达尔文:”前排出售小板凳。”

同样地位不保的还有第三方 Android 系统 CM 之父,被踢出局的他与乔布斯经历了同样的悲惨境遇,作为 Cyanogen 公司的主要创始人,Steve Kondik 已经从这家公司离职。

这种感觉就像 Firebug 在其官方网站上宣布 —— “Firebug 扩展不再进行开发或维护,我们邀请您使用 Firefox 的内置开发工具以代替”。@世尘悉洞 :“回想起用firebug的岁月,挺伤感的。感谢一路陪伴,虽然现在不怎么使用了,但是还是很感谢之前的陪伴。”讲不出的再见~

虽然开发者的世界少了 Firebug,不过我们的大谷歌回归啦,Google Developers 中国网站正式发布!Google Developers 中国网站是特别为中国开发者而建立的,它汇集了 Google 为全球开发者所提供的开发技术资源,包括 API 文档、开发案例、技术培训的视频。并涵盖了以下关键开发技术和平台产品的信息:

  • Android(developer.android.google.cn)
  • Tensor Flow (www.tensorflow.org)
  • Google Play(developer.android.com/distribute/googleplay/index.html)
  • AdMob(firebase.google.cn/docs/admob)、
  • Firebase(firebase.google.cn)

除了面向中国开发者的 Google Developers 中国网站,谷歌 DeepMind 还面向公众和开发者开放开源 AI 训练平台 DeepMind Lab,这款软件本周在GitHub上线,它看起来像一款卡通视频游戏,但却是精心设计的,目的是让AI开发者对他们机器人的学习加以控制。

当越来越牛逼的机器人取代程序员写代码,会发生什么呢?过去,程序员需要在大学或工作中花费好几年时间才能学习掌握一些编程知识,熟悉了解一些昂贵的服务器性能,而现在,只需几周时间就能搞定一项网页开发编程语言了。基于人工智能生成的代码,为整个行业带来了颠覆创新。

php-fpm添加service服务

Nginx通过FastCGI运行PHP比Apache包含PHP环境有明显的优势,最近有消息称,PHP5.4将很有可能把PHP-FPM补丁包含在内核里,nginx服务器平台上运行PHP将更加轻松,下面我们就来看一篇php-fpm平滑启动并配置服务例子。

我的PHP是源码安装的。php-fpm在PHP 5.3.2以后的版本不支持以前的php-fpm (start|restart|stop|reload) ,那么如果将php-fpm配置成服务,并添加平滑启动/重启。

配置php-fpm.conf(vi  php-7.1.0/etc/php-fpm.conf),将pid(;pid = run/php-fpm.pid)前的;去掉。

因为编译安装php的,所以会在php目录生成很多二进制文件,找到init.d.php-fpm,拷贝到init.d下。

cp  php-7.1.0/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

设置权限,并添加服务

chmod +x /etc/init.d/php-fpm
chkconfig –add php-fpm

以后可以使用如下命令管理php-fpm了

service php-fpm status

service php-fpm start
service php-fpm restart
service php-fpm reload

service php-fpm stop

Adding SQLCipher to Xcode Projects IOS MAC

Adding SQLCipher to Xcode Projects

SQLite is already a popular API for persistent data storage in iOS apps so the upside for development is obvious. As a programmer you work with a stable, well-documented API that happens to have many good wrappers available in Objective-C, such as FMDB and Encrypted Core Data. All security concerns are cleanly decoupled from application code and managed by the underlying framework.

The framework code of the SQLCipher project is open source, so users can be confident that an application isn’t using insecure or proprietary security code. In addition, SQLCipher can also be compiled on Android, Linux, OS X and Windows for those developing cross-platform applications.

Using SQLCipher in an iOS app is fairly straightforward. This document describes integrating SQLCipher into an existing iOS project using the Community Edition source code build process. This tutorial assumes some familiarity with basic iOS app development and a working install of Xcode (6.1.1). The same basic steps can be applied to OS X projects as well.

? Hot Tip: Commercial Edition static libraries are available for you to drop right into your project if you’d like to skip all this and receive personalized support from our crack development team! Binaries and helpful projects integrations are available for all supported platforms. Learn more »

Prerequisites

Xcode with an iOS or OS X SDK installed. Visit the Apple Developer site for more information on downloading the latest Xcode and iOS and OS X SDKs.

OpenSSL

OpenSSL is no longer required for building SQLCipher on iOS and OS X, as the project by default uses Apple’s CommonCrypto framework for hardware-accelerated encryption. You can still build SQLCipher with other crypto providers like OpenSSL if you’d prefer, or you can write your own.

SQLCipher

Fire up the Terminal app, switch into your project’s root directory and checkout the SQLCipher project code using Git:

$ cd ~/Documents/code/SQLCipherApp
$ git clone https://github.com/sqlcipher/sqlcipher.git

Xcode Project Configuration

The SQLCipher source provides a sqlcipher.xcodeproj project file that we’ll add to your project to build a static library that you’ll link from your main application target.

Add Project Reference

Open your iOS app’s project or workspace in Xcode, open the Project Navigator (command+1), and click on the top-level Project icon for your iOS app. Right click on the project and choose “Add Files to “My App”” (the label will vary depending on your app’s name). Since we cloned SQLCipher directly into the same folder as your iOS app you should see a sqlcipher folder in your root project folder. Open this folder and select sqlcipher.xcodeproj:

Add Files to 'My App'

Project References

Project Settings

Navigate to your Project settings (make sure you don’t select the application target level). Select the Build Settings pane. In the search field, type in “Header Search Paths”. Double-click on the field under the target column and add the following path: $(PROJECT_DIR)/sqlcipher/src:

Next, add a setting to ensure that SQLCipher is the first library linked with your application in the “Other Linker Flags” setting. Start typing “Other Linker Flags” into the search field until the setting appears, double click to edit it, and add the following value: $(BUILT_PRODUCTS_DIR)/libsqlcipher.a

You will next edit one other setting on your Project to ensure the SQLCipher builds correctly—”Other C Flags.” Start typing “Other C Flags” into the search field until the setting appears, double click to edit it, and in the pop-up add the following value: -DSQLITE_HAS_CODEC

Target Settings

Next, navigate to the Target Level settings. Add a Target dependency to each of your application targets to ensure that SQLCipher is compiled before the application code. In Xcode’s Project Navigator (command+1), select your app’s Project file and in the Editor pane select Build Phases and your app’s main target (not the project file).

Expand Target Dependencies and click on the + button at the end of the list. In the browser that opens, select the sqlcipher static library target:

Add Target Dependency

Expand Link Binary With Libraries, click on the +button at the end of the list, and select the libsqlcipher.a library.

Link Binary With Libraries

Finally, also under Link With Libraries, add Security.framework.

? Hot Tip: If libsqlite3.dylib or another SQLite framework is listed in your Link Binary With Libraries list be sure to remove it!

Repeat these steps for any other targets in your project that will depend on SQLCipher, i.e. unit tests.

Integration Code

Now that the SQLCipher library is incorporated into the project you can start using the library immediately. Telling SQLCipher to encrypt a database is easy:

  • Open the database
  • Use the sqlite3_key function to provide key material. In most cases this should occur as the first operation after opening the database.
  • Run a query to verify the database can be opened (i.e. by querying the schema)
  • As a precautionary measure, run a query to ensure that the application is using SQLCipher on the active connection
#import <sqlite3.h>

...
NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
                          stringByAppendingPathComponent: @"sqlcipher.db"];
sqlite3 *db;
bool sqlcipher_valid = NO;

if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
    const char* key = [@"BIGSecret" UTF8String];
    sqlite3_key(db, key, strlen(key));
    if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
      if(sqlite3_prepare_v2(database, "PRAGMA cipher_version;", -1, &stmt, NULL) == SQLITE_OK) {
        if(sqlite3_step(stmt)== SQLITE_ROW) {
          const unsigned char *ver = sqlite3_column_text(stmt, 0);
          if(ver != NULL) {
            sqlcipher_valid = YES;

            // password is correct (or database initialize), and verified to be using sqlcipher

          }
        }
        sqlite3_finalize(stmt);
      }
    }
    sqlite3_close(db);
}

In most cases SQLCipher uses PBKDF2, a salted and iterated key derivation function, to obtain the encryption key. Alternately, an application can tell SQLCipher to use a specific binary key in blob notation (note that SQLCipher requires exactly 256 bits of key material), i.e.

PRAGMA key = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'";

Once the key is set SQLCipher will automatically encrypt all data in the database! Note that if you don’t set a key then SQLCipher will operate identically to a standard SQLite database.

Testing and Verification

There are a number of ways that you can verify SQLCipher is working as expected in your applications before its release to users.

After the application is wired up to use SQLCipher, take a peek at the resulting data files to make sure everything is in order. An ordinary SQLite database will look something like the following under hexdump. Note that the file type, schema, and data are clearly readable.

% hexdump -C plaintext.db
00000000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.|
00000010  04 00 01 01 00 40 20 20  00 00 00 04 00 00 00 00  |.....@  ........|
...
000003b0  00 00 00 00 24 02 06 17  11 11 01 35 74 61 62 6c  |....$......5tabl|
000003c0  65 74 32 74 32 03 43 52  45 41 54 45 20 54 41 42  |et2t2.CREATE TAB|
000003d0  4c 45 20 74 32 28 61 2c  62 29 24 01 06 17 11 11  |LE t2(a,b)$.....|
000003e0  01 35 74 61 62 6c 65 74  31 74 31 02 43 52 45 41  |.5tablet1t1.CREA|
000003f0  54 45 20 54 41 42 4c 45  20 74 31 28 61 2c 62 29  |TE TABLE t1(a,b)|
...
000007d0  00 00 00 14 02 03 01 2d  02 74 77 6f 20 66 6f 72  |.......-.two for|
000007e0  20 74 68 65 20 73 68 6f  77 15 01 03 01 2f 01 6f  | the show..../.o|
000007f0  6e 65 20 66 6f 72 20 74  68 65 20 6d 6f 6e 65 79  |ne for the money|

Fire up the SQLCipher application in simulator and look for the application database files under /Users/sjlombardo/Library/Application Support/iPhone Simulator/5.0/Applications/<Instance ID>/Documents. Try running hexdump on the application database. With SQLCipher the output should looks completely random, with no discerning characteristics at all.

% hexdump -C sqlcipher.db
00000000  1b 31 3c e3 aa 71 ae 39  6d 06 f6 21 63 85 a6 ae  |.1<..q.9m..!c...|
00000010  ca 70 91 3e f5 a5 03 e5  b3 32 67 2e 82 18 97 5a  |.p.>.....2g....Z|
00000020  34 d8 65 95 eb 17 10 47  a7 5e 23 20 21 21 d4 d1  |4.e....G.^# !!..|
...
000007d0  af e8 21 ea 0d 4f 44 fe  15 b7 c2 94 7b ee ca 0b  |..!..OD.....{...|
000007e0  29 8b 72 93 1d 21 e9 91  d4 3c 99 fc aa 64 d2 55  |).r..!...<...d.U|
000007f0  d5 e9 3f 91 18 a9 c5 4b  25 cb 84 86 82 0a 08 7f  |..?....K%.......|
00000800

Other sensible testing steps include:

  • Attempt to open a database with a correct key and verify that the operation succeeds
  • Attempt to open a database with an incorrect key and verify that the operation fails
  • Attempt to open a database without any key, and verify the operation fails
  • Programtically inspect the first 16 bytes of the database file and ensure that it contains random data (i.e. not the string SQLite Format 3\0)

来源:https://www.zetetic.net/sqlcipher/ios-tutorial/

每个程序员都应该收藏的算法复杂度速查表

英文:http://bigocheatsheet.com/
编译:Linux中国
链接:https://linux.cn/article-7480-1.html

这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-O 复杂度。我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住。最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如 Yahoo、eBay、LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,“为什么没有人创建一个漂亮的大 O 速查表呢?”所以,为了节省大家的时间,我就创建了这个,希望你喜欢!

— Eric[1]

图例

数据结构操作

数组排序算法

图操作

堆操作

大 O 复杂度图表

Big O 复杂度

推荐阅读

  • Cracking the Coding Interview: 150 Programming Questions and Solutions[33]
  • Introduction to Algorithms, 3rd Edition[34]
  • Data Structures and Algorithms in Java (2nd Edition)[35]
  • High Performance Java (Build Faster Web Application Interfaces)[36]

关注「算法爱好者」

2016 最佳 Linux 发行版排行榜

2015年,不管在企业市场还是个人消费市场都是 Linux非常重要的一年。作为一个自2005年起就开始使用 Linux的 Linuxer ,我门见证了 Linux在过去十年的成长。2016 Linux 将更加精彩,所以我们选择了一些大放异彩的发行版。现在 Linux Story小编就带你去领略一下各领域的风采吧!

最好的回归发行版:openSUSE

openSUSE 背后的 SUSE 公司是最老的 Linux 企业,它成立于 Linus Torvalds 宣布放出 Linux 的一年后。它其实早于 Red Hat 的诞生,它也是社区主导的发行版 openSUSE 的赞助商。

在2015,openSUSE 团队决定靠拢 SUSE Linux 企业版(SLE)以便用户可以共享企业服务版本的 DNA ,就像 CentOS 和 Ubuntu一样。之后,openSUSE 变成了 openSUSE Leap,直接基于 SLESP1 。这两个发行版将共享代码库以互惠互利,SUSE 将吸取 openSUSE 的优秀内容,反之亦然。通过这一举措,openSUSE 也抛弃了常规的发行周期,一个新的版本将和 SLE 保持一致。这意味着每个版本将有更长的生命周期。这一举措的结果是 openSUSE 将变成一个非常重要的发行版,因为潜在的 SLE 用户可以使用 openSUSE Leap。然而,这还不是全部,openSUSE 同时发布了一个纯粹的滚动发行版—— Tumbleweed 。可以参考Linux Story闻其详撰写的这篇文章《生命、宇宙以及Linux 系统的终极答案? openSUSE Leap 42.1 华丽发布》,所以现在用户可以使用超稳定的 openSUSE Leap和 始终保持最新的 openSUSE Tumbleweed。

在我记忆中没有其他发行版做了如此深刻的回归。

最可定制的发行版: Arch Linux

Arch Linux是现阶段最好的滚动发行版,好吧,我可能因为我是 Arch Linux用户而产生了偏见。更重要的是 Arch 在其他方面也表现良好,这也是为什么我选择它作为我的操作系统的原因。

Arch Linux 是一个为那些想了解 Linux 一切的人准备的发行版,因为你必须手动安装一切,它会让你学会基于 Linux 的操作系统的每个部分。Arch Linux 是最可定制的发行版,你获得的只是一个基础系统,然后你可以在它上面建立属于你个人的发行版。不论好坏,它都不像 openSUSE 和 Ubuntu,它没有额外的补丁和整合内容,你甚至可以获得上游开发者创建的内容。Arch Linux 也是最好的滚动发行版之一。他总是更新,用户始终使用最新的软件包,并且他们还可以通过稳定的存储库运行预发布软件。Arch 也因优异的文档闻名。 Arch Wiki 可以让我得到任何 Linux 相关的资料。Arch 中我最喜欢的内容是它提供的所有的包和软件都可在“任何” Linux 发行版上运行。感谢 Arch User Repository(AUR)。

最好看的发行版:elementary OS

不同的 Linux 发行版有不同的侧重点,在大多数情况下这都是技术差异。在很多 Linux 发行版中外观和感觉是无足轻重的——更像是一个边缘项目。不管什么角度,Linux Story 一直觉得它是一个非常漂亮的系统。

elementary OS正试图改变这一切。在它里面,设计走在了前列,其原因是很明显的。该发行版漂亮的图标是 Linux 世界闻名的设计师们设计开发的。elementary OS非常严格要求整体的外观和感觉。开发者已经创建了包括桌面环境在内的自己的组件,此外,他们只选择那些符合自己设计模式的应用程序。可以在该系统上看到 Mac OS X 的影子。

最佳新人:Solus

Solus操作系统最近已经获得了相当多的关注,它是一个从头开始创建的前瞻性操作系统。它并不是 Debian 或 Ubuntu的衍生物。它搭配了为集成 GNOME 从头开始构建的 Budgie 桌面环境。Solus 有和 Google Chrome OS相同的极简主义方法。Linux Story 完全认同 Solus 为最佳新人。

我没有使用太多 Solus,但它看起来很有希望。 Solus 不是一个“新的”操作系统,它曾经以不同的形式和名称存在。但是整个项目的新名称是在2015年才提出的。

最好的教育操作系统:ezgo Linux

ezgo是一套开源、公益、免费、面向教育的电脑操作系统,基于Linux 而开发,它包含有丰富的互动教学软件和开放教材、知识,涵盖了物理、化学、地理、天文、 生物、数学、计算机等学科,矢志帮助学校的学生和教师的教育信息化,帮助孩子们和家长、老师以最方便最有效的方式接触、获取全世界最先进的知识和智慧,这 是一个发源于台湾的开源项目,目前在国内是ezgo中国社区,重庆Linux用户组 ChongqingLUG 在维护、开发和推广。搜集了包括 PhET在内的大量开源教材,Linux Story 有幸也曾经报道过跟 ezgo 有关的消息,它的官方网站是 http://ezgolinux.org/。关心教育的家长、学生和老师值得关注。

最好的云操作系统:Chrome OS

Chrome OS不是一个典型的基于 Linux 的发行版,因为它是一个为在线活动设计的基于浏览器的操作系统。而且,由于它基于 Linux 同时它的源码是供所有人编译,所以它也很有吸引力。我每天都使用 Chrome OS ,这是一个对纯粹为网络活动而设计的极好的,免维护的,不断更新的操作系统。Chrome OS 和 Android 一起值得所有的新人来实现 PC 和其他平台的 Linux 普及。Linux Story 曾经也试用过 Acer Chromebook 11,感觉相当不错。

最好的笔记本操作系统:Ubuntu MATE

大多数笔记本没有非常高端的硬件,如果你正在运行一个非常消耗资源的桌面环境的话你将不会有太多的系统资源或电池续航来供你使用,因为系统已经占用了很多。这就是我发现为什么 Ubuntu MATE是一个优秀的操作系统。因为它是轻量级的,但也有应有尽有的内容给你提供不错的体验。正是由于它轻量级的设计,大部分的系统资源可供你去完成繁重的工作。我认为它在低端硬件上是一个真正优秀的发行版。

最好的旧硬件支持系统:Lubuntu

如果你有闲置的旧笔记本或者台式机,可以使用 Lubuntu来令它焕发生机。Lubuntu 使用 LXDE 桌面环境,但该项目已经和 Razor Qt 合并为 LXQt 项目了。尽管最新的15.04版本仍然使用 LXDE ,但是以后的版本将使用 LXQt 。Lubuntu 确实是一款适合旧硬件的操作系统。

最好的物联网操作系统:Snappy Ubuntu Core

Snappy Ubuntu Core是最好的物联网以及其他类似设备的基于 Linux 的操作系统。该操作系统有很大的潜力将近乎的所有东西都变成智能设备,比如路由器、咖啡机、无人驾驶飞机等等。优秀的软件管理和为增强安全性设计的容器化将它变得更加好玩。

最好的台式机操作系统:Linux Mint Cinnamon

Linux Mint Cinnamon是最好的台式机操作系统,它对硬件强大的笔记本也是最好的。我将它当成 Linux 世界的 Mac OS X 。老实说,我曾经因为 Cinnamon的不稳定而十分不愉快。但是,只要开发者选择 LTS 版本,它就变得难以置信的稳定。因为开发者不必花太多时间去跟上 Ubuntu,所以他们可以花更多时间去让 Cinnamon 更好。

最好的游戏系统:Steam OS

游戏一直是桌面版 Linux 的弱点,许多用户启动双系统的 Windows只是为了玩游戏。Valve Software 正在努力改变这一现状。Valve 是一个提供使游戏在不同平台上运行的客户端的游戏分销商。而且,为了创建基于 Linux 的游戏框架,Valve 已经创建了他们自己的开放式操作系统—— Steam OS。在2015年底,合作伙伴开始将 Steam 机器推向市场。

最好的隐私保护操作系统:Tails

当下大量的监视和营销者的跟踪(匿名跟踪的目标内容是可接受的)让隐私保护已经成为一个主要的问题。如果你的业务需要避免政府和营销机构的追踪,你就需要考虑一款从底层设计隐私保护的操作系统。

而且,在这一方面没有其他的能打败 Tails。它是基于 Debian 的设计用来实现隐私保护和匿名化的操作系统。Tails 非常棒,据报道,美国国家安全局(NSA)认为它是自己使命的重要威胁。

最好的多媒体制作系统:Ubuntu Studio

多媒体制作是基于 Linux 的操作系统的主要缺点之一,所有专业级的程序在 Windows和 Mac OS X 上都可找到。Linux 上却没有像样的音频/视频制作软件,但一个多媒体制作系统需要的不仅仅是像样的应用程序。它应该使用轻量级的桌面环境使宝贵的系统资源如 CPU、RAM 被系统尽量少的使用,以便用于多媒体制作程序。因此,最好的 Linux 多媒体制作系统是 Ubuntu Studio,它使用 Xfce 桌面环境并配备了众多的音频,视频和图像编辑应用程序。Linux Story 网站很长时间也用过它来制作一些影音多媒体素材。

最好的企业级系统:SLE/RHEL

企业用户不会四处寻找运行在自己服务器上的发行版。他们已经知道选择范围:Red Hat Enterprise Linux 或者 SUSE Linux Enterprise 。这两个名字已经成为企业级系统的代名词。这些公司也在设法在容器化和软件定义上的创新来推倒当前的壁垒。Linux Story 认为 RHEL 确实稳定,确实好用。

最好的服务器操作系统:Debian/CentOS

如果你正打算运行一个服务器,但是又不想为 RHEL 或 SLE 的维护付费,那么 Debian 或 CentOS 是你最好的选择。这些发行版是社区主导的服务器版本,它们有着黄金标准。而且,它们的支持周期很长,所以你不必担心经常升级系统。

最好的移动操作系统:Plasma Mobile

尽管基于 Linux 的操作系统—— Android 正在主宰移动领域,包括我在内的很多开源社区的成员仍然希望有一个发行版能够在移动设备上提供传统的 Linux 桌面应用程序。同时,它最好是由一个社区负责运营维护而不是一个公司以便让用户仍然是受关注的焦点,而不是以公司的财务目标为焦点。而这正是 KDE 的 Plasma Mobile带来的希望。

该版本是基于 Kubuntu 的,发布于2015年。因为 KDE 社区在公众环境中遵守标准和发展东西是众所周知的,所以我对 Plasma Mobile的未来充满希望。

最好的 ARM 设备发行版:Arch Linux ARM

随着 Android 的成功,我们已经被 ARM 设备所包围——从树莓派到 Chromebook 再到 Nvidia Shield。为 Intel/AMD 处理器编写的传统发行版将不能在这些设备上运行。虽然一些发行版专为 ARM 设计,但是大多数都只针对具体的硬件,比如为树莓派设计的 Raspbian 。这也是为什么 Arch Linux ARM(ALARM) 让人眼前一亮。因为它是一个纯粹由社区主导的基于 Arch Linux 的发行版,你可以在树莓派、Chromebook、Android 设备、Nvidia Shield 等上面运行它。这个发行版更有趣的是,因为 Arch User Repository(AUR)的原因,所以你可以安装许多你可能在其他发行版上无法获得的应用程序。

总结

当我完成这篇文章的时候我很惊讶和惊奇,非常令人兴奋的看到有适合每个人的 Linux 世界。如果这一年桌面版的 Linux 一直跳票也没关系,我们因 Linux 时刻高兴着!

linux 查看系统信息命令

下面给除了各linux发行版比较常用的系统信息查询的命令

#  man  # 使用man命令 查看命令手册

# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量资源
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh <目录名> # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载磁盘和分区
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况网络
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息进程
# ps -ef # 查看所有进程
# top # 实时显示进程状态用户
# w # 查看活动用户
# id <用户名> # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务服务
# chkconfig –list # 列出所有系统服务
# chkconfig –list | grep on # 列出所有启动的系统服务程序
# rpm -qa # 查看所有安装的软件包

如何使mac os x支持sap的web portal

以前在Mac OS X上使用firefox访问sap 的web portal时,往往在验证用户名和口令之后,就被告知访问失败。本来以为是操作系统+浏览器的问题,直到最近windows 7也遇到此类问题,并得到完美解决之后,我才想到,Mac OS X上估计也能如法炮制。

Windows 7上的解决方案是在本地安全策略中启用kerberos验证。实际上firefox也有一个启用kerberos的过程。具体的步骤如下 :
  •  In the address bar of Firefox, type about:config to display the list of current configuration options.
  • In the Filter field, type negotiate to restrict the list of options.
  • Double-click the network.negotiate-auth.trusted-uris entry to display the Enter string value dialog box.
  • Enter the name of the domain against which you want to authenticate, for example, .example.com.
  • Repeat the above procedure for the network.negotiate-auth.delegation-uris entry, using the same domain.光有这步还不够,还需要拿到kerberos验证需要的ticket.方法如下:

    在shell下运行 kinit username@DOMAIN.NAME

    后面的域名一定要用大写,小写会导致验证失败。

    根据提示输入密码之后,就能够拿到ticket了。接下来再用firefox访问sap web portal,就没有任何问题了。

来源://blog.chinaunix.net/uid-11093116-id-180489.html

unauthenticated user mysql 原因分析

最近常出现 客户端连接远程服务器失败问题

show processlist;

出现 unauthenticated user,一直到超时;

网上查了下,到处都是互相抄袭文章,类似:

解决的方案很简单,结束这个反查的过程,禁止任何解析。

打开mysql的配置文件(my.cnf),在[mysqld]下面增加一行:

skip-name-resolve

。。。

实际上我都用IP连接的,不会出现这种问题

最后网上有个说是网络慢也会影响连接,ping 测试了下果然慢

ping liyunde.com
PING liyunde.com (112.126.64.59): 56 data bytes
64 bytes from 112.126.64.59: icmp_seq=0 ttl=51 time=41.072 ms
64 bytes from 112.126.64.59: icmp_seq=1 ttl=51 time=40.965 ms
64 bytes from 112.126.64.59: icmp_seq=2 ttl=51 time=41.036 ms
64 bytes from 112.126.64.59: icmp_seq=3 ttl=51 time=42.662 ms
64 bytes from 112.126.64.59: icmp_seq=4 ttl=51 time=41.681 ms
64 bytes from 112.126.64.59: icmp_seq=5 ttl=51 time=41.701 ms
64 bytes from 112.126.64.59: icmp_seq=6 ttl=51 time=41.859 ms
64 bytes from 112.126.64.59: icmp_seq=7 ttl=51 time=43.713 ms

网络响应过慢,配置服务器不能解决这个问题,换个好点的网络,问题自然解决。

Beanstalkd 使用

一、安装

1、官网

https://kr.github.io/beanstalkd/

2、安装

yum install beanstalkd --enablerepo=epel

3、启动

/usr/bin/beanstalkd -l 0.0.0.0 -p 11300 -b /var/lib/beanstalkd/binlog -F

-b 开启binlog,断电后重启会自动恢复任务。

二、基本概念

1、Beanstalkd设计里面的核心概念:

  • job :一个需要异步处理的任务,是 Beanstalkd 中的基本单元,需要放在一个 tube 中。
  • tube :一个有名的任务队列,用来存储统一类型的 job,是 producer 和 consumer 操作的对象。
  • producer :Job 的生产者,通过 put 命令来将一个 job 放到一个 tube 中。
  • consumer :Job的消费者,通过 reserve/release/bury/delete 命令来获取 job 或改变 job 的状态。

2、job 的生命周期

Beanstalkd job life circle

当producer直接put一个job时,job就处于READY状态,等待consumer来处理,如果选择延迟put,job就先到 DELAYED状态,等待时间过后才迁移到READY状态。consumer获取了当前READY的job后,该job的状态就迁移到RESERVED, 这样其他的consumer就不能再操作该job。

当consumer完成该job后,可以选择delete, release或者bury操作;delete之后,job从系统消亡,之后不能再获取;release操作可以重新把该job状态迁移回READY(也 可以延迟该状态迁移操作),使其他的consumer可以继续获取和执行该job;有意思的是bury操作,可以把该job休眠,等到需要的时候,再将休 眠的job kick回READY状态,也可以delete BURIED状态的job。

正是有这些操作和状态,才可以基于此做出很多意思的应用,比如要实现一个循环队列,就可以将RESERVED状态的 job休眠掉,等没有READY状态的job时再将BURIED状态的job一次性kick回READY状态。

  • READY – 需要立即处理的任务,当延时 (DELAYED) 任务到期后会自动成为当前任务;
  • DELAYED – 延迟执行的任务, 当消费者处理任务后, 可以用将消息再次放回 DELAYED 队列延迟执行;
  • RESERVED – 已经被消费者获取, 正在执行的任务。Beanstalkd 负责检查任务是否在 TTR(time-to-run) 内完成;
  • BURIED – 保留的任务: 任务不会被执行,也不会消失,除非有人把它 “踢” 回队列;
  • DELETED – 消息被彻底删除。Beanstalkd 不再维持这些消息。

3、一些特性

优先级

任务 (job) 可以有 0~2^32 个优先级, 0 代表最高优先级,默认优先级为1024。

持久化

可以通过binlog将job及其状态记录到文件里面,在Beanstalkd下次启动时可以通过读取binlog来恢复之前的job及状态。

分布式容错

分布式设计和Memcached类似,beanstalkd各个server之间并不知道彼此的存在,都是通过client来实现分布式以及根据tube名称去特定server获取job。

超时控制

为了防止某个consumer长时间占用任务但不能处理的情况,Beanstalkd为reserve操作设置了timeout时间,如果该consumer不能在指定时间内完成job,job将被迁移回READY状态,供其他consumer执行。

三、Client Libraries For PHP

项目地址: https://github.com/pda/pheanstalk/

1、Producer 示例:向队列中添加job

$pheanstalk = new Pheanstalk_Pheanstalk('127.0.0.1');

$pheanstalk ->useTube('tubeName') ->put($jobData);

2、Consumer 示例:从队列中取出job

$job = $pheanstalk ->watch('tubeName') ->ignore('default') ->reserve();

echo $job->getData();

$pheanstalk->delete($job);

3、检查服务状态

$isAlive = $pheanstalk->getConnection()->isServiceListening(); //返回 true 或 false

4、获取某一 tube 的数据

try{
    $tubeStatus = $pheanstalk->statsTube('tubeName');
} catch (Exception $e){
    if($e->getMessage()=='Server reported NOT_FOUND'){     //tube 不存在
        $current_jobs_ready = 0;
    }
}

四、其他

1、PHP 版控制台

https://github.com/ptrofimov/beanstalk_console

2、Chrome 插件

https://chrome.google.com/webstore/detail/beanstalkd-dashboard/dakkekjnlffnecpmdiamebeooimjnipm

原文:segmentfault.com

PHP7 Support PThread

In PHP7 etc/standard/php_smart_str.h has been renamed to etc/standard/php_smart_string.h.

错误描述:

php-7.0.0beta3/ext/pthreads/php_pthreads.c:22:
./src/pthreads.h:41:10: fatal error: ‘ext/standard/php_smart_str.h’ file not
found
#include <ext/standard/php_smart_str.h>
^
1 error generated.
make: *** [php_pthreads.lo] Error 1

https://github.com/gophp7/gophp7-ext/wiki/extensions-catalog

https://github.com/krakjoe/pthreads/tree/seven

今天在github 上发现一个新的分支seven 可用在php7

下载之

使用当前最新php版本 php-7.0.0RC2

➜  /Users/liyunde/Downloads/pthreads-seven  >phpize7
Configuring for:
PHP Api Version:         20131218
Zend Module Api No:      20141001
Zend Extension Api No:   320140815

配置

➜  /Users/liyunde/Downloads/pthreads-seven  >./configure –with-php-config=php-config7 –enable-pthreads

…..

creating libtool
appending configuration tag “CXX” to libtool
configure: creating ./config.status
config.status: creating config.h

编译,安装

make -j2

make test

sudo make install

make 通过,工作正常,enjoy !

 

Excel最多可存多少行,多少列

使用Excel2007或Excel2010,在“另存为” 菜单中可以选择为“Excel 07-2003 工作薄”,从中我们可以看出,到了2007版以后,存储格式变了,简单一点从扩展名便可以看出,一个是.xls,一个是.xlsx,差异自己去体会,因为 对于我来说,Excel用得相当少。

平时多是用Number,不过一般为能用 都导出为excel格式,演示文档,内容相同的PPT2007 相对PPT2003要小很多,更方便携带。

Excel最多可存多少行,多少列?查到的资料如下:

Excel 07-2003一个工作表最多可有65536行,行用数字1—65536表示;最多可有256列,一个工作簿中最多含有255个工作表,默认情况下是三个工作表;

Excel 2007及以后版本,一个工作表最多可有1048576行,16384列;

crontab 每月最后一天

在linux中设置crontab在每月最后一天执行的两种方法:
方法一:

Linux环境:
0 23 28-31 * * [ `date -d tomorrow +\%e` -eq 1 ] && do-something
Unix,BSD,Mac环境:
0 23 28-31 * * [ `echo \`cal\` | awk ‘{print $NF}’` -eq 1 ] && do-something

方法二:
单独靠crontab判断比较复杂,所以把判断部分写到执行脚本中

#!/bin/bash
today=`date +%d`
last_day=`cal | xargs | awk ‘{print $NF}’`
if [ “$today” != “$last_day” ]; then
exit 1
fi

CRONTAB语法及应用

1:查看当前用户的定时任务

[oracle@localhost ~]$ crontab -l

* * * * * /home/oracle/test.sh >/dev/null 2>&1

2:编辑当前用户的定时任务

可以在编辑状态修改、删除、新增一些定时任务。注释一般用#

[oracle@localhost ~]$ crontab -e

3:删除当前用户的定时任务

[root@localhost ~]# crontab -r

[root@localhost ~]# crontab -l

no crontab for root

4如下所示,一般crontab文件里面的定时任务格式如下所示:

59 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1

crontab 文件中每个条目中各个域的意义和格式:

第一列 分钟: 1——59

第二列 小时: 1——23(0表示子夜)

第三列 日 : 1——31

第四列 月 : 1——12

第五列 星期: 星期0——6(0表示星期天,1表示星期一、以此类推)

第六列 要运行的命令

我们暂且用C1、C2、C3、C4、C5、C6代表这六列,前面五列通过组合方式来决定执行脚本的频率,最小频率为每分钟执行一次,其中Cn可以用 * ; */n ; T1-T2; a,b,c; 四种形式来表示:

当 C1 为 * 时表示每分钟都要执行脚本,C2 为 * 时表示每小时都要执行程式,依次类推…..

当 C1 为 T1-T2 时表示从第 T1 分钟到第 T2 分钟这段时间内要执行,C2 为 T1-T2 时表示从第 T1 到第 T2 小时都要执行,依次类推….

当 C1 为 */n 时表示每 n 分钟的时间间隔执行一次,C2 为 */n 表示每隔n小时的间隔执行一次,依次类推…..

当 C1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,C2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,依次类推….

下面列举几个例子供大家参考

1: 59 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1

表示每天23点59分执行脚本/home/oracle/scripts/alert_log_archive.sh

2: */5 * * * * /home/oracle/scripts/monitoring_alert_log.sh >/dev/null 2>&1

表示每5分钟执行一次脚本/home/oracle/scripts/monitoring_alert_log.sh

3: 0 20 * * 1-5 mail -s “**********” haha@liyunde.com < /tmp/maildata

周一到周五每天下午 20:00 寄一封信给 haha@liyunde.com

……………………………………….

关于 >/dev/null 2>&1 的解释:

0表示键盘输入

1表示标准输出

2表示错误输出.

我们首先创建test.sh脚本如下:

#! /bin/sh

echo “hello, everybody, now is ” `date`

date >> test.txt

然后添加作业

* * * * * /home/oracle/test.sh >/home/oracle/log.txt & 默认值为1,即和下面命令一致

* * * * * /home/oracle/test.sh 1>/home/oracle/log.txt &

* * * * * /home/oracle/test.sh 2>/home/oracle/log.txt &

* * * * * /home/oracle/test.sh 2>/home/oracle/log.txt 2>&1 &

1,2将tesh.sh 命令输出重定向到log.txt, 即输出内容不打印到屏幕上,而是输出到log.txt文件中。如果你需要追加而不是覆盖,可以用 >>代替>

2>&1 是将错误输出重定向到标准输出。 然后将标准输入重定向到文件log.txt。

&1 表示的是文件描述1,表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。

注意事项:

配置定时任务时,需要注意两个问题:

1: 在SHELL中设置了必要的环境变量;例如一个shell脚本手工执行OK,但是配置成后台作业执行时,获取不到ORACLE的环境变量,这是因为 crontab环境变量问题,Crontab的环境默认情况下并不包含系统中当前用户的环境。所以,你需要在shell脚本中添加必要的环境变量的设置

2: 尽量所有的文件都采用完全路径方式,避免使用相对路径。

更新到10.10.3,但是出现finder缓慢,文件夹长时间菊花问题

问题出现:

更新后,finder只要打开本次启动没打开过的文件夹,就会转很久菊花(窗口右下角状态栏),才能刷出来。
删除到废纸篓和清空都变得很缓慢 有卡顿。其它程序打开文件时调用finder 选择文件也变得很慢。

解决方案:

1,如果使用了内存盘,请关闭RamDisk
2.  去掉系统文件的ln 特别是tmp ,cache,logs,并放回原来的位置,
如果不在系统默认位置,依然会菊花很久,/var/folders/xx/乱序码/T,是放用户临时文件的地方,不能换位置,也不能放内存盘,不然就会菊花
3. 要关闭系统,再启动,用重启好像是不行地,(reboot也不行)
4.可以回复ram使用,不过依然会有些小问题,还是不要用了,对磁盘读写负担没有减少

 

同类问题: http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1591396

@liyunde

Linux Shell编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。

Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。

利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

#!/bin/sh

#comments

Your commands go here

首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上”,这个符号表明下一行与此行会合并为同一行。

编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:

chmod +x filename.sh

执行脚本的方法是:

./filename.sh

下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。

#!/bin/sh

#print hello world in the console window

a = “hello world”

echo $a

Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:

variable_name = variable_value

如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:

echo “Hi, $as”

就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:

echo “Hi, ${a}s”

单引号中的变量不会进行变量替换操作。

关于变量,还需要知道几个与其相关的Linux命令。

env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。

下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。

1 #!/bin/bash
2 # we have less than 3 arguments. Print the help text:
3 if [ $# -lt 3 ]; then
4 cat<<HELP
5 ren — renames a number of files using sed regular expressions
6
7 USAGE: ren ‘regexp’ ‘replacement’ files
8 EXAMPLE: rename all *.HTM files in *.html:
9 ren ‘HTM$’ ‘html’ *.HTM
10
11 HELP
12 exit 0
13 fi
14 OLD=”$1″
15 NEW=”$2″
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if [ -f “$file” ]; then
23 newfile=`echo “$file” | sed “s/${OLD}/${NEW}/g”`
24 if [ -f “$newfile” ]; then
25 echo “ERROR: $newfile exists already”
26 else
27 echo “renaming $file to $newfile ”
28 mv “$file” “$newfile”
29 fi
30 fi
31 done

我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:

if …; then

elif …; then

else

fi

与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:

[ -f “$file” ] 判断$file是否是一个文件

[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于

[ -x “$file” ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性

[ -n “$a” ] 判断变量$a是否有值,测试空串用-z

[ “$a” = “$b” ] 判断$a和$b的取值是否相等

[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。

现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间 的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以<<开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助 信息的作用。

第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。

十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。

然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式:

while [ cond1 ] && { || } [ cond2 ] …; do

done

for var in …; do

done

for (( cond1; cond2; cond3 )) do

done

until [ cond1 ] && { || } [ cond2 ] …; do

done

在上面这些循环中,也可以使用类似C语言中的break和continue语句中断 当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。

通过这个例子我们明白了Shell Script的编写规则,但还有几件事情需要讲述一下。

第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是:

case var in

pattern 1 )

… ;;

pattern 2 )

… ;;

*)

… ;;

esac
我们再就下面一个例子,看看case语句的用法。

while getopts vc: OPTION

do

case $OPTION in

c) COPIES=$OPTARG

ehco “$COPIES”;;

v) echo “suyang”;;

\?) exit 1;;

esac

done

上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。getopts的语法如下:

getopts option_string variable

option_string中包含一串单字符选项,若getopts在命令行参数中 发现了连字符,那么它会将连字符之后的字符与option_string进行比较,若匹配成功,则把变量variable的值设为该选项,若无匹配,则把 变量的值设为?。有时候,选项还会带一个值,例如-c5等,这时要在option_string中该选项字母后面加上一个冒号,getopts发现冒号 后,会读取该值,然后将该值放入特殊变量OPTARG中。这个命令比较复杂,如有需要,读者可以详细参阅Shell编写的相关资料。

上面这个循环的作用就是依次取出脚本名称后面的选项,进行处理,如果输入了非法选项,则进入”?指定的部分,退出脚本程序。

第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。其语法如下:

select var in …; do

break;

done

例如,下面这段程序的输出是:

#!/bin/bash

echo “Your choice?”

select var in “a” “b” “c”; do

break

done

echo $var

—————————-

Your choice?

1) a

2) b

3) c

第三,Shell Script中也可以使用自定义的函数,其语法形式如下:

functionname()

{

}

例如我们可以把上面第二个例子中第四到第十二行放入一个名为help函数体内,以后每次调用的时候直接写help即可。函数中处理函数调用参数的方法是,直接用上面讲过的$1、$2来分别表示第一、第二个参数,用$*表示参数列表。

第四,我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了。Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数。

sh ?x filename.sh

这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。

http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html

移动端html5之IOS篇

一、在移动端head 中都会加入如下一些app专属的Meta元素

  1. <meta name=”viewport” content=”width=device-width, initial-scale=1,  maximum-scale=1, minimum-scale=1.0,  user-scalable=no”>
  2. <meta name=”apple-mobile-web-app-title” content=“iOS title”>
  3. <meta name=”apple-mobile-web-app-capable” content=”yes”>
  4. <meta name=”apple-mobile-web-app-status-bar-style” content=”black”>
  5. <meta name=”format-detection” content=”telephone=no”>
  6. <meta name=”format-detection” content=”address=no”>
  7. <meta name=”format-detection” content=”email=no”>
  8. <link href=”/images/apple-touch-icon-57×57.png” rel=”apple-touch-icon”>
  9. <link media=”(device-height:480px)” href=”startup/apple-touch-startup-image-640×920.png” rel=”apple-touch-startup-image”>


1、viewport 
width :这个还用说么,,你可以自己手动设置数值,也可等同于设置宽device-width
initial-scale :表示页面初始的缩放比例1:1
maximum-scale:表示允许用户缩放的最大比例
minimum-scale:表示允许用户缩放的最小比例
user-scalable:是否允许用户进行手动缩放(yes/no)

2、apple-mobile-web-app-title
网页默认的title 是不是太长了,可以自己定义一个类似ios app 名

3、apple-mobile-web-app-capable
添加到主屏后,点击图标启动后会隐藏导航和工具栏

4、apple-mobile-web-app-status-bar-style
这个我一直以为是隐藏手机顶部的条,好吧我面壁去了。
其实就是一个背景颜色,默认为白色,可以设置black 和灰色半透明 black-translucent
设置为“black-translucent”将会占据页面px位置,浮在页面上方(会覆盖页面20px高度,iphone4和itouch4的Retina屏幕为40px)

5、format-detection——telephone
默认为识别数字为电话号码,telephone=no 为禁止

6、format-detection——address
禁止跳转为地图 address=no

7、format-detection——email
禁止设置识别邮箱,email=no

8、apple-touch-icon 
设置保存到主屏的icon 图标,如果不设置默认为整个页面截图,亲测真的丑到爆好么。
<link href=”/images/apple-touch-icon-114×114.png” rel=”apple-touch-icon” sizes=”114×114″>
<link href=”/images/apple-touch-icon-120×120.png” rel=”apple-touch-icon” sizes=”120×120”>
图片尺寸可以设定为57*57(px)或者Retina可以定为114*114(px),ipad尺寸为72*72(px)

9、apple-touch-startup-image
为了高逼格,当然少不了启动动画,模拟的当然要真一些嘛。
<link media=”(device-height:480px)” href=”startup/apple-touch-startup-image-640×920.png” rel=”apple-touch-startup-image”>
<link media=”(device-height:568px)” href=”startup/apple-touch-startup-image-640×1096.png” rel=”apple-touch-startup-image”>
media
设备高度为480px 代表iPhone4/4s
设备高度为568px 代表iPhone5

二、一些元素技巧

10、文件上传
<input type=”file”> 单文件
<input type=“file” multiple > 多文件

11、直接呼出数字键盘
<input type=”tel”>

12、呼出email键盘
<input type=“email”>

13、打电话
<a href=”tel:12345654321″>打电话给我</a>

14、发短信
<a href=”sms:12345654321″>发短信</a>