2020年

「オブジェクト指向でなぜつくるのか 第2版」を読んでみた

  • 2020.12.28

概要 Kindle Unlimitedに加入してみて良さそうな技術書を探していたところ一番におすすめで出てきた「オブジェクト指向でなぜつくるのか 第2版」を読んでみたのでそのまとめを書きたいと思います。本書ではオブジェクト指向(以降OOPと記載、Object Oriented Programming language)の特徴を大きく「プログミング技術」と「汎用の整理術」の2面からわかりやすく言語化して記載されていました。特に「プログラミング技術」の部分では他の技術書でよくある現実世界に無理やり置き換えた比喩を極力使わずに言語と図を用いて表現されていた部分がよかったと思います。 「オブジェクト指向でなぜつくるのか 第2版」 内容 プログラミングの歴史 機械語→アセンブリ言語→高級言語→構造化言語(GOTOレス)→オブジェクト指向(OOP) 機械語:コンピュータが解釈できる言語 アセンブリ言語:アセンブリ言語を使って書いたプログラムは、それをコンパイルするアセンブラと呼ばれるプログラムに読み込ませて機械語を生成 高級言語:FORTRANやCOBOLなどの人がわかりやすい言語。 構造化言語(GOTOレスプログラミング):基本三構造(順次実行、if文による条件分岐、for文やwhile文による繰り返し)。サブルーチンで独立性を高めて、複数サブルーチン間はグローバル変数で共有する。代表的なのはC言語。GOTO文を極力使わないように。 オブジェクト指向(OOP):グローバル変数問題、貧弱な再利用の2つの課題を解決させるために登場。Simula67→Smalltalk→Javaの流れ。 オブジェクト指向の特徴整理 3大要素 クラス(まとめる、隠す、たくさん作る) 関連性の強いサブルーチン(関数)とグローバル変数を1つにまとめて粒度の大きいソフトウェア部品をつくる仕組み。 サブルーチンと変数を「まとめる」、メソッドとインスタンス変数(属性、フィールド) クラスの内部だけで使う変数やサブルーチンを「隠す」、カプセル化 1つのクラスからインスタンスを「たくさん作る」、インスタンス ポリモフィズム(呼び出す側を共通化) 英語で「いろいろな形に変わる、多態性、多相性」 類似したクラスに対するメッセージの送り方を共通にする仕組み 目的は呼び出す側を共通化すること 実装は継承を使う 継承(重複を排除する) モノの種類の共通点と相違点を体系的に整理する仕組み 似たもの同士のクラスの共通点と相違点を整理する仕組み 目的はクラスの共通部分を別クラスにまとめること 進化した仕組み パッケージ クラスをまとめる仕組み クラスの名前の重複を全世界で避ける役割もある 例外 戻り値とが違う形式でメソッドから特別なエラーを返す ガベージコレクション ヒープ領域に作成されて、使われていないインスタンスを自動的に削除する仕組み ガベージコレクタと呼ばれるシステムが用意する専用のプログラムがインスタンスをメモリから削除する 実行方式とメモリの使用 コンパイラ方式:プログラムに書かれた命令をコンピュータが理解できる機会に変換したから実行する方式 インタプリタ方式:ソースコードに書かれたプログラムの命令をそのばで逐次解釈しながら実行する方式 コンパイラ方式とインタプリタ方式コンパイラ方式は実行効率がよく、インタプリタ方式では同じプログラミングを異なる環境で動作させることができる 中間コード方式:ソースコードを特定の機械語に依存しない中間コードに変換し、その中間コードを専用のインタプリタによって解釈して実行する Javaや.NETで採用されている 中間コード方式により同じプログラミングを異なる実行環境で効率良く動かすことができる スレッドとプロセススレッドはプログラムの実行単位で、複数のスレッドでひとまとまりの1つのプロセスとなる 静的領域:プログラムの開始時に確保され、以降プログラムが終了するまで配置が固定される領域 ヒープ領域:プログラムの実行時に動的に確保するためのメモリ領域 スタック領域:スレッドの制御のために使うメモリ領域。ヒープ領域は複数のスレッドで共用されるが、スタック領域はスレッドに1つずつ用意される。 LIFO(Last In First Out) OOPでのメモリ領域クラス情報は静的領域にロードされる OOPのプログラムは、ヒープ領域を大量に使って動く。 インスタンスはヒープ領域に作成されるが、変数に格納されるのはメモリの場所を指すポイント。 実装で注意すべて点は、不要になったインスタンスをスタックやメソッドエリアから参照し続けないようにすること フレームワークやデザインパターン フレームワークには、「包括的なアプリケーション基盤」の意味と「特定の目的のために書かれた再利用部品群」の意味がある フレームワークでのポリモフィズムと継承の役割ハリウッドの法則(Don’t call us, we will call you):基本的な処理はフレームワーク側で用意し、アプリケーション固有の処理はポリモフィズムを利用して呼び出す アプリケーション固有の処理は継承の仕組みを利用してあらかじめデフォルトの機能を用意しておく GoFデザインパターン(23種) 4人の技術者(Gang of Fourの略) デザインパターンに慣れる Iterator:1つ1つ数えあげる Adapter:一皮被せて再利用 サブクラスに任せる Template Method:具体的な処理をサブクラスに任せる Factory Method:インスタンス作成をサブクラスに任せる インスタンスを作る Singleton:たった一つのインスタンス Prototype:コピーしてインスタンスを作る Builder:複雑なインスタンスを組み立てる Abstract Factory:関連する部品を組み合わせて製品を作る 分けて考える Bridge:機能の階層と実装の階層を分ける Strategy:アルゴリズムをごっそり入れ替える 同一視 Composite:容器と中身の同一視 Decorator:飾り枠と中身の同一視 構造を渡り歩く Visitor:構造を渡り歩きながら仕事をする Chain of Responsibility:責任のたらい回し シンプルにする Facade:シンプルな窓口 Mediator:相手は相談役1人だけ 状態を管理する Observer:状態の変化を通知する Memento:状態を保存する State:状態をクラスとして表現する 無駄をなくす Flyweight:同じものを共有して無駄をなくす Proxy:必要になってから作る クラスで表現する Command:命令をクラスにする Interpreter:文法規則をクラスで表現する UML 13種類 クラス図:クラスの仕様とクラス間の関係を表現する 複合構造図:全体 – 部分構造を持つクラスの実行時の構造を表現する コンポーネント図:ファイルやデータベース、プロセスやスレッドのソフトウェアの実装構造を表現する 配置図:ハードウェアやネットワークなど、システムの物理構造を表現する オブジェクト図:インスタンス間の関係を表現する パッケージ図:パッケージ間の関係を表現する アクティビティ図:一連の処理における制御の流れを表現する シーケンス図:インスタンス間の相互作用を時系列に表現する コミュニケーション図:インスタンス間の相互作用を構造中心に表現する 相互作用概要図:条件によって異なる動作をするシーケンス図をアクティビティ図の中に含めることで表現する タイミング図:インスタンス間の状態遷移や相互作用を時間制約つきで表現する ユースケース図:システムが提供する機能と利用者の関係を表現する ステートマシン図:インスタンスの状態変化を表現する モデリング 業務分析 現実世界の仕事がどういう役割でどのように進めているのかを整理 合わせて、業務を遂行する上での課題を抽出し、コンピュータに任せる仕事を決めるための情報源とする 要求定義 現実世界の仕事の中からコンピュータに任せる仕事を定義する 設計 ハードウェアの能力、OSやミドルウェアの特性、プログラミング言語の表現能力などを考慮して、ソフトウェアの構造を決める 開発手法 ウォーターフォール RUP(Rational Unified Process) XP(eXtreme Programming) アジャイル TDD(Test Driven Development) リファクタリング CI(Continuous Integration) 関数型言語 関数型言語では、関数の実行を「引数に関数を適用する」と表現する 命令型言語と関数型言語の違い 命令型言語では、命令を実行すると表現するが、関数型言語では数学用語と同様に式を評価すると表現する まとめ 基礎的な内容が多かったが、初心者にも比較的わかりやすく記載されていた。経験者であっても、改めてオブジェクト指向の概要を幅広く復習できるのでおすすめできる。また、本書の途中に登場したデザインパターンは非常に気になったので次は下記を読みたくなった。 「Java言語で学ぶデザインパターン入門」https://www.amazon.co.jp/dp/B00I8ATHGW

