Labels

Friday, April 15, 2016

GitHub可视化工具

GitHub可视化工具

作为版本管理仓库中的龙头老大,GitHub有着千万量级的Project,实际上,由于Project Open DataDocker以及科技巨头们的青睐,在2013年的时候,GitHub上Repository的托管数量就已经突破千万了。详细见下表
图片来源:https://github.com/blog/1724-10-million-repositories
在如数众多的Project中,尤其是开发周期长达几年的Project中提取我们感兴趣的信息是很困难难的。比如直观的了解一个Project的生命周期,有多少contributer在什么时间做了多少contribution。
GitHub的可视化工具可以帮我们做到这一点,最近发现了一个有意思的GitHub可视化工具,输入待分析的GitHub用户名后可以看到该用户下所有公共Respository,并且根据使用语言进行聚类可视化

接下来,我们可以选择一个感兴趣的Respository继续进行分析,比如我们在这里选中Docker


点击播放就可以看到根据时间轴的Project动态变化了,比如什么时候有什么人加入了近来,做了什么贡献等等


然后发现Docker中的不少贡献者都是国人欸,比较亮点是发现了不少华为员工^_^

Thursday, April 14, 2016

[Java] 参数传递

[Java] 参数传递

Java参数传递说难也难说简单也简单,今天做了一道编程题,才觉得掌握了Java的参数传递。
Java的参数传递应该分为两部分来讲,一是基本类型的参数传递,比如int, boolean, double, float等类型,这里要特别说明String不是基本类型。而是对象作为参数传递,比如各种内建类和用户自己实现的类。

基本类型参数传递

这个比较好讲,类比C语言,基本类型作为参数传递时,是传递值的拷贝,无论在函数中如何改变这个值的拷贝,原值是不会改变的

对象作为参数传递

这里就比较令人迷惑了,今天写了一个用遍历单项链表的方法找末尾元素和长度的函数,输入为单项链表的表头元素
 LinkedListNode  tail = findEndNode(first)
 public static int findEndNode(LinkedListNode tail) {
  int length = 1;
  while (tail.next != null) {
   length++;
   tail = tail.next;
  }
                return int;
 }
本以为函数不用返回找到的尾项,输入表头后直接变末尾元素,可惜不是这样。输出后发现表头没有任何改变,和基本类型作为参数传递的情况一样。
实际上Java中对象作为参数传递时,是把对象在在内存中的地址拷贝了一份给了参数,也就是说这里参数传递时的tail是first地址的拷贝,对tail进行操作四号不会影响到first的地址
进行改进后
 public static class Result{
  public LinkedListNode tail;
  public int length;
  public Result(LinkedListNode tail, int length) {
   this.tail = tail;
   this.length = length;
  }
 }
 public static Result findEndNode(LinkedListNode tail) {
  int length = 1;
  while (tail.next != null) {
   length++;
   tail = tail.next;
  }
  return new Result(tail,length);
 }
这样才可以同时返回单项列表长度以及末尾元素

Wednesday, April 13, 2016

在Win10上安装Tensorflow

在Win10上安装TensorFlow

[2016 12 01 update] 谷歌TensorFlow支持微软Windows平台, 并且支持CUDA加速, 以后windows用户不用再使用docker安装TensorFlow了

谷歌TensorFlow上提供了数种安装TensorFlow的办法,唯独不支持微软Windows平台,本想打算放弃Windows平台转战Ubuntu,但是仔细阅读TensorFlow的官方安装文档,我发现可以用Dock直接下载TensorFlow的镜像,而Docker是支持Windows平台的!(PS:虽然相比于Linux的原生支持,Docker在Windows上的非原生支持也免了我安装Ubuntu的困恼)
下面是TensorFlow安装教程以及注意事项

Step 1:

在Windows平台下安装TensorFlow可以借助Docker实现,至于火遍云计算圈子的Docker到底是什么,可以参考这本开源图书《Docker —— 從入門到實踐­》
下面我们要安装Windows版本的Docker,点击进入Docker官方安装教程。

