Shared Stuff - a new Google service

Google推出的SharedStuff服务,旨在方便用户标记有价值的网页。目前体验欠佳,与del.icio.us相比缺乏高效的功能,如Firefox插件。未来有望与GoogleReader整合,并可能支持离线功能。
    Shared Stuff是Google新推出的一项服务。今天刚刚从 Google Reader中听说。简单看了下,貌似跟 del.icio.us差不多吧。Google现有的类似服务有Google Reader附带的Shared Items( 这里是我的shared items)以及 Google Bookmark,不清楚这个新的Shared Stuff将来会是什么样子,我猜想Google会把这三者进一步的整合吧。

   Shared Stuff提供的目前就是一段js,添加到浏览器的bookmark里面作为一个按钮。当看到需要mark的有价值的网页,click这个按钮就可以,但是实在慢的要死,我点击之后半天才显示出来界面,然后想输入注释以及tag,又是半天没反应,所以我感觉目前基本上不可用。相比之下del.icio.us就已经有了一个非常好的FireFox插件(在 这里下载)。所以,Google Shared Stuff需要改进的空间是非常非常大滴。

   GMailGoogle ToolBarGoogle DesktopGoogle DocsGoogle Gears,一路走来,让人觉得Google越来越像微软了,确实有了垄断互联网之嫌,而且除了这点,模糊桌面和web之间的差别的用意也很明显(当然,有此想法的不止Google一家,RIA已经成了大家的共识了),特别是Gears出来之后,我觉得将来Google的RIA应用一定非常之多,现在的Google Reader只不过是Google第一个下水的产品。未来,我想Gmail,Google Docs这些都必然会用到Gears,支持离线功能的。而离线的时候查看收藏的条目也是很实用性的功能,所以Shared Stuff将来估摸着也会被gears滴。

   记得最早的时候Google只有搜索的时候,每个人都很喜欢Google,特别是"Don't be evil"的信条更是让大家奉为经典。我个人直到Gmail推出,都一直是一个Gfans,但是之后随着Google提供的服务越来越多,我使用的越来越多,以及"谷歌"的成立以及谷歌在中国干的那些个破事儿,让我越来越不放心Google(谷歌),越来越去怀疑。其实有时想想,商业公司真正追求的永远只有利润,而不是" 为每一个人整合全球信息,让人人能获取,使人人都受益"什么扯淡的话。而"Don't be evil"也不是什么信条,而仅仅是一句口号罢了。必要时刻,也是需要违反的。譬如Google当年的另外一句口号:让用户尽快离开自己的网站。再看如今有了Gmail/Gtalk,Google Reader缠身,用户黏度那是噌噌的往上彪,还离得开不?

   以前一直用del.icio.us来收藏网页,自从把RSS Reader从 Bloglines换到Google Reader之后,在Google Reader里看到想收藏的东西就直接用自带的shared items功能了。所以用到del.icio.us的频率变得越来越少,只在随意浏览的时候碰到值得收藏的条目时才用到。所以如果说Shared Stuff将来能有足够的可用性,和Google Reader自带的Shared Items结合起来,完全替代了del.icio.us也好。把所有收藏的页面聚合到一起也省事了。省的找文章的时候不知道去哪个网站找好。当然,最好能提供导入功能,把del.icio.us等等的网站的数据导进去,这样就一劳永逸了。

