MUSCLE

البرمجيات قطة:
MUSCLE
تفاصيل البرنامج:
الإصدار: 6.82 محدث
تاريخ إيداع: 22 Jun 18
المطور: Jeremy Friesner
ترخيص: حرر
شعبية: 26

Rating: 5.0/5 (Total Votes: 1)

تُعد MUSCLE اختصارًا لبيئة ربط عميل متعدد المستخدمين ، وهي نظام مراسلة مفتوح المصدر ومجاني وقوي وقابل للتطوير وعبر الأنظمة الأساسية يتألف من مكونات الخادم والعميل. وسوف تساعدك على كتابة جميع أنواع البرامج الموزعة ، من ألعاب متعددة اللاعبين وعملاء الدردشة IRC ، إلى تطبيقات حساب SETI.


الميزات في لمحة

باستخدام MUSCLE ، سيتمكن المستخدمون من تخصيص "الخادم المشغول" المضمن بسهولة عن طريق تعريف بروتوكول الدورة أو بروتوكول تدفق الرسائل الخاص بهم. يساعدك البرنامج على كتابة رمز العميل الخاص بك في أي من لغات البرمجة C ++ أو C أو C # أو Java أو Delphi أو Python.

يستخدم البرنامج العضلة الشبيهة بعلامة BMessage :: Messages ، ويدعم إرسال العضلة المسطحة :: الرسائل بين أجهزة الكمبيوتر عبر تيارات TCP (بروتوكول التحكم بالإرسال) ، تنشر خادمًا عضليًا & rdquo؛ على جهاز الخادم ، مما يتيح لك كتابة برامج العميل التي يمكن استخدامها للتواصل مع الخادم.

بالإضافة إلى ذلك ، يشتمل على واجهات برمجة تطبيقات مراسلة فردية ومتعددة الخيوط تدعم جميع لغات البرمجة المذكورة أعلاه. الخادم & ldquo؛ العضلات & rdquo؛ يمكن تخصيصها بسهولة من خلال تحديد بروتوكول تدفق الرسائل أو منطق الجلسة.

بدء العمل مع MUSCLE

بعد تسجيل الدخول بنجاح ، يمكن للبرامج العميلة تحديد من يقوم بتسجيل الدخول إلى الخادم المركزي ، بالإضافة إلى تخزين رسائل العضلات في ذاكرة الوصول العشوائي (ذاكرة النظام) وإرسال رسائل العضلة :: الرسائل إلى العملاء الآخرين المتصلين إلى الخادم. يرجى ملاحظة أن برامج العميل يمكنها الاشتراك في بيانات محددة على الخادم ، والحصول على إشعارات فورية عند تغير البيانات.


يدعم مجموعة واسعة من مسارات الرسائل

تم تصميم البرنامج بحيث يدعم نطاقًا واسعًا من مسارات الرسائل ، بما في ذلك نمط البث الأحادي ، ونمط البث ، ونمط البث المتعدد ، من خلال آلية توجيه مطابقة النمط الذكي الهرمي.


أنظمة تشغيل مدعومة وتوافر

تعمل MUSCLE على أي نظام تشغيل متوافق مع POSIX. يتم توزيعه كأرشيف مصدر عالمي واحد يتيح للمستخدمين تحسين التطبيق لنظام GNU / Linux الخاص بهم. يتم دعم كل من الأنظمة الأساسية للأجهزة 32 بت و 64 بت في هذا الوقت.

ما هو الجديد في هذا الإصدار:

لم تعد الاختبارات / Makefile-mt تحاول تجميع اختبار testreflectsession إلا عند التنفيذ على نظام التشغيل الذي يدعم testreflectsession.
تم إجراء بعض التعديلات البسيطة وإعادة الترتيب لـ & quot؛ MUSCLE by Example & quot؛ الصفحات.
استبدال عدد من "العلامات" في MkDocs مع [عناوين URL] (...)
إزالة وراثة خاصة من CountedObject من جميع الفئات التي كان عليها - الآن أنها تشمل متغير عضو خاص CountedObject بدلا من ذلك. وقد تم ذلك فقط لأن كل هذا الميراث الخاص كان يمزق الرسوم البيانية لميراث DOxygen.
إضافة ماكرو DECLARE_COUNTED_OBJECT إلى CountedObject.h بحيث يمكن استبعاد أي مقدار الذاكرة المحتملة من CountedObjects في الحالات حيث لا يكون المطلوب العد الكائن.
تمت إزالة الدعم لـ -DMUSCLE_AVOID_OBJECT_COUNTING وإضافة ماكرو -DMUSCLE_ENABLE_OBJECT_COUNTING في مكانه. (وهذا يعني أن فئة CountedObject معطلة الآن بشكل افتراضي ويجب تمكينها بشكل صريح لاستخدامها)
تمت إضافة & quot؛ MUSCLE حسب المثال & quot؛ وثائق MiscUtilityFunctions. {cpp، h}
تم تغيير عدد من "العلامات" في مصدر MkCocs MUSCLE-by-Example إلى [عناوين url] بحيث يمكن مراجعة الطرق التي يذكرونها بسرعة.

