一、结构

二、Repository层

1.

 package spittr.db;

 import java.util.List;

 import spittr.domain.Spitter;

 /**
* Repository interface with operations for {@link Spitter} persistence.
* @author habuma
*/
public interface SpitterRepository { long count(); Spitter save(Spitter spitter); Spitter findOne(long id); Spitter findByUsername(String username); List<Spitter> findAll(); }

2.

 package spittr.db;

 import java.util.List;

 import spittr.domain.Spittle;

 /**
* Repository interface with operations for {@link Spittle} persistence.
* @author habuma
*/
public interface SpittleRepository { long count(); List<Spittle> findRecent(); List<Spittle> findRecent(int count); Spittle findOne(long id); Spittle save(Spittle spittle); List<Spittle> findBySpitterId(long spitterId); void delete(long id); }

3.以前是用HibernateTemplate,但现在的最佳实践是用Hibernate contextual sessions and not use HibernateTemplate at all. This can be done by wiring a Hibernate SessionFactory directly into your repository and using it to obtain a session

@Repository有两作用:

(1)scanned by Spring component-scanning

(2)catch platformspecific exceptions and rethrow them as one of Spring’s unified unchecked exceptions

But if you’re using Hibernate contextual sessions and not a Hibernate template,how can the exception translation take place?要实现第2个作用还要配在配置文件配置PersistenceExceptionTranslationPostProcessor,如:

 @Bean
public BeanPostProcessor persistenceTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
 package spittr.db.hibernate4;

 import java.io.Serializable;
import java.util.List; import javax.inject.Inject; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository; import spittr.db.SpitterRepository;
import spittr.domain.Spitter; @Repository
public class HibernateSpitterRepository implements SpitterRepository { private SessionFactory sessionFactory; @Inject
public HibernateSpitterRepository(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory; //<co id="co_InjectSessionFactory"/>
} private Session currentSession() {
return sessionFactory.getCurrentSession();//<co id="co_RetrieveCurrentSession"/>
} public long count() {
return findAll().size();
} public Spitter save(Spitter spitter) {
Serializable id = currentSession().save(spitter); //<co id="co_UseCurrentSession"/>
return new Spitter((Long) id,
spitter.getUsername(),
spitter.getPassword(),
spitter.getFullName(),
spitter.getEmail(),
spitter.isUpdateByEmail());
} public Spitter findOne(long id) {
return (Spitter) currentSession().get(Spitter.class, id);
} public Spitter findByUsername(String username) {
return (Spitter) currentSession()
.createCriteria(Spitter.class)
.add(Restrictions.eq("username", username))
.list().get(0);
} public List<Spitter> findAll() {
return (List<Spitter>) currentSession()
.createCriteria(Spitter.class).list();
} }

4.

 package spittr.db.hibernate4;

 import java.io.Serializable;
import java.util.List; import javax.inject.Inject; import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository; import spittr.db.SpittleRepository;
import spittr.domain.Spittle; @Repository
public class HibernateSpittleRepository implements SpittleRepository { private SessionFactory sessionFactory; @Inject
public HibernateSpittleRepository(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
} private Session currentSession() {
return sessionFactory.getCurrentSession();//<co id="co_RetrieveCurrentSession"/>
} public long count() {
return findAll().size();
} public List<Spittle> findRecent() {
return findRecent(10);
} public List<Spittle> findRecent(int count) {
return (List<Spittle>) spittleCriteria()
.setMaxResults(count)
.list();
} public Spittle findOne(long id) {
return (Spittle) currentSession().get(Spittle.class, id);
} public Spittle save(Spittle spittle) {
Serializable id = currentSession().save(spittle);
return new Spittle(
(Long) id,
spittle.getSpitter(),
spittle.getMessage(),
spittle.getPostedTime());
} public List<Spittle> findBySpitterId(long spitterId) {
return spittleCriteria()
.add(Restrictions.eq("spitter.id", spitterId))
.list();
} public void delete(long id) {
currentSession().delete(findOne(id));
} public List<Spittle> findAll() {
return (List<Spittle>) spittleCriteria().list();
} private Criteria spittleCriteria() {
return currentSession()
.createCriteria(Spittle.class)
.addOrder(Order.desc("postedTime"));
} }

