<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>layerssss (layerssss)</title>
    <link>https://ruby-china.org/layerssss</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>[广东地区优先][远程][兼职][React][Ruby on Rails] 寻一个小伙伴和我一起做项目</title>
      <description>&lt;p&gt;更新：已经收到挺多简历了，也有看起来不错的人选了，还不止一个，但是只能找一位朋友合作，所以大家暂时不要再发简历了。&lt;/p&gt;

&lt;p&gt;=====&lt;/p&gt;

&lt;p&gt;是这样子的，这个项目从开始到现在一直是我一个人在兼职给老板做，从 2017 年开始，中途也休息暂停了大半年，不过现在越来越步入正轨，使用量越来越大，也拿到了客户的合同，从去年开始就一直在考虑增加更多开发成员，所以快新年了就来这里寻求一下。&lt;/p&gt;

&lt;p&gt;客户目前是一些城市建设方面的政府部门，用来管理他们的一些文档和流程电子化，但是一直按照 Software as Service 的模式去做，为扩增更多客户做准备。老板在这个行业沉浸多年（为政府提供公共建设项目的项目管理服务公司）。&lt;/p&gt;

&lt;p&gt;对你的要求：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在广东地区优先（这个不是硬性条件，这是因为客户和老板都在佛山，只是考虑未来如果能偶尔见面讨论能更方便所以优先，不在也可以考虑）&lt;/li&gt;
&lt;li&gt;有每周至少 20 小时的时间能用，白天晚上周末都行&lt;/li&gt;
&lt;li&gt;有给力的出国网络（这个比较重要，因为我自己人在新西兰，所有开发用的东西和工具，除了生产服务器在国内，其他都在墙外，而且和我语音视频沟通会比较多，没有好点的网络没法玩）&lt;/li&gt;
&lt;li&gt;自然要熟练用 React 和 Ruby on Rails，都是兼职，沟通的时间自然没那么多，自己能想办法做当然很重要。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;码人说码，顺便分享一下棒棒的项目细节：&lt;/p&gt;

&lt;p&gt;软件本身分 Web 和移动端，移动端用 ReactNative(Expo) 做的，仅实现小部分功能所以就没必要多做介绍了。Web 前端后端两个项目分开分别由 Rails 和 create-react-app 驱动，运行在青云上的一个 docker swarm 集群里。&lt;/p&gt;

&lt;p&gt;项目代码托管在 GitLab.com 上，使用 GitLab 自带的 CI 测试和发布。测试分两层，底层测试仅测试 Rails 里的单元的逻辑，包括所有 GraphQL mutation / query，还有一些 Model / Job 等上面有独立逻辑的方法；E2E 测试覆盖前端后端所有代码。测试覆盖率由 Codecov 一起统计，总体覆盖率长期保持在 90% 左右，覆盖几乎所有业务代码，没覆盖的大部分都是一些不容易测试的底层代码。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.jpg.cm/2021/01/27/4UHz8.png" title="" alt=""&gt;
&lt;img src="https://s3.jpg.cm/2021/01/27/4U1Jw.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Renovate bot 随时检测并创建 merge request 升级依赖库到最新，加上 CI 里高覆盖率的测试检测出所有升级导致的问题，每次有新版本点击 CI 运行成功后自动合并即可，这样几乎所有的依赖库都能保持到最新的，例如目前：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rails 6.1.1&lt;/li&gt;
&lt;li&gt;ruby 2.7.2 (ruby 3 还对有一些 gem 没跟上)&lt;/li&gt;
&lt;li&gt;react 17.0.1/create-react-app 4.0.1&lt;/li&gt;
&lt;li&gt;material-ui 4.11.3&lt;/li&gt;
&lt;li&gt;apollo-client 3.3.7&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如图，最近由 Renovate 创建的 merge request:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.jpg.cm/2021/01/27/4UEE5.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Rails 中几乎仅包含 GraphQL 的 API 实现，界面逻辑几乎全部在前端代码里 (create-react-app)。&lt;/p&gt;

&lt;p&gt;前端界面库使用的是最新的 &lt;a href="https://material-ui.com/" rel="nofollow" target="_blank" title=""&gt;Material-UI&lt;/a&gt;，项目最开始时使用的是 &lt;a href="https://react-bootstrap.github.io/" rel="nofollow" target="_blank" title=""&gt;react-bootstrap&lt;/a&gt;，现在已经全替换掉了。&lt;/p&gt;