ABC169 B,C問題(2020.5.31)

  • 2020.06.03

概要 本記事は、2020/5/31に開催されたABC169のB,C問題を整理した内容を記載します。D問題までの回答を目指しているにもかかわらず、まさかのB,C問題でつまづいてしまいました。非常に不甲斐ない結果ですが、しっかりできなかったポイントを整理していきたいと思います。ただ、TwitterやYoutubeのコメントを見ていると同じようにB,Cで苦戦している人が多かったようなので、少しだけほっとしていました。 B – Multiplication2 問題 https://atcoder.jp/contests/abc169/tasks/abc169_b 解説 PDF https://img.atcoder.jp/abc169/editorial.pdf Youtube 理解 N個の整数Ajを全て掛け合わせして解を求めるという非常にシンプルな問題です。ポイントは2つあって、まず1つはAjは0になることがあるということ。もう1つはAjは最大で10の9乗であり、そのまま全てをかけるとオーバーフローを起こしてしまうということです。python3.0の場合は、int型が多倍長整数であるので基本的にメモリがある分は桁数を使用することができます。なので、単純に毎回掛けて10の18乗を超えていないかをチェックする処理で動作します。 実装 参考 – 任意精度演算 https://ja.m.wikipedia.org/wiki/%E4%BB%BB%E6%84%8F%E7%B2%BE%E5%BA%A6%E6%BC%94%E7%AE%97 C – Multiplication3 問題 https://atcoder.jp/contests/abc169/tasks/abc169_c 解説 PDF https://img.atcoder.jp/abc169/editorial.pdf Youtube 理解 与えられたAとBの2つの整数をかけて、解は小数点以下を切り捨てて表示するというC問題にしては簡単すぎる問題だと思って解いたところ、しっかりと罠が仕掛けられていました。それはfloat型の浮動小数点により掛け算を行うと精度が足りず、誤差が発生してしまうというものです。したがって、安全な方法としてはfloatからDecimalに変換して掛け算を行うことで誤差をなくすことができます。注意点としてはpythonのDecimal関数の引数は誤差をなくすためにはStringで引数を指定する必要があるということがあります。 実装 参考 – 浮動小数点数 https://ja.m.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

