apeescape2.com
  • メイン
  • 技術
  • エンジニアリング管理
  • その他
  • プロセスとツール
モバイル

MantleとRealmを使用したiOSでのRESTfulAPIの使用とデータの永続性の簡素化

すべて iOS開発者 は、Appleのオブジェクトグラフおよび永続性フレームワークであるCoreDataに精通しています。データをローカルに永続化する以外に、フレームワークには、オブジェクトの変更の追跡や元に戻すなど、多数の高度な機能が付属しています。これらの機能は多くの場合便利ですが、無料では提供されません。それは多くの定型コードを必要とし、フレームワークは全体として急な学習曲線を持っています。

2014年に、 レルム 、モバイルデータベースがリリースされ、開発の世界を席巻しました。データをローカルに永続化するだけでよい場合は、レルムが適しています。結局のところ、すべてのユースケースがコアデータの高度な機能を必要とするわけではありません。 Realmは非常に使いやすく、Core Dataとは対照的に、ボイラープレートコードはほとんど必要ありません。また、スレッドセーフであり、Appleの永続性フレームワークよりも高速であると言われています。

最新のモバイルアプリケーションのほとんどでは、データを永続化することで問題の半分を解決できます。通常、RESTful APIを介して、リモートサービスからデータをフェッチする必要があることがよくあります。ここが マントル 登場します。これは、CocoaおよびCocoaTouchのオープンソースモデルフレームワークです。 Mantleは、を使用するAPIと対話するためのデータモデルの記述を大幅に簡素化します。 JSON それらのデータ交換フォーマットとして。



iOS用のレルムとマントル

この記事では、New York Times Article Search APIv2から記事のリストとそれらへのリンクをフェッチするiOSアプリケーションを構築します。リストは、標準のHTTP GET要求を使用してフェッチされ、要求モデルと応答モデルはMantleを使用して作成されます。 Mantleを使用すると、値の変換(NSDateから文字列への変換など)を簡単に処理できることがわかります。データがフェッチされたら、Realmを使用してローカルに永続化します。最小限の定型コードでこれらすべて。

PythonはCで書かれています

RESTfulAPI-はじめに

まず、iOS用の新しい「Master-DetailApplication」Xcodeプロジェクト「RealmMantleTutorial」を作成することから始めましょう。 CocoaPodsを使用してフレームワークを追加します。 podfileは次のようになります。

pod 'Mantle' pod 'Realm' pod 'AFNetworking'

ポッドをインストールしたら、新しく作成したポッドを開くことができます MantleRealmTutorial ワークスペース。お気づきのとおり、有名なAFNetworkingフレームワークもインストールされています。これを使用して、APIへのリクエストを実行します。

冒頭で述べたように、New YorkTimesは優れた記事検索APIを提供します。これを使用するには、APIへのアクセスキーを取得するためにサインアップする必要があります。これはで行うことができます http://developer.nytimes.com 。 APIキーが手元にあれば、コーディングを開始する準備が整います。

Mantleデータモデルの作成について詳しく説明する前に、ネットワーク層を稼働させる必要があります。 Xcodeで新しいグループを作成し、それをネットワークと呼びましょう。このグループでは、2つのクラスを作成します。最初のものを呼びましょう SessionManager そしてそれがから派生していることを確認してください AFHTTPSessionManager からのセッションマネージャクラスです AFNetworking 、楽しいネットワーキングフレームワーク。私たちの SessionManager クラスは、APIへのgetリクエストを実行するために使用するシングルトンオブジェクトになります。クラスが作成されたら、以下のコードをそれぞれインターフェースファイルと実装ファイルにコピーしてください。

#import 'AFHTTPSessionManager.h' @interface SessionManager : AFHTTPSessionManager + (id)sharedManager; @end #import 'SessionManager.h' static NSString *const kBaseURL = @'http://api.nytimes.com'; @implementation SessionManager - (id)init { self = [super initWithBaseURL:[NSURL URLWithString:kBaseURL]]; if(!self) return nil; self.responseSerializer = [AFJSONResponseSerializer serializer]; self.requestSerializer = [AFJSONRequestSerializer serializer]; return self; } + (id)sharedManager { static SessionManager *_sessionManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sessionManager = [[self alloc] init]; }); return _sessionManager; } @end