三、Domainn层

1.

 package spittr.domain;

 import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id; @Entity
public class Spitter { private Spitter() {} @Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id; @Column(name="username")
private String username; @Column(name="password")
private String password; @Column(name="fullname")
private String fullName; @Column(name="email")
private String email; @Column(name="updateByEmail")
private boolean updateByEmail; public Spitter(Long id, String username, String password, String fullName,
String email, boolean updateByEmail) {
this.id = id;
this.username = username;
this.password = password;
this.fullName = fullName;
this.email = email;
this.updateByEmail = updateByEmail;
} public Long getId() {
return id;
} public String getUsername() {
return username;
} public String getPassword() {
return password;
} public String getFullName() {
return fullName;
} public String getEmail() {
return email;
} public boolean isUpdateByEmail() {
return updateByEmail;
} }

2.

 package spittr.domain;

 import java.util.Date;

 import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne; @Entity
public class Spittle { private Spittle() {} @Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id; @ManyToOne
@JoinColumn(name="spitter")
private Spitter spitter; @Column
private String message; @Column
private Date postedTime; public Spittle(Long id, Spitter spitter, String message, Date postedTime) {
this.id = id;
this.spitter = spitter;
this.message = message;
this.postedTime = postedTime;
} public Long getId() {
return this.id;
} public String getMessage() {
return this.message;
} public Date getPostedTime() {
return this.postedTime;
} public Spitter getSpitter() {
return this.spitter;
} }

四、配置文件及数据库文件

0.

 package spittr.db.hibernate4;

 import java.io.IOException;
import java.util.Properties; import javax.inject.Inject;
import javax.sql.DataSource; import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
//import org.springframework.orm.hibernate4.HibernateTransactionManager;
//import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer; @Configuration
@EnableTransactionManagement
@ComponentScan
public class RepositoryTestConfig implements TransactionManagementConfigurer { @Inject
private SessionFactory sessionFactory; @Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder edb = new EmbeddedDatabaseBuilder();
edb.setType(EmbeddedDatabaseType.H2);
edb.addScript("spittr/db/hibernate4/schema.sql");
edb.addScript("spittr/db/hibernate4/test-data.sql");
EmbeddedDatabase embeddedDatabase = edb.build();
return embeddedDatabase;
} //@Bean
public PlatformTransactionManager annotationDrivenTransactionManager() {
System.out.println(sessionFactory);
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory);
return transactionManager;
} @Bean
public SessionFactory sessionFactoryBean() {
try {
LocalSessionFactoryBean lsfb = new LocalSessionFactoryBean();
lsfb.setDataSource(dataSource());
lsfb.setPackagesToScan("spittr.domain");
Properties props = new Properties();
props.setProperty("dialect", "org.hibernate.dialect.H2Dialect");
lsfb.setHibernateProperties(props);
lsfb.afterPropertiesSet();
SessionFactory object = lsfb.getObject();
return object;
} catch (IOException e) {
return null;
}
}
}

1.

 log4j.rootCategory=INFO, stdout

 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %40.40c:%4L - %m%n

2.RepositoryTest-context.xml

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:c="http://www.springframework.org/schema/c" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:component-scan base-package="spittr.db.hibernate4" /> <bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
c:_-ref="sessionFactory" /> <jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="spittr/db/hibernate4/schema.sql" />
<jdbc:script location="spittr/db/hibernate4/test-data.sql" />
</jdbc:embedded-database> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.habuma.spitter.domain" />
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.H2Dialect</prop>
</props>
</property>
</bean> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> </beans>

3.schema.sql

 drop table if exists spittle;
drop table if exists spitter; create table spitter (
id identity,
username varchar(25) not null,
password varchar(25) not null,
fullName varchar(100) not null,
email varchar(50) not null,
updateByEmail boolean not null
); create table spittle (
id integer identity primary key,
spitter integer not null,
message varchar(2000) not null,
postedTime datetime not null,
foreign key (spitter) references spitter(id)
);