&lt;p&gt;React 代码使用 &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="nofollow" target="_blank" title=""&gt;React Hooks&lt;/a&gt; 风格，只剩少部分一些旧代码使用 &lt;a href="https://reactjs.org/docs/higher-order-components.html" rel="nofollow" target="_blank" title=""&gt;HOC(Higher-Order Components)&lt;/a&gt; 风格还未重构。&lt;/p&gt;

&lt;p&gt;GraphQL 库使用的是 &lt;a href="https://www.apollographql.com/apollo-client" rel="nofollow" target="_blank" title=""&gt;Apollo Client&lt;/a&gt;，这个我觉得国内朋友了解的不多，即使在国外很流行但有机会用的人也不多。这个是 MeteorJS 的团队做的，质量相当好，功能也很强大，而且还不再需要额外的状态管理库（redux，mobx 等）。&lt;/p&gt;

&lt;p&gt;感兴趣的朋友可以发&lt;strong&gt;简历&lt;/strong&gt;和&lt;strong&gt;联系方式&lt;/strong&gt;到我邮箱 me at micy.in，麻烦顺便透露一下你&lt;strong&gt;当前的薪资&lt;/strong&gt;，仅用来参考给你发放的时薪，肯定能更高（请得起的话），还有还有预计&lt;strong&gt;每周平均可用多少小时&lt;/strong&gt;，这个是弹性的之后可以按需调整。&lt;/p&gt;</description>
      <author>layerssss</author>
      <pubDate>Thu, 28 Jan 2021 05:47:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/40868</link>
      <guid>https://ruby-china.org/topics/40868</guid>
    </item>
    <item>
      <title>CoffeeScript 里 `?=` 这个运算符在 Ruby 里有对应的语法吗？</title>
      <description>&lt;p&gt;传送门： &lt;a href="http://coffeescript.org/#try:a%20%3D%20null%0Aa%20%3F%3D%202%0Aalert%20a%0Aa%20%3D%20false%0Aa%20%3F%3D%202%0Aalert%20a" rel="nofollow" target="_blank"&gt;http://coffeescript.org/#try:a%20%3D%20null%0Aa%20%3F%3D%202%0Aalert%20a%0Aa%20%3D%20false%0Aa%20%3F%3D%202%0Aalert%20a&lt;/a&gt;&lt;/p&gt;</description>
      <author>layerssss</author>
      <pubDate>Sun, 31 Aug 2014 19:45:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/21312</link>
      <guid>https://ruby-china.org/topics/21312</guid>
    </item>
    <item>
      <title>感觉达到人生巅峰了！</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/5a9f4125e2a448b63da7b6ac96fb21e8.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;图题： 「经历过这一个多月的“apcn2 风暴”后，太阳们终于又出来了」&lt;/p&gt;</description>
      <author>layerssss</author>
      <pubDate>Thu, 24 Apr 2014 17:04:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/18828</link>
      <guid>https://ruby-china.org/topics/18828</guid>
    </item>
    <item>
      <title>使用又拍云的 API 将 Assets Pipeline 发布到 upyun</title>
      <description>&lt;p&gt;这个 gem 是&lt;a href="http://ruby-china.org/topics/18586" title=""&gt;又拍云这个开发者大赛&lt;/a&gt;的作品，在这里投票啊小伙伴们 &amp;gt;_&amp;gt;：  &lt;a href="http://upyun.gitcafe.com/projects?category=plugin" rel="nofollow" target="_blank"&gt;http://upyun.gitcafe.com/projects?category=plugin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;故事是这样的：&lt;/p&gt;

&lt;p&gt;以前，我一直用 lftp 来自动上传我们的静态资源到又拍云上去&lt;/p&gt;

&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/7be7b0d3a40c75b86f23ee55da82adb5.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;直到有一天我看到这个家伙做了一个&lt;a href="https://github.com/turingou/keepingbusy" rel="nofollow" target="_blank" title=""&gt;很骚的东西&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/6a3b123b5414af7de30ebb839f408546.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;看着这玩意儿我瞬间感到一股共鸣感，于是豪气一发，从我们公司的 ci 里随便拉出了一段日志，直接在 GitHub 的界面上帖给了这货&lt;/p&gt;

