MapReduce的C#实现及单元测试(试验)
MapReduce.cs类文件代码 MapReduce的执行方法
using System;
using System.Collections.Generic;
//using System.Linq;
//using System.Threading.Tasks; namespace MapReduce
{
/// <summary>
/// Very Simple MapReduce implementation in C#
/// </summary>
/// <remarks>
/// Thanks to Stephan Brenner. Refactored for C# 4.0
/// </remarks>
public class MapReduce
{
public static int NumberOfCores = 4; public static Dictionary<T3, List<T4>> Execute<T1, T2, T3, T4>(
Func<T1, T2, List<KeyValuePair<T3, T4>>> mapFunction,
Func<T3, List<T4>, List<T4>> reduceFunction,
Dictionary<T1, T2> input)
{
var maps = new Dictionary<T3, List<T4>>();
input.DivvyUp(
NumberOfCores,
l => l.ForEach(kv => maps.Add(mapFunction(kv.Key, kv.Value), i => i.Key, i => i.Value))); var result = new Dictionary<T3, List<T4>>();
maps.DivvyUp(
NumberOfCores,
m => m.ForEach(map => result.Add(reduceFunction(map.Key, map.Value), i => map.Key, i => i))); return result;
}
}
}
EnumerableExtensions.cs类文件 MapReduce执行过程中调用的枚举扩展方法
using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks; namespace MapReduce
{
public static class EnumerableExtensions
{
#region -- IDictionary -- /// <summary>
/// 字典值集合中添加值?
/// Adds an Enumerable to a Dictionary
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TK"></typeparam>
/// <typeparam name="TV"></typeparam>
/// <param name="dictionary"></param>
/// <param name="list"></param>
/// <param name="keySelector"></param>
/// <param name="valueSelector"></param>
public static void Add<T, TK, TV>(this IDictionary<TK, List<TV>> dictionary,
IEnumerable<T> list,
Func<T, TK> keySelector,
Func<T, TV> valueSelector)
{
lock (dictionary)
{
foreach (var item in list)
{
var key = keySelector(item); if (!dictionary.ContainsKey(key))
{
dictionary[key] = new List<TV>();
} dictionary[key].Add(valueSelector(item));
}
}
} #endregion #region -- IEnumberable -- /// <summary>
/// 遍历执行
/// Iterates over an Enumerable
/// </summary>
/// <remarks>
/// why wasn't this part of LINQ?
/// </remarks>
/// <typeparam name="T"></typeparam>
/// <param name="enumerable"></param>
/// <param name="action"></param>
public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
foreach (var item in enumerable)
{
action(item);
}
} /// <summary>
/// Divides an enumerable into equal parts and performs an action on those parts
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="enumerable"></param>
/// <param name="parts"></param>
/// <param name="action"></param>
public static void DivvyUp<T>(this IEnumerable<T> enumerable, int parts, Action<IEnumerable<T>, int, int> action)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
} if (action == null)
{
throw new ArgumentNullException("action");
} var actions = new List<Action>(); if (parts == 0)
parts = 1; int count = enumerable.Count();
int itemsPerPart = count / parts; if (itemsPerPart == 0)
itemsPerPart = 1; for (int i = 0; i < parts; i++)
{
var collection = enumerable
.Skip(i * itemsPerPart)
.Take(i == parts - 1 ? count : itemsPerPart); int j = i; // access to modified closure safety
actions.Add(() => action(collection, j, itemsPerPart));
} //并行执行对象列表中方法
Parallel.Invoke(actions.ToArray());
} /// <summary>
/// 接口的扩展方法(可枚举对象的扩展方法)
/// Divides an enumerable into equal parts and performs an action on those parts
/// </summary>
/// <typeparam name="T">?KeyValuePair<T3,List<T4>>?</typeparam>
/// <param name="enumerable">可枚举对象</param>
/// <param name="parts">均分数</param>
/// <param name="action">执行方法</param>
public static void DivvyUp<T>(this IEnumerable<T> enumerable, int parts, Action<IEnumerable<T>> action)
{
DivvyUp(enumerable, parts, (subset, i, j) => action(subset));
} #endregion
}
}
TestAllInfo.cs 单位测试工具测试MapReduce的实现过程
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using MapReduce;
using NUnit.Framework;
using Microsoft.CSharp.RuntimeBinder; namespace nUnitTest
{
[TestFixture]
public class TestAllInfo
{
[Test]
public void TestDynamicKeyWord()
{
//动态加载类型 (运行时确定类型)
dynamic target = "动态类型 panchzh 测试";
dynamic arg = "panchzh";
bool bTestResult = target.Contains(arg);
}
/// <summary>
/// 测试枚举方法
/// </summary>
[Test]
public void DivvyUp_Splits_List_Of_Two()
{
var list = new[] { , , , , , , , };
list.DivvyUp(, subset =>
{
Assert.IsNotNull(subset);
Assert.IsTrue(.Equals(subset.Count()));
});
}
/// <summary>
/// 测试枚举方法
/// </summary>
[Test]
public void DivvyUp_Splits_List_Of_Three()
{
var list = new[] { , , , , , , , , };
list.DivvyUp(, subset =>
{
Assert.IsNotNull(subset);
Assert.IsTrue(.Equals(subset.Count()));
});
}
/// <summary>
/// 测试枚举方法
/// </summary>
[Test]
public void DivvyUp_Splits_Uneven_Lists()
{
var list = new[] { , , , , , , , , };
list.DivvyUp(, (subset, i, j) =>
{
Assert.IsNotNull(subset);
if (i == )
Assert.IsTrue(.Equals(subset.Count()));
if (i == )
Assert.IsTrue(.Equals(subset.Count()));
});
}
/// <summary>
/// 测试枚举方法
/// </summary>
[Test]
public void DivvyUp_Waits_For_All_Actions_To_Complete()
{
int i = ;
var list = new[] { , , , , , , , , };
list.DivvyUp(, j => i++);
Assert.IsTrue(.Equals(i));
} /// <summary>
/// 文件中查找单词
/// </summary>
[Test]
public void TestFindWordInFile()
{
DirectoryInfo dir = new DirectoryInfo(@"E:\SourceCode\mapreduce-csharp-master\mapreduce-csharp-master\Tests\App_Data");
Dictionary<FileInfo, string> fileSearchData = new Dictionary<FileInfo, string>();
dir.GetFiles("*.txt").ToList().ForEach(f => fileSearchData.Add(f, File.ReadAllText(f.FullName)));
var output = MapReduceClass.Execute(Map_FindWord, Reduce_FindWord, fileSearchData); //单元测试断言
Assert.IsNotEmpty(output);
Assert.Contains("Vestibulum", output.Keys);
Assert.LessOrEqual(output["Vestibulum"][], );
if (!output["Vestibulum"][].Equals())
{
Trace.WriteLine("Not Equal");
Debug.WriteLine("debug test");
}
Assert.IsTrue(output["Vestibulum"][].Equals());
}
public static List<KeyValuePair<string, int>> Map_FindWord(FileInfo document, string text)
{
List<KeyValuePair<string, int>> result = new List<KeyValuePair<string, int>>();
var items = text.Split('\n', ' ', '.', ',', '\r');
result = items.Select(item => new KeyValuePair<string, int>(item, )).ToList();
return result;
}
public static List<int> Reduce_FindWord(string word, List<int> wordCounts)
{
if (wordCounts == null) return null;
var result = new List<int> { };
foreach (var value in wordCounts)
{
result[] += value;
}
return result;
} [Test]
public void TestFindsBasicKeywords()
{
string word = "dragon";
int count = ;
int charCount = word.Length * count;
Dictionary<string, string> input = new Dictionary<string, string>
{
{"Dragonslayer", "Dragons ate some people"},
{"War of the Ancients", "The dragon liked to eat bears"},
{"War of the Ancients Part 2", "The multitude of Dragon could only eat One Big Bear"},
{"Nature's Splendor", "The bear was at peace with his life. He was Bear."},
{"Mothership", "The Spaceship was not a mother ship"},
{"Lost Viking", "The little Spaceship tried to get home"},
{"Abduction", "The big Spaceship got some rednecks"},
};
var output = MapReduceClass.Execute(Map_FindsBasic, Reduce_FindsBasic, input); //单元测试断言
Assert.Contains(word, output.Keys);
Assert.LessOrEqual(output[word][], count);
Assert.IsFalse(output[word][].Equals(charCount));
}
public static List<KeyValuePair<string, int>> Map_FindsBasic(string document, string words)
{
var items = words.Split('\n', ' ', '.');
return items.Select(item => new KeyValuePair<string, int>(item, )).ToList();
}
public static List<int> Reduce_FindsBasic(string word, List<int> words)
{
if (words == null) return null;
var result = new List<int> { , };
foreach (var value in words)
{
result[] += value; // number of words
result[] += word.Length; // number of characters
}
return result;
} public Dictionary<char, List<int>> _output;
public void FileCharacterTests()
{
//var di = new DirectoryInfo(String.Format(@"{0}\App_Data\", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)));
var di = new DirectoryInfo(@"E:\SourceCode\mapreduce-csharp-master\mapreduce-csharp-master\Tests\App_Data"); ;
var fileSearchData = new Dictionary<FileInfo, string>();
di.GetFiles("*.txt").ToList().ForEach(f => fileSearchData.Add(f, File.ReadAllText(f.FullName)));
_output = MapReduceClass.Execute(Map_FileCharacter, Reduce_FileCharacter, fileSearchData);
}
[Test]
public void MapReduce_Finds_All_Characters()
{
FileCharacterTests();
Assert.IsTrue(.Equals(_output.Keys.Count));
}
[Test]
public void MapReduce_Finds_Most_Common_Character()
{
FileCharacterTests();
var ignoreCharacters = new[] { ' ' };
var mostCommonMatch = _output
.Where(kv => !ignoreCharacters.Contains(kv.Key))
.OrderByDescending(kv => kv.Value.Sum())
.FirstOrDefault();
Assert.IsTrue('i'.Equals(mostCommonMatch.Key));
Assert.IsTrue(.Equals(mostCommonMatch.Value.Sum()));
}
[Test]
public void MapReduce_Finds_Keywords_In_Flat_Files()
{
char character = 'f';
int times = ;
FileCharacterTests();
Assert.IsNotEmpty(_output);
Assert.Contains(character, _output.Keys);
Assert.IsFalse(times.Equals(_output[character][]));
}
public static List<KeyValuePair<char, int>> Map_FileCharacter(FileInfo document, string text)
{
return text.Select(item => new KeyValuePair<char, int>(item, )).ToList();
}
public static List<int> Reduce_FileCharacter(char character, List<int> characterCounts)
{
if (characterCounts == null) return new List<int>();
var result = new List<int> { };
foreach (var value in characterCounts)
{
result[] += value;
}
return result;
} }
}
nunit.framework.dll 需下载
LoremIpsum_I.txt 测试文本文件
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor eros ac lectus vulputate a cursus lectus tempor. Aenean nec purus eu eros lacinia hendrerit pretium tempor magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam sagittis egestas neque, at cursus risus accumsan in. Mauris tellus nisi, ullamcorper quis posuere sed, tincidunt sit amet nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas sed tortor at leo fringilla ultrices. Vivamus orci risus, rhoncus cursus iaculis imperdiet, aliquet sed quam. Sed erat neque, pretium nec imperdiet id, congue quis dolor. Curabitur in metus vel leo ullamcorper ullamcorper.
Morbi tincidunt, elit sed vestibulum convallis, est turpis euismod erat, nec fringilla magna ante vel tellus. Fusce vel massa justo, ut sagittis justo. Vestibulum lacinia rutrum nisi, eget accumsan lacus suscipit non. Nunc convallis ultrices erat sit amet congue. Integer varius iaculis urna, ac varius leo porttitor nec. Ut auctor semper erat, quis consequat augue posuere eget. Etiam magna ligula, scelerisque vitae pellentesque euismod, egestas ac nisi. Etiam malesuada vulputate velit at euismod. Mauris at sem justo, nec sagittis dui. Proin molestie hendrerit quam, ut elementum est rutrum a. Mauris aliquam rhoncus viverra. Morbi vel dapibus mi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam ornare varius orci nec rhoncus. Praesent nec lacus a enim volutpat blandit a ut ante. Curabitur sed magna quam. Aenean est erat, molestie ullamcorper suscipit a, dictum eu arcu. Sed fringilla risus nisl, quis congue diam. Aliquam lacinia, arcu quis lacinia fringilla, metus quam fringilla odio, ut cursus dolor dui sit amet orci. Etiam eget mauris ut risus iaculis ornare.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ut tortor turpis. In vel augue et lectus ultricies hendrerit. Suspendisse commodo, nibh ac tincidunt dictum, turpis nisi tristique justo, ultrices tempor metus nunc sit amet leo. Pellentesque vitae nunc sem, eu porttitor leo. Etiam ac justo eu leo rutrum varius sit amet et urna. Vestibulum tellus mauris, hendrerit vitae adipiscing et, congue mollis magna. Donec bibendum sodales purus eu vehicula. Suspendisse non libero nec elit imperdiet mattis vel ac orci. Nam accumsan pellentesque mollis.
Vestibulum turpis magna, faucibus in commodo a, auctor sit amet leo. In ultricies adipiscing diam. Nulla fringilla mollis ligula, ut pharetra leo eleifend sit amet. In viverra purus ut lectus mattis non facilisis ipsum sagittis. Sed a augue sed ante sagittis pellentesque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc pretium quam eu est sollicitudin et adipiscing sapien facilisis. Integer commodo leo vitae urna feugiat mollis. Pellentesque sodales tortor sit amet risus dignissim vitae vulputate leo convallis. Quisque non libero nibh, et aliquam nibh. Ut molestie urna ut mauris mollis facilisis. Curabitur nunc lorem, tristique vel pulvinar vitae, auctor quis est. In quis arcu quam, non blandit mauris. Nullam iaculis laoreet nibh, in luctus enim varius luctus. Curabitur vel luctus massa.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam vel velit vel turpis tincidunt commodo. Fusce in magna odio, in pretium augue. Morbi condimentum leo ut elit tincidunt sed tincidunt risus tincidunt. Sed faucibus suscipit mattis. Cras sit amet arcu eros. Nunc in gravida leo. Ut nec lorem nisl, sed aliquam erat. Praesent purus sem, sagittis sed fermentum eget, lacinia eget sem. Ut sagittis molestie mollis. Curabitur porta congue dapibus.
Donec magna est, vestibulum eu eleifend ac, fermentum eget dolor. Nulla vestibulum mattis arcu vitae ullamcorper. Integer consequat dapibus adipiscing. Aliquam erat volutpat. Nam pellentesque iaculis neque vestibulum auctor. Donec sed nisl arcu. Vestibulum porta magna ipsum. Sed lacus nisl, tempus id convallis et, interdum ut augue. Suspendisse interdum odio lobortis ante consectetur ut iaculis purus interdum. Nunc eleifend elit faucibus eros bibendum a consequat elit dictum. Donec at urna vitae urna sagittis feugiat. Nullam velit sem, mollis id bibendum eu, egestas nec sem. Sed porta aliquet est, euismod mattis enim viverra auctor. Nam nibh felis, lacinia eu posuere quis, tempor at velit. Nulla dignissim mollis orci et fermentum. Nulla congue ultrices auctor. Phasellus condimentum mattis metus, et dignissim lorem sagittis ac. Donec congue elit felis. Mauris leo elit, euismod quis sollicitudin eu, tristique vitae orci.
Praesent ornare tellus at purus porta convallis. Vestibulum mollis risus ac quam tristique tincidunt sit amet eu sapien. Phasellus pellentesque laoreet consectetur. Vivamus vestibulum laoreet mollis. Suspendisse vitae lobortis velit. Phasellus a leo ligula. Morbi aliquam diam eget velit tristique at egestas massa gravida. Nulla facilisi. Vivamus augue lectus, molestie et euismod sit amet, rutrum at eros. Phasellus in odio enim, sit amet porta odio. Morbi et libero eget velit pellentesque suscipit. Nam nisl odio, gravida nec molestie eget, congue ac dolor. Sed felis leo, tempor aliquet placerat in, congue vel neque. Mauris ipsum dolor, volutpat ut ornare sed, pharetra vel enim.
Morbi eget nisl id mi adipiscing convallis ut nec nulla. Mauris in nisi odio, in pretium nisl. Vivamus pulvinar, tortor a gravida scelerisque, magna nibh elementum risus, ac laoreet lectus augue in massa. Aliquam adipiscing vulputate metus et tincidunt. Nunc fermentum tortor vel risus facilisis dapibus venenatis ac diam. Nunc venenatis, eros quis pretium ornare, augue dolor convallis ligula, vitae mattis magna quam eu dolor. Aliquam ac orci metus, ut viverra diam. Suspendisse potenti. Sed tincidunt viverra leo nec adipiscing. Cras congue, tortor ac consectetur imperdiet, ipsum metus pulvinar lectus, et porta sem diam quis risus. In eros sapien, condimentum semper placerat a, varius in metus. Proin suscipit pulvinar justo vel pulvinar. Sed eget ipsum a erat bibendum sodales at et metus. Proin diam enim, adipiscing nec pulvinar eget, semper consectetur arcu. Nulla ut mauris sed lectus porta hendrerit in vitae velit. Maecenas sed porta metus. Etiam commodo, tortor at ornare ullamcorper, mi velit pretium mauris, a iaculis risus lorem eu justo. Donec sollicitudin erat cursus turpis sollicitudin scelerisque. Suspendisse mollis orci eu metus ullamcorper nec hendrerit arcu molestie. Proin congue ullamcorper tristique.
Sed id dolor non massa ornare laoreet. Mauris et dolor non nibh porta commodo. Aenean dapibus rhoncus justo, id cursus quam condimentum non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lacus ante, pulvinar sit amet aliquet sodales, feugiat eget turpis. Aenean commodo sagittis urna at ultricies. Quisque et felis et nibh volutpat porttitor. Quisque at tellus mi, a placerat neque. Sed massa neque, elementum vitae pellentesque eu, suscipit in tellus. Morbi lacinia pellentesque nulla id placerat. Curabitur ultrices metus eget urna sagittis interdum. Aenean ultricies sollicitudin sapien, ut convallis eros accumsan ullamcorper. Aliquam erat volutpat. Fusce dictum fermentum pulvinar. Morbi vitae elit dui. Maecenas nec nunc ligula, interdum aliquet neque. Maecenas id massa tortor, venenatis sodales nisi. Pellentesque ut turpis ac odio auctor tincidunt sed scelerisque lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
Sed faucibus libero eu nisl semper eget luctus est fringilla. Nullam consectetur vehicula interdum. Duis faucibus ipsum quis turpis porta vestibulum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer accumsan, dolor ut vulputate rhoncus, sem urna malesuada velit, nec lacinia mi mauris non ligula. Morbi at interdum enim. Aliquam facilisis accumsan feugiat. Aliquam pretium ligula quis metus sagittis egestas. Duis pulvinar massa vitae mauris vulputate porta. Aenean euismod massa ante. Nam eget dolor sed nisi sollicitudin interdum id sed risus. Sed accumsan elementum neque, eu condimentum elit fringilla tempus. Nulla accumsan adipiscing ipsum, ac molestie elit varius in. Integer nec fermentum odio. Phasellus pellentesque ipsum a nulla dictum bibendum. Curabitur euismod sollicitudin faucibus. Nullam porttitor lacus varius quam sollicitudin vel consectetur mi vulputate.
In Catilinam Prima.txt 测试文本文件
ORATIO IN L. CATILINAM PRIMA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
[1] I. Quo usque tandem abutere, Catilina, patientia nostra? quam diu etiam furor iste tuus nos eludet? quem ad finem sese effrenata iactabit audacia? Nihilne te nocturnum praesidium Palati, nihil urbis vigiliae, nihil timor populi, nihil concursus bonorum omnium, nihil hic munitissimus habendi senatus locus, nihil horum ora voltusque moverunt? Patere tua consilia non sentis, constrictam iam horum omnium scientia teneri coniurationem tuam non vides? Quid proxima, quid superiore nocte egeris, ubi fueris, quos convocaveris, quid consilii ceperis, quem nostrum ignorare arbitraris? [2] O tempora, o mores! Senatus haec intellegit. Consul videt; hic tamen vivit. Vivit? immo vero etiam in senatum venit, fit publici consilii particeps, notat et designat oculis ad caedem unum quemque nostrum. Nos autem fortes viri satis facere rei publicae videmur, si istius furorem ac tela vitemus. Ad mortem te, Catilina, duci iussu consulis iam pridem oportebat, in te conferri pestem, quam tu in nos [omnes iam diu] machinaris.
[3] An vero vir amplissumus, P. Scipio, pontifex maximus, Ti. Gracchum mediocriter labefactantem statum rei publicae privatus interfecit; Catilinam orbem terrae caede atque incendiis vastare cupientem nos consules perferemus? Nam illa nimis antiqua praetereo, quod C. Servilius Ahala Sp. Maelium novis rebus studentem manu sua occidit. Fuit, fuit ista quondam in hac re publica virtus, ut viri fortes acrioribus suppliciis civem perniciosum quam acerbissimum hostem coercerent. Habemus senatus consultum in te, Catilina, vehemens et grave, non deest rei publicae consilium neque auctoritas huius ordinis; nos, nos, dico aperte, consules desumus.
[4] II. Decrevit quondam senatus, ut L. Opimius consul videret, ne quid res publica detrimenti caperet; nox nulla intercessit; interfectus est propter quasdam seditionum suspiciones C. Gracchus, clarissimo patre, avo, maioribus, occisus est cum liberis M. Fulvius consularis. Simili senatus consulto C. Mario et L. Valerio consulibus est permissa res publica; num unum diem postea L. Saturninum tribunum pl. et C. Servilium praetorem mors ac rei publicae poena remorata est? At [vero] nos vicesimum iam diem patimur hebescere aciem horum auctoritatis. Habemus enim huiusce modi senatus consultum, verum inclusum in tabulis tamquam in vagina reconditum, quo ex senatus consulto confestim te interfectum esse, Catilina, convenit. Vivis, et vivis non ad deponendam, sed ad confirmandam audaciam. Cupio, patres conscripti, me esse clementem, cupio in tantis rei publicae periculis me non dissolutum videri, sed iam me ipse inertiae nequitiaeque condemno.
[5] Castra sunt in Italia contra populum Romanum in Etruriae faucibus conlocata, crescit in dies singulos hostium numerus; eorum autem castrorum imperatorem ducemque hostium intra moenia atque adeo in senatu videtis intestinam aliquam cotidie perniciem rei publicae molientem. Si te iam, Catilina, comprehendi, si interfici iussero, credo, erit verendum mihi, ne non potius hoc omnes boni serius a me quam quisquam crudelius factum esse dicat. Verum ego hoc, quod iam pridem factum esse oportuit, certa de causa nondum adducor ut faciam. Tum denique interficiere, cum iam nemo tam inprobus, tam perditus, tam tui similis inveniri poterit, qui id non iure factum esse fateatur. [6] Quamdiu quisquam erit, qui te defendere audeat, vives, et vives ita, ut [nunc] vivis. multis meis et firmis praesidiis obsessus, ne commovere te contra rem publicam possis. Multorum te etiam oculi et aures non sentientem, sicut adhuc fecerunt, speculabuntur atque custodient.
III. Etenim quid est, Catilina, quod iam amplius expectes, si neque nox tenebris obscurare coetus nefarios nec privata domus parietibus continere voces coniurationis tuae potest, si illustrantur, si erumpunt omnia? Muta iam istam mentem, mihi crede, obliviscere caedis atque incendiorum. Teneris undique; luce sunt clariora nobis tua consilia omnia; quae iam mecum licet recognoscas.
[7] Meministine me ante diem XII Kalendas Novembris dicere in senatu fore in armis certo die, qui dies futurus esset ante diem VI Kal. Novembris, C. Manlium, audaciae satellitem atque administrum tuae? Num me fefellit, Catilina, non modo res tanta, tam atrox tamque incredibilis, verum, id quod multo magis est admirandum, dies? Dixi ego idem in senatu caedem te optumatium contulisse in ante diem V Kalendas Novembris, tum cum multi principes civitatis Roma non tam sui conservandi quam tuorum consiliorum reprimendorum causa profugerunt. Num infitiari potes te illo ipso die meis praesidiis, mea diligentia circumclusum commovere te contra rem publicam non potuisse, cum tu discessu ceterorum nostra tamen, qui remansissemus, caede te contentum esse dicebas?
[8] Quid? cum te Praeneste Kalendis ipsis Novembribus occupaturum nocturno impetu esse confideres, sensistin illam coloniam meo iussu meis praesidiis, custodiis, vigiliis esse munitam? Nihil agis, nihil moliris, nihil cogitas, quod non ego non modo audiam, sed etiam videam planeque sentiam. IV. Recognosce tandem mecum noctem illam superiorem; iam intelleges multo me vigilare acrius ad salutem quam te ad perniciem rei publicae. Dico te priore nocte venisse inter falcarios--non agam obscure--in M. Laecae domum; convenisse eodem complures eiusdem amentiae scelerisque socios. Num negare audes? quid taces? Convincam, si negas. Video enim esse hic in senatu quosdam, qui tecum una fuerunt.
[9] O di inmortales! ubinam gentium sumus? in qua urbe vivimus? quam rem publicam habemus? Hic, hic sunt in nostro numero, patres conscripti, in hoc orbis terrae sanctissimo gravissimoque consilio, qui de nostro omnium interitu, qui de huius urbis atque adeo de orbis terrarum exitio cogitent! Hos ego video consul et de re publica sententiam rogo et, quos ferro trucidari oportebat, eos nondum voce volnero!
Fuisti igitur apud Laecam illa nocte, Catilina, distribuisti partes Italiae, statuisti, quo quemque proficisci placeret, delegisti, quos Romae relinqueres, quos tecum educeres, discripsisti urbis partes ad incendia, confirmasti te ipsum iam esse exiturum, dixisti paulum tibi esse etiam nunc morae, quod ego viverem. Reperti sunt duo equites Romani, qui te ista cura liberarent et sese illa ipsa nocte paulo ante lucem me in meo lectulo interfecturos [esse] pollicerentur. [10] Haec ego omnia vixdum etiam coetu vestro dimisso comperi; domum meam maioribus praesidiis munivi atque firmavi, exclusi eos, quos tu ad me salutatum mane miseras, cum illi ipsi venissent, quos ego iam multis ac summis viris ad me id temporis venturos esse praedixeram.
V. Quae cum ita sint, Catilina, perge, quo coepisti, egredere aliquando ex urbe; patent portae; proficiscere. Nimium diu te imperatorem tua illa Manliana castra desiderant. Educ tecum etiam omnes tuos, si minus, quam plurimos; purga urbem. Magno me metu liberabis, dum modo inter me atque te murus intersit. Nobiscum versari iam diutius non potes; non feram, non patiar, non sinam. [11] Magna dis inmortalibus habenda est atque huic ipsi Iovi Statori, antiquissimo custodi huius urbis, gratia, quod hanc tam taetram, tam horribilem tamque infestam rei publicae pestem totiens iam effugimus.
Non est saepius in uno homine summa salus periclitanda rei publicae. Quamdiu mihi consuli designato, Catilina, insidiatus es, non publico me praesidio, sed privata diligentia defendi. Cum proximis comitiis consularibus me consulem in campo et competitores tuos interficere voluisti, compressi conatus tuos nefarios amicorum praesidio et copiis nullo tumultu publice concitato; denique, quotienscumque me petisti, per me tibi obstiti, quamquam videbam perniciem meam cum magna calamitate rei publicae esse coniunctam.
[12] Nunc iam aperte rem publicam universam petis, templa deorum inmortalium, tecta urbis, vitam omnium civium, Italiam [denique] totam ad exitium et vastitatem vocas. Quare, quoniam id, quod est primum, et quod huius imperii disciplinaeque maiorum proprium est, facere nondum audeo, faciam id, quod est ad severitatem lenius et ad communem salutem utilius. Nam si te interfici iussero, residebit in re publica reliqua coniuratorum manus; sin tu, quod te iam dudum hortor, exieris, exhaurietur ex urbe tuorum comitum magna et perniciosa sentina rei publicae. [13] Quid est, Catilina? num dubitas id me imperante facere, quod iam tua sponte faciebas? Exire ex urbe iubet consul hostem. Interrogas me, num in exilium; non iubeo, sed, si me consulis, suadeo.
VI. Quid est enim, Catilina, quod te iam in hac urbe delectare possit? in qua nemo est extra istam coniurationem perditorum hominum, qui te non metuat, nemo, qui non oderit.
Quae nota domesticae turpitudinis non inusta vitae tuae est? quod privatarum rerum dedecus non haeret in fama? quae lubido ab oculis, quod facinus a manibus umquam tuis, quod flagitium a toto corpore afuit? cui tu adulescentulo, quem corruptelarum inlecebris inretisses, non aut ad audaciam ferrum aut ad lubidinem facem praetulisti? [14] Quid vero? nuper cum morte superioris uxoris novis nuptiis domum vacuefecisses, nonne etiam alio incredibili scelere hoc scelus cumulasti? quod ego praetermitto et facile patior sileri, ne in hac civitate tanti facinoris inmanitas aut extitisse aut non vindicata esse videatur. Praetermitto ruinas fortunarum tuarum, quas omnis inpendere tibi proxumis Idibus senties; ad illa venio, quae non ad privatam ignominiam vitiorum tuorum, non ad domesticam tuam difficultatem ac turpitudinem sed ad summam rem publicam atque ad omnium nostrum vitam salutemque pertinent. [15] Potestne tibi haec lux, Catilina, aut huius caeli spiritus esse iucundus, cum scias esse horum neminem, qui nesciat te pridie Kalendas Ianuarias Lepido et Tullo consulibus stetisse in comitio cum telo, manum consulum et principum civitatis interficiendorum causa paravisse, sceleri ac furori tuo non mentem aliquam aut timorem tuum sed fortunam populi Romani obstitisse?
Ac iam illa omitto--neque enim sunt aut obscura aut non multa commissa postea--quotiens tu me designatum, quotiens consulem interficere conatus es! quot ego tuas petitiones ita coniectas, ut vitari posse non viderentur, parva quadam declinatione et, ut aiunt, corpore effugi! nihil [agis, nihil] adsequeris [, nihil moliris] neque tamen conari ac velle desistis. [16] Quotiens tibi iam extorta est ista sica de manibus, quotiens [vero] excidit casu aliquo et elapsa est! [tamen ea carere diutius non potes] quae quidem quibus abs te initiata sacris ac devota sit, nescio, quod eam necesse putas esse in consulis corpore defigere.
VII. Nunc vero quae tua est ista vita? Sic enim iam tecum loquar, non ut odio permotus esse videar, quo debeo, sed ut misericordia, quae tibi nulla debetur. Venisti paulo ante in senatum. Quis te ex hac tanta frequentia totque tuis amicis ac necessariis salutavit? Si hoc post hominum memoriam contigit nemini, vocis expectas contumeliam, cum sis gravissimo iudicio taciturnitatis oppressus? Quid, quod adventu tuo ista subsellia vacuefacta sunt, quod omnes consulares, qui tibi persaepe ad caedem constituti fuerunt, simul atque adsedisti, partem istam subselliorum nudam atque inanem reliquerunt, quo tandem animo [hoc] tibi ferundum putas?
[17] Servi mehercule mei si me isto pacto metuerent, ut te metuunt omnes cives tui, domum meam relinquendam putarem; tu tibi urbem non arbitraris? et, si me meis civibus iniuria suspectum tam graviter atque offensum viderem, carere me aspectu civium quam infestis omnium oculis conspici mallem; tu cum conscientia scelerum tuorum agnoscas odium omnium iustum et iam diu tibi debitum, dubitas, quorum mentes sensusque volneras, eorum aspectum praesentiamque vitare? Si te parentes timerent atque odissent tui neque eos ulla ratione placare posses, ut opinor, ab eorum oculis aliquo concederes. Nunc te patria, quae communis est parens omnium nostrum, odit ac metuit et iam diu nihil te iudicat nisi de parricidio suo cogitare; huius tu neque auctoritatem verebere nec iudicium sequere nec vim pertimesces?
[18] Quae tecum, Catilina, sic agit et quodam modo tacita loquitur: "Nullum iam aliquot annis facinus exstitit nisi per te, nullum flagitium sine te; tibi uni multorum civium neces, tibi vexatio direptioque sociorum inpunita fuit ac libera; tu non solum ad neglegendas leges et quaestiones, verum etiam ad evertendas perfringendasque valuisti. Superiora illa, quamquam ferenda non fuerunt, tamen, ut potui, tuli; nunc vero me totam esse in metu propter unum te, quicquid increpuerit, Catilinam timeri, nullum videri contra me consilium iniri posse, quod a tuo scelere abhorreat, non est ferendum. Quam ob rem discede atque hunc mihi timorem eripe; si est verus, ne opprimar, sin falsus, ut tandem aliquando timere desinam."
[19] VIII. Haec si tecum, ita ut dixi, patria loquatur, nonne impetrare debeat, etiamsi vim adhibere non possit? Quid, quod tu te ipse in custodiam dedisti, quod vitandae suspicionis causa ad M'. Lepidum te habitare velle dixisti? A quo non receptus etiam ad me venire ausus es atque, ut domi meae te adservarem, rogasti. Cum a me quoque id responsum tulisses, me nullo modo posse isdem parietibus tuto esse tecum, qui magno in periculo essem, quod isdem moenibus contineremur, ad Q. Metellum praetorem venisti. A quo repudiatus ad sodalem tuum, virum optumum, M. Metellum, demigrasti; quem tu videlicet et ad custodiendum diligentissimum et ad suspicandum sagacissimum et ad vindicandum fortissimum fore putasti. Sed quam longe videtur a carcere atque a vinculis abesse debere, qui se ipse iam dignum custodia iudicarit!
[20] Quae cum ita sint, Catilina, dubitas, si emori aequo animo non potes, abire in aliquas terras et vitam istam multis suppliciis iustis debitisque ereptam fugae solitudinique mandare? "Refer" inquis "ad senatum"; id enim postulas et, si hic ordo [sibi] placere decreverit te ire in exilium, optemperaturum te esse dicis. Non referam, id quod abhorret a meis moribus, et tamen faciam, ut intellegas, quid hi de te sentiant. Egredere ex urbe, Catilina, libera rem publicam metu, in exilium, si hanc vocem exspectas, proficiscere. Quid est, Catilina? ecquid attendis, ecquid animadvertis horum silentium? Patiuntur, tacent. Quid exspectas auctoritatem loquentium, quorum voluntatem tacitorum perspicis?
[21] At si hoc idem huic adulescenti optimo, P. Sestio, si fortissimo viro, M. Marcello, dixissem, iam mihi consuli hoc ipso in templo iure optimo senatus vim et manus intulisset. De te autem, Catilina, cum quiescunt, probant, cum patiuntur, decernunt, cum tacent, clamant, neque hi solum, quorum tibi auctoritas est videlicet cara, vita vilissima, sed etiam illi equites Romani, honestissimi atque optimi viri, ceterique fortissimi cives, qui circumstant senatum, quorum tu et frequentiam videre et studia perspicere et voces paulo ante exaudire potuisti. Quorum ego vix abs te iam diu manus ac tela contineo, eosdem facile adducam, ut te haec, quae vastare iam pridem studes, relinquentem usque ad portas prosequantur.
[22] IX. Quamquam quid loquor? te ut ulla res frangat, tu ut umquam te corrigas, tu ut ullam fugam meditere, tu ut ullum exilium cogites? Utinam tibi istam mentem di inmortales duint! tametsi video, si mea voce perterritus ire in exilium animum induxeris quanta tempestas invidiae nobis, si minus in praesens tempus recenti memoria scelerum tuorum, at in posteritatem impendeat. Sed est tanti, dum modo ista sit privata calamitas et a rei publicae periculis seiungatur. Sed tu ut vitiis tuis commoveare, ut legum poenas pertimescas, ut temporibus rei publicae cedas, non est postulandum. Neque enim is es, Catilina, ut te aut pudor umquam a turpitudine aut metus a periculo aut ratio a furore revocarit.
[23] Quam ob rem, ut saepe iam dixi, proficiscere ac, si mihi inimico, ut praedicas, tuo conflare vis invidiam, recta perge in exilium; vix feram sermones hominum, si id feceris, vix molem istius invidiae, si in exilium iussu consulis ieris, sustinebo. Sin autem servire meae laudi et gloriae mavis, egredere cum inportuna sceleratorum manu, confer te ad Manlium, concita perditos cives, secerne te a bonis, infer patriae bellum, exsulta impio latrocinio, ut a me non eiectus ad alienos, sed invitatus ad tuos isse videaris.
[24] Quamquam quid ego te invitem, a quo iam sciam esse praemissos, qui tibi ad Forum Aurelium praestolarentur armati, cui iam sciam pactam et constitutam cum Manlio diem, a quo etiam aquilam illam argenteam, quam tibi ac tuis omnibus confido perniciosam ac funestam futuram, cui domi tuae sacrarium [scelerum tuorum] constitutum fuit, sciam esse praemissam? Tu ut illa carere diutius possis, quam venerari ad caedem proficiscens solebas, a cuius altaribus saepe istam impiam dexteram ad necem civium transtulisti?
[25] X. Ibis tandem aliquando, quo te iam pridem ista tua cupiditas effrenata ac furiosa rapiebat; neque enim tibi haec res adfert dolorem, sed quandam incredibilem voluptatem. Ad hanc te amentiam natura peperit, voluntas exercuit, fortuna servavit. Numquam tu non modo otium, sed ne bellum quidem nisi nefarium concupisti. Nactus es ex perditis atque ab omni non modo fortuna, verum etiam spe derelictis conflatam inproborum manum. [26] Hic tu qua laetitia perfruere, quibus gaudiis exultabis, quanta in voluptate bacchabere, cum in tanto numero tuorum neque audies virum bonum quemquam neque videbis! Ad huius vitae studium meditati illi sunt, qui feruntur, labores tui, iacere humi non solum ad obsidendum stuprum, verum etiam ad facinus obeundum, vigilare non solum insidiantem somno maritorum, verum etiam bonis otiosorum. Habes, ubi ostentes tuam illam praeclaram patientiam famis, frigoris, inopiae rerum omnium, quibus te brevi tempore confectum esse senties. [27] Tantum profeci tum, cum te a consulatu reppuli, ut exsul potius temptare quam consul vexare rem publicam posses, atque ut id, quod esset a te scelerate susceptum, latrocinium potius quam bellum nominaretur.
XI. Nunc, ut a me, patres conscripti, quandam prope iustam patriae querimoniam detester ac deprecer, percipite, quaeso, diligenter, quae dicam, et ea penitus animis vestris mentibusque mandate. Etenim, si mecum patria, quae mihi vita mea multo est carior, si cuncta Italia, si omnis res publica loquatur:
"M.Tulli, quid agis? Tune eum, quem esse hostem comperisti, quem ducem belli futurum vides, quem expectari imperatorem in castris hostium sentis, auctorem sceleris, principem coniurationis, evocatorem servorum et civium perditorum, exire patiere, ut abs te non emissus ex urbe, sed immissus in urbem esse videatur? Nonne hunc in vincla duci, non ad mortem rapi, non summo supplicio mactari imperabis? [28] Quid tandem te impedit? mosne maiorum? At persaepe etiam privati in hac re publica perniciosos cives morte multarunt. An leges, quae de civium Romanorum supplicio rogatae sunt? At numquam in hac urbe, qui a re publica defecerunt, civium iura tenuerunt. An invidiam posteritatis times? Praeclaram vero populo Romano refers gratiam, qui te, hominem per te cognitum nulla commendatione maiorum tam mature ad summum imperium per omnis honorum gradus extulit, si propter invidiam aut alicuius periculi metum salutem civium tuorum neglegis. [29] Sed, si quis est invidiae metus, non est vehementius severitatis ac fortitudinis invidia quam inertiae ac nequitiae pertimescenda. An, cum bello vastabitur Italia, vexabuntur urbes, tecta ardebunt tum te non existumas invidiae incendio conflagraturum?"
XII. His ego sanctissimis rei publicae vocibus et eorum hominum, qui hoc idem sentiunt, mentibus pauca respondebo. Ego si hoc optimum factu iudicarem, patres conscripti, Catilinam morte multari, unius usuram horae gladiatori isti ad vivendum non dedissem. Etenim si summi viri et clarissimi cives saturnini et Gracchorum et Flacci et superiorum complurium sanguine non modo se non contaminarunt, sed etiam honestarunt, certe verendum mihi non erat, ne quid hoc parricida civium interfecto invidiae [mihi] in posteritatem redundaret. Quodsi ea mihi maxime inpenderet tamen hoc animo fui semper, ut invidiam virtute partam gloriam, non invidiam putarem.
[30] Quamquam non nulli sunt in hoc ordine, qui aut ea, quae inminent non videant aut ea, quae vident, dissimulent; qui spem Catilinae mollibus sententiis aluerunt coniurationemque nascentem non credendo corroboraverunt; quorum auctoritate multi non solum improbi, verum etiam inperiti, si in hunc animadvertissem, crudeliter et regie factum esse dicerent. Nunc intellego, si iste, quo intendit, in Manliana castra pervenerit, neminem tam stultum fore, qui non videat coniurationem esse factam neminem tam improbum, qui non fateatur. Hoc autem uno interfecto intellego hanc rei publicae pestem paulisper reprimi, non in perpetuum comprimi posse. Quodsi se eiecerit secumque suos eduxerit et eodem ceteros undique collectos naufragos adgregarit, extinguetur atque delebitur non modo haec tam adulta rei publicae pestis, verum etiam stirps ac semen malorum omnium.
[31] Etenim iam diu, patres conscripti, in his periculis coniurationis insidiisque versamur, sed nescio quo pacto omnium scelerum ac veteris furoris et audaciae maturitas in nostri consulatus tempus erupit. Quodsi ex tanto latrocinio iste unus tolletur, videbimur fortasse ad breve quoddam tempus cura et metu esse relevati, periculum autem residebit et erit inclusum penitus in venis atque in visceribus rei publicae. Ut saepe homines aegri morbo gravi cum aestu febrique iactantur, si aquam gelidam biberunt, primo relevari videntur, deinde multo gravius vehementiusque adflictantur, sic hic morbus, qui est in re publica, relevatus istius poena vehementius reliquis vivis ingravescet.
[32] Quare secedant inprobi, secernant se a bonis, unum in locum congregentur, muro denique, [id] quod saepe iam dixi, secernantur a nobis; desinant insidiari domi suae consuli, circumstare tribunal praetoris urbani, obsidere cum gladiis curiam, malleolos et faces ad inflammandam urbem comparare; sit denique inscriptum in fronte unius cuiusque, quid de re publica sentiat. Polliceor hoc vobis, patres conscripti, tantam in nobis consulibus fore diligentiam, tantam in vobis auctoritatem, tantam in equitibus Romanis virtutem, tantam in omnibus bonis consensionem, ut Catilinae profectione omnia patefacta, inlustrata, oppressa, vindicata esse videatis.
[33] Hisce ominibus, Catilina, cum summa rei publicae salute, cum tua peste ac pernicie cumque eorum exitio, qui se tecum omni scelere parricidioque iunxerunt, proficiscere ad impium bellum ac nefarium. Tu, Iuppiter, qui isdem quibus haec urbs auspiciis a Romulo es constitutus, quem Statorem huius urbis atque imperii vere nominamus, hunc et huius socios a tuis [aris] ceterisque templis, a tectis urbis ac moenibus, a vita fortunisque civium [omnium] arcebis et homines bonorum inimicos, hostis patriae, latrones Italiae scelerum foedere inter se ac nefaria societate coniunctos aeternis suppliciis vivos mortuosque mactabis.
Cicero The Latin Library The Classics Page
MapReduce的C#实现及单元测试(试验)的更多相关文章
- 大数据技术 - MapReduce 应用的配置和单元测试
上一章的 MapReduce 应用中,我们使用了自定义配置,并用 GenericOptionsParser 处理命令行输入的配置,这种方式简单粗暴.但不是 MapReduce 应用常见的写法,本章第一 ...
- Hadoop专业解决方案-第5章 开发可靠的MapReduce应用
本章主要内容: 1.利用MRUnit创建MapReduce的单元测试. 2.MapReduce应用的本地实例. 3.理解MapReduce的调试. 4.利用MapReduce防御式程序设计. 在WOX ...
- 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试
0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...
- 使用MRUnit对MapReduce进行单元测试
1. 为什么需要单元测试 一旦MapReduce项目提交到集群之后,若是出现问题是很难定位和修改的,只能通过打印日志的方式进行筛选.又如果数据和项目较大时,修改起来则更加麻烦.所以,在将MapRedu ...
- 从零自学Hadoop(08):第一个MapReduce
阅读目录 序 数据准备 wordcount Yarn 新建MapReduce 示例下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是 ...
- Effective_Python mapreduce
完全吊炸天构造器的写法... import os import threading,time class GenericInputData(object): def read(self): raise ...
- hadoop MapReduce 笔记
1. MapReduce程序开发步骤 编写map 和 reduce 程序–> 单元测试 -> 编写驱动程序进行验证-> 本地数据集调试 -> 部署到集群运行 用 ...
- MapReduce UnitTest
通常情况下,我们需要用小数据集来单元测试我们写好的map函数和reduce函数.而一般我们可以使用Mockito框架来模拟OutputCollector对象(Hadoop版本号小于0.20.0)和Co ...
- 《Hadoop权威》学习笔记五:MapReduce应用程序
一.API的配置---Configuration类 API的配置:Hadoop提供了专门的API对资源进行配置,Configuration类的实例(在org.apache.hadoop.conf包)包 ...
随机推荐
- codevs 1455 路径 计算m^n%p
题目链接 题目描述 Description 小明从A1到An+1,他知道从A1到A2,从A2到A3,......,从An到An+1都有m条路,且从A1到An+1都只有这些路.小明想知道,从A1地到An ...
- codeforces 540D 概率dp
传送门 大概可以这样理解, 一开始有r个石头, p个布, s个剪刀, 每一天有其中的两个相遇, 如果两个是相同的种类, 什么都不会发生, 否则的话有一个会挂掉, 问最后每一种生存的概率. dp[i][ ...
- 【转】Centos 设置IP地址的几种方式
对于很多刚刚接触linux的朋友来说,如何设置linux系统的IP地址,作为第一步,下面小编以centos系统为例,给大家演示如何给centos设置IP地址,如何修改linux 系统IP地址? 查看I ...
- Android SharedPreference最佳实践
Android提供多种方式保存应用数据,其中一种方式是SharedPreferences,使用键值对保存私有基本的数据.所有的逻辑仅基于以下三个类: SharedPreferences SharedP ...
- c# winform读取xml创建菜单
动态创建菜单使得程序灵活性大大增加,本文根据读取xml文件中的配置菜单项来动态创建菜单,代码如下: using System; using System.Collections.Generic; us ...
- 升级automake和autoconf
<pre name="code" class="html">zjtest7-redis:/root/soft/json-c-json-c-0.12- ...
- DLL编写教程(绝对经典之作)
DLL编写教程 半年不能上网,最近网络终于通了,终于可以更新博客了,写点什么呢?决定最近写一个编程技术系列,其内容是一些通用的编程技术.例如DLL,COM,Socket,多线程等等.这些技术的特点就是 ...
- PHP中的一个很好用的文件上传类
<?php class FileUpload{ private $filepath; //设置上传文件的路径 private $allowtype=array('jpg',' ...
- 最新 Cocos2d-x 3.2 开发环境搭建(windows环境下)
本篇是基于Cocos2d-x-3.2和vs2012的环境下配置. 1.先从官方站点(www.cocos2d-x.org)下载 Cocos2d-x-3.2文件. 2.因为Cocos2d-x 3.0以上的 ...
- VS2015操作Oracle数据需要做那些设置?
1>在oracle网上下载:ODP.NET 2> 要根据自己的oracle 数据32bit/64bit,选择下载. 3> 根据提示配置tnsnames.ora文件. # alias ...