Step 2:


安装完Docker后桌面上会有上面三个图标,点击Docker Quickstart Terminal,输入以下命令

$ docker pull b.gcr.io/tensorflow/tensorflow-full
等待几分钟后,TensorFlow的完整版镜像就安装到了本地,我们可以测试一下,在Prompt下输入  python 进如python命令行
$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>

大功告成^_^

Saturday, April 2, 2016

Unity入门教程之ROLL-A-BALL 学习笔记 Part IV

Unity入门教程

ROLL-A-BALL 学习笔记

4     Building the Game

使用Unity的好处就是设计完成一款游戏后可以在多个平台发布
游戏Build流程
1.      打开Build Setting Windows: File -> Build Settings
2.      选择Plateform和要BulidScene
3.      选择输出文件夹,Build完成
Project View文件夹说明
文件夹名称
作用
_Scene
放置游戏场景
Materials
放置着色用的材料
Prefabs
Template of game object family
Scripts
保存游戏Script



Friday, April 1, 2016

Unity入门教程之ROLL-A-BALL 学习笔记 Part III

Unity入门教程

ROLL-A-BALL 学习笔记

教程链接:http://unity3d.com/cn/learn/tutorials/projects/roll-a-ball/introduction?playlist=17141

3     收集, 得分以及BUILDING THE GAME

3.1    创建可收集的OBJECTS

Create->3D Object->Cube,重命名为Pick Up
Inspector菜单下的Active checkbox可以控制objectscene view里的显示/隐藏

3.1.1     使Pick Up Object在游戏中旋转

Inspector菜单下 Add Component-> New Script,命名为Rotator
Update()函数下增加
transform.Rotate (new Vector3 (153045) * Time.deltaTime);
乘以Time.deltaTim使得rotate动作更加smoothframe rate independent
Pick Up Object 放入prefab
Prefab: Prefab is an asset that contains a template or blueprint of a game object family, once created, we can use this prefab in any scene in our current project
使用Prefab的好处:对一个object更改,或直接对prefab asset本身更改,所有相关object都会得到更新,比如我们想要给一个Prefab关联的多个instance着色,有两个办法:
1.      新建material,设置颜色后拖动materialScene View中的一个instance,这时只有该instance得到着色,单击inspector菜单的apply,所有相关instance都会得到着色
2.      新建material,设置颜色后直接拖动materialProject View下的prefab,所有相关instance都会得到着色
使用prefab步骤:
1.      在根目录下创建Prefabs文件夹
2.      Pick Up ObjectHierarchy拖入Project View中的Prefabs文件夹,当我们从Hierarchy View拖动objectProject View 中时,我们就创建了一个new prefab asset containing a template or blueprint of our game object or game object family
3.      为了使hierarchy更有序,我们在Hierarchy View创建空的Game Obejcthold之前的Pick Up Object

3.2    收集PICK UP OBJECTS