セッションマネージャは、静的で定義されたベースURLで初期化されます kBaseURL 変数。また、JSON要求および応答シリアライザーも使用します。

次に、で作成する2番目のクラス 通信網 グループが呼び出されます APIManager 。それは私たちの新しく作成されたものから派生するものとします SessionManager クラス。必要なデータモデルが作成されたら、メソッドを追加します ApiManager これは、APIから記事のリストを要求するために使用されます。

New YorkTimesの記事検索APIの概要

この優れたAPIの公式ドキュメントは、次のURLで入手できます。 http://developer.nytimes.com/…/article_search_api_v2 。これから行うことは、次のエンドポイントを使用することです。

事業計画の主な外部ユーザーは
http://api.nytimes.com/svc/search/v2/articlesearch

…日付範囲で囲まれた、選択した検索クエリ用語を使用して見つかった記事をフェッチします。たとえば、私たちにできることは、2015年7月の最初の7日間にバスケットボールと関係のあるニューヨークタイムズに掲載されたすべての記事のリストを返すようにAPIに依頼することです。APIによると ドキュメンテーション 、これを行うには、そのエンドポイントへのgetリクエストで次のパラメータを設定する必要があります。

パラメータ 値
何 'バスケットボール'
begin_date 「20150701」
終了日 「20150707」

APIからの応答は非常に複雑です。以下は、わかりやすくするために多数のフィールドが省略された、上記のパラメーターが1つの記事(docs配列の1つのアイテム)に制限されているリクエストに対する応答です。

{ 'response': { 'docs': [ { 'web_url': 'http://www.nytimes.com/2015/07/04/sports/basketball/robin-lopez-and-knicks-are-close-to-a-deal.html', 'lead_paragraph': 'Lopez, a 7-foot center, joined Arron Afflalo, a 6-foot-5 guard, as the Knicks’ key acquisitions in free agency. He is expected to solidify the Knicks’ interior defense.', 'abstract': null, 'print_page': '1', 'source': 'The New York Times', 'pub_date': '2015-07-04T00:00:00Z', 'document_type': 'article', 'news_desk': 'Sports', 'section_name': 'Sports', 'subsection_name': 'Pro Basketball', 'type_of_material': 'News', '_id': '5596e7ac38f0d84c0655cb28', 'word_count': '879' } ] }, 'status': 'OK', 'copyright': 'Copyright (c) 2013 The New York Times Company. All Rights Reserved.' }

基本的に私たちが答えるのは3つの分野です。最初に呼ばれたもの 応答 配列が含まれています ドキュメント 、記事を表すアイテムが含まれています。他の2つのフィールドは 状態 そして 著作権 。 APIがどのように機能するかがわかったので、次にMantleを使用してデータモデルを作成します。

マントル入門

前述のように、Mantleはデータモデルの記述を大幅に簡素化するオープンソースフレームワークです。記事リストリクエストモデルを作成することから始めましょう。このクラスを呼びましょう ArticleListRequestModel そしてそれがから派生していることを確認してください MTLModel 、これはすべてのMantleモデルの派生元となるクラスです。さらに、それをに準拠させましょう MTLJSONシリアル化 プロトコル。リクエストモデルには、適切なタイプの3つのプロパティが必要です。 articlesFromDate 、および articlesToDate 。私たちのプロジェクトがうまく組織されていることを確認するために、このクラスを モデル グループ。

Mantleは、データモデルの記述を簡素化し、定型コードを削減します。 つぶやき

のインターフェースファイルは次のとおりです ArticleListRequestModel 見る必要があります:

#import 'MTLModel.h' #import 'Mantle.h' @interface ArticleListRequestModel : MTLModel @property (nonatomic, copy) NSString *query; @property (nonatomic, copy) NSDate *articlesFromDate; @property (nonatomic, copy) NSDate *articlesToDate; @end

ここで、記事検索エンドポイントのドキュメントを検索するか、上記のリクエストパラメータを含むテーブルを見ると、APIリクエストの変数の名前がリクエストモデルの変数の名前と異なることがわかります。 Mantleは、次の方法を使用してこれを効率的に処理します。

+ (NSDictionary *)JSONKeyPathsByPropertyKey.

リクエストモデルの実装でこのメソッドを実装する方法は次のとおりです。