LWC Local Developmentを試してみた

  • 2020.05.23

概要 SalesforceのLightning Web Component(LWC)をローカルサーバーで動かせる機能がBeta版でリリースされていたので、どんなものかを触って確かめてみました。 準備 Local Dev Server用のCLIをインストール 最終的にはSalesforce CLIのパッケージに含まれるようですが、現在はBeta版なので含まれていないので、個別にインストールする必要があります。 組織の認証 Devhub組織と認証して、Scratch組織を作成しておきます。どうやら接続先はSandboxではなくScratch組織である必要があるみたいです。この辺は結構前に書いた記事ですが、下記をご参照ください。 Salesforce DXの基礎の基礎https://qiita.com/yhayashi30/items/80dd868f2e15aac67072 ローカルサーバーを起動 下記のコマンドを実行することでnode.jsがローカルサーバーを起動してくれます。 また、VSCodeのコマンドパレットで下記を実行して操作することもできます。 起動して開くSFDX: Open Local Development Server 起動SFDX: Start Local Development Server 停止SFDX: Stop Local Development Server 表示(選択したLWCのソースコードを右クリック)Preview Lightning Web Components in VS Code これで準備ができたので、localhostにアクセスすると画面が表示されるはずです。 http://localhost:3333/ 特徴 ローカルのLWCを画面描画 最初、localhostにアクセスすると自分のローカルプロジェクトに含まれているLWCがリンクでリスト表示されます。 リンクをクリックすると、LWCがローカルサーバー上で表示されます。また、画面右上にある”View in VS Code”のボタンを押下すると、画面で表示しているLWCのソースコード をVS Code上で表示してくれます。VS Code上でLWCのソースを修正すると即時にローカルサーバーにデプロイが行われて画面が最新化されるようになっているようです。 コンパイルチェックしてくれる 今までSalesforceの開発ではSandboxやScratch組織にソースコードをアップロードしないとコンパイルのチェックはできませんでしたが、ローカルサーバーを使う事でLWCの構文チェックを行ってくれて、どこでエラーが発生しているかを表示してくれます。ちなみにエラー画面は下記のようなイメージで、どこでエラーが起きているかやエラーメッセージも表示されます。 データ表示 LWCはローカルサーバーで動いているのですが、Apexの処理は接続しているScratch組織上で実行するようになっているので、組織のデータを検索したり、登録/更新することも可能なようです。 参考 Local Development (Beta)https://developer.salesforce.com/tools/vscode/en/lwc/localdev Announcing LWC Local Development Betahttps://developer.salesforce.com/blogs/2019/10/announcing-lwc-local-development-beta.html

ABC165 C問題(2020.5.2)

  • 2020.05.23