&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/abf643219a90473cc943c904e77e1816.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;贴完之后我站起来伸了个懒腰，淫荡的一天又过去了 XD ……突然我虎躯一震，赶紧会过头去看我贴的那段日志：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;我们的 UpYun 操作员密码&lt;a href="https://github.com/turingou/keepingbusy/blob/c7e0fdb0b1dbc69576dbbb13ec96cd709389fc4f/langs/zh-cn/deployment#L817" rel="nofollow" target="_blank" title=""&gt;俨然以明文留在里面&lt;/a&gt;！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;而且我们发布用的操作员密码和主账户的密码是一样的，于是我赶紧把这俩密码都给改了，然后就是各种小伙伴被惊醒：&lt;/p&gt;

&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/bbc509e486223aa46a15586e562c63ce.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;经过这件事，我学到了一个道理：不要随便把自己的日志贡献给别人……&lt;/p&gt;

&lt;p&gt;哈哈哈哈哈好吧，不过用明文的 ftp 来做事情也确实不安全（也不快，还要经常求防火墙放行我们可怜楚楚的数据连接），既然 UpYun 有提供一个带摘要授权又是基于 HTTP REST 的 API，咱就从了呗，大家来看看俺的作品吧：&lt;/p&gt;
&lt;h2 id="rails-assets-for-upyun"&gt;rails-assets-for-upyun&lt;/h2&gt;
&lt;p&gt;把预编译好的静态资源发布到又拍云上（用&lt;code&gt;rake&lt;/code&gt;）&lt;/p&gt;
&lt;h2 id="用法"&gt;用法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;Gemfile&lt;/code&gt; 里引用我： &lt;code&gt;gem 'rails-assets-for-upyun', '&amp;gt;= 0.0.3'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;首先设置好在生产环境中调用 UpYun 上的资源&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# .. config/environments/production.rb
..
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
config.action_controller.asset_host = "awesome-bucket.b0.upaiyun.com"
..
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;Rakefile&lt;/code&gt; 里添加一个任务（起一个最酷的名字！）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace :assets do
  task :publish_my_holy_shinning_precompiled_miraculous_assets_to_the_almighty_upyun do
    RailsAssetsForUpyun.publish 'awesome-bucket', 'notjustausername', 'thencomesthepassword'
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;然后你就可以在每次发布前（&lt;code&gt;rake assets:precompile&lt;/code&gt;之后）运行一遍这个 rake 任务把他们同步到又拍云上去了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="卖点"&gt;卖点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;调用 UpYun 提供的 API 进行增量发布，通过 HTTP 通讯，比 FTP 更加稳定、快速&lt;/li&gt;
&lt;li&gt;使用 UpYun API 提供的签名授权，不明文传送密码，更加安全！&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="详解"&gt;详解&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RailsAssetsForUpyun.publish(bucket, username, password, bucket_path="/", localpath='public', upyun_ap="http://v0.api.upyun.com")
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>layerssss</author>
      <pubDate>Wed, 16 Apr 2014 19:08:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/18644</link>
      <guid>https://ruby-china.org/topics/18644</guid>
    </item>
    <item>
      <title>从剪切版里粘贴图片: HTML5 Clipboard API hacking</title>
      <description>&lt;p&gt;最近在做一个在线图片编辑器，觉得如果让用户使用剪切板来粘贴图片（而不是将图片保存到本地，然后再选取文件上传）会很方便。在衡量了客户的浏览器状况之后，我决定使用 HTML5 的 local features 来 hack 一下，最终想达到的效果就是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;用户在 photoshop 里编辑好原图（可能是从数码相机里传上来的照片）&lt;/li&gt;