Update:最后加一句,我的Shared Stuff地址如下,欢迎访问  ^_^
http://www.google.com/s2/sharing/stuff?user=108019549327864760674
一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
你提到的这些初始化代码是 C/C++ 中对结构体成员逐个赋初值的方式。虽然功能上没有问题,但这种方式 **可读性差、易出错、维护困难**,特别是当 `sharedData` 指向的是一个复杂的嵌套结构体时。 ### ✅ 更好的初始化方式 以下是几种更优雅、安全、可维护的初始化方法: --- ## ✅ 推荐方案 1:使用 **构造函数式初始化(Designated Initializers)**(C99/C++20 支持) 如果你是在使用支持 **C99 或 GNU C / C++20** 的编译器(如 GCC),推荐使用 **指定初始化器(Designated Initializers)** 来定义默认值模板。 ```c // 假设 sharedData 是指向某个全局共享结构体的指针 typedef struct { char domain_name[64]; char authorization[64]; int request_time; time_t dev_time; } SysConfig; typedef struct { bool spectrum_flags; float* spectrum_array; } SpectrumInfo; typedef struct { bool usb_recv_freq_video_flag; SysConfig sys_config; SpectrumInfo spectrumInfo; bool set_compass_data_flags; float set_compass_data; void* msg_array; bool verify_area_gps_flags; bool isVerify; bool http_verify; int verify_error_code; bool calibration_heading_thread_flags; float calibration_heading; void* mqtt_discover_array; void* mqtt_local_discover_array; } SharedData; // 定义一个默认初始化模板(静态常量) static const SharedData DEFAULT_SHARED_DATA = { .usb_recv_freq_video_flag = false, .sys_config = { .request_time = 10, .dev_time = 0 }, .spectrumInfo = { .spectrum_flags = false, .spectrum_array = NULL }, .set_compass_data_flags = false, .set_compass_data = 0.0f, .msg_array = NULL, .verify_area_gps_flags = false, .isVerify = false, .http_verify = false, .verify_error_code = 2, .calibration_heading_thread_flags = true, .calibration_heading = 0.0f, .mqtt_discover_array = NULL, .mqtt_local_discover_array = NULL }; // 字符串需要单独处理(不能在 const 结构中直接初始化 char[]) void init_shared_data(SharedData* sharedData) { // 先拷贝整个默认结构 *sharedData = DEFAULT_SHARED_DATA; // 单独设置字符串(因为 char[] 不可 memcpy 初始化为字符串字面量) snprintf(sharedData->sys_config.domain_name, sizeof(sharedData->sys_config.domain_name), "%s", "123.56.10.90:8098"); snprintf(sharedData->sys_config.authorization, sizeof(sharedData->sys_config.authorization), "%s", "79ee8ef4271d4f4d9b99c2d36aa1bcb1"); } ``` ### ✅ 使用示例: ```c SharedData* sharedData = malloc(sizeof(SharedData)); init_shared_data(sharedData); ``` --- ### 🔍 解释说明: - `.field = value` 是 **指定初始化器(designated initializer)**,C99 标准引入,GCC 和 Clang 广泛支持。 - 使用 `const` 模板可以避免重复写一堆赋值语句。 - 字符串字段无法直接在 `const` 结构中初始化(因为 `char[]` 是数组,不是指针),所以必须在运行时用 `snprintf` 或 `strncpy` 设置。 - 这种方式 **清晰、集中管理默认值、易于修改和测试**。 --- ## ✅ 推荐方案 2:封装为初始化函数(适用于纯 C89 或嵌入式环境) 如果不能用 C99 特性(比如某些老旧嵌入式系统),建议将初始化逻辑封装成函数: ```c void init_shared_data(SharedData* sharedData) { memset(sharedData, 0, sizeof(*sharedData)); // 先清零 // 再设置非零默认值 sharedData->usb_recv_freq_video_flag = false; sharedData->sys_config.request_time = 10; sharedData->sys_config.dev_time = 0; sharedData->spectrumInfo.spectrum_flags = false; sharedData->set_compass_data_flags = false; sharedData->set_compass_data = 0.0f; sharedData->msg_array = NULL; sharedData->verify_area_gps_flags = false; sharedData->isVerify = false; sharedData->http_verify = false; sharedData->verify_error_code = 2; sharedData->calibration_heading_thread_flags = true; sharedData->calibration_heading = 0.0f; sharedData->mqtt_discover_array = NULL; sharedData->mqtt_local_discover_array = NULL; // 单独设置字符串 snprintf(sharedData->sys_config.domain_name, sizeof(sharedData->sys_config.domain_name), "%s", "123.56.10.90:8098"); snprintf(sharedData->sys_config.authorization, sizeof(sharedData->sys_config.authorization), "%s", "79ee8ef4271d4f4d9b99c2d36aa1bcb1"); } ``` > ⚠️ 注意:`memset(..., 0, ...)` 对于指针和整型/布尔值是安全的,但对于浮点数或复杂类型要小心(不过这里没问题)。 --- ## ✅ 推荐方案 3:结合配置文件 or JSON(高级场景) 对于更灵活的需求(如参数可配置),可以把默认值放在外部配置文件中(JSON、ini 等),程序启动时加载: ```json { "sys_config": { "domain_name": "123.56.10.90:8098", "authorization": "79ee8ef4271d4f4d9b99c2d36aa1bcb1", "request_time": 10, "dev_time": 0 }, "flags": { "usb_recv_freq_video_flag": false, "spectrum_flags": false, "verify_area_gps_flags": false, "isVerify": false, "http_verify": false, "calibration_heading_thread_flags": true }, "values": { "verify_error_code": 2, "calibration_heading": 0.0 } } ``` 然后用 [cJSON](https://github.com/DaveGamble/cJSON) 或其他库解析加载。 --- ## ✅ 小贴士:关于 `snprintf` 的写法优化 你当前写的: ```c snprintf(sharedData->sys_config.domain_name, sizeof(...), "%s", "xxx"); ``` 其实等价于更简洁安全的: ```c strncpy(sharedData->sys_config.domain_name, "123.56.10.90:8098", sizeof(sharedData->sys_config.domain_name) - 1); sharedData->sys_config.domain_name[sizeof(sharedData->sys_config.domain_name) - 1] = '\0'; ``` 或者更现代一点: ```c snprintf(sharedData->sys_config.domain_name, sizeof(sharedData->sys_config.domain_name), "123.56.10.90:8098"); ``` 👉 不需要 `%s` 包一层,直接传字符串就行! --- ### ✅ 总结对比 | 方法 | 优点 | 缺点 | 适用场景 | |------|------|------|---------| | 指定初始化器(C99) | 清晰、集中、高效 | 需要 C99+ 支持 | 推荐(现代 C) | | 初始化函数 + memset | 兼容性好 | 易漏赋值 | 老旧系统 | | 配置文件加载 | 可配置、灵活 | 复杂、依赖解析库 | 参数频繁变更 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值