#import 'ArticleListRequestModel.h' @implementation ArticleListRequestModel #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @'query': @'q', @'articlesFromDate': @'begin_date', @'articlesToDate': @'end_date' }; } @end

このメソッドの実装は、モデルのプロパティをJSON表現にマッピングする方法を指定します。一度方法 JSONKeyPathsByPropertyKey 実装されているので、クラスメソッド+[MTLJSONAdapter JSONArrayForModels:]を使用してモデルのJSON辞書表現を取得できます。

パラメータのリストからわかるように、まだ残っていることの1つは、両方の日付パラメータが「YYYYMMDD」の形式である必要があるということです。これは、マントルが非常に便利になる場所です。オプションのメソッド+JSONTransformerを実装することで、任意のプロパティにカスタム値変換を追加できます。これを実装することで、JSON逆シリアル化中に特定のJSONフィールドの値をどのように変換するかをMantleに指示します。モデルからJSONを作成するときに使用されるリバーシブルトランスフォーマーを実装することもできます。変換する必要があるので NSDate オブジェクトを文字列に変換します。 NSDataFormatter クラス。これがの完全な実装です ArticleListRequestModel クラス:

#import 'ArticleListRequestModel.h' @implementation ArticleListRequestModel + (NSDateFormatter *)dateFormatter { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @'yyyyMMdd'; return dateFormatter; } #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @'query': @'q', @'articlesFromDate': @'begin_date', @'articlesToDate': @'end_date' }; } #pragma mark - JSON Transformers + (NSValueTransformer *)articlesToDateJSONTransformer { return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) { return [self.dateFormatter dateFromString:dateString]; } reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) { return [self.dateFormatter stringFromDate:date]; }]; } + (NSValueTransformer *)articlesFromDateJSONTransformer { return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) { return [self.dateFormatter dateFromString:dateString]; } reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) { return [self.dateFormatter stringFromDate:date]; }]; } @end

Mantleのもう1つの優れた機能は、これらのモデルがすべて NSCoding プロトコル、および実装 isEqual そして ハッシュ メソッド。

すでに見てきたように、API呼び出しから得られるJSONには、記事を表すオブジェクトの配列が含まれています。 Mantleを使用してこの応答をモデル化する場合は、2つの別個のデータモデルを作成する必要があります。記事を表すオブジェクトをモデル化する( ドキュメント 配列要素)、およびもう1つは、docs配列の要素を除くJSON応答全体をモデル化します。これで、受信JSONのすべてのプロパティをデータモデルにマッピングする必要がなくなりました。記事オブジェクトの2つのフィールドにのみ関心があり、それらは次のようになると仮定します。 Lead_paragraph そして web_url 。ザ・ ArticleModel 以下に示すように、クラスの実装はかなり簡単です。

#import 'MTLModel.h' #import @interface ArticleModel : MTLModel @property (nonatomic, copy) NSString *leadParagraph; @property (nonatomic, copy) NSString *url; @end #import 'ArticleModel.h' @implementation ArticleModel #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @'leadParagraph': @'lead_paragraph', @'url': @'web_url' }; } @end

記事モデルが定義されたので、記事リストのモデルを作成して応答モデルの定義を完了することができます。 ArticleListクラスの応答モデルは次のようになります。

#import 'MTLModel.h' #import #import 'ArticleModel.h' @interface ArticleListResponseModel : MTLModel @property (nonatomic, copy) NSArray *articles; @property (nonatomic, copy) NSString *status; @end #import 'ArticleListResponseModel.h' @class ArticleModel; @implementation ArticleListResponseModel #pragma mark - Mantle JSONKeyPathsByPropertyKey + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @'articles' : @'response.docs', @'status' : @'status' }; } #pragma mark - JSON Transformer + (NSValueTransformer *)articlesJSONTransformer { return [MTLJSONAdapter arrayTransformerWithModelClass:ArticleModel.class]; } @end

このクラスには2つのプロパティしかありません。 状態 そして 記事 。これをエンドポイントからの応答と比較すると、3番目のJSON属性の著作権が応答モデルにマップされていないことがわかります。私たちが見れば 記事JSONTransformer メソッドでは、クラスのオブジェクトを含む配列の値トランスフォーマーが返されることがわかります ArticleModel 。