&lt;li&gt;然后在 photoshop 里选取一部分图片区域（比如说照片中的人脸）&lt;/li&gt;
&lt;li&gt;然后在编辑器里点 Ctrl + V&lt;/li&gt;
&lt;li&gt;搞掂!photoshop 可以关了（保存还是不保存就随便用户咯）&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;想一想，这一个工作用剪切板来代替文件上传是会方便很多（不用再单独将编辑结果保存为另外一个文件）&lt;/p&gt;
&lt;h2 id="prepare!"&gt;prepare!&lt;/h2&gt;
&lt;p&gt;所以，这个想法就从一个 demo 开始了。首先，要做好界面上的其他元素的渲染，这个编辑器的界面是用 canvas 来渲染的，所以要先了解一下 canvas 的世界里图片是怎样表示的。&lt;/p&gt;
&lt;h3 id="about canvas"&gt;about canvas&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Using_images" rel="nofollow" target="_blank" title=""&gt;MDN 上的这篇文章&lt;/a&gt;列出了一个简单的在 canvas 中使用位图的例子，然而如果不太考虑计算效率，我们能拿到粘贴过来的图像的 dataURL 的话，就最方便了，因为 dataURL 就是一个简单的字符串。&lt;/p&gt;
&lt;h3 id="about clipboard"&gt;about clipboard&lt;/h3&gt;
&lt;p&gt;然后还要对“剪切板“这个系统功能有个简单的认识，不管是 OSX, Windows, 还是 Linux 世界里的一堆桌面环境，现在都对剪切板有了以下共识：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;剪切板里可以装 1 个或者多个数据项&lt;/li&gt;
&lt;li&gt;“粘贴一个图片文件”和“粘贴一块图片”是不同的 (!important)： &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;图片文件&lt;/strong&gt;是作为一个&lt;strong&gt;文件&lt;/strong&gt;出现的，它里面的数据可能是任意格式的甚至不是图片。而&lt;em&gt;图片&lt;/em&gt;，就肯定是表示图片的数据，它不一定有文件名，而它的数据格式也因不同实现而不同。这篇文章介绍的是第二种情况哦（虽然以后有时间我们也可以把第一种情况给解决掉）。&lt;/p&gt;
&lt;h2 id="choose your best favorite weapon!"&gt;choose your &lt;del&gt;best&lt;/del&gt; favorite weapon!&lt;/h2&gt;
&lt;p&gt;下一步便是从剪切板里读数据啦。我目前的第一开发浏览器是 chrome，所以就从 chrome 开始边调试边开发吧。对于 chrome，开发者们自己写的教程文章很多，于是我便按照&lt;a href="http://www.vettyofficer.com/2012/11/how-to-paste-image-from-clipboard-using.html" rel="nofollow" target="_blank" title=""&gt;这一篇&lt;/a&gt;开始了，总结一下，步骤很简单：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;拦截元素的&lt;code&gt;paste&lt;/code&gt;事件&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;可以是可编辑元素：&lt;code&gt;input&lt;/code&gt;, &lt;code&gt;[contenteditable]&lt;/code&gt;，也可以是全局元素： &lt;code&gt;window&lt;/code&gt;，所以只有在这个元素被激活时（例如正在编辑一个 contenteditable 时），你的粘贴动作才会被拦截&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;从&lt;code&gt;event&lt;/code&gt;的数据里判断粘贴过来的内容是不是我们想要的内容（我们想要图片）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;window.onpaste = (event)-&amp;gt; # it's coffeescript. don't panic!
  for item in event.clipboardData.items # 如果你是用 jQuery 拦截了 paste 事件，你需要用 event.originalEvent 来代替 event 
    if item.type.match /^image\// # item.type 为粘贴过来的内容的 mime-type，如 image/png
      # ...
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;是图片！调用&lt;code&gt;FileReader&lt;/code&gt;拿到它的 dataURL&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reader = new FileReader()
reader.onload = (event)=&amp;gt; # 注意这里是异步的哦
  getImageData event.target.result, (data)-&amp;gt;
    console.log data