server / Makefile يحدد الآن libmuscle.a بعد الملف main () .o.
إصلاح بعض تحذيرات مجلس التعاون الخليجي في مجلد الاختبارات (وفقًا لمقترحات ميكا)
لم يكن UnparseFile () يقتبس الكلمات الأساسية بمسافات بشكل صحيح. ثابت.
تم إصلاح الاعتماديات في & quot؛ MUSCLE by Example & quot؛ أمثلة على "Makefiles.

ما هو الجديد في الإصدار:

تمت إضافة أسلوب ملائم ShrinkToFit () إلى فصول Queue و Hashtable و String. تقلل هذه الطريقة من الكائن بحيث يتطابق حجم الذاكرة التي خصصها داخليًا مع حجم البيانات التي تحتفظ بها بالفعل.
يقوم Hashtable :: EnsureSize () و Queue :: EnsureSize () الآن بإجراء وسيطة اختيارية (allowShrink) ، تسمح (إذا تم تعيينها إلى true) بتخصيص صفيف الكائن المخصص داخليًا بشكل أصغر إذا كان أكبر من اللازم.
قم بتعديل سلوك توسيع المخزن المؤقت لفئة String ليكون أكثر فعالية قليلاً.
أضاف حارسًا ضد عودية لانهائية محتملة قد تحدث أثناء تسجيل & quot؛ الخروج من الذاكرة & quot؛ خطأ بعد فشل تخصيص الذاكرة ، إذا حاول LogCallback تخصيص الذاكرة.

ما هو الجديد في الإصدار 6.01:

أضف طريقة PrependWord () الملائمة إلى فئة String.
وأضاف WithReplacements () أساليب الراحة لفئة السلسلة.
تمت إضافة أسلوب SetExplicitDelayMicros () إلى الفئة DetectNetworkConfigChangesSession.
إضافة أسلوب IsCopperDetected () إلى فئة NetworkInterfaceInfo بحيث يمكن معرفة رمز ما إذا كان مقبس Ethernet يحتوي على كبل توصيل به.
تمت إضافة & quot؛ quietsend & quot؛ حجة إلى hexterm.
تم تغيير الأسلوب الظاهري NetworkInterfacesChanged () في فئة DetectNetworkConfigChangesSession لاتخاذ وسيطة باستدعاء أي واجهات شبكة اتصال بشكل خاص تغيرت. لا يتم تنفيذ هذه الوظيفة حاليًا إلا في Linux و MacOS / X و Windows. بالنسبة إلى نظام التشغيل الآخر ، ستكون الحجة دائمًا قائمة فارغة.
تم إصلاح الخلل في تنفيذ Linux لـ DetectNetworkConfigChangesSession والذي قد يتسبب في حدوث خطأ تجزئة إذا قام recvmsg () بإرجاع خطأ (على سبيل المثال بسبب إشارة يتم تلقيها).

ما هو الجديد في الإصدار 6.00:

أعد كتابة فئة SSLSocketDataIO للعمل بشكل أفضل مع الإدخال / الإخراج غير المحظور (بالاقتران مع فئة SSLSocketAdapterGateway الجديدة).
تطبيقات إضافية من SSLSocketDataIO :: SetPrivateKey () و SSLSocketDataIO :: SetCertificate () التي تأخذ ByteBuffer كوسيطة.
تمت إضافة فئة SSLSocketAdapterGateway المستخدمة لإدارة الجهاز الداخلي لـ OpenSSL عند استخدام فئة SSLSocketDataIO مع العبّارة الخاصة بك.
تمت إضافة أساليب SetSSLPrivateKey () و GetSSLPrivateKey () إلى فئة ReflectServer ، من أجل تمكين أسهل لمصادقة SSL على كافة اتصالات TCP الواردة. تتوفر هذه الطرق إذا تم تعريف MUSCLE_ENABLE_SSL.
تمت إضافة أساليب SetSSLPublicKeyCertificate () و GetSSLPublicKeyCertificate () إلى فئة ReflectServer ، من أجل تمكين أسهل لمصادقة SSL على اتصالات TCP الصادرة. تتوفر هذه الطرق إذا تم تعريف MUSCLE_ENABLE_SSL.
تمت إضافة أساليب SetSSLPrivateKey () و SetSSLPublicKeyCertificate () إلى فئة MessageTransceiverThread ، لتسهيل وظيفة SSL عند استخدام الإدخال / الإخراج المتسلسل.
تمت إضافة مجلد ssl_data مع بعض المعلومات حول إنشاء مفاتيح OpenSSL العامة / الخاصة ، ومثال على ذلك keypair للاستخدام في اختبار OpenSSL.

عندما يتم تعريف MUSCLE_ENABLE_SSL ، يقبل muscled الآن وسيطة 'privatekey = اسم الملف' الاختيارية. عند تحديده ، سيتم تمكين وضع طبقة المقابس الآمنة وسيقبل العضلات فقط اتصالات TCP الواردة التي تعرض المفاتيح العامة التي تطابق هذا المفتاح / الشهادة الخاصة.
عند تحديد MUSCLE_ENABLE_SSL ، سيقبل portablereflectclient و qt_example الآن وسيطة اختيارية "publickey = filename". عند تحديده ، سيتم تمكين وضع SSL وسيقوم هؤلاء العملاء بالاتصال بالعنصر باستخدام OpenSSL وتقديم هذا الملف كأوراق اعتمادهم.
تمت إضافة & quot؛ تحريك & quot؛ حدد خانة الاختيار على العرض التجريبي qt_example. يؤدي التحقق من ذلك إلى تحريك الإطار مؤشره تلقائيًا. هذا أمر ممتع ومفيد أيضًا إذا كنت ترغب في اختبار سيناريو حيث يقوم العديد من العملاء بإنشاء حركة مرور في نفس الوقت.
جعل qt_example التجريبي أجمل.
إعادة تسمية C ++ 11-مساعد في وحدات الماكرو في Hashtable.h و Queue.h لجعلها أقل احتمالاً للاصطدام مع وحدات الماكرو حزم أخرى. * إصلاح بعض الأخطاء الطفيفة في فئة SSLSocketDataIO. إعادة تسمية SSLSocketDataIO :: SetKey () إلى SetPrivateKey (). إعادة تسمية SSLSocketDataIO :: SetCertificate () إلى SetPublicKeyCertificate (). o AbstractMessageIOGateway :: SetDataIO () الآن أسلوب ظاهري.

ما هو الجديد في الإصدار 5.92:

دعم محسّن لدلالات النقل C ++ 11 في فصول Queue و Hashtable (يتم تمكينها فقط عند تعريف DMUSCLE_USE_CPLUSPLUS11)
تمت إضافة بعض الأجهزة إلى فئة String حتى أتمكن من مشاهدة عدد المرات التي يتم فيها نسخ كائن سلسلة ونقله وما إلى ذلك (يتم تمكينه فقط عند تحديد DMUSCLE_COUNT_STRING_COPY_OPERATIONS)
تمت إضافة وظيفة PrintAndClearStringCopyCounts () التي ستطبع بيانات عملية String التي تم جمعها أعلاه.
تمت إضافة بعض سحر SFINAE إلى muscleSwap () بحيث يتم تبديله عن طريق استدعاء SwapContents () عندما يكون ذلك ممكنًا ، بدلاً من النسخ إلى كائن مؤقت.
إضافة مُنشئ قائمة مُبدِّل و overload من AddTailMulti () إلى فئة قائمة الانتظار (متوفر فقط عند تحديد DMUSCLE_USE_CPLUSPLUS11 ، بالطبع)
إعادة تسمية الطابور overloads الصفيف و Queue من Queue :: AddTail () إلى AddTailMulti () ، لتجنب تعارضات مع دعم توزيع قالب C ++ 11 جديد.
إعادة تسمية الطابور overloads قائمة انتظار و صفيف من Queue :: AddHead () إلى AddHeadMulti () ، لتجنب تعارضات مع دعم توزيع قالب C ++ 11 جديد.
استبدال MCRASH_IMPL الماكرو بمكالمة لتأكيد (خطأ).
المزيد من التواء التوافق مع Android.