メソッドでそれも注目に値します JSONKeyPathsByPropertyKey 、モデルプロパティ 記事 JSON属性内にネストされている配列ドキュメントに対応します 応答 。

これで、ArticleListRequestModel、ArticleModel、ArticleListResponseModelの3つのモデルクラスが実装されているはずです。

グラフィックデザイナーのための色彩理論

最初のAPIリクエスト

Restful API

すべてのデータモデルを実装したので、クラスに戻る時間です。 APIManager APIへのGETリクエストを実行するために使用するメソッドを実装します。方法:

- (NSURLSessionDataTask *) getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure

かかります ArticleListRequestModel モデルをパラメータとしてリクエストし、 ArticleListResponseModel 成功した場合はNSError、それ以外の場合はNSError。このメソッドの実装では、 AFNetworking APIへのGETリクエストを実行します。 APIリクエストを成功させるには、で登録することにより、前述のように取得できるキーを提供する必要があることに注意してください。 http://developer.nytimes.com 。

#import 'SessionManager.h' #import 'ArticleListRequestModel.h' #import 'ArticleListResponseModel.h' @interface APIManager : SessionManager - (NSURLSessionDataTask *)getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure; @end #import 'APIManager.h' #import 'Mantle.h' static NSString *const kArticlesListPath = @'/svc/search/v2/articlesearch.json'; static NSString *const kApiKey = @'replace this with your own key'; @implementation APIManager - (NSURLSessionDataTask *)getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure{ NSDictionary *parameters = [MTLJSONAdapter JSONDictionaryFromModel:requestModel error:nil]; NSMutableDictionary *parametersWithKey = [[NSMutableDictionary alloc] initWithDictionary:parameters]; [parametersWithKey setObject:kApiKey forKey:@'api-key']; return [self GET:kArticlesListPath parameters:parametersWithKey success:^(NSURLSessionDataTask *task, id responseObject) { NSDictionary *responseDictionary = (NSDictionary *)responseObject; NSError *error; ArticleListResponseModel *list = [MTLJSONAdapter modelOfClass:ArticleListResponseModel.class fromJSONDictionary:responseDictionary error:&error]; success(list); } failure:^(NSURLSessionDataTask *task, NSError *error) { failure(error); }]; }

このメソッドの実装では、2つの非常に重要なことが起こります。まず、この行を見てみましょう。

NSDictionary *parameters = [MTLJSONAdapter JSONDictionaryFromModel:requestModel error:nil];

ここで起こっていることは、によって提供される方法を使用することです MTLJSONAdapter 私たちが得るクラス NSDictionary データモデルの表現。この表現は、APIに送信されるJSONを反映しています。ここにマントルの美しさがあります。実装した JSONKeyPathsByPropertyKey および+JSONTransformer ArticleListRequestModelクラスのメソッドを使用すると、1行のコードでデータモデルの正しいJSON表現をすぐに取得できます。

マントルを使用すると、他の方向にも変換を実行できます。そして、それはまさにAPIから受信したデータで起こっていることです。受信したNSDictionaryは、次のクラスメソッドを使用してArticleListResponseModelクラスのオブジェクトにマップされます。

ArticleListResponseModel *list = [MTLJSONAdapter modelOfClass:ArticleListResponseModel.class fromJSONDictionary:responseDictionary error:&error];

レルムを使用したデータの永続化

リモートAPIからデータをフェッチできるようになったので、それを永続化するときが来ました。冒頭で述べたように、レルムを使用して実行します。 Realmはモバイルデータベースであり、CoreDataとSQLiteの代わりになります。以下に示すように、非常に使いやすいです。

究極のモバイルデータベースであるRealmは、CoreDataとSQLiteの完全な代替品です。 つぶやき

レルムにデータを保存するには、最初にRLMObjectクラスから派生したオブジェクトをカプセル化する必要があります。ここで行う必要があるのは、単一の記事のデータを格納するモデルクラスを作成することです。このようなクラスを作成するのは簡単です。

#import 'RLMObject.h' @interface ArticleRealm : RLMObject @property NSString *leadParagraph; @property NSString *url; @end

そして、これは基本的にそれである可能性があり、このクラスの実装は空のままである可​​能性があります。モデルクラスのプロパティには、nonatomic、strong、copyなどの属性がないことに注意してください。レルムがそれらを処理し、私たちはそれらについて心配する必要はありません。

