Office 365 更新:可直接插入 SVG 图像

Office 365 最新更新后,可以直接在 Office 各组件中插入 SVG 图像,SVG 放大缩小都不会损耗图片品质,最广泛的应用在于各种图标图形。
更新前使用 SVG 图形,需要先使用 Adobe Illustrator 转换为增强形图元文件,再进行编辑操作。此次更新后直接使用插入即可插入 SVG 图形,并且可直接在 图形 工具 格式 选项卡中编辑图形的轮廓外观,超级方便。

可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG由W3C制定,是一个开放标准。
SVG允许3种图形对象类型:矢量图形、栅格图像以及文本。图形对象——包括PNG、JPEG这些栅格图像——能够被编组、设计、转换及集成进先前的渲染对象中。文本可以在任何适用于应用程序的XML命名空间之内,从而提高SVG图形的搜索能力和无障碍性。SVG提供的功能集涵盖了嵌套转换、裁剪路径、Alpha通道、滤镜效果、模板对象以及可扩展性。

——维基百科:可缩放向量图形

Mac 技巧:禁用 Time Machine 本地快照

time-machine

当您使用 Mac 笔记本电脑时,可能有时 Time Machine 备份驱动器不在手边。如果未连接备份驱动器,Time Machine 会制作您创建、修改或删除的文件的副本,并将其存储在启动驱动器上。这些副本称作本地快照。

为了节省磁盘空间,有必要禁用产生快照,当然是在本机电脑无重要资料且磁盘容量又不大的情况下。

命令如下:

sudo tmutil disablelocal

重新启用本地快照的命令:

sudo tmutil enablelocal

Enjoy It!

Mac 技巧:使用终端命令创建 OS X EI Capitan 系统安装盘

准备工作

  • 一个用于装载系统安装器的外置存储设备,至少拥有大于 8GB 的可用空间。
  • 从 Mac App Store 下载 OS X EI Capitan.app 安装程序。下载完成后不要进行安装,退出安装程序。
  • 使用管理员账户登录系统。

格式化 U 盘

  • 将准备好的 U 盘连接 Mac,使用 磁盘工具 抹掉。
  • 名称使用英文或者数字,eg:10.11,Captian 等(后面以10.11为例)。
  • 格式选择:OS X 扩展 (日志式)
  • 方案选择:GUID 分区图

制作安装盘

打开 终端命令(Terminal.app),输入以下命令:

sudo /Applications/Install\ OS\ X\ El\ Capitan.app/Contents/Resources/createinstallmedia --volume /Volumes/10.11 --applicationpath /Applications/Install\ OS\ X\ El\ Capitan.app --nointeraction

PS:记得将上述命令中 /Volumes/10.1110.11 更改为你自己的设备名称。

回车后会要求输入管理员密码,接下来就是等待系统开始制作启动盘了。这时,命令执行中你会陆续看到类似以下的信息:

Erasing Disk: 0%... 10%... 20%... 30%...100%...
Copying installer files to disk...
Copy complete.
Making disk bootable...
Copying boot files...
Copy complete.
Done.

当你看到最后有 Copy completeDone 字样出现就是表示启动盘已经制作完成了!

OK,可以使用这个 U 盘作为启动盘安装系统了!

Enjoy It!

VBA 开发:利用 Excel 创建 BOM 树状结构

最近在设计一个模具系统的工艺 BOM,其结构参考了 ERP 中物料 BOM 的结构样式,参考下图:

erp-bom-style

为了方便前期的数据收集,我将上面的树状结构设计成了一个 Excel 表格,表格样式见下图:

Mold-BOM-Style

表格中第1列“层次”表示项目的所在阶层的层号,即表示:第1层,第2层,第3层……;第2列“项次”表示相应阶层的顺序号,即:第2层第1项,第2层第2项,第2层第3项……

So,问题来了,在确定了项目所在层后,如果该层存在很多项时,“项次”的输入就很麻烦,导致表格的 Key-IN 负荷大大增加(~其实主要是因为我比较懒!)。如果“项次”列能够根据所在层次自动判断并输入相对应的顺序号的话,那表格的 Key-IN 负荷就会降低很多。

经过一番摸索和求助后,终于找到了解决方法(感谢 @LIUZHU):

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r%, i%, n%
    Dim Arr()

    If Target.Cells.Count > 1 Then Exit Sub
    If Target.Column <> 1 Then Exit Sub
    If Target.Row = 1 Then Exit Sub

    If Target.Row = 2 Then
        Target.Offset(0, 1).Value = 1
    Else
        r = Target.Row
        Arr = Range("A2:B" & r).Value

        For i = UBound(Arr) - 1 To 1 Step -1
            If Arr(i, 1) = Target.Value Then
                n = n + 1
            ElseIf Arr(i, 1) < Target.Value Then
                n = n + 1
                Arr(UBound(Arr), 2) = n
                Exit For
            End If
        Next
        Range("A2:B" & r).Value = Arr
    End If
End Sub

如果你也有同样的需求,不妨试一下上面这个方法!

Enjoy It!

写在25%:不劳无获

no pains no gains

昨天晚上完成第25个作品时,回头看了一下更新的作品列表,一股成就感油然而生,哈哈!~在刚开始的那几天,或许连我自己都不相信能坚持下来,以前想坚持做一件事,总是半途而废……

正如上图中的那四个字:不劳无获,就是这25天最切切实实的感受。虽然每天晚上都加班至深夜,但这一个月来的收获,总是给我坚持的动力,希望在接下来的日子里,继续加油!~

为了未来!

CS106A 学习笔记(9):Assignment #2-1

cs106a-assignment-2-1

主要思路:

  • 从下往上,最底层(第0行),有14块砖;第1行,有13块砖;第2行,有12块砖…
  • 以此类推,每一行的砖块数量等于底层数(14)减去行数
  • 获取砖块放置的坐标:
    • 横坐标:窗口宽度/2 – 每行砖块总宽度/2 + 相应砖块的数量的宽度
    • 纵坐标:窗口高度 – 相应行数砖块的高度

参考代码:

/*
 * File:    Pyramid.java
 * -------------------------
 * Draws a pyramid consisting of bricks arranged in horizontal rows.
 */

import acm.program.*;
import acm.graphics.*;

public class Pyramid extends GraphicsProgram {

    private static final int BRICK_WIDTH = 30; // brick 宽度:30px
    private static final int BRICK_HEIGHT = 12; // brick 高度:12px
    private static final int BRICK_IN_BASE =14; // 底层 brick 数量:14

    public void run() {

        /*
         * 从下往上,第0行,14个 bricks;第1行,13个 bricks;第2行,12个 bricks;
         * 所以,每一行的 bricks 数量为 BRICK_IN_BASE - 行数;
         * 总共 14 行;
         */

        // 主循环,定义行数
        for (int row = 0; row < BRICK_IN_BASE; row++) {
            int bricksInRow = BRICK_IN_BASE - row; // 每一行brick的数量等于底层数量减去行数

            // 定位每行中bricks的位置
            for (int brickNum = 0; brickNum < bricksInRow; brickNum++) {

                // brick 横坐标
                int x = getWidth() / 2 - ( BRICK_WIDTH * bricksInRow ) /2 + brickNum * BRICK_WIDTH;
                // brick 纵坐标
                int y = getHeight() - BRICK_HEIGHT * ( row + 1 );
                // 添加bricks
                GRect brick = new GRect ( x, y, BRICK_WIDTH, BRICK_HEIGHT );
                add(brick);
            }
        }
    }

}