لم يتم تجميع العديد من البرامج في مجلد الاختبارات ضمن C ++ 11. ثابت.
إصلاح العديد من الأخطاء المحتملة التي تم الكشف عنها بواسطة أداة تحليل ثابت في clang.

ما هو الجديد في الإصدار 5.91:

تمت إضافة طريقة EnsureCanPut () الملائمة إلى فئة Hashtable.
وأضاف EnsureCanAdd () طريقة الراحة لفئة الصف.
تغيير DoMutexAtomicIncrement () لتكون دالة مضمّنة لجعل الاتصال أكثر فعالية.
تغيير QMessageTransceiverThread و QAcceptSocketsThread للاتصال QCoreApplication :: postEvent () بدلاً من QApplication :: postEvent () ، للسماح للتطبيقات غير واجهة المستخدم الرسومية Qt.
تحديث مستند دليل المبتدئين ليعكس دعم UDP المحسّن لـ MUSCLE.
تم دمجها في بعض تغييرات توافق Android المقدمة بواسطة Jean-FranA§ois Mullet.
استخدام علامة الترجمة MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS قد يتسبب في تعطل MUSCLE عند بدء التشغيل بسبب مشكلة في ترتيب العمليات. وقد تم إصلاح هذا الآن.
تم استخدام علامة الترجمة MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS مسبقًا فقط في حالة عدم توفر أي تطبيق آخر AtomicCounter. والآن أصبح للعلم أولوية أعلى ، لذا فإن تعيين العلم يعني أنه سيتم استخدام Mutexes ، حتى إذا توفرت آلية أخرى (أكثر كفاءة).

ما هو الجديد في الإصدار 5.90:

تمت إضافة أسلوب GetPacketMaximumSize () إلى فئة DataID للسماح لشفرة البوابة بمعالجة اتصال حزم البيانات بأسلوب UDP بشكل أكثر ذكاءً.
MessageIOGateway يعمل الآن بشكل مفيد بالاقتران مع UDPSocketDataIO.
إضافة CreateObjectFromArchiveMessage () دالات templated إلى Message.h ، لتعمل كنظير جانب الاستعادة GetArchiveMessageFromPool () ، إلخ.
AtomicCounter :: AtomicIncrement () الآن بإرجاع قيمة منطقية (iff صحيح قيمة تساوي عداد جديد يساوي واحد).
تعديل فئة HashtableIterator بحيث تكون التكرارات Hashtable للقراءة فقط الآن مؤشر الترابط - الآمن حتى إذا لم يتم تحديد العلامة HTIT_FLAG_NOREGISTER.
إضافة class_thread_id فئة إلى SetupSystem.h ، لتمثيل معرف مؤشر ترابط بطريقة صحيحة على نحو محايد للتنفيذ.
تمت إضافة & quot؛ حالة توقف تام & quot؛ البرنامج إلى مجلد الاختبارات. هذا البرنامج يخاطر عمدا خلق طريق مسدود ، كوسيلة لممارسة / إثبات اختبار deadlockfinder.
تمت إضافة دعم لعلامة سطر الأوامر DMUSCLE_AVOID_THREAD_SAFE_HASHTABLE_ITERATORS ، لأولئك الذين يفضلون تجنب الحمل الزائد لسلامة الموضوع التلقائي ، ويعدهم بتوفير حجج HTIT_FLAG_NOREGISTER يدويًا عند الضرورة.