4.test-data.sql

 insert into Spitter (username, password, fullname, email, updateByEmail) values ('habuma', 'password', 'Craig Walls', 'craig@habuma.com', false);
insert into Spitter (username, password, fullname, email, updateByEmail) values ('mwalls', 'password', 'Michael Walls', 'mwalls@habuma.com', true);
insert into Spitter (username, password, fullname, email, updateByEmail) values ('chuck', 'password', 'Chuck Wagon', 'chuck@habuma.com', false);
insert into Spitter (username, password, fullname, email, updateByEmail) values ('artnames', 'password', 'Art Names', 'art@habuma.com', true); insert into Spittle (spitter, message, postedTime) values (1, 'This is a test spittle message', '2012-06-09 22:00:00Z');
insert into Spittle (spitter, message, postedTime) values (1, 'This is another test spittle message', '2012-06-09 22:10:00Z');
insert into Spittle (spitter, message, postedTime) values (1, 'This is a third test spittle message', '2012-07-04 23:30:00Z');
insert into Spittle (spitter, message, postedTime) values (2, 'Hello from Chuck!', '2012-03-25 12:15:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Hello from Art!', '2012-03-25 12:15:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Hello again from Art!', '2012-03-25 12:25:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Hola from Arthur!', '2012-03-25 12:35:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Buenos Dias from Art!', '2012-03-25 12:45:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Ni Hao from Art!', '2012-03-25 12:55:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Guten Tag from Art!', '2012-03-25 13:05:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Konnichi wa from Art!', '2012-03-25 13:15:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Buon giorno from Art!', '2012-03-25 13:25:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Bonjour from Art!', '2012-03-25 13:35:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'Aloha from Art!', '2012-03-25 13:45:00Z');
insert into Spittle (spitter, message, postedTime) values (4, 'God dag from Art!', '2012-03-25 13:55:00Z');

五、测试文件

1.

 package spittr.db.hibernate4;

 import static org.junit.Assert.*;

 import java.util.List;

 import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional; import spittr.db.SpitterRepository;
import spittr.domain.Spitter; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RepositoryTestConfig.class)
public class SpitterRepositoryTest { @Autowired
SpitterRepository spitterRepository; @Test
@Transactional
public void count() {
assertEquals(4, spitterRepository.count());
} @Test
@Transactional
public void findAll() {
List<Spitter> spitters = spitterRepository.findAll();
assertEquals(4, spitters.size());
assertSpitter(0, spitters.get(0));
assertSpitter(1, spitters.get(1));
assertSpitter(2, spitters.get(2));
assertSpitter(3, spitters.get(3));
} @Test
@Transactional
public void findByUsername() {
assertSpitter(0, spitterRepository.findByUsername("habuma"));
assertSpitter(1, spitterRepository.findByUsername("mwalls"));
assertSpitter(2, spitterRepository.findByUsername("chuck"));
assertSpitter(3, spitterRepository.findByUsername("artnames"));
} @Test
@Transactional
public void findOne() {
assertSpitter(0, spitterRepository.findOne(1L));
assertSpitter(1, spitterRepository.findOne(2L));
assertSpitter(2, spitterRepository.findOne(3L));
assertSpitter(3, spitterRepository.findOne(4L));
} @Test
@Transactional
public void save_newSpitter() {
assertEquals(4, spitterRepository.count());
Spitter spitter = new Spitter(null, "newbee", "letmein", "New Bee",
"newbee@habuma.com", true);
Spitter saved = spitterRepository.save(spitter);
assertEquals(5, spitterRepository.count());
assertSpitter(4, saved);
assertSpitter(4, spitterRepository.findOne(5L));
} private static void assertSpitter(int expectedSpitterIndex, Spitter actual) {
assertSpitter(expectedSpitterIndex, actual, "Newbie");
} private static void assertSpitter(int expectedSpitterIndex, Spitter actual,
String expectedStatus) {
Spitter expected = SPITTERS[expectedSpitterIndex];
assertEquals(expected.getId(), actual.getId());
assertEquals(expected.getUsername(), actual.getUsername());
assertEquals(expected.getPassword(), actual.getPassword());
assertEquals(expected.getFullName(), actual.getFullName());
assertEquals(expected.getEmail(), actual.getEmail());
assertEquals(expected.isUpdateByEmail(), actual.isUpdateByEmail());
} private static Spitter[] SPITTERS = new Spitter[6]; @BeforeClass
public static void before() {
SPITTERS[0] = new Spitter(1L, "habuma", "password", "Craig Walls",
"craig@habuma.com", false);
SPITTERS[1] = new Spitter(2L, "mwalls", "password", "Michael Walls",
"mwalls@habuma.com", true);
SPITTERS[2] = new Spitter(3L, "chuck", "password", "Chuck Wagon",
"chuck@habuma.com", false);
SPITTERS[3] = new Spitter(4L, "artnames", "password", "Art Names",
"art@habuma.com", true);
SPITTERS[4] = new Spitter(5L, "newbee", "letmein", "New Bee",
"newbee@habuma.com", true);
SPITTERS[5] = new Spitter(4L, "arthur", "letmein", "Arthur Names",
"arthur@habuma.com", false);
} }