入手できる記事はマンテモデルでモデル化されているので 論文 初期化すると便利です ArticleRealm クラスのオブジェクトを持つオブジェクト 論文 。これを行うには、追加します initWithMantleModel レルムモデルへのメソッド。これがの完全な実装です ArticleRealm クラス。

#import 'RLMObject.h' #import 'ArticleModel.h' @interface ArticleRealm : RLMObject @property NSString *leadParagraph; @property NSString *url; - (id)initWithMantleModel:(ArticleModel *)articleModel; @end #import 'ArticleRealm.h' @implementation ArticleRealm - (id)initWithMantleModel:(ArticleModel *)articleModel{ self = [super init]; if(!self) return nil; self.leadParagraph = articleModel.leadParagraph; self.url = articleModel.url; return self; } @end

クラスのオブジェクトを使用してデータベースと対話します RLMRealm 。簡単に入手できます RLMRealm メソッド「[RLMRealmdefaultRealm]」を呼び出してオブジェクトを作成します。このようなオブジェクトは、作成されたスレッド内でのみ有効であり、スレッド間で共有することはできないことを覚えておくことが重要です。レルムへのデータの書き込みは非常に簡単です。 1回の書き込み、または一連の書き込みは、書き込みトランザクション内で実行する必要があります。データベースへの書き込み例は次のとおりです。

RLMRealm *realm = [RLMRealm defaultRealm]; ArticleRealm *articleRealm = [ArticleRealm new]; articleRealm.leadParagraph = @'abc'; articleRealm.url = @'sampleUrl'; [realm beginWriteTransaction]; [realm addObject:articleRealm]; [realm commitWriteTransaction];

ここで起こることは次のとおりです。まず、 RLMRealm データベースと対話するオブジェクト。次に、 ArticleRealm モデルオブジェクトが作成されます(から派生していることに注意してください RLMRealm クラス)。最後にそれを保存するために、書き込みトランザクションが開始され、オブジェクトがデータベースに追加され、保存されると書き込みトランザクションがコミットされます。ご覧のとおり、書き込みトランザクションは、それらが呼び出されるスレッドをブロックします。 Realmは非常に高速であると言われていますが、メインスレッドの単一のトランザクション内でデータベースに複数のオブジェクトを追加すると、トランザクションが終了するまでUIが応答しなくなる可能性があります。これに対する自然な解決策は、バックグラウンドスレッドでそのような書き込みトランザクションを実行することです。

SQLサーバーのパフォーマンスを向上させる方法

レルムでのAPIリクエストと永続的なレスポンス

これは、レルムを使用して記事を永続化するために必要なすべての情報です。メソッドを使用してAPIリクエストを実行してみましょう

- (NSURLSessionDataTask *) getArticlesWithRequestModel:(ArticleListRequestModel *)requestModel success:(void (^)(ArticleListResponseModel *responseModel))success failure:(void (^)(NSError *error))failure

バスケットボールと(前の例のように)関係があり、2015年6月の最初の7日間に公開されたニューヨークタイムズの記事を取得するためのマントルのリクエストモデルとレスポンスモデル。レルムでそれを永続化します。以下はそれを行うコードです。に配置されます viewDidLoad 私たちのアプリのテーブルビューコントローラーのメソッド。

ArticleListRequestModel *requestModel = [ArticleListRequestModel new]; // (1) requestModel.query = @'Basketball'; requestModel.articlesToDate = [[ArticleListRequestModel dateFormatter] dateFromString:@'20150706']; requestModel.articlesFromDate = [[ArticleListRequestModel dateFormatter] dateFromString:@'20150701']; [[APIManager sharedManager] getArticlesWithRequestModel:requestModel // (2) success:^(ArticleListResponseModel *responseModel){ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // (3) @autoreleasepool { RLMRealm *realm = [RLMRealm defaultRealm]; [realm beginWriteTransaction]; [realm deleteAllObjects]; [realm commitWriteTransaction]; [realm beginWriteTransaction]; for(ArticleModel *article in responseModel.articles){ ArticleRealm *articleRealm = [[ArticleRealm alloc] initWithMantleModel:article]; // (4) [realm addObject:articleRealm]; } [realm commitWriteTransaction]; dispatch_async(dispatch_get_main_queue(), ^{ // (5) RLMRealm *realmMainThread = [RLMRealm defaultRealm]; // (6) RLMResults *articles = [ArticleRealm allObjectsInRealm:realmMainThread]; self.articles = articles; // (7) [self.tableView reloadData]; }); } }); } failure:^(NSError *error) { self.articles = [ArticleRealm allObjects]; [self.tableView reloadData]; }];