تمت إضافة ذاكرة تخزين مؤقت بحث LRU اختيارية إلى الدالة GetHostByName () ، بحيث يمكن أن تعود بسرعة أكبر عندما يتم حل نفس أسماء المضيفات مرارًا وتكرارًا.
إضافة وظيفة SetHostNameCacheSettings () تمكن وتعديل ذاكرة التخزين المؤقت البحث LRU في GetHostByName ().
تمت إضافة دعم لـ & quot؛ dnscache & quot؛ و & quot؛ dnscachesize & quot؛ وسيطات سطر الأوامر في HandleStandardDaemonArgs () ، للسماح لمواصفات سطر الأوامر من سلوك ذاكرة التخزين المؤقت البحث LRU.
تعديل فئة Hashtable بحيث تصبح قيم عضو _iterHead و _iterTail و _freeHead الآن uint32s بدلاً من المؤشرات ، لتقليل استخدام الذاكرة.
إزالة أسلوب ThreadLocalStorage :: SetFreeHeldObjectsOnExit () ، وإضافة وسيطة منطقية إلى منشئها بدلا من ذلك ، لأن pthreads لا تسمح لك بتغيير هذا الإعداد بعد أن تم استدعاء pthread_key_create ().
نقل GetCurrentThreadID () إلى فئة muscle_thread_id كدالة عضو ثابت وتغييرها لإرجاع كائن muscle_thread_id بدلاً من غير الموقعة طويلة.تم تغيير اسم المضيف الافتراضي للجلسات بدون عنوان IP معروف من & quot؛ & quot؛ إلى & quot؛ _unknown_ & quot؛ ، لأن أقواس الزاوية في السلسلة السابقة لها معنى خاص اعتبارًا من الإصدار 5.84 ، ويمكن أن يتداخل ذلك مع مطابقة مسار العقدة بطرق غير مقصودة.
تم تعديل أساليب CalculateChecksum () في Message.cpp لتكون أكثر فعالية في الكشف عن الاختلافات نقل البيانات.
إزالة دعم MUSCLE_USE_QT_FOR_ATOMIC_OPERATIONS من AtomicCounter.h ، لأن فئة QAtomicInt Qt لا يعتمد الوظيفة التي تتطلب قيمة الإرجاع الجديدة أسلوب AtomicIncrement ().
إزالة MessageIOGateway :: FlattenMessage () و MessageIOGateway :: UnflattenMessage (). وأضاف في مكانها: MessageIOGateway :: FlattenHeaderAndMessage () و MessageIOGateway :: UnflattenHeaderAndMessage (). تتعامل هذه الطرق الجديدة مع كل من بايت الرأس ونص الرسالة في نفس الوقت.
إضافة ملف udpproxy.vcproj إلى مجلد الاختبارات ، للمساعدة في ترجمة udpproxy تحت Windows.
الرسالة: Flatten () الآن يتكرر عبر الحقول في الرسالة مرة واحدة ، بدلاً من مرتين.
GetCurrentThreadID () الآن دالة مضمنة ، لأنه قد يتم الآن الحصول على استدعاء كثيرًا بواسطة HashtableIterator.

عدّل رمز deadlockfinder لاستخدام قوائم الانتظار بدلاً من Hashtables ، حيث لا يمكن استخدام muscle_thread_id كنوع مفتاح Hashtable بعد الآن.
اختبار testudp.cpp بشكل صحيح لاستخدام MessageIOGateway للاتصال UDP الخاص به.
تم تعديل ifdefs في FilePathInfo.cpp أكثر قليلاً بحيث لن يتم الوصول إلى statInfo.st_birthtimespec عند استخدام MacOS / X SDKs التي لا توفرها.
لم يعد MessageDataIOGateway يحاول Unflatten رسالة من المخزن مؤقت بيانات zlib- deflated أنه كان غير قادر على re-inflate.
إصلاح خلل في SendDataUDP () قد يؤدي SendDataUDP () لإرجاع خطأ بشكل غير صحيح عند الإرسال إلى عنوان متعدد الإرسال باستخدام وضع غير حظر ، وكان المخزن المؤقت للإخراج ممتلئاً.

ما هو الجديد في الإصدار 5.85:

تمت إضافة LogTime (MUSCLE_LOG_DEBUG) إلى كافة مسارات الخطأ في MessageIOGateway :: DoInputImplementation () و Message :: Unflatten () ، بحيث يسهل تحديد متى يتم إحباط اتصالات TCP بسبب تلف البيانات.
إضافة دالة PreviousOperationHadTransientFailure () ، والتي تُرجع true iff errno هو EINTR أو ENOBUFS.
سيؤدي تحديد spamspersecond = -1 الآن إلى إرسال hexterm لإرسال البيانات غير المرغوب فيها بأسرع وقت ممكن.
تطبيق MUSCLE_USE_POLL SocketMultiplexer.h كان بتزويد POLLERR إلى WSAPoll () ولكن لا يدعم WSAPoll () POLLERR لذا سيقوم WSAPoll () بإرجاع خطأ عند حدوث ذلك. عملت حول المشكلة عن طريق تصفية خارج POLLERR عند التحويل البرمجي تحت ويندوز.
إصلاح خطأ حيث يمكن إرسال () إرجاع ENOBUFS قد يؤدي إلى إنهاء اتصال مأخذ التوصيل على الرغم من أن ENOBUFS ليس شرطاً فادحاً.
لم ترجمة SocketMultiplexer.cpp عندما تم تعريف MUSCLE_USE_POLL. ثابت.
قد تفشل الأسلوب ZLibCodec :: Deflate () لضغط كافة البيانات في مخزن مؤقت كبير جداً (على سبيل المثال أكثر من 42 ميغا بايت). ثابت.

