轻量级微服务架构下总结

轻量级的微服务 总结:整个微服务使用Spring boot + Docker 冰山上,ZooKeeper服务注册、Node.js服务网关、Jenkins等冰山下。 总体上可以分为:开发框架(上)、容器技术(上)、注册中心(下)、调用中心、部署中心、日志中心、监控中心、追踪中心、消息中心、配置中心。 注册中心:用于注册微服务相关配置信息的中心 调用中心:用于提供给前端调用的统一入口(我们选用Node.js实现) 部署中心:用于编译并打包微服务源码并将其部署到Docker引擎中(Jenkins) 日志中心:用于收集并管理微服务应用程序中产生的日志 监控中心:用于监控微服务的实时运行状况 追踪中心:用于最终微服务的调用轨迹 消息中心:用于解耦服务之间的调用关系 配置中心:用于管理微服务应用程序所需的配置参数 (我们认为,中心分为两类:一类是含有业务意义的中心,另一类是不含业务意义的中心-只是技术层面的中心) 微服务日志 总结:docker中查看日志路径 /var/lib/docker/containers/<container_id目录看到一个container_id-json.log文件,Docker默认使用docker logs查看的就是这些json文件,Docker默认使用Json-file格式,还有其他格式 none:容器不输出任何日志 json-file:容器默认输出的日志以json格式写入文件中(默认) syslog:容器输出日志写入宿主机的Syslog中 journald:容器输出日志写入宿主机的Journald中 gelf:容器输出的日志以GELF(Graylog Extended log fromat)格式写入Graylog中 fluentd: 容器输出的日志写入宿主机的Fluentd中 awalogs:容器输出日志写入Ammazon CloudWatch Logs中 splunk:容器输出日志写入splunk中 etwlogs:容器输出日志写入ETW (event tracing for windows)中 gcplogs:容器输出日志写入GCP(Google Cloud Platform)中 nats:容器输出日志写入NATS服务器中 docker中 –log-driver参数配置日志驱动 –log-opt max-size –log-opt max-file 分别设置日志文件大小和日志文件数量 例如:docker run -p 80:80 –log-dirver json-file –log-opt max-size=10m –log-opt max-file=3 –name xxx 容器名称 docker日志驱动(https://docs.docker.com/engine/admin/logging/overview/) ...

2018年8月26日 · 1 分钟 · 天边的星星

Android hdpi ldpi mdpi xhdpi xxhdpi适配详解

1、了解几个概念 (1)分辨率。分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920等。720×1280表示此屏幕在宽度方向有720个像素,在高度方向有1280个像素。 (2)屏幕大小。屏幕大小是手机对角线的物理尺寸,以英寸(inch)为单位。比如某某手机为“5寸大屏手机”,就是指对角线的尺寸,5寸×2.54厘米/寸=12.7厘米。 (3)密度(dpi,dots per inch;或PPI,pixels per inch)。从英文顾名思义,就是每英寸的像素点数,数值越高当然显示越细腻。假如我们知道一部手机的分辨率是1080×1920,屏幕大小是5英寸,你 能否算出此屏幕的密度呢?哈哈,中学的勾股定理派上用场啦!通过宽1080和高1920,根据勾股定理,我们得出对角线的像素数大约是2203,那么用 2203除以5就是此屏幕的密度了,计算结果是440。440dpi的屏幕已经相当细腻了。 2、实际密度与系统密度 尚未发现他处使用“实际密度”和“系统密度”这两个词汇,暂时由我如此定义吧。 “实际密度”就是我们自己算出来的密度,这个密度代表了屏幕真实的细腻程度,如上述例子中的440dpi就是实际密度,说明这块屏幕每寸有440个 像素。5英寸1080×1920的屏幕密度是440,而相同分辨率的4.5英寸屏幕密度是490。如此看来,屏幕密度将会出现很多数值,呈现严重的碎片 化。而密度又是安卓屏幕将界面进行缩放显示的依据,那么安卓是如何适配这么多屏幕的呢? 其实,每部安卓手机屏幕都有一个初始的固定密度,这些数值是120、160、240、320、480,我们权且称为“系统密度”。大家发现规律没 有?相隔数值之间是2倍的关系。一般情况下,240×320的屏幕是低密度120dpi,即ldpi;320×480的屏幕是中密度160dpi,即 mdpi;480×800的屏幕是高密度240dpi,即hdpi;720×1280的屏幕是超高密度320dpi,即xhdpi;1080×1920的 屏幕是超超高密度480dpi,即xxhdpi。 安卓对界面元素进行缩放的比例依据正是系统密度,而不是实际密度。 3、一个重要的单位dp dp也可写为dip,即density-independent pixel。你可以想象dp更类似一个物理尺寸,比如一张宽和高均为100dp的图片在320×480和480×800的手机上“看起来”一样大。而实际 上,它们的像素值并不一样。dp正是这样一个尺寸,不管这个屏幕的密度是多少,屏幕上相同dp大小的元素看起来始终差不多大。 另外,文字尺寸使用sp,即scale-independentpixel的缩写,这样,当你在系统设置里调节字号大小时,应用中的文字也会随之变大变小。 4、dp与px的转换 在安卓中,系统密度为160dpi的中密度手机屏幕为基准屏幕,即320×480的手机屏幕。在这个屏幕中,1dp=1px。 100dp在320×480(mdpi,160dpi)中是100px。那么100dp在480×800(hdpi,240dpi)的手机上是多少 px呢?我们知道100dp在两个手机上看起来差不多大,根据160与240的比例关系,我们可以知道,在480×800中,100dp实际覆盖了 150px。因此,如果你为mdpi手机提供了一张100px的图片,这张图片在hdpi手机上就会拉伸至150px,但是他们都是100dp。 中密度和高密度的缩放比例似乎可以不通过160dpi和240dpi计算,而通过320px和480px也可以算出。但是按照宽度计算缩放比例不适 用于超高密度xhdpi和超超高密度xxhdpi了。即720×1280中1dp是多少px呢?如果用720/320,你会得出1dp=2.25px,实 际这样算出来是不对的。dp与px的换算要以系统密度为准,720×1280的系统密度为320,320×480的系统密度为 160,320/160=2,那么在720×1280中,1dp=2px。同理,在1080×1920中,1dp=3px。 大家可以记住下面这个比例,dp与px的换算就十分easy啦! ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12,我们发现,相隔数字之间还是2倍的关系。计算的时候,以mdpi 为基准。比如在720×1280(xhdpi)中,1dp等于多少px呢?mdpi是4,xhdpi是8,2倍的关系,即1dp=2px。反着计算更重 要,比如你用PhotoShop在720×1280的画布中制作了界面效果图,两个元素的间距是20px,那要标注多少dp呢?2倍的关系,那就是 10dp! 当安卓系统字号设为“普通”时,sp与px的尺寸换算和dp与px是一样的。比如某个文字大小在720×1280的PS画布中是24px,那么告诉工程师,这个文字大小是12sp。 5、建议在xdhpi中作图 安卓手机有这么多屏幕,我到底依据哪种屏幕作图呢?没有必要为不同密度的手机都提供一套素材,大部分情况下,一套就够了。 现在手机比较高的分辨率是1080×1920,你可以选择这个尺寸作图,但是图片素材将会增大应用安装包的大小。并且尺寸越大的图片占用的内存也就 越高。如果你不是设计ROM,而是做一款应用,我建议大家用PS在720×1280的画布中作图。这个尺寸兼顾了美观性、经济性和计算的简单。美观性是 指,以这个尺寸做出来的应用,在720×1280中显示完美,在1080×1920中看起来也比较清晰;经济性是指,这个分辨率下导出的图片尺寸适中,内 存消耗不会过高,并且图片文件大小适中,安装包也不会过大;计算的简单,就是1dp=2px啊,多好计算啊! 做出来的图片,记着让界面工程师放进drawable-xhdpi的资源文件夹中。 6、屏幕的宽高差异 在720×1280中作图,要考虑向下兼容不同的屏幕。通过计算我们可以知道,320×480和480×800的屏幕宽度都是320dp,而 720×1280和1080×1920的屏幕宽度都是360dp。它们之间有40dp的差距,这40dp在设计中影响还是很大的。如下图蝴蝶图片距离屏幕 的左右边距在320dp宽的屏幕和360dp宽的屏幕中就不一样。 不仅宽度上有差异,高度上的差异更加明显。对于天气等工具类应用,由于界面一般是独占式的,更要考虑屏幕之间的比例差异 如果想消除这些比例差异,可以通过添加布局文件来实现。一般情况下,布局文件放在layout文件夹中,如果要单独对360dp的屏幕进行调整,你 可以单做做一个布局文件放在layout-w360dp中;如果你想对某个特殊的分辨率进行调整,那么你可以将布局文件放在标有分辨率的文件夹中,如 layout-854×480。 7、几个资源的文件夹 在720×1280中做了图片,要让开发人员放到drawable-xhdpi的资源文件夹中,这样才可以显示正确。个人认为仅提供一套素材就可以 了,可以测试一下应用在低端手机上运行是否流畅,如果比较卡顿,可以根据需要提供部分mdpi的图片素材,因为xhdpi中的图片运行在mdpi的手机上 会比较占内存。 以应用图标为例,xhdpi中的图标大小是96px,如果要单独给mdpi提供图标,那么这个图标大小是48px,放到drawable-mdpi 的资源文件夹中。各个资源文件夹中的图片尺寸同样符合ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12的规律。 如果你把一个高2px的分割线素材做成了9.png图片,你想让细线在不同密度中都是2px,而不被安卓根据密度进行缩放,怎么办?你可以把这个分 割线素材放到drawable-nodpi中,这个资源文件夹中的图片,将按照实际像素大小进行显示,而不会被安卓根据密度进行缩放。即在mdpi中细线 是2px(2dp),在xhdpi中细线是2px(1dp)。 ...

2018年8月22日 · 2 分钟 · 天边的星星

Android实现斑马Wifi打印机打印小票图片

最近一期做WiFi打印机打印小票功能,其中有一个功能点是把Logo打印在小票上面。 实现思路就是对网上的思路进行一下调整修改,方便Android端调用,很简单; 测试的打印机型号:Zebra GK888T Bitmap to ZPL <div class="line"> 1 </div> <div class="line"> 2 </div> <div class="line"> 3 </div> <div class="line"> 4 </div> <div class="line"> 5 </div> <div class="line"> 6 </div> <div class="line"> 7 </div> <div class="line"> 8 </div> <div class="line"> 9 </div> <div class="line"> 10 </div> <div class="line"> 11 </div> <div class="line"> 12 </div> <div class="line"> 13 </div> <div class="line"> 14 </div> <div class="line"> 15 </div> <div class="line"> 16 </div> <div class="line"> 17 </div> <div class="line"> 18 </div> <div class="line"> 19 </div> <div class="line"> 20 </div> <div class="line"> 21 </div> <div class="line"> 22 </div> <div class="line"> 23 </div> <div class="line"> 24 </div> <div class="line"> 25 </div> <div class="line"> 26 </div> <div class="line"> 27 </div> <div class="line"> 28 </div> <div class="line"> 29 </div> <div class="line"> 30 </div> <div class="line"> 31 </div> <div class="line"> 32 </div> <div class="line"> 33 </div> <div class="line"> 34 </div> <div class="line"> 35 </div> <div class="line"> 36 </div> <div class="line"> 37 </div> <div class="line"> 38 </div> <div class="line"> 39 </div> <div class="line"> 40 </div> <div class="line"> 41 </div> <div class="line"> 42 </div> <div class="line"> 43 </div> <div class="line"> 44 </div> <div class="line"> 45 </div> <div class="line"> 46 </div> <div class="line"> 47 </div> <div class="line"> 48 </div> <div class="line"> 49 </div> <div class="line"> 50 </div> <div class="line"> 51 </div> <div class="line"> 52 </div> <div class="line"> 53 </div> <div class="line"> 54 </div> <div class="line"> 55 </div> <div class="line"> 56 </div> <div class="line"> 57 </div> <div class="line"> 58 </div> <div class="line"> 59 </div> <div class="line"> 60 </div> <div class="line"> 61 </div> <div class="line"> 62 </div> <div class="line"> 63 </div> <div class="line"> 64 </div> <div class="line"> 65 </div> <div class="line"> 66 </div> <div class="line"> 67 </div> <div class="line"> 68 </div> <div class="line"> 69 </div> <div class="line"> 70 </div> <div class="line"> 71 </div> <div class="line"> 72 </div> <div class="line"> 73 </div> <div class="line"> 74 </div> <div class="line"> 75 </div> <div class="line"> 76 </div> <div class="line"> 77 </div> <div class="line"> 78 </div> <div class="line"> 79 </div> <div class="line"> 80 </div> <div class="line"> 81 </div> <div class="line"> 82 </div> <div class="line"> 83 </div> <div class="line"> 84 </div> <div class="line"> 85 </div> <div class="line"> 86 </div> <div class="line"> 87 </div> <div class="line"> 88 </div> <div class="line"> 89 </div> <div class="line"> 90 </div> <div class="line"> 91 </div> <div class="line"> 92 </div> <div class="line"> 93 </div> <div class="line"> 94 </div> <div class="line"> 95 </div> <div class="line"> 96 </div> <div class="line"> 97 </div> <div class="line"> 98 </div> <div class="line"> 99 </div> <div class="line"> 100 </div> <div class="line"> 101 </div> <div class="line"> 102 </div> <div class="line"> 103 </div> <div class="line"> 104 </div> <div class="line"> 105 </div> <div class="line"> 106 </div> <div class="line"> 107 </div> <div class="line"> 108 </div> <div class="line"> 109 </div> <div class="line"> 110 </div> <div class="line"> 111 </div> <div class="line"> 112 </div> <div class="line"> 113 </div> <div class="line"> 114 </div> <div class="line"> 115 </div> <div class="line"> 116 </div> <div class="line"> 117 </div> <div class="line"> 118 </div> <div class="line"> 119 </div> <div class="line"> 120 </div> <div class="line"> 121 </div> <div class="line"> 122 </div> <div class="line"> 123 </div> <div class="line"> 124 </div> <div class="line"> 125 </div> <div class="line"> 126 </div> <div class="line"> 127 </div> <div class="line"> 128 </div> <div class="line"> 129 </div> <div class="line"> 130 </div> <div class="line"> 131 </div> <div class="line"> 132 </div> <div class="line"> 133 </div> <div class="line"> 134 </div> <div class="line"> 135 </div> <div class="line"> 136 </div> <div class="line"> 137 </div> <div class="line"> 138 </div> <div class="line"> 139 </div> <div class="line"> 140 </div> <div class="line"> 141 </div> <div class="line"> 142 </div> <div class="line"> 143 </div> <div class="line"> 144 </div> <div class="line"> 145 </div> <div class="line"> 146 </div> <div class="line"> 147 </div> <div class="line"> 148 </div> <div class="line"> 149 </div> <div class="line"> 150 </div> <div class="line"> 151 </div> <div class="line"> 152 </div> <div class="line"> 153 </div> <div class="line"> 154 </div> <div class="line"> 155 </div> <div class="line"> 156 </div> <div class="line"> 157 </div> <div class="line"> 158 </div> <div class="line"> 159 </div> <div class="line"> 160 </div> <div class="line"> 161 </div> <div class="line"> 162 </div> <div class="line"> 163 </div> <div class="line"> 164 </div> <div class="line"> 165 </div> <div class="line"> 166 </div> <div class="line"> 167 </div> <div class="line"> 168 </div> <div class="line"> 169 </div> <div class="line"> 170 </div> <div class="line"> 171 </div> <div class="line"> 172 </div> <div class="line"> 173 </div> <div class="line"> 174 </div> <div class="line"> 175 </div> <div class="line"> 176 </div> <div class="line"> 177 </div> <div class="line"> 178 </div> <div class="line"> 179 </div> <div class="line"> 180 </div> <div class="line"> 181 </div> <div class="line"> 182 </div> <div class="line"> 183 </div> <div class="line"> 184 </div> <div class="line"> 185 </div> <div class="line"> 186 </div> <div class="line"> 187 </div> <div class="line"> 188 </div> <div class="line"> 189 </div> <div class="line"> 190 </div> <div class="line"> 191 </div> <div class="line"> 192 </div> <div class="line"> 193 </div> <div class="line"> 194 </div> <div class="line"> 195 </div> <div class="line"> 196 </div> <div class="line"> 197 </div> <div class="line"> 198 </div> </td> <td class="code"> <div class="top-box hide"> <div class="alert-info"> </div> </div> <div class="line"> </div> <div class="line"> <span class="comment">/**</span> </div> <div class="line"> </div> <div class="line"> */ </div> <div class="line"> <span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ZPLImageConverter</span> </span>{ </div> <div class="line"> </div> <div class="line"> <span class="keyword">private</span> Context context; </div> <div class="line"> </div> <div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">ZPLImageConverter</span><span class="params">(Context context)</span> </span>{ </div> <div class="line"> <span class="keyword">this</span>.context = context; </div> <div class="line"> } </div> <div class="line"> </div> <div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> blackLimit = <span class="number">380</span>; </div> <div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> total; </div> <div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> widthBytes; </div> <div class="line"> <span class="keyword">private</span> <span class="keyword">boolean</span> compressHex = <span class="keyword">false</span>; </div> <div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Map<Integer, String> mapCode = <span class="keyword">new</span> HashMap<Integer, String>(); </div> <div class="line"> </div> <div class="line"> { </div> <div class="line"> mapCode.put(<span class="number">1</span>, <span class="string">&#8220;G&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">2</span>, <span class="string">&#8220;H&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">3</span>, <span class="string">&#8220;I&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">4</span>, <span class="string">&#8220;J&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">5</span>, <span class="string">&#8220;K&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">6</span>, <span class="string">&#8220;L&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">7</span>, <span class="string">&#8220;M&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">8</span>, <span class="string">&#8220;N&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">9</span>, <span class="string">&#8220;O&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">10</span>, <span class="string">&#8220;P&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">11</span>, <span class="string">&#8220;Q&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">12</span>, <span class="string">&#8220;R&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">13</span>, <span class="string">&#8220;S&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">14</span>, <span class="string">&#8220;T&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">15</span>, <span class="string">&#8220;U&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">16</span>, <span class="string">&#8220;V&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">17</span>, <span class="string">&#8220;W&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">18</span>, <span class="string">&#8220;X&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">19</span>, <span class="string">&#8220;Y&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">20</span>, <span class="string">&#8220;g&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">40</span>, <span class="string">&#8220;h&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">60</span>, <span class="string">&#8220;i&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">80</span>, <span class="string">&#8220;j&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">100</span>, <span class="string">&#8220;k&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">120</span>, <span class="string">&#8220;l&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">140</span>, <span class="string">&#8220;m&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">160</span>, <span class="string">&#8220;n&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">180</span>, <span class="string">&#8220;o&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">200</span>, <span class="string">&#8220;p&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">220</span>, <span class="string">&#8220;q&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">240</span>, <span class="string">&#8220;r&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">260</span>, <span class="string">&#8220;s&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">280</span>, <span class="string">&#8220;t&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">300</span>, <span class="string">&#8220;u&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">320</span>, <span class="string">&#8220;v&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">340</span>, <span class="string">&#8220;w&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">360</span>, <span class="string">&#8220;x&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">380</span>, <span class="string">&#8220;y&#8221;</span>); </div> <div class="line"> mapCode.put(<span class="number">400</span>, <span class="string">&#8220;z&#8221;</span>); </div> <div class="line"> } </div> <div class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">convertFromImg</span><span class="params">(Bitmap image)</span> <span class="keyword">throws</span> IOException </span>{ </div> <div class="line"> </div> <div class="line"> String cuerpo = createBody(image); </div> <div class="line"> <span class="keyword">if</span>(compressHex) </div> <div class="line"> cuerpo = encodeHexAscii(cuerpo); </div> <div class="line"> <span class="keyword">return</span> headDoc() + cuerpo + footDoc(); </div> <div class="line"> } </div> <div class="line"> </div> <div class="line"> <span class="function"><span class="keyword">private</span> String <span class="title">createBody</span><span class="params">(Bitmap originalImage)</span> <span class="keyword">throws</span> IOException </span>{ </div> <div class="line"> StringBuffer sb = <span class="keyword">new</span> StringBuffer(); </div> <div class="line"> <span class="comment">// Graphics2D graphics = originalImage.createGraphics();</span> </div> <div class="line"> <span class="comment">// graphics.drawImage(originalImage, 0, 0, null);</span> </div> <div class="line"> </div> <div class="line"> <span class="keyword">int</span> height = originalImage.getHeight(); </div> <div class="line"> <span class="keyword">int</span> width = originalImage.getWidth(); </div> <div class="line"> <span class="keyword">int</span> rgb, red, green, blue, index=<span class="number"></span>; </div> <div class="line"> <span class="keyword">char</span> auxBinaryChar[] = {<span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>}; </div> <div class="line"> widthBytes = width/<span class="number">8</span>; </div> <div class="line"> <span class="keyword">if</span>(width%<span class="number">8</span> > <span class="number"></span>){ </div> <div class="line"> widthBytes= (((<span class="keyword">int</span>)(width / <span class="number">8</span>)) + <span class="number">1</span>); </div> <div class="line"> } <span class="keyword">else</span> { </div> <div class="line"> widthBytes= width/<span class="number">8</span>; </div> <div class="line"> } </div> <div class="line"> <span class="keyword">this</span>.total = widthBytes*height; </div> <div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> h = <span class="number"></span>; h<height; h++) </div> <div class="line"> { </div> <div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> w = <span class="number"></span>; w<width; w++) </div> <div class="line"> { </div> <div class="line"> <span class="comment">// rgb = originalImage.getRGB(w, h);</span> </div> <div class="line"> rgb = originalImage.getPixel(w, h); </div> <div class="line"> red = (rgb >> <span class="number">16</span> ) & <span class="number">0x000000FF</span>; </div> <div class="line"> green = (rgb >> <span class="number">8</span> ) & <span class="number">0x000000FF</span>; </div> <div class="line"> blue = (rgb) & <span class="number">0x000000FF</span>; </div> <div class="line"> <span class="keyword">char</span> auxChar = <span class="string">&#8216;1&#8217;</span>; </div> <div class="line"> <span class="keyword">int</span> totalColor = red + green + blue; </div> <div class="line"> <span class="keyword">if</span>(totalColor>blackLimit){ </div> <div class="line"> auxChar = <span class="string">&#8216;0&#8217;</span>; </div> <div class="line"> } </div> <div class="line"> auxBinaryChar[index] = auxChar; </div> <div class="line"> index++; </div> <div class="line"> <span class="keyword">if</span>(index==<span class="number">8</span> || w==(width-<span class="number">1</span>)){ </div> <div class="line"> sb.append(fourByteBinary(<span class="keyword">new</span> String(auxBinaryChar))); </div> <div class="line"> auxBinaryChar = <span class="keyword">new</span> <span class="keyword">char</span>[]{<span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>, <span class="string">&#8216;0&#8217;</span>}; </div> <div class="line"> index=<span class="number"></span>; </div> <div class="line"> } </div> <div class="line"> } </div> <div class="line"> sb.append(<span class="string">&#8220;\n&#8221;</span>); </div> <div class="line"> } </div> <div class="line"> <span class="keyword">return</span> sb.toString(); </div> <div class="line"> } </div> <div class="line"> <span class="function"><span class="keyword">private</span> String <span class="title">fourByteBinary</span><span class="params">(String binaryStr)</span></span>{ </div> <div class="line"> <span class="keyword">int</span> decimal = Integer.parseInt(binaryStr,<span class="number">2</span>); </div> <div class="line"> <span class="keyword">if</span> (decimal><span class="number">15</span>){ </div> <div class="line"> <span class="keyword">return</span> Integer.toString(decimal,<span class="number">16</span>).toUpperCase(); </div> <div class="line"> } <span class="keyword">else</span> { </div> <div class="line"> <span class="keyword">return</span> <span class="string">&#8220;0&#8221;</span> + Integer.toString(decimal,<span class="number">16</span>).toUpperCase(); </div> <div class="line"> } </div> <div class="line"> } </div> <div class="line"> <span class="function"><span class="keyword">private</span> String <span class="title">encodeHexAscii</span><span class="params">(String code)</span></span>{ </div> <div class="line"> <span class="keyword">int</span> maxlinea = widthBytes * <span class="number">2</span>; </div> <div class="line"> StringBuffer sbCode = <span class="keyword">new</span> StringBuffer(); </div> <div class="line"> StringBuffer sbLinea = <span class="keyword">new</span> StringBuffer(); </div> <div class="line"> String previousLine = <span class="keyword">null</span>; </div> <div class="line"> <span class="keyword">int</span> counter = <span class="number">1</span>; </div> <div class="line"> <span class="keyword">char</span> aux = code.charAt(<span class="number"></span>); </div> <div class="line"> <span class="keyword">boolean</span> firstChar = <span class="keyword">false</span>; </div> <div class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">1</span>; i< code.length(); i++ ){ </div> <div class="line"> <span class="keyword">if</span>(firstChar){ </div> <div class="line"> aux = code.charAt(i); </div> <div class="line"> firstChar = <span class="keyword">false</span>; </div> <div class="line"> <span class="keyword">continue</span>; </div> <div class="line"> } </div> <div class="line"> <span class="keyword">if</span>(code.charAt(i)==<span class="string">&#8216;\n&#8217;</span>){ </div> <div class="line"> <span class="keyword">if</span>(counter>=maxlinea && aux==<span class="string">&#8216;0&#8217;</span>){ </div> <div class="line"> sbLinea.append(<span class="string">&#8220;,&#8221;</span>); </div> <div class="line"> } <span class="keyword">else</span> <span class="keyword">if</span>(counter>=maxlinea && aux==<span class="string">&#8216;F&#8217;</span>){ </div> <div class="line"> sbLinea.append(<span class="string">&#8220;!&#8221;</span>); </div> <div class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (counter><span class="number">20</span>){ </div> <div class="line"> <span class="keyword">int</span> multi20 = (counter/<span class="number">20</span>)*<span class="number">20</span>; </div> <div class="line"> <span class="keyword">int</span> resto20 = (counter%<span class="number">20</span>); </div> <div class="line"> sbLinea.append(mapCode.get(multi20)); </div> <div class="line"> <span class="keyword">if</span>(resto20!=<span class="number"></span>){ </div> <div class="line"> sbLinea.append(mapCode.get(resto20) + aux); </div> <div class="line"> } <span class="keyword">else</span> { </div> <div class="line"> sbLinea.append(aux); </div> <div class="line"> } </div> <div class="line"> } <span class="keyword">else</span> { </div> <div class="line"> sbLinea.append(mapCode.get(counter) + aux); </div> <div class="line"> <span class="keyword">if</span>(mapCode.get(counter)==<span class="keyword">null</span>){ </div> <div class="line"> } </div> <div class="line"> } </div> <div class="line"> counter = <span class="number">1</span>; </div> <div class="line"> firstChar = <span class="keyword">true</span>; </div> <div class="line"> <span class="keyword">if</span>(sbLinea.toString().equals(previousLine)){ </div> <div class="line"> sbCode.append(<span class="string">&#8220;:&#8221;</span>); </div> <div class="line"> } <span class="keyword">else</span> { </div> <div class="line"> sbCode.append(sbLinea.toString()); </div> <div class="line"> } </div> <div class="line"> previousLine = sbLinea.toString(); </div> <div class="line"> sbLinea.setLength(<span class="number"></span>); </div> <div class="line"> <span class="keyword">continue</span>; </div> <div class="line"> } </div> <div class="line"> <span class="keyword">if</span>(aux == code.charAt(i)){ </div> <div class="line"> counter++; </div> <div class="line"> } <span class="keyword">else</span> { </div> <div class="line"> <span class="keyword">if</span>(counter><span class="number">20</span>){ </div> <div class="line"> <span class="keyword">int</span> multi20 = (counter/<span class="number">20</span>)*<span class="number">20</span>; </div> <div class="line"> <span class="keyword">int</span> resto20 = (counter%<span class="number">20</span>); </div> <div class="line"> sbLinea.append(mapCode.get(multi20)); </div> <div class="line"> <span class="keyword">if</span>(resto20!=<span class="number"></span>){ </div> <div class="line"> sbLinea.append(mapCode.get(resto20) + aux); </div> <div class="line"> } <span class="keyword">else</span> { </div> <div class="line"> sbLinea.append(aux); </div> <div class="line"> } </div> <div class="line"> } <span class="keyword">else</span> { </div> <div class="line"> sbLinea.append(mapCode.get(counter) + aux); </div> <div class="line"> } </div> <div class="line"> counter = <span class="number">1</span>; </div> <div class="line"> aux = code.charAt(i); </div> <div class="line"> } </div> <div class="line"> } </div> <div class="line"> <span class="keyword">return</span> sbCode.toString(); </div> <div class="line"> } </div> <div class="line"> <span class="function"><span class="keyword">private</span> String <span class="title">headDoc</span><span class="params">()</span> </span>{ </div> <div class="line"> String str = <span class="comment">/*&#8221;^XA &#8221; +*/</span> </div> <div class="line"> <span class="string">&#8220;^FO10,50^GFA,&#8221;</span>+ total + <span class="string">&#8220;,&#8221;</span>+ total + <span class="string">&#8220;,&#8221;</span> + widthBytes +<span class="string">&#8220;, &#8220;</span>; </div> <div class="line"> <span class="keyword">return</span> str; </div> <div class="line"> } </div> <div class="line"> <span class="function"><span class="keyword">private</span> String <span class="title">footDoc</span><span class="params">()</span></span>{ </div> <div class="line"> String str = <span class="string">&#8220;^FS&#8221;</span><span class="comment">/*+ &#8220;^XZ&#8221;*/</span>; </div> <div class="line"> <span class="keyword">return</span> str; </div> <div class="line"> } </div> <div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setCompressHex</span><span class="params">(<span class="keyword">boolean</span> compressHex)</span> </span>{ </div> <div class="line"> <span class="keyword">this</span>.compressHex = compressHex; </div> <div class="line"> } </div> <div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setBlacknessLimitPercentage</span><span class="params">(<span class="keyword">int</span> percentage)</span></span>{ </div> <div class="line"> blackLimit = (percentage * <span class="number">768</span> / <span class="number">100</span>); </div> <div class="line"> } </div> <div class="line"> } </div> </td> </tr> 调用方式 就是把Bitmap对象转化为ZPL编码格式,并把转化后的内容塞到ZPL命令中,和打印机通过Wifi 连接,把组装后的命令发给打印机就可以了。 1 <div class="line"> 2 </div> <div class="line"> 3 </div> <div class="line"> 4 </div> <div class="line"> 5 </div> <div class="line"> 6 </div> <div class="line"> 7 </div> </td> <td class="code"> <div class="top-box hide"> <div class="alert-info"> </div> </div> <div class="line"> </div> <div class="line"> ZPLImageConverter zp = <span class="keyword">new</span> ZPLImageConverter(context); </div> <div class="line"> zp.setCompressHex(<span class="keyword">true</span>); </div> <div class="line"> zp.setBlacknessLimitPercentage(<span class="number">50</span>); </div> <div class="line"> String str = zp.convertFromImg(myBitmap); </div> <div class="line"> zplStr += str; </div> <div class="line"> <span class="comment">//&#8230;</span> </div> </td> </tr> 其它命令的时候可以参考zebra打印机官方文档。 refs - [http://labelary.com/viewer.html](http://labelary.com/viewer.html) (在线调整打印小票样式细节) - [http://www.jcgonzalez.com/java-image-to-zpl-example](http://www.jcgonzalez.com/java-image-to-zpl-example) - https://jinfengli.github.io/2017/11/17/zebra_printer_logo/

2018年8月14日 · 11 分钟 · 天边的星星

后管模版整理

# Bootstrap **Adminlte** 项目:https://github.com/almasaeed2… 演示:https://adminlte.io/themes/Ad… **SB Admin** 项目:https://github.com/BlackrockD… 演示:https://blackrockdigital.gith… **Gentelella Admin** 项目:https://github.com/puikinsh/g… 演示:https://colorlib.com/polygon/… **Vali Admin** 项目:https://github.com/pratikbors… 演示:http://pratikborsadiya.in/val… **ModularAdmin** 项目:https://github.com/modularcod… 演示:https://gurayyarar.github.io/… **Metis** 项目:https://github.com/puikinsh/B… 演示:https://colorlib.com/polygon/… **Ace** 项目:https://github.com/bopoda/ace 演示:http://ace.jeka.by/ **Light Bootstrap Dashboard** 项目:https://github.com/creativeti… 演示:http://demos.creative-tim.com… **Material Dashboard** 项目:https://github.com/creativeti… 演示:http://demos.creative-tim.com… **Clearmin** 项目:https://github.com/paomedia/c… 演示:http://cm.paomedia.com/ Vue **Element Admin** 项目:https://github.com/PanJiaChen… 演示:https://panjiachen.github.io/… **Vue-Bulma** 项目:https://github.com/vue-bulma/… 演示:https://admin.vuebulma.com/ **Iview-Admin** 项目:https://github.com/iview/ivie… 演示:https://admin.iviewui.com **Vuestic-Admin** 项目:https://github.com/epicmaxco/… 演示:https://vuestic.epicmax.co/ ...

2018年8月12日 · 1 分钟 · 天边的星星

虚拟导航栏适配

在写界面的时候 然后发现在界面最底下的几行文字 正好被虚拟导航栏遮挡住了,不滑动还看不到底下的文字,所以想隐去这些导航栏。 采用下面的代码将DecorView中的属性设置为隐藏 navigation,我这里注销掉了全屏的属性 ,按需添加or删除属性吧 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDecorView(); if(v!=null){ v.setSystemUiVisibility(View.GONE); } } else if (Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY/* | View.SYSTEM_UI_FLAG_FULLSCREEN*/; if (decorView != null) { decorView.setSystemUiVisibility(uiOptions); } } }1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 " data-snippet-id="ext.c635ae4a92490f41cf801e12d12759e7" data-snippet-saved="false" data-codota-status="done">` &lt;span class="hljs-keyword">protected&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">hideBottomMenu&lt;/span>() { &lt;span class="hljs-comment">//隐藏虚拟按键&lt;/span> &lt;span class="hljs-keyword">if&lt;/span> (Build.VERSION.SDK_INT &gt; &lt;span class="hljs-number">11&lt;/span> && Build.VERSION.SDK_INT &lt; &lt;span class="hljs-number">19&lt;/span>) { &lt;span class="hljs-comment">// lower api&lt;/span> View v = &lt;span class="hljs-keyword">this&lt;/span>.getWindow().getDecorView(); &lt;span class="hljs-keyword">if&lt;/span>(v!=&lt;span class="hljs-keyword">null&lt;/span>){ v.setSystemUiVisibility(View.GONE); } } &lt;span class="hljs-keyword">else&lt;/span> &lt;span class="hljs-keyword">if&lt;/span> (Build.VERSION.SDK_INT &gt;= &lt;span class="hljs-number">19&lt;/span>) { &lt;span class="hljs-comment">//for new api versions.&lt;/span> View decorView = getWindow().getDecorView(); &lt;span class="hljs-keyword">int&lt;/span> uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY&lt;span class="hljs-comment">/* | View.SYSTEM_UI_FLAG_FULLSCREEN*/&lt;/span>; &lt;span class="hljs-keyword">if&lt;/span> (decorView != &lt;span class="hljs-keyword">null&lt;/span>) { decorView.setSystemUiVisibility(uiOptions); } } }` ...

2018年8月3日 · 1 分钟 · 天边的星星

Centos7安装MariaDB

1.yum -y install mariadb mariadb-server 2. 安装完成MariaDB,首先启动MariaDB systemctl start mariadb 3.设置开机启动 systemctl enable mariadb 4.接下来进行MariaDB的相关简单配置 systemctl enable mariadb 首先是设置密码,会提示先输入密码 Enter current password for root (enter for none):<–初次运行直接回车 设置密码 Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车 New password: <– 设置root用户的密码 Re-enter new password: <– 再输入一次你设置的密码 其他配置 Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车 Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车, Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车 Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车 ...

2018年7月8日 · 2 分钟 · 天边的星星

Linux CentOS完全卸载PHP及手动安装php

很无语,CentOS居然php版本才5.1.6,很多开源的CMS无法安装。 查看php版本命令: #php -v 下面的命令是删除不干净的 #yum remove php 因为使用这个命令以后再用 #php -v 还是会看到有版本信息的。。。。。 &nbsp; 必须强制删除,使用下面命令查看全部php软件包 #rpm -qa|grep php 提示如下: #php-pdo-5.1.6-27.el5_5.3 #php-mysql-5.1.6-27.el5_5.3 #php-xml-5.1.6-27.el5_5.3 #php-cli-5.1.6-27.el5_5.3 #php-common-5.1.6-27.el5_5.3 #php-gd-5.1.6-27.el5_5.3 注意卸载要先卸载没有依赖的 pdo是mysql的依赖项;common是gd的依赖项; 例如:# rpm -e php-pdo-5.1.6-27.el5_5.3 error: Failed dependencies: php-pdo is needed by (installed) php-mysql-5.1.6-27.el5_5.3.i386 所以正确的卸载顺序是(卸载顺序很重要): # rpm -e php-mysql-5.1.6-27.el5_5.3 rpm -e php-pdo-5.1.6-27.el5_5.3 rpm -e php-xml-5.1.6-27.el5_5.3 rpm -e php-cli-5.1.6-27.el5_5.3 rpm -e php-gd-5.1.6-27.el5_5.3 rpm -e php-common-5.1.6-27.el5_5.3 再用 # php -v 查看版本信息已经没有提示 ## 关于php-fpm nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。 nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx。 PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的。 PHP在 5.3.3 之后已经讲php-fpm写入php源码核心了。所以已经不需要另外下载了。 获取PHP下载地址 为什么选择5.6.30这个版本,因为学习,不是研究。诚然,7.0新增了很多PHP的新特性,性能上面也有些提升,如果是研究,倒是可以折腾一番,后面得空再讲7.0的版本以及如何在各个PHP版本之间切换。 打开php的官网:http://php.net/,查看php的版本列表 ![](https://images2015.cnblogs.com/blog/465728/201702/465728-20170222135638429-399501886.png) 右击,复制链接地址,在远程主机登录,下载该软件(我选的是Australia的主机mirror下载的) ``` wget http://au1.php.net/get/php-5.6.30.tar.gz/from/this/mirror </div> 下载下来的是一个mirror文件,改成我们需要的文件名 <div class="cnblogs_code"> <div class="top-box hide"> <div class="alert-info"> </div> </div> ``` #mv mirror php-5.6.30.tar.gz #tar zxvf php-5.6.30.tar.gz #cd php-5.6.30 配置安装 进入到目录,我们需要在安装的时候将安装目录配置到/usr/local/php/里 ![复制代码](https://common.cnblogs.com/images/copycode.gif) <div class="top-box hide"> <div class="alert-info"> </div> </div> ``` #./configure –prefix=/usr/local/php –with-curl –with-freetype-dir –with-gd –with-gettext –with-iconv-dir –with-kerberos –with-libdir=lib64 –with-libxml-dir –with-MySQL –with-mysqli –with-openssl –with-pcre-regex –with-pdo-mysql –with-pdo-sqlite –with-pear –with-png-dir –with-xmlrpc –with-xsl –with-zlib –enable-fpm –enable-bcmath –enable-libxml –enable-inline-optimization –enable-gd-native-ttf –enable-mbregex –enable-mbstring –enable-opcache –enable-pcntl –enable-shmop –enable-soap –enable-sockets –enable-sysvsem –enable-xml –enable-zip ...

2018年7月8日 · 3 分钟 · 天边的星星

Doxygen—程序文档生成工具

doxygen是一种从源代码生成文档的工具,支持多种语言。当然,源代码中需按一定的格式写注释,这些注释的格式也能帮助我们养成很好的注释习惯,可以尝试一下。 使用doxygen生成文档的方法很简单: ** $ doxygen -g –s $ doxygen </blockquote> 只需两个简单命令就可以了。 下面简单说明一下: 1、在工程目录下输入doxygen –s –g doxyconfig,其中doxyconfig为生成配置的文件名称,可任意指定,如果不指定,默认生成的配置文件为Doxyfile。man手册中没有详细说明选项的意思,这里不妨猜测一下,-s为simple,-g为generate,如果不指定-s,则生成的配置文件大约为63KB,行数约1500左右;反之,则约成10KB,行数约250左右。——此处猜测便根据这些测试而来的。 2、生成配置文件后,会出现提示信息,大意是说那个配置文件已经生成了,现在编辑它,之后输入doxygen Doxyfile(经实践证明,可以只输入doxygen命令)就可以产生工程的文档了。如果再次使用doxygen生产配置文件,则原来的就配置文件就变成了备份文件,添加后缀名.bak。 3、根据doxygen要求的注释格式来编写代码的注释,这一步要求比较高,而且工作量比较大。我们在文章后面还要讲解的。 下面介绍一下如何编辑生成的配置文件,我们以我们的串口程序为例子。 &nbsp; doxygen的配置文件与大多数linux平台的配置文件类似,就是一些关键字与值,配置文件中的值以YES和NO居多。 <blockquote> DOXYFILE_ENCODING = UTF-8,默认编码为UTF-8,这样可以支持中文。 PROJECT_NAME = “SerialPort”,项目名称,多个单词需要使用引号(“”)。 PROJECT_NUMBER = “1.0 beta”,项目版本号。 OUTPUT_DIRECTORY = serialport-html,输出文档的目录,如果为空,表示在当前目录,建议写上表示本工程的有意义的目录名称,比如我们就指定目录名称为serialport-html。 OUTPUT_LANGUAGE = English,文档语言,可以指定为Chinese。 IMAGE_PATH = image_dir,指定图片存放的目录,我们将图片放到当前目录下的image_dir目录中,因为我们的文档会出现测试图片示例。 HTML_OUTPUT= . ,html输出目录名称,默认为html目录,如果为“.”则表明为上述OUTPUT_DIRECTORY目录。 GENERATE_LATEX = NO,是否生成LaTeX,默认生成的,但我们不想生成。 好了,我们需要修改的就这么多,使用上述第2步骤的命令就可以生成一个漂亮的文档了。此外还有一些常用的设置选项。 INPUT =xxx,代码文件或目录,多个文件(目录)需要以空格隔开,如果不指定,表示当前目录,但是,如果指定目录且当前目录有代码文件的话,需要使用点号(“.”)表示当前目录。 FILE_PATTERNS=xxx,指定各种文件,我们常用为*.cpp *.c *.h,等等。 </blockquote> 上面基本就是我们常用的了,如果还想更深入了解,请移步到google网站。 下面就是真正需要花费一定时间的工作:为我们的程序作特定格式的注释。 doxygen支持多种注释风格,比如JavaDoc风格,它在C语言块注释开始处再添加一个星号(*)构成,如下: <div> 1. /** 2. * … text … 3. */ </div> Qt风格: <div> ``` 1. /*! ``` 2. * ... text ... ``` 3. */ </div> 上面两种方式中间的星号(*)是可选的,不过,个人认为添加会更美观一些。 C++风格的,——就是在C++注释后面再添加“/”: <div> ``` 1. /// ``` 2. /// ... text ... ``` 3. /// </div> 或者是这样: <div> ``` 1. //! ``` 2. //!... text ... ``` 3. //! </div> 经测试,实际使用中,如果是单行注释的话,可以使用如下的格式: <div> ``` 1. /** ... text ... */ ``` 2. /**&lt; ... text ... */ </div> 这些格式会被doxygen文档化,如果不想让它文档化,可以“破坏”这些格式,比如可以使用“正宗”的C/C++注释: <div> ``` 1. /* ... text ... */ ``` 2. // ... text ... </div> 上述风格来自doxygen的manual页面,具体地址为: [http://www.stack.nl/~dimitri/doxygen/docblocks.html](http://www.stack.nl/~dimitri/doxygen/docblocks.html) http://www.stack.nl/~dimitri/doxygen/index.html ``` # 自定义文档首页 # INPUT = README.md other_sources # USE_MDFILE_AS_MAINPAGE = README.md 下面介绍一下常用doxygen的命令,更多详细使用说明,请参考如下地址: [http://www.stack.nl/~dimitri/doxygen/commands.html#cmde](http://www.stack.nl/~dimitri/doxygen/commands.html#cmde) doxygen命令以@或开始,两种方式均可以。文中以@标记之。 <blockquote> @def 宏定义说明 @fn 函数 函数说明 @param 参数 参数说明 @return 返回值说明(出错返回什么值,等等) @file 文件名 @author 作者 @version 程序版本 @date 日期 @note 注解(注意事项,等) @warning 警告信息 @bug bug信息 @test 测试示例、信息 @todo 一些未完事宜 (@bug、@test以及@todo等会出现链接页面) 上面这样适合在函数、文件前面出现。 下面为生成特殊字体的命令: @a @e @em:其后的单个字(word)表现为斜体,以强调作用。如有多个word的话,使用*xxx xxx*代替。 @b:其后的word为粗体,多个则使用<b>xxx xxx**。 @c @p:字体表现为打印机字体,多个则使用<tt>xxx xxx</tt>。 </blockquote> ` ` `下面是一些具体的实例。 ` `在文件开始处的版权声明及其它信息:` ** /** * Copyleft (C) 2010 Late Lee * This program is tested on LINUX PLATFORM, WITH GCC 4.x. * The program is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY. Please feel free to * use the program, and I feel free to ignore the related * issues. Any questions or suggestions, or bugs, please * contact me at or e-mail to * if you want to do this. * @file serialport.c * @author Late Lee * @date Mon Jan 10 2011 * * @brief Some utils of the serial port, such as open the port, close * the port and setup the port. * @note This is a note. * @warning This is a warning. * @bug This is a bug. */ </blockquote> &nbsp; 在函数前的注释: &nbsp; <blockquote> /** * open_port – Open a serial port * * @param port : The port number, eg, open_port(1) will open com1 * * @return Return fd if success, otherwise will return -1 with some msg. */ </blockquote> 定义宏使用的注释: <blockquote> /** * @def error_exit * @brief A macro that prints the @a error msg and exit. */ #define error_exit(error) do{ fprintf(stderr, “%sn”, error); exit(0); } while(0) </blockquote> &nbsp; &nbsp; 或者你会说,这样的注释风格太麻烦了!不怕!现在有了跟emacs结合的doxymacs,在emacs中配置了doxymacs,这些注释是十分方便的!比如需要在文件前插入注释,按C-c d i即可,在函数前插入注释,按C-c d f即可,等等。具体的请移步到这里的文章:[http://www.latelee.org/embedded-linux/learning-elinux-4-my-emacs-ii](http://www.latelee.org/embedded-linux/learning-elinux-4-my-emacs-ii.html)及[http://www.latelee.org/embedded-linux/learning-elinux-4-my-emacs](http://www.latelee.org/embedded-linux/learning-elinux-4-my-emacs.html)。如果你使用的不是emacs,那Sorry,我也不太会,如果你懂,不妨分享一下。 这个串口程序的文档已经放到网站上了,这里main.c文件参考页面地址:[http://www.latelee.org/yetanothertest/serialport-html-cn/main_8c.html](http://www.latelee.org/yetanothertest/serialport-html-cn/main_8c.html) 此外,我们还测试生成中文文档,因此doxygen使用UTF8,因此只要将代码文件保存为utf8编码即可(使用Ultra Edit或notepad++等等编辑器很容易做到)。但这又引出一个问题,gcc并不支持utf8!经过google,发现gcc 4.4.0版本以后已经支持utf8了,因此,为了做这个测试,花了一个小时左右编译、安装高版本的gcc(我们使用4.4.5版本),结果,这个版本的gcc是支持utf8的。后来,又发现,如果使用“UTF-8 无BOM格式编码”格式保存源文件的话,在原来的gcc下也编译通过。因此如果想在程序中使用中文注释,建议以此格式保存,当然,在系统的locale不是中文的情况下看到的中文是乱码的。 1、尽信书则不如无书,我们建议各位到实践中试一试,这样学到的知识才是我们自己的,比如,在指定源代码目录中,我的测试文件main.c放在当前目录下,如果不指定“.”的话,doxygen便不会处理该文件,这是网上很多资料没有说明的,因此需要实践才能了解。 2、我们强烈建议各位到官方网站学习,因为其它地方绝大部分都出自官方网站,manual页面地址是: [http://www.stack.nl/~dimitri/doxygen/manual.html](http://www.stack.nl/~dimitri/doxygen/manual.html) ...

2018年7月6日 · 6 分钟 · 天边的星星

给你 60 家免费版权图片网站,以后别再跟我说找不到图了

无论是写文章、做 PPT 还是找壁纸、换头像,搜图片都是件费时却最出效果的事情。之前小美给大家分享了最好用无版权图片网站之一的 Pixabay,不过图片素材这种东西,尤其是可自由修改使用的图片素材,向来是嫌少不嫌多的。所以这次,小美就把私藏的 60 余家无版权图片网站分享给大家,这家找不到合适的图片?没关系,下一家就有了!从此再也不会被找图这件事情所束缚。 本次推荐分为第一找图梯队、第二找图梯队、精准找图、分门别类找图、备选方案以及最后的终极找图梯队组成。 第一找图梯队 根据二八定律,80% 的结果可能来自于 20% 的原因。这在找图片这件事上也适用。虽然这次推荐的无版权图片网站有数十家,但是真正好用的也是只有一部分,而这一部分就足够使用了。 Unsplash** 最知名的无版权图片网站,这家以风景为主,数量足够多,但是很多滤镜感太强,颜色太过厚重,比较适合做壁纸,事实上很多壁纸软件也是直接从这上面下载的图 Pixabay** 小美最常用的一家,可以说是全球最大的免费图片网站了。图多而且种类足够丰富。这其实也是一家集合网站,可以看到 Unsplash 家的很多图也能在 Pixabay 里搜到 Pexels** 这家也有很多精美的图片,而且比较好的一点是会有「一周精选」,平常没事的时候来收收图也挺好的 visualhunt** 数量超级多的无版权图片网站,可以根据颜色进行搜索 第二找图梯队 这里面是一些图片资源没有那么丰富,但是质量都还不错的,如果之前的网站没有找到合适的,可以在这里再次搜寻一下。 别样网** 找图新欢,旅行日常为主,图片多为用户自己上传,所以在其他地方很少见到 Gratisography** 每周都会更新,图片角度和题材都比较另类,人物图片不少,另外他家的 logo 也比较另类…… StreetWill 优点是图片都比较精致小众,缺点是更新慢 IM FREE** 图片分类详细,可按分类进行筛选 Magdeleine** 有编辑精选,图片也比较厚重 FancyCrave** 每天两张手工筛选精品照片,每张都在诉说一个故事 精准找图梯队 一般搜索图片都是用关键词进行搜索,搜索单一的关键词还好,一旦稍复杂些的就很容易搜索不出来,这时候你就需要一些精准找图方案。 Flickr** 第一个是雅虎著名的图片社区——Flickr,由于汇集了大批的摄影师,所以 Flickr 家的图片质量都相当之高,不过你可能会说 Flickr 的图片不都是有版权的吗?别急,在「授权」那里选择「所有创用CC」或者「允许商业用途」即可找到那些可以使用的图片啦 ps.由于 Flickr 目前没有简体中文版,所以搜索时用英文或者繁体中文会得到比较好的结果 Google** 第二个是我大谷歌,谷歌的图片搜索那是相当的强大,选择右侧的「工具」,可以自定义很多东西,包括大小、颜色及使用权限 分类找图 Life of Pix** 景色建筑为主,色调比较统一 ...

2018年6月12日 · 2 分钟 · 天边的星星

CentOS7使用firewalld打开关闭防火墙与端口

1、firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disable firewalld 禁用: systemctl stop firewalld 2.systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。 启动一个服务:systemctl start firewalld.service 关闭一个服务:systemctl stop firewalld.service 重启一个服务:systemctl restart firewalld.service 显示一个服务的状态:systemctl status firewalld.service 在开机时启用一个服务:systemctl enable firewalld.service 在开机时禁用一个服务:systemctl disable firewalld.service 查看服务是否开机启动:systemctl is-enabled firewalld.service 查看已启动的服务列表:systemctl list-unit-files|grep enabled 3.配置firewalld-cmd <div> </div> <div> <div> </div> <div> </div> <div> </div> <div> </div> <div> 那怎么开启一个端口呢 </div> <div> 添加 </div> <div> </div> <div> 重新载入 </div> <div> </div> <div> 查看 </div> <div> </div> <div> 删除 </div> <div> </div> <div> </div> </div>

2018年6月10日 · 1 分钟 · 天边的星星