概要 本記事は、AtCoderのABC165に参加した際に回答することができなかったの問題を解説を読んで理解した内容を記載します。C問題で回答できなかったのは久しぶりだったので、しっかりと復習したいと思います。 問題 C – Many Requirementshttps://atcoder.jp/contests/abc165/tasks/abc165_c 解説 pdf https://img.atcoder.jp/abc165/editorial.pdf 動画(Youtube) 理解 まず計算量を考える部分ですが、数の組み合わせですが等しい数も選択することができるので、玉を並べてそれらに仕切りを置くようなイメージで算出します。具体的にはN個の仕切りとM-1個の玉からN個を選択するときの組み合わせが総数となります。なので、N+M-1 Choose N となり、今回の最大数は19 Choose 9なので92378通りで全探索でも問題ない処理量と考えられます。次に全探索のdfs関数についてですが、全探索を考えるときのポイントは以下の2つです。 一回のステップでどんな処理をすることで次につなげられるか 終了条件をどうするか 今回の実装では、一回の実行ではリストの最後の値をリストに追加する処理を行います。終了条件はリストの長さがNとなると時で、そこでそのリストでの値を計算してmaxをとります。 実装

SalesforceにおけるOAuth2.0/OpenID Connect

  • 2020.05.20

概要 本記事では、業界標準であるOAuth2.0とOpenID Connectの概要を紹介した後に、Salesforceではそれらをどのように実装することができるのかを簡単に記載していきたいと思います。 本記事のベースとなるOAuth2.0やOpenID Connectの技術的な事項はこちらの本で学習しました。クライアント、認可サーバー、保護対象リソースのそれぞれについてサンプルのソースコードでどのように動作するかが詳細に記載されており理解するのに非常に役に立ちました。おすすめです。 認証・認可とは それぞれ詳細を説明すると非常に長くなるのですが、あえて一言で言うと下記で表せます。 認証 通信の相手が誰(何)であるかを確認すること 認可 とある特定の条件に対して、リソースアクセスの権限を与えること Salesforceにおける認証・認可とは Salesforceで実現可能な認証・認可の仕組みは下記が上げられます。 # 名称 概要 機能名 1 フォーム認証 Webブラウザでユーザ名とパスワードを入力する最も基本的な認証方式 標準ログイン画面 2 2要素認証 認証に2つ目の要素を追加することでセキュリティを強化する Salesforce Authenticator 3 SSO 一回の認証で複数のサービスを利用できる仕組みSalesforceは、IdpとSPのどちらになることもできる SAMLシングルサインオン 4 証明書認証 PCもしくはモバイルデバイスに配布されたクライアント証明書でログイン認証を行う 証明書認証 5 OAuth/OpenID Connect ←本記事ではこれを解説 外部アプリケーションにSalesforceのデータへのアクセスする際にその認可を与える仕組み 接続アプリケーション 6 Social Sign on ソーシャルアカウントで認証を行う 認証プロバイダ 7 代理認証 ユーザの認証を外部サービスで行う外部サービスはSalesforceが指定するWSDLに合わせたインターフェースを実装する必要がある 代理認証 OAuth2.0とは 概要 OAuth2.0は、業界標準でありRFCに下記のように定義されております。RFC6794(The OAuth 2.0 Authorization Framework) https://tools.ietf.org/html/rfc6749 ‘OAuth 2.0 は, サードパーティーアプリケーションによるHTTPサービスへの限定的なアクセスを可能にする認可フレームワークである. サードパーティーアプリケーションによるアクセス権の取得には, リソースオーナーとHTTPサービスの間で同意のためのインタラクションを伴う場合もあるが, サードパーティーアプリケーション自身が自らの権限においてアクセスを許可する場合もある. 本仕様書はRFC 5849に記載されているOAuth 1.0 プロトコルを廃止し, その代替となるものである.’ 言い換えると、下記のように表せます。 リソース所有者の代わりとして対象のリソースへのアクセスを許可するための手段 サード・パーティー製のアプリケーションがHTTPサービスへの制限されたアクセス権を取得できるするようにするためのもの OAuthとはシステムを構成しているある要素から別の構成要素にアクセス権を渡すためのもの では、なんのためにOAuthを使用して認可をするかというと サード・パーティ製のアプリケーションにユーザーの ID & パスワードを渡さない となります。 概要イメージ 0. まずユーザであるリソース所有者がクライアントのアプリケーションを使用します。1. クライアントは、保護対象リソースへアクセスするために一旦認可サーバーへリクエストを行います。2. 認可サーバーはリソース所有者との間でユーザ認証および認可を行います。3. 認可サーバーはユーザとの認証・認可が完了しているので、クライアントへアクセストークンを返却します。4. クライアントは、保護対象リソースへアクセストークンを利用してAPIアクセスを行います。 各構成要素 クライアント ・・・ ソフトウェアであり、リソース所有者の代わりとして保護対象リソースへのアクセスを行うもの 認可サーバー ・・・ OAuthの仕組みの中心的な役割を担うHTTPサーバーのこと. リソース所有者にクライアントを認可するための仕組みを提供し、トークンをクライアントに発行するもの リソース所有者 ・・・ クライアントにアクセス権を委譲する権限を持つ存在. ソフトウェアでなくユーザー. 保護対象リソース ・・・ HTTPサーバーから提供されており、そのリソースにアクセスするにはOAuthのトークンが必要となる. 保護対象リソースは提示されたトークンを検証して、リクエストに応えるかを判定する アクセストークン ・・・ 認可サーバーによってクライアントへ発行され、クライアントに権限が委譲されたことを示すもの スコープ ・・・ 保護対象リソースでの権限を表すものであり、クライアントに付与されるアクセス権限を制限するための仕組み リフレッシュトークン ・・・ 新しいアクセストークンを発行するために使用する 認可コードフロー(Authrorization Code Grant Type) OAuthのいくつかあるフローの中で最も標準的なフローである認可コードフローは下記のようになります。 認可リクエスト/認可レスポンスのイメージ response_type=codeで認可コードフローを指定 codeの値が発行された認可コード トークンリクエスト/トークンレスポンスのイメージ grant_type ・・・ authorization_codeで認可コードフローを指定。 その他のフロー # フロー名 概要 1 認可コードフロー(Authorization Code Type) 最も標準系のフロー。クライアントが認可コードを経由してアクセストークンを取得する。 2 インプリシットフロー(Implicit Grant Type) JavaScriptアプリケーション等で完全にブラウザ内で動作している場合に使用する。クライアントは認可エンドポイントから直接アクセストークンを取得する。 3 クライアント・クレデンシャルフロー(Client Credentials Grant Type) ユーザに関係なくクライアントアプリへ直接アクセストークンを発行する。 4 リソースオーナー・パスワード・クレデンシャルズフロー(Resource Owner Password Credentials Grant Type) 基本的に非推奨。(アンチパターン)アプリケーション側でID、PWを入力させて、それをトークンエンドポイントへ送り直接アクセストークンを取得する。 5 リフレッシュトークンフロー(Refresh Token Grant Type) リフレッシュトークンを使用して、アクセストークンの再発行を行う。 OpenID Connectとは 概要 OpenID Connect Core1.0https://openid.net/connect/ OpenID Connect 1.0 は, OAuth 2.0 プロトコルの上にシンプルなアイデンティティレイヤーを付与したものである. このプロトコルは Client が Authorization Server の認証結果に基づいて End-User のアイデンティティを検証可能にする. また同時に End-User の必要最低限のプロフィール情報を, 相互運用可能かつ RESTful な形で取得することも可能にする. これらをわかりやすく言い換えると下記のように表せます。 OAuth 2.0 + Identity Layer = OpenID Connect Identity Layer = ID Token + UserInfo […]