ما هو الجديد في الإصدار 5.84:

تم توسيع بناء جملة رقمية لمجموعة StringMatcher بحيث يمكنك الآن تحديد نطاقات متعددة. على سبيل المثال ، & quot؛ & quot؛ سوف تطابق سلاسل ومثل (19)؛ ومثل ؛، ومثل، و 20 ومثل ؛، ومثل (21)؛ ومثل ؛، ومثل (25)؛ ومثل ؛، ومثل؛ 30 & مثل ؛، ومثل (31)؛ ومثل ؛، [...]، وومثل؛ 50 & مثل ؛.
إضافة GetCurrentTime64ForRunTime64 () ودالات التحويل GetRunTime64ForCurrenTime64 () إلى TimeUtilityFunctions.h.
إضافة أسلوب أداة مساعدة GetDescendant () إلى فئة DataNode.
تمت إضافة معالجات نقل C ++ 11 ومشغلات نقل المهام إلى فئات Hashtable و Queue و String و Message و ByteBuffer. للتوافق مع الإصدارات السابقة مع compilers القديمة ، سيتم ترجمة هذا الرمز فقط إذا تم تحديد -DMUSCLE_USE_CPLUSPLUS11 على سطر الترجمة.
سيتم الآن تقسيم فئة SharedMemory إلى فئة ذاكرة غير مشتركة إذا تم تحديد -DMUSCLE_FAKE_SHARED_MEMORY.
إضافة اختبار testfilepathinfo إلى مجلد الاختبارات.
تم تحديث جميع رؤوس إشعارات حقوق الطبع والنشر لقراءة 2000-2013 ماير ساوند.
مسافات مضافة بين الرموز المميزة للماكرو (مثل UINT32_FORMAT_SPEC) وثوابت السلسلة (مثل & quot؛ مرحبًا & quot؛) لجعل القارئات C ++ 11 سعيدة.


ByteBuffer.cpp كان خطأ في بناء الجملة من شأنه أن يمنعها من تجميع على مضيفي end-big-endian. ثابت.
MacOS / X فقط: تستبدل دالة الكربون المستهلكة المستبدلة بمكافئات المكات ، لتجنب تحذيرات الإيقاف تحت 10.8.x.

ما هو الجديد في الإصدار 5.83:

إصدارات الراحة المضافة من InflateByteBuffer () و DeflateByteBuffer () التي تأخذ ByteBufferRef كوسيطة.
إزالة بعض الأساليب القديمة / غير المستخدمة (EnsureBufferSize () و FreeLargeBuffer ()) من الفئة AbstractMessageIOGateway.
إصلاح بعض الأخطاء المطبعية في التعليقات في المجلد الفرعي دلفي.
لم تعد فئة Hashtable تصدر تحذيرات عند التحويل البرمجي تحت MSVC مع -DMUSCLE_AVOID_MINIMIZED_HASHTABLES المعرفة.
إصلاح الخلل في IPAddressAndPort :: ToString () الذي تسبب في تنسيق سلاسل عناوين IPv4 بطريقة غامضة عند تعيين (preferIPv4Style) على false.

برامج مماثلة

Qercus
Qercus

14 Apr 15

Mroonga
Mroonga

17 Feb 15

phpPgAdmin
phpPgAdmin

14 Apr 15

Apache Cassandra
Apache Cassandra

19 Feb 15

البرامج الأخرى من المطور Jeremy Friesner

AudioMove
AudioMove

2 Jun 15

تعليقات ل MUSCLE

لم يتم العثور على التعليقات
إضافة تعليق
بدوره على الصور!