2.

 package spittr.db.hibernate4;

 import static org.junit.Assert.*;

 import java.util.Date;
import java.util.List; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional; import spittr.db.SpittleRepository;
import spittr.domain.Spitter;
import spittr.domain.Spittle; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=RepositoryTestConfig.class)
public class SpittleRepositoryTest { @Autowired
SpittleRepository spittleRepository; @Test
@Transactional
public void count() {
assertEquals(15, spittleRepository.count());
} @Test
@Transactional
public void findRecent() {
// default case
{
List<Spittle> recent = spittleRepository.findRecent();
assertRecent(recent, 10);
} // specific count case
{
List<Spittle> recent = spittleRepository.findRecent(5);
assertRecent(recent, 5);
}
} @Test
@Transactional
public void findOne() {
Spittle thirteen = spittleRepository.findOne(13);
assertEquals(13, thirteen.getId().longValue());
assertEquals("Bonjour from Art!", thirteen.getMessage());
assertEquals(1332682500000L, thirteen.getPostedTime().getTime());
assertEquals(4, thirteen.getSpitter().getId().longValue());
assertEquals("artnames", thirteen.getSpitter().getUsername());
assertEquals("password", thirteen.getSpitter().getPassword());
assertEquals("Art Names", thirteen.getSpitter().getFullName());
assertEquals("art@habuma.com", thirteen.getSpitter().getEmail());
assertTrue(thirteen.getSpitter().isUpdateByEmail());
} @Test
@Transactional
public void findBySpitter() {
List<Spittle> spittles = spittleRepository.findBySpitterId(4L);
assertEquals(11, spittles.size());
for (int i = 0; i < 11; i++) {
assertEquals(15-i, spittles.get(i).getId().longValue());
}
} @Test
@Transactional
public void save() {
assertEquals(15, spittleRepository.count());
Spitter spitter = spittleRepository.findOne(13).getSpitter();
Spittle spittle = new Spittle(null, spitter, "Un Nuevo Spittle from Art", new Date());
Spittle saved = spittleRepository.save(spittle);
assertEquals(16, spittleRepository.count());
assertNewSpittle(saved);
assertNewSpittle(spittleRepository.findOne(16L));
} @Test
@Transactional
public void delete() {
assertEquals(15, spittleRepository.count());
assertNotNull(spittleRepository.findOne(13));
spittleRepository.delete(13L);
assertEquals(14, spittleRepository.count());
assertNull(spittleRepository.findOne(13));
} private void assertRecent(List<Spittle> recent, int count) {
long[] recentIds = new long[] {3,2,1,15,14,13,12,11,10,9};
assertEquals(count, recent.size());
for (int i = 0; i < count; i++) {
assertEquals(recentIds[i], recent.get(i).getId().longValue());
}
} private void assertNewSpittle(Spittle spittle) {
assertEquals(16, spittle.getId().longValue());
} }

SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-001-使用Hibernate(@Inject、@EnableTransactionManagement、@Repository、PersistenceExceptionTranslationPostProcessor)的更多相关文章

  1. SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-006Spring-Data的运行规则(@EnableJpaRepositories、<jpa:repositories>)

    一.JpaRepository 1.要使Spring自动生成实现类的步骤 (1)配置文件xml <?xml version="1.0" encoding="UTF- ...

  2. SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-003编写JPA-based repository( @PersistenceUnit、 @PersistenceContext、PersistenceAnnotationBeanPostProcessor)

    一.注入EntityManagerFactory的方式 package com.habuma.spittr.persistence; import java.util.List; import jav ...

  3. SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-002设置JPA的EntityManagerFactory(<persistence-unit>、<jee:jndi-lookup>)

    一.EntityManagerFactory的种类 1.The JPA specification defines two kinds of entity managers:  Applicatio ...

  4. SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-005Spring-Data-JPA例子的代码

    一.结构 二.Repository层 1. package spittr.db; import java.util.List; import org.springframework.data.jpa. ...

  5. SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-004JPA例子的代码

    一.结构 二.Repository层 1. package spittr.db; import java.util.List; import spittr.domain.Spitter; /** * ...

  6. SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-004-以query parameters的形式给action传参数(@RequestParam、defaultValue)

    一. 1.Spring MVC provides several ways that a client can pass data into a controller’s handler method ...

  7. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-005- 异常处理@ResponseStatus、@ExceptionHandler、@ControllerAdvice

    No matter what happens, good or bad, the outcome of a servlet request is a servlet response. If an e ...

  8. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-003- 上传文件multipart,配置StandardServletMultipartResolver、CommonsMultipartResolver

    一.什么是multipart The Spittr application calls for file uploads in two places. When a new user register ...

  9. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-002- 在xml中引用Java配置文件,声明DispatcherServlet、ContextLoaderListener

    一.所有声明都用xml 1. <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...

随机推荐

  1. [LAMP]【转载】——PHP7.0的安装

    ***原文链接:http://my.oschina.net/sallency/blog/541287 php编译过程报错解决可参考:http://www.cnblogs.com/z-ping/arch ...

  2. linux查看tomcat版本

    进入tomcat bin目录下 然后执行 ./version.sh Server version: Apache Tomcat/6.0.26Server built:   March 9 2010 1 ...

  3. mysql 慢查询开启

    相关博客: linux下开启mysql慢查询,分析查询语句 开启方法: 方法一:使用命令开启慢查询开启 mysql> show variables like "%long%" ...

  4. android 通过AlarmManager实现守护进程

    场景:在app崩溃或手动退出或静默安装后能够自动重启应用activity 前提:得到系统签名 platform.pk8.platform.x509.pem及signapk.jar 三个文件缺一不可(系 ...

  5. 自定义异常时如何定义checked异常和unchecked异常

    When defining your own exception type, study the existing exception classes in the Java API and try ...

  6. 在ubuntu上搭建reviewboard

    review board 2.0.5 ubuntu ubuntu-12.04.1-desktop-amd64 基本上基于这个教程:http://alephnullplex.appspot.com/bl ...

  7. 实现IDisposable接口的模式

    代码: public class Class2 : IDisposable { ~Class2() { Dispose(false); } public void Dispose() { Dispos ...

  8. C#指针与字节数组的操作

    private static byte[] ReadBytesFromPtr(IntPtr intPtr, int bufferLength) { var result = new byte[buff ...

  9. CIFAR-10 Competition Winners: Interviews with Dr. Ben Graham, Phil Culliton, & Zygmunt Zając

    CIFAR-10 Competition Winners: Interviews with Dr. Ben Graham, Phil Culliton, & Zygmunt Zając Dr. ...

  10. git在terminal中自动补全

    1. curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~ ...