如何学习一个component:点击inspector菜单下的相应component « ? »标志,进入reference,可以查看两周referencemanual(in the context of editor)scripting
GameObject的属性之tagtag是一个string value可以让我们区分不同的game object
GameObject的方法之compareTag,可以让我们比较不同的tag
如何给game object增加tag
1.      project view中选中prefab- >点击inspectorTaglist->Add Tag
2.      project view中选中prefab- >点击inspectorTaglist ->选择新建Tag
按住ctrl,可以在Scene View中选择多个game object,这时inspector菜单会显示多个game object的共同属性
碰撞collisions,在Unity的物理引擎下是如何工作的?
物理引擎不运行两个collidervolumes重叠(overlap),如果物理引擎在某一帧检测到了一个或多个colliders的重叠,物理引擎将会查看该object,分析其速度、rotation和形状以此计算碰撞。该计算中的一个重要因素是,该colliderstatic的还是dynamic的。Static collider一般是scene中不能移动的物体,比如墙壁,花草;Dynamic collider一般是移动的物体,比如player’s sphere或是汽车。计算碰撞时,Static collider的形状(geometry)不会受到影响,但是Dynamic collider会受到影响。
如果我们不希望colliders有重叠时发生碰撞,那么我们可以把其中的一个该为trigger collider。当我们把一个collider变成trigger collider时,我们可以通过OnTrigger event message来检测两个colliders的重叠。当一个collidertrigger时,我们可以做很多有意思的事情。比如在冒险游戏中,我们在middle of the door way中放置这样一个trigger,当player到大门口时,我们可以更新小地图,并在屏幕上显示“你发现了这个房间“。
collider变成trigger方法:选中该物体,在inspector菜单下Collider选项中将Is Trigger选中
关于Unity的性能优化问题
Unity计算all the volumes of all the static colliders in a scene and holds this information in a cache。这种情况在static collidersmove的假设下是合理的,因为这样可以save recaculation time,然而,当我们使static collider运动时(比如move, rotate, scale),Unity会重新计算所有static collider并且更新cache。为了避免Unity重新计算这样的Static collider,我们需要将其转变为dynamic collider
Static collider:有collider attache但是没有physics rigid body
dynamic collider:同时有colliderrigid body
Static collider转变为dynamic collider只需要增加rigid body就行了,但是要注意rigid body会带来物理属性,为了消除rigid body的物理属性,要勾选inspector菜单下Rigidbody一栏中,Use Gravity Is Kinemactic两个勾选框,这样它就变成了kinematic rigid bodykinematic rigid body不会相应物理forces,但是可以相应我们在脚本中设置的动画,比如move, rotate, scalekinematic rigid body可以用于游戏中的升降梯,移动平台以及可以收集的小豆豆

3.3    显示得分以及文字

game中显示text需要用到UnityUI Toolset
Hierarchy ViewCreate->UI->Text
同时新建了三个东西,CanvasTextEventSystemText必须是Canavschild以确保其behave correctly
注意Inspector View下的TextTransform属性与game object不同,更改Text的默认显示位置可以在Rect Transform属性下修改Anchor Presets
Script PlayerController中增加public变量countText 以及相应方法后怎么与Hierarchy View中的Text链接呢? 将其拖入到PlayerScript相应属性中就行,这样Unity会找到Hierarchy View中的Textreference

Unity入门教程之ROLL-A-BALL 学习笔记 Part II

Unity入门教程

ROLL-A-BALL 学习笔记

教程链接:http://unity3d.com/cn/learn/tutorials/projects/roll-a-ball/introduction?playlist=17141

2     设置摄像头和PLAY AREA

2.1    移动摄像头

·        方法一:
1.      调整Main Camera角度:Inspector设置postion
2.      拖动Main Camera使其成为Playerchild
3.      这样Main Camera会随着Player的移动而移动,注意,如果Player rotateMain Camera也会跟着rotate,这样不好
·        方法二:
1.      使用scriptPlayer Camera联系起来选中Main Camera Add Component->New Script, 重命名scriptCameraController
2.      为得到Playerreference,可以新建public GameObject变量,获取Playerrefercence
3.      LateUpdate里插入代码
4.      进取Editor,把Player拖入Main CameraInspector菜单下的Script Slot

2.2    设置PLAY AREA

就是增加4堵墙
GameObject ->create empty
注意:Empty GameObject的意义在于充当objectfolder,有利于结构化管理
建造四面墙壁:
1.      先新建Empty GameObject当作parent,重命名为Walls
2.      先建造一面墙壁:GameObject->3D Object->Cube,重命名为West Wall
3.      West Wall归入Walls
4.      把刚刚的墙复制三遍:Edit->Duplicate (ctrl + d)
Global Mode:这个模式下,拖动objectobjectground平行
Local Mode : Highlight 某个object后,使Editor进入Local Mode,按下Play按钮,这样我们就可以看到 transform rotate