ABC163 D問題(2020.04.19)

  • 2020.05.06

概要 コンテストの日から少し時間が空いてしまいましたが、2週間前?くらいに参加したABC163(2020/4/19)で相変わらずD問題がクリアすることができなかったので、復習のために解説を確認しながら、概念を理解してACするプログラムを実装しました。 問題 https://atcoder.jp/contests/abc163/tasks/abc163_d 解説 PDF https://img.atcoder.jp/abc163/editorial.pdf 動画(Youtube) 理解 まずM個の数である10^100の部分は非常に大きい数であるため、選択する数が変わると合計の値は他の数の組み合わせとは重複しないので、各選択した数の組み合わせによる合計値を求めれば算出可能となります。本問題でキーとなる部分は、M個からK個選ぶ場合の最大値は大きい方からK個選ぶ場合であり、最小値は小さい方からK個選ぶ場合となり、これらの最大値と最小値の間の値は全てを組み合わせで生成できるという点となります。したがって、作成できる数の総和は最大値-最小値で算出できます。次に、2つの連続するrからlまでの数の合計は、(l+r)*(r-l+1)/2で求めることができます。というポイントを抑えて実装すると下記のようになりました。 実装

Pythonista3でGithubにPushする方法

  • 2020.05.06

Pythonista3とは Pythonista3とは、iPadやiPhoneでPythonのプログラムを書いたり、実行したりすることができるiOSのアプリです。https://apps.apple.com/jp/app/pythonista-3/id1085978097 概要 本記事では、Pythonista3で書いたプログラムをアプリから直接Githubの自分のリポジトリにPushする方法を記載します。iOSのアプリケーションでは基本的にShellスクリプトを実行することができないのですが、Pythonistaのユーザが作成したstashというスクリプトを実行することでShellが擬似的に使用できるにしてGithubへのアクセスをCUIベースで行います。 手順 stashのインストール Pythonistaのアプリケーションで左にスワイプするとコマンドが表示されるので、そこで下記のコマンドを実行してstashをインストールします。 Pythonistaを再起動 インストールが完了したら、Pythonistaを一度タスクリストから削除して、再度アプリの立ち上げを行うことで再起動します。 stashをPythonのバージョン2.7で起動 アプリ内のフォルダ直下(This iPad,This iPhone)にlaunc_stash.pyというプログラムが作成されているので、そのファイルを開いて右上のRun(再生ボタンみたいなやつ)を長押しすると「Run with Python 2.7」が表示されるのでそちらを押下します。すると、unix風のコンソールに切り替わると思うのでそこでコマンドを実行可能となります。ちなみに、Pythonバージョン2.7で起動している理由は、この後で実行するGitコマンドがバージョン3.6で起動すると動作しなかったからとなります。 公開鍵を作成 Githubとの接続に必要となる公開鍵をstash上で作成します。rsaはデフォルトでは1024bitとなりますが、セキュリティを考えて2048bitを指定しています。 作成した公開鍵をGithubへ登録します。GithubのSetting->SSH keysから下記のコマンドで表示される文字列(ssh-rsa から始まる)をコピーして設定します。 Gitコマンド 下記のコマンドでGithubへのPushまでを行います。 参考 stashhttps://github.com/ywangd/stash