reader.readAsDataURL item.getAsFile()
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="faithful gecko"&gt;faithful gecko&lt;/h2&gt;
&lt;p&gt;关于在 Firefox 里获取剪切板数据的文章相对要少一些，而且我发现刚才针对 chrome 使用的&lt;code&gt;clipboardData.items&lt;/code&gt;其实是 chrome 的私有 API，而不是 HTML5 的标准接口，而 Firefox 实现的才是标准的接口。好吧咱来看看&lt;a href="http://dev.w3.org/2006/webapi/clipops/clipops.html" rel="nofollow" target="_blank" title=""&gt;标准里面是怎样说的&lt;/a&gt;，其实区别不大：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要从 &lt;code&gt;event.clipboardData.types&lt;/code&gt; (一个类数组) 里判断粘贴过来的数据的类型&lt;/li&gt;
&lt;li&gt;需要用 &lt;code&gt;event.clipboardData.getData(type)&lt;/code&gt; 方法来获取数据&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;可是我试了一下后发现一个严重的问题： &lt;a href="http://stackoverflow.com/questions/15253468/get-pasted-image-from-clipboard-firefox" rel="nofollow" target="_blank" title=""&gt;Firefox 不允许粘贴图片 / 在 Firefox 里粘贴图片时获取不到数据&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;ok, 其实以上那个链接中也说得很明白了，想粘贴图片，hack 吧：ff 里编辑&lt;code&gt;[contenteditable]&lt;/code&gt;时，粘贴一个图片的话，ff 会把图片当作图文混排的插图将它转化为一个&lt;code&gt;&amp;lt;img /&amp;gt;&lt;/code&gt;元素插进去（图片数据被转换成 dataURL 作为这个&lt;code&gt;&amp;lt;img /&amp;gt;&lt;/code&gt;元素的&lt;code&gt;src&lt;/code&gt;属性了），所以该 hack 原理为： &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;激活 (&lt;code&gt;focus()&lt;/code&gt;) 一个隐藏的&lt;code&gt;div[contenteditable]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;获取&lt;code&gt;paste&lt;/code&gt;事件&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;虽然 ff 不允许粘贴图片，但是&lt;code&gt;paste&lt;/code&gt;事件还是能捕获到的，只不过从&lt;code&gt;event.clipboardData&lt;/code&gt;获取不到任何数据&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;setTimeout(..., 1)&lt;/code&gt;，等待“下一刻”图片被插入到&lt;code&gt;[contenteditable]&lt;/code&gt;里面&lt;/li&gt;
&lt;li&gt;在这个&lt;code&gt;[contenteditable]&lt;/code&gt;里面找到新添加的&lt;code&gt;&amp;lt;img /&amp;gt;&lt;/code&gt;元素，并拿到它的&lt;code&gt;src&lt;/code&gt;属性（就是我们想要的东西——图片数据的 dataURL）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Internet Explorer, the troll"&gt;Internet Explorer, the troll&lt;/h2&gt;
&lt;p&gt;IE 也没有实现 HTML5 标准里的 API，但是 IE 有个&lt;a href="http://msdn.microsoft.com/en-us/library/ie/ms535220(v=vs.85).aspx" rel="nofollow" target="_blank" title=""&gt;挺简单的私有剪切板 API&lt;/a&gt;，而且是从 IE5.5 就已经实现了的。IE 的私有 API 异常简单——直接访问&lt;code&gt;window.clipboardData.getData(type)&lt;/code&gt;就可以获取剪切板里的数据了。btw. 大部分同学应该能马上就想到 HTML5 标准 API 不设计成这样的原因，那就是：如果 API 是这样的，那网页便可以随时访问用户剪切板里的内容，用户的隐私便可能会被泄漏。&lt;/p&gt;

&lt;p&gt;不过试了一下后发现了 IE11 和 Firefox 有一样的问题：它不认粘贴来的图片，不过 IE11 的&lt;code&gt;[contenteditable]&lt;/code&gt;也支持插入图片并将其转换成&lt;code&gt;&amp;lt;img /&amp;gt;&lt;/code&gt;，所以用和 ff 同样的 hack 来解决就好了。&lt;/p&gt;
&lt;h2 id="old-fashioned Opera"&gt;old-fashioned Opera&lt;/h2&gt;
&lt;p&gt;Opera 的情况和 Firefox 类似——实现了 HTML5 标准里的 API，但是不支持粘贴图片。不过比较糟糕的是它的&lt;code&gt;[contenteditable]&lt;/code&gt;里也不支持插入图片，所以我也暂时没有找到什么办法让它能支持粘贴图片。&lt;/p&gt;
&lt;h2 id="Safari"&gt;Safari&lt;/h2&gt;
&lt;p&gt;Safari 的情况也和 Firefox 类似，但是在 Safari 里粘贴至&lt;code&gt;[contenteditable]&lt;/code&gt;的图片只会转换为&lt;code&gt;webkit-fake-url://...&lt;/code&gt;的形式，而这个数据似乎对我们没有任何用，它只是个本地的临时 url，只能在当前网页的&lt;code&gt;&amp;lt;img /&amp;gt;&lt;/code&gt;元素里显示图片，用 javascript 也读取不到 (非同源)，所以也暂时没办法让它支持粘贴图片了。&lt;/p&gt;