まず、リクエストモデル(1)を使用してAPI呼び出しが行われ(2)、記事のリストを含むレスポンスモデルが返されます。 Realmを使用してこれらの記事を永続化するには、forループ(4)で行われるRealmモデルオブジェクトを作成する必要があります。複数のオブジェクトが単一の書き込みトランザクション内で永続化されるため、その書き込みトランザクションはバックグラウンドスレッドで実行されることに注意することも重要です(3)。これで、すべての記事がレルムに保存されたら、それらをクラスプロパティに割り当てます。 self.articles (7)。これらは後でTableViewデータソースメソッドのメインスレッドでアクセスされるため、メインスレッドのレルムデータベースからも安全に取得できます(5)。この場合も、新しいスレッドからデータベースにアクセスするには、そのスレッドで新しいRLMRealmオブジェクトを作成する必要があります(6)。

APIからの新しい記事の取得が何らかの理由で失敗した場合、既存の記事は失敗ブロックのローカルストレージから取得されます。

まとめ

このチュートリアルでは、リモートと対話するために、CocoaとCocoaTouchのモデルフレームワークであるMantleを構成する方法を学びました。 火 。また、Realmモバイルデータベースを使用して、Mantleモデルオブジェクトの形式で取得されたデータをローカルに永続化する方法も学びました。

このアプリケーションを試してみたい場合は、からソースコードを取得できます。 そのGitHubリポジトリ 。アプリケーションを実行する前に、独自のAPIキーを生成して提供する必要があります。

スピードに合わせたスケール:ビットコインライトニングネットワークの説明

技術

スピードに合わせたスケール:ビットコインライトニングネットワークの説明
暗号通貨、ブロックチェーン、ICOの謎を解き明かす

暗号通貨、ブロックチェーン、ICOの謎を解き明かす

財務プロセス

人気の投稿
PMOとは何ですか?プロジェクトマネジメントオフィスへのガイド
PMOとは何ですか?プロジェクトマネジメントオフィスへのガイド
NvidiaShield-Androidゲームコンソールの別の見方
NvidiaShield-Androidゲームコンソールの別の見方
H-1B:ホンジュラスからシリコンバレーへのiOS開発者の旅
H-1B:ホンジュラスからシリコンバレーへのiOS開発者の旅
ダウンラウンドとは何ですか?ダウンラウンドを回避する方法
ダウンラウンドとは何ですか?ダウンラウンドを回避する方法
プロジェクト管理会議2020の完全なリスト
プロジェクト管理会議2020の完全なリスト
 
GWT Toolkit:Javaを使用して強力なJavaScriptフロントエンドを構築する
GWT Toolkit:Javaを使用して強力なJavaScriptフロントエンドを構築する
REST仕様でこれまでに行ったことのない5つのこと
REST仕様でこれまでに行ったことのない5つのこと
ヘッジファンドのディープラーニングトレーディング入門
ヘッジファンドのディープラーニングトレーディング入門
製品設計における人間中心の設計の重要性
製品設計における人間中心の設計の重要性
CodeceptionでPHPテストをすぐに開始
CodeceptionでPHPテストをすぐに開始
人気の投稿
  • 安全なパスワードを設計するときにWebサイトによって発行される最も一般的なガイドラインのいくつかは次のとおりです。
  • モバイルウェブデザインのベストプラクティス2018
  • vulkanapiの使用方法
  • アジャイルスクラムとかんばんの違い
  • mysqlレプリケーションを設定する方法
  • ソフトウェアエンジニアを見つける方法
  • node jsWebアプリケーションフレームワーク
カテゴリー
ブランドデザイン ライフスタイル 革新 収益と成長 ヒントとツール 設計プロセス アジャイル 収益性と効率性 モバイル 財務プロセス

© 2021 | 全著作権所有

apeescape2.com