ABC162 D問題(2020.4.12)

  • 2020.04.14

まえおき 最初に記事の本題に入る前に前置きを書きたいと思います。去年くらいから新しくプログラミング言語を勉強していても実務で使用する機会がない言語でアウトプットする場がないと身につかないなと思い始めました。そこで色々考えていたのですが、ある時TwitterのTLでAtCoder(https://atcoder.jp/)という日本発の競技プログラミングが流行りはじめているのをみて興味を持ったのがきっかけでした。試しに参加してみたら割と簡単に参加できて、大体週一回開催というペースがあっているなと感じ少しづつ始めるようになりました。言語は最近勉強し始めていたPythonを使って参加しておりますが、数回参加して感じたのはプログラミング言語の問題や課題ではなく自分のアルゴリズム能力の無さでした。この課題は将来のためにも改善した方が良いと思い、より本腰を入れて毎週末の夜にABCのコンテストに参加するようになりました。ところが、参加するだけではなかなか能力の向上はないので、問題に臨んだけど解くことができなかった問題は回答や他の方の実装を参照して、自分なりの実装を作成するというのを始めることにしました。そして、その内容はなるべくブログで簡単にでもアウトプットしようと思っています。それの初回が本記事となります。また、時間があれば、アルゴリズムについてチーター本、蟻本、螺旋本あたりを読んでブログで整理できればと考えています。ということで、前置きが長くなりましたが、早速先週末(4/12)の夜に開催されたABC162のD問題が解けなかったので、その回答と自分なりの実装を本記事では記載します。 問題 ABC162 D問題 RGB Triplets https://atcoder.jp/contests/abc162/tasks/abc162_d 解説 https://img.atcoder.jp/abc162/editorial.pdf 理解 何も考えないで実装すると、i, j, kについて全探索で処理を行ってしまい計算量はO(N^3)となり、nは最大で4000なのでTLEしてしまいそうです。なので、方針として最初に”R”,”G”,”B”の3つが異なる組み合わせとなる総数を算出してから2つの条件にマッチしないものを引いていくことにします。その理由は、マッチしないパターンであれば問題文の2個目の条件でi, j, kの関係でi, jを固定するとkが算出できるので、その分を総数から引いてあげることができます。その場合の計算量はO(N^2)とすることができそうです。 実装例 自分が作成した実装は下記の通りとなります。

VSCode Onlineを試してみた

  • 2020.04.04

概要 少し前ですがMS社のVisual Studio Onlineのパブリックプレビューで利用可能となったので、実際に触ってみました。個人的に注目していた理由はiPadからコーディングするのにブラウザ経由でVSCodeで使えるのであれば少しくらいなら課金してもいいかなと思って試しました。本記事では検証のために触った際のメモを記載します。※ちなみにブログ投稿と実際の作業試した日に時差があるので画面等が古かったらごめんなさい。 手順 サインアップ 下記のページからサインアップできます。サインアップするには、MSアカウントとAzureのサブスクリプションプラン(課金設定)が必要となります。 https://visualstudio.microsoft.com/ja/services/visual-studio-online/ Visual Studio Onlineの管理画面(?)に遷移するので、Create a Billing Planを実行します。https://online.visualstudio.com/environmentsLocationは、いくつか選択することができましたがSourtheast Asiaを選択しました。 作成したLocationでCreate environmentで環境を作成します。Gitのリポジトリを指定すると環境作成時に自動でCloneされるようです。また、Instance Typeでは、StandardかPlemiumのどちらかが選択できます。Suspendするまでのidle時間もここで選択して環境を作成します。 接続 環境が作成できました。 Connectを押下すると、ブラウザからVSCode Onlineに接続できました。なお、Connectした環境は、明示的にSuspendすることもできそうです。 価格 価格は、こちらにありました。https://azure.microsoft.com/ja-jp/pricing/details/visual-studio-online/課金は、アクティブの時間数と環境を保持していた時間数の2つをベースに計算されるようです。なので、例えば基本消費ユニット × 環境を保持していた時間数:2 × 730時間(約一ヶ月分)アクティブユニット × アクティブの時間数(Connectしていた時間数):125 × 100時間(1日5時間で20日間) 合計 → 7,317.28円まぁまぁいい値段になりました・・・ セルフホステッド 上記の価格表にセルフホステッドが無料と記載されていたので、こちらもどのようなものかを試してみました。https://docs.microsoft.com/ja-jp/visualstudio/online/how-to/vscode#self-hostedローカルのVS Codeのコマンドパレットで、VS Online: Register Local Environmentを実行します。環境名は、デフォルトでPC名となるのでそのままでOKのようです。 セルフホステッドだと、当然クラウドのサーバーは利用しないので課金はされないのですが自宅でサーバーを保有しているとかではない限り常時PCを立ち上げておくとかは現実的ではないので私は使用するのは断念しました。 結論 もうちょっとPrice Downしたら利用しようかなと思いました。プライベートのコーディングであれば、アクティブの時間はそれほど多くないと思うので基本料金の部分がもう少し下がれば、検討しても良いのかなと思っています。

[Salesforceデザイナー資格]Data Architecture and Management デザイナー

  • 2020.03.21

概要 本記事は、Salesforceのデザイナー資格であるData Architecture and Managementを受験するにあたって勉強した際の簡単なメモとなります。私が受験した時のバージョンはWinter’20でしたので、その時点での試験範囲に基づいております。 試験範囲 試験範囲については、リリースごとに変わる可能性があるので最新情報を確認する必要があります。詳細は下記から参照してください。http://tandc.salesforce.com/examguide_cert_data_archi_manage_designer.pdf 勉強内容 基本的な勉強方法は、上記の試験範囲に沿って必要な情報が公開されているヘルプサイトやブログ、Trailheadを参考にインプットをしました。 Data Modeling (20%) BigObject https://developer.salesforce.com/docs/atlas.en-us.bigobjects.meta/bigobjects/big_object.htm https://developer.salesforce.com/docs/atlas.en-us.bigobjects.meta/bigobjects/big_object_example_queueable.htm Roll up summary https://help.salesforce.com/articleView?id=fields_about_roll_up_summary_fields.htm&type=5 https://help.salesforce.com/articleView?id=fields_defining_summary_fields.htm&type=5 Relation https://help.salesforce.com/articleView?id=overview_of_custom_object_relationships.htm&type=5 External Object https://help.salesforce.com/articleView?id=external_object_define.htm&type=5 https://help.salesforce.com/articleView?err=1&id=ext_data_sync_database.htm&type=5 Data Skew https://trailhead.salesforce.com/content/learn/modules/large-data-volumes/design-your-data-model Person Account https://help.salesforce.com/articleView?id=account_person.htm&type=5 Custom Index https://help.salesforce.com/articleView?id=000325247&language=en_US%C2%A0&type=1&mode=1 Data Archiving Strategy http://www.salesforce.org/ask-architect-5-steps-effective-salesforce-data-management-strategy/ Data Storage https://help.salesforce.com/articleView?id=overview_storage.htm&type=5 https://help.salesforce.com/articleView?id=000318951&type=1&mode=1 Set Audit Field https://help.salesforce.com/articleView?id=000334139&type=1&mode=1 Outbound Message https://help.salesforce.com/articleView?err=1&id=workflow_managing_outbound_messages.htm&type=5 Conceptual Design(15%) Lightning Data https://appexchange.salesforce.com/appxStore?type=Data Data.com vs Lightning Data Service https://help.salesforce.com/articleView?id=000317679&type=1&mode=1 Merge https://help.salesforce.com/articleView?id=contacts_merge_classic.htm&type=5 Data.com Prospector and Clean https://help.salesforce.com/articleView?id=000318293&type=1&mode=1 Duplicate Rule https://help.salesforce.com/articleView?id=duplicate_rules_map_of_reference.htm&type=5 Translation workbench https://help.salesforce.com/articleView?id=customize_wbench.htm&type=5 Mater Data Management(10%) 特に参考サイトなし・・・ Metadata Management(7%) Event monitoring https://trailhead.salesforce.com/en/content/learn/modules/event_monitoring/event_monitoring_intro Custom Metadata Types https://help.salesforce.com/articleView?id=custommetadatatypes_package_install.htm&type=5 Package Custom Metadata Types and Record https://help.salesforce.com/articleView?id=custommetadatatypes_package_install.htm&type=5 Define Custom Settings https://help.salesforce.com/articleView?id=custommetadatatypes_package_install.htm&type=5 Metadata API https://help.salesforce.com/articleView?id=custommetadatatypes_package_install.htm&type=5 Audit Trail https://help.salesforce.com/articleView?id=custommetadatatypes_package_install.htm&type=5 Data Archiving(10%) Export Buckup data from Salesforce https://help.salesforce.com/articleView?id=admin_exportdata.htm&type=5 https://developer.salesforce.com/blogs/2015/03/salesforce-backup-and-restore-essentials-part-1-backup-overview-api-options-and-performance.html Outbound Message Actions https://help.salesforce.com/articleView?id=workflow_managing_outbound_messages.htm&type=5 Field Set https://help.salesforce.com/articleView?id=fields_about_field_sets.htm&type=5 Buckup and restore https://developer.salesforce.com/blogs/2015/03/salesforce-backup-and-restore-essentials-part-1-backup-overview-api-options-and-performance.html PK Chunking https://developer.salesforce.com/blogs/engineering/2015/03/use-pk-chunking-extract-large-data-sets-salesforce.html Field History Tracking https://help.salesforce.com/articleView?id=tracking_field_history.htm&type=5 Suspend Event https://developer.salesforce.com/blogs/engineering/2013/05/extreme-force-com-data-loading-part-3-suspending-events-that-fire-on-insert.html Deferred Sharing Calculation https://developer.salesforce.com/blogs/engineering/2013/08/extreme-force-com-data-loading-part-6-taking-advantage-of-deferred-sharing-calculation.html Dataloader CLI https://help.salesforce.com/articleView?id=command_line_intro.htm&type=5 Data backup and recovery Best Practice https://help.salesforce.com/articleView?id=000334121&language=en_US&type=1&mode=1 Data Governance(7%) Data Covernance Best Practice https://www.salesforce.com/video/1779731/ Reporting and Analytics(10%) Performance Turning https://developer.salesforce.com/blogs/engineering/2013/03/long-and-short-term-approaches-for-tuning-force-com-performance.html Custom Index https://developer.salesforce.com/blogs/engineering/2015/06/know-thy-salesforce-field-indexes-fast-reports-list-views-soql.html Run Report Faster https://developer.salesforce.com/docs/atlas.en-us.salesforce_reportperformance_cheatsheet.meta/salesforce_reportperformance_cheatsheet/reportperformance_cheatsheet.htm Improve Report Performance https://help.salesforce.com/articleView?id=improving_report_performance.htm&type=5 Sales Dashboard https://www.salesforce.com/blog/2019/01/sales-management-dashboards.html Report Consideration https://help.salesforce.com/articleView?id=platform_connect_considerations_reports.htm&type=5 Schedule Dashboard https://help.salesforce.com/articleView?id=dashboards_schedule_refresh.htm&type=5 Limit of Custom ReportTypes https://help.salesforce.com/articleView?id=reports_report_type_guidelines.htm&type=5 Data Migration(10%) Duplicate Rules https://help.salesforce.com/articleView?id=duplicate_rules_map_of_reference.htm&type=5 Data loading https://developer.salesforce.com/blogs/engineering/2013/06/extreme-force-com-data-loading-part-4-sequencing-load-operations.html Data aggregation https://developer.salesforce.com/docs/atlas.en-us.salesforce_large_data_volumes_bp.meta/salesforce_large_data_volumes_bp/ldv_deployments_case_studies_data_aggregation.htm  Limits and allocation […]