&lt;p&gt;ps. webkit 的 bugzilla 里有一个&lt;a href="https://bugs.webkit.org/show_bug.cgi?id=49141" rel="nofollow" target="_blank" title=""&gt;放了很久的 issue&lt;/a&gt;，正是针对这个问题而言的，所以看来从&lt;code&gt;[contenteditable]&lt;/code&gt;里粘贴暂时看来是没戏了，有其他办法么？&lt;/p&gt;
&lt;h2 id="share!"&gt;share!&lt;/h2&gt;
&lt;p&gt;其实俺一开始也到处搜索了一下，希望有人已经做了一个能实现粘贴图片功能的、支持不同浏览器的小 lib(或者 snippets)，后来发现确实没有，所以俺就来做这个事儿吧，这样我的编辑器也可以简单地引用它来读取剪切板里的图片：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;它的代码在这里：&lt;a href="https://github.com/Puffant/paste.js" rel="nofollow" target="_blank" title=""&gt;https://github.com/Puffant/paste.js&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;一个简单的演示页面 (先复制一段文字或者图片，然后点击网页四个方框中的任意一个，然后按&lt;code&gt;Ctrl + V&lt;/code&gt;粘贴)： &lt;a href="http://puffant.github.io/paste.js/" rel="nofollow" target="_blank" title=""&gt;http://puffant.github.io/paste.js/&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在这过程中我还找到了一些十分有用的资源 (上文中没有提到的)：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://wizard.ae.krakow.pl/~jb/localio.html" rel="nofollow" target="_blank" title=""&gt;Local I/O tests&lt;/a&gt;：除了 Clipboard API，这里还包括 Drag&amp;amp;Drop、FileReader、FileSaving、CopyAPI(“点击我拷贝到剪切板”这样的功能) 的原生 JavaScript 实现 demo。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://caniuse.com/#feat=clipboard" rel="nofollow" target="_blank" title=""&gt;Can I use clipboard API?&lt;/a&gt;：标准 Clipboard API 的浏览器兼容性一览。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://hacks.mozilla.org/2010/07/firefox-4-formdata-and-the-new-file-url-object/" rel="nofollow" target="_blank" title=""&gt;Firefox 4 – FormData and the new File.url object&lt;/a&gt;：想要将粘贴来的图片作为一个文件上传到服务器？用&lt;code&gt;FormData&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/blueimp/JavaScript-Canvas-to-Blob" rel="nofollow" target="_blank" title=""&gt;JavaScript Canvas to Blob&lt;/a&gt;：如题。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="碎碎念"&gt;碎碎念&lt;/h2&gt;
&lt;p&gt;其实这个功能对于论坛很有用耶，看：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;截图到剪切板&lt;/li&gt;
&lt;li&gt;编辑完文字后按一下 &lt;code&gt;Ctrl + V&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;发帖多么方便，生活多么美好&lt;/li&gt;
&lt;li&gt;求又拍云赞助咱 ruby-china 一个免费 bucket 吧  &lt;a href="/_" class="user-mention" title="@_"&gt;&lt;i&gt;@&lt;/i&gt;_&lt;/a&gt;@&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>layerssss</author>
      <pubDate>Fri, 14 Feb 2014 19:09:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/17266</link>
      <guid>https://ruby-china.org/topics/17266</guid>
    </item>
    <item>
      <title>开什么玩笑，鲁威的源码 谁下到了？</title>
      <description>&lt;p&gt;一大串网址，刚打开电脑就没了。……&lt;/p&gt;</description>
      <author>layerssss</author>
      <pubDate>Sun, 27 Oct 2013 09:06:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/15062</link>
      <guid>https://ruby-china.org/topics/15062</guid>
    </item>
  </channel>
</rss>
