ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

4
完璧なクロスフェード
この問題を言葉で説明するのは難しいと思うので、それを説明するためにビデオ(45秒)を作成しました。ここに質問のプレビューがあります、Vimeoでそれを見てください:http : //vimeo.com/epologee/perfect-crossfade 過去10年間、多くの分野で2つの画像または形状の完璧なクロスフェードまたはディゾルブを作成する問題が繰り返し発生しました。最初はビデオ編集で、次にFlashアニメーションで、そして今はiOSプログラミングで。Googleでグーグル検索を開始すると、多くの回避策が見つかりますが、今回はハックせずにこれを解決したいです。 要約: 結果の透明度をどちらか一方のオリジナルと一致させる場合、2つの半透明の同色のビットマップをクロスフェードする際に適用する手法または曲線の名前は何ですか? フェード中に必要な部分的な透明度/アルファ値を計算する(数学的な)関数はありますか? これらの関数をに似たプリセットとして持っているプログラミング言語ease in、ease outまたはease in outActionScriptやCocoaにある関数はありますか? 更新:ビデオに加えて、サンプルプロジェクト(XcodeとiOS SDKが必要)を作成し、githubに投稿しました。ビデオと同じアニメーションを示していますが、今回は正方形を使用しています:https : //github.com/epologee/StackOverflow-Example-Code

13
実験言語を学ぶ価値はありますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 私はいつかプログラマーとして現場​​で働きたいと思っている若いプログラマーです。Java、VB.NET、C#を知っています。私は新しい言語を学びたいです(プログラマーとして、私が知っていることを拡張すること-あなたが違った考え方をする言語を学ぶことは価値があることを知っています)。どの言語が一般的かをオンラインで調べました。誰もがCとC ++を知っています(コンピューター全般についてほとんど知らないマグルさえも)、だから私はCを推し進めるべきだと思いました。 CとC ++は優れていますが、古いものです。HaskellやForthなど(などなど)は古く、人気を失っています。この同じ理由で、C(またはC ++)を学ぶのが怖いです。Javaもかなり古く、JVMによって実行され、ネイティブコードにコンパイルされないため、低速です。 私はかなり長い間Windows開発者でした。私は最近、Javaの使用を開始しましたが、それはJavaがより汎用性が高く、他の場所に拡散可能であったためです。問題は、次の理由により、非常に使いやすい言語のように見えないことです。 最もよく使用される目的は、Webアプリケーションと携帯電話アプリ(特にAndroid)です。 それで作られた実際の製品に関する限り、頭に浮かぶのはNetbeans、Eclipse(IDEが使用する言語でIDEを作成するためのhurrah-HTML / CSS / Javascriptを書くためのWebページを作成するようなもの)、およびMinecraftだけですこれはたまたま楽しいですが、コンピュータの仕様に関しては遅延があり、バイポーラです。サポート。 それ以外はサーバーに使用されますが、一体-サーバーを作成/構成するだけではありません。 ただし、.NET言語は優れています。 真面目な会話でVB.NETやC#に言及すれば、人々は笑います。 MONOを使用しない限り、クロスプラットフォームではありません(まだ開発中であり、改善が必要です)。 JVMを備えたJavaのように、CLRによって実行/管理されるため、低レベルのものはありません。 私の最初の考えは、Cのようなものを学び、それを使ってC ++に踏み込むことでした(ただ、私が強い理解/基盤を持っていることを確認するためです)。 私が見たもの ファントムはいいですね。それは私の2つのお気に入りの言語間の素敵な仲介者のようであり、2つの言語を交換可能に公開することもできますが、私が望むものとは異なり、完全なコンパイルではなくCLRまたはJVM(公開する内容に応じて)にコンパイルします。 Dもいいですね。それは非常に使用可能な言語のように思えるからMULTipleの源、実際にはC / C ++よりも良いように見えます。私はそれでうまくいきますが、この時点では明らかにあまり主流ではないので、私はまだその成功を確信していません。 Opa with web developmentやGo by GOOGLE など、他のことに焦点を当てた、とても素敵に見えるカップルが他にもあります。 私の質問 これらの「実験的」言語を学ぶ価値はありますか?他の質問を読んだことがあります。もしあなたが絶えず言語を学んでおらず、あなたがプログラミングにふさわしくないすべての言語に開かれているなら。私はこれを理解していますが、まだ理解していないかもしれませんが、実際には、言語が主流にならない場合、何か他のことを学ぶことに時間を費やすべきですか?古い(またはもうすぐ古くなる)プログラミング言語を学びたくありません。多くの人がこれを何か重要なものとみなしていることを知っていますが、あなたが実際にFORTRANを検討することはありますか(まだ知らなかったと仮定して)。私の目標は、将来の成功を確実にするために最新の状態を保つことです。 免責事項 はい、私は若いプログラマーですので、私はおそらく私の質問で多くの素朴な声明を出しました。 何でも自由に修正してください! 私はどこかで学習を始めなければならないので、私の知識の多くは、誤った記述や思考の欠陥を引き起こしたのに十分なほど大ざっぱです。コメントに感想を残してください。 結果... 私は、驚くべき反応に本当に驚いています。それらのほとんどは、私の誤解と誤解をとてもうまく指摘しています。私はこれから多くのことを学びました、そして、うまくいけば、私が学んだすべてを活用することに興奮しています!おそらく、Haskellの学習を始めて(20年以上とはいえ、それほど古くはない言語です-hahaha)、その後、私の周りのいくつかのオプションを調べ始めます。 ありがとう

5
ネットワークアクセスなしでローカルコンピューターにsvnサーバーをセットアップできますか?
ネットワークにアクセスせずにコンピューターにSVNリポジトリーをセットアップしたい。私はコードを共同編集者なしで作業しているので、一般に公開したくありません。 この投稿を読みましたが、無料のリポジトリを提供するオンラインSVNリポジトリサービスを使用することをお勧めします。その場合、私のコードは公開されます(無料プランの条件に含まれています)。 それで、インターネットに接続していないときでも、自分だけがアクセスできるローカルサーバーをWindows XPマシンにセットアップできるかどうか疑問に思っていました。
25 svn 

8
意味のある簡潔なメソッド命名ガイドライン
最近私はオープンソースプロジェクトのリリースを開始しましたが、私はライブラリの唯一のユーザーでしたが、名前は気にしませんでしたが、学習しやすくするために各メソッドに巧妙な名前を割り当てたいことを知っていますが、簡潔な名前を付けて、簡単に記述できるようにします。 命名に関するいくつかのガイドラインについて考えていましたが、文字の大文字小文字やいくつかの簡単なメモだけに注意を払う多くのガイドラインを知っています。ここでは、意味のある、しかし簡潔な命名のガイドラインを探しています。 たとえば、これは私が検討しているガイドラインの一部です。 既存のアイテムをターゲットに追加する場合は「追加」を使用し、新しいアイテムを作成してターゲットに追加する場合は「作成」を使用します。 既存のアイテムをターゲットから削除する場合は[削除]を使用し、アイテムを完全に削除する場合は[削除]を使用します。 AddXXXメソッドをRemoveXXXメソッドとペアリングし、CreateXXXメソッドをDeleteXXXメソッドとペアリングしますが、これらを混在させないでください。 上記のサンプルが示すように、英語の文法と単語の意味に準拠する命名方法やその他のアイテムを支援するオンライン資料を見つけたいと思います。 上記のガイダンスは、英語を母国語とする人にとって直感的かもしれませんが、私にとっては英語が私の第二言語であると私はこのようなことについて話す必要があります。
25 naming 

5
Tell Do n't AskとCommand Query Separationの選択方法
Tell Do n't Askの原則は次のとおりです。 オブジェクトに何をしたいかを伝えるよう努力する必要があります。彼らに彼らの状態についての質問をしないで、決定を下して、そして、彼らに何をすべきかを彼らに話します。 問題は、呼び出し元として、呼び出されたオブジェクトの状態に基づいて決定を下すべきではないということです。その結果、オブジェクトの状態が変更されます。実装しているロジックは、おそらく呼び出されたオブジェクトの責任であり、あなたの責任ではありません。オブジェクトの外側で決定を下すと、そのカプセル化に違反します。 「聞かないで」の簡単な例は Widget w = ...; if (w.getParent() != null) { Panel parent = w.getParent(); parent.remove(w); } tellバージョンは... Widget w = ...; w.removeFromParent(); しかし、removeFromParentメソッドからの結果を知る必要がある場合はどうでしょうか?私の最初の反応は、removeFromParentを変更して、親が削除されたかどうかを示すブール値を返すことでした。 しかし、私はこれをしないと言うコマンドクエリ分離パターンに出くわしました。 すべてのメソッドは、アクションを実行するコマンド、または呼び出し側にデータを返すクエリのいずれかである必要がありますが、両方ではないことを示しています。言い換えれば、質問をしても答えは変わらないはずです。より正式には、メソッドは参照的に透明であり、したがって副作用がない場合にのみ値を返す必要があります。 これら2つは本当に対立しているのですか?どうすれば2つを選択できますか?これについては、Pragmatic ProgrammerまたはBertrand Meyerを使用しますか?
25 java  coding 

8
既存の悪い習慣、または古いコードに適合しない良い習慣を使用する方が良いでしょうか?
既存のサードパーティ製ソフトウェアの拡張機能を作成しようとしていたため、そのデータベースは恐ろしく非正規化されていたため、これを考えていました。既存のテーブルを使用して、多数の新しいフィールドを追加する必要がありました。 デザインスタイル(1つの大きなテーブルにあるほとんどすべてのプロパティで構成される)で新しいテーブルを作成するか、新しいテーブルセットを一緒に作成し、トリガーなどの特別なものを使用して、新しいテーブルと古いテーブル。 結局、既存の貧弱なデザインスタイルを使用するという最初のオプションに行き着きましたが、この質問が残されました:既存の悪い慣行に行くのか、既存のコードにうまく合わない良い慣行を実装するのが良いのでしょうか?どちらかを選択する必要がある状況はありますか? 注:これまでの多くの答えは、悪いコードをゆっくりとリファクタリングすることに関係していますが、私はそれをすることができません。コードは私たちのものではなく、ベンダーによって頻繁に更新されます。私はそれの上にのみ構築できます。

6
プログラミング学生にとって、どのDVCS(gitまたはhg)が簡単ですか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 ちょっとした文脈:私は大学3年生です。学生は4人のチームに分かれています。ほとんどの人はWindowsで作業しています(Linuxを使用している私のような少数の人を除く)。学校のカリキュラムの一環として、まもなく本物のクライアント向けのプロジェクトに取り掛かりますが、私と別のチームは、コードを相互に共有するのにどの方法が最適か疑問に思っています。 私は3年間パートタイムで働いており、さまざまなプロジェクトでgitとmercurialの両方を使用した経験が豊富なので、どちらのシステムを使用しても問題はありません。しかし、私のチームメートは誰もバージョン管理システムを使用したことがありません。SVNを使用しようとしたが、大きな問題があり、他の何かを試してみたいと思う別のチームもいるので、彼らは私の意見を求めました。 私の考え:Mercurial + TortoiseHgはWindowsの下でより良く統合されていると聞いたことがありますが、匿名の頭の概念が説明しても混乱させるのではないかと思っています。一方で、初心者にとってはgitブランチの方が理解しやすい(各プログラマーの作業が明確に分離されている)が、Windowsではうまく機能しないことがわかりました。

4
擬似コードで:=はどういう意味ですか?
Algorithmic Implementationというタイトルのセクションには、次のコードがあります。 // Return RC low-pass filter output samples, given input samples, // time interval dt, and time constant RC function lowpass(real[0..n] x, real dt, real RC) var real[0..n] y var real α := dt / (RC + dt) y[0] := x[0] for i from 1 to n y[i] := …
25 algorithms 

7
Python 2.6または2.7または3.xを使用する必要がありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 6年前に閉鎖されました。 私が使用しているpythonのバージョンは2.6で、2.7と3.xがあります。通常、私はいくつかの些細なプログラム/スニペットにPythonを使用します。2.xと3.xには大きな違いがあることに気付きました。pythonでより大きなプロジェクトを作成する場合、どのバージョンのpythonを使用する必要がありますか? 2.7にアップグレードするか、3.xにアップグレードするか、2.6のままにする必要がありますか? 決定は次の条件に基づいて行う必要があります。 コミュニティとしてのインターネットのユーザーの数。より多くのユーザーは、より多くのオープンソースパッケージと彼らからの助けを意味します。 機能性。 公式開発チームからのサポート。 既存のモジュール/パッケージの互換性。 ありがとう!
25 python 

4
クライアントを選択するための「FizzBu​​zz」に類似したものはありますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 これはフリーランサー向けです。 フルタイムの従業員としての私の人生の中で、私は雇用に関与し、多くの開発者にインタビューしました。経験などについて話すよりも、どんなに小さな問題であっても、開発者が問題を解決するのを見るほうがはるかに価値があることを学びました。 現在、私はフリーランサー/コンサルタントとして働いています。より良いことの一つは、私がやりたいことを選択する自由です。しかし、今、数年後、私は(難しい方法で)一部のクライアントはお金の価値がないことを学びました。彼らは気まぐれで、理不尽で、要求が多く、非常に士気をくじく方法で働くのが難しい場合があります。 だから私は疑問に思っていました:クライアントを「インタビュー」するより良い方法はありますか?クライアントはおそらくテストされることを期待していないので、明らかにメソッドは微妙でなければなりません。しかし、「FizzBu​​zz」に類似したものがあり、サインオンするか、ゆっくり戻るかを教えてくれますか?

14
私は契約開発者であり、私はねじ止めしようとしていると思います[クローズ]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 8年前に閉鎖されました。 この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 私は側で契約の開発を行います。私は契約開発者だと言えますか?クライアントが1人しかいなかったことを考えると、それは正確には真実ではないと言うでしょう-私が副業をして、いくらかの余分な現金を必要としたように。「ウェブサイトを再構築し、1万ドルを支払う」タイプのプロジェクトとして始まりました。それが完了したら(スケジュールを少し超過しましたが、予算を超過していません)、会社は私を「長期サポート」請負業者として雇いました。契約は今年の3月から始まり、今年の12月31日(10か月)に期限が切れます。毎月30日に設定された金額で支払いが行われます。 私はすべての点で契約の終わりを果たしてきました-サーバーのメンテナンス、アプリケーションとデータベースの変更、大急ぎの変更、そしてそれ以上のことを行っています。現在、完成に近づいているiPhoneモバイルアプリケーション(PhoneGapベース)の開発の最中です(申請から3〜4週間後)。 桃と花だけではありません。私の給料が支払期日に来る毎月、常にある種の問題があるようです。これらの問題は、最初のプロジェクトでは発生せず、サポート契約中にのみ発生しました。実際の契約では、私の小切手を毎月30日に郵送するように定められています。定刻に1回、小切手を受け取りました(30日以内に約2〜3日)。翌月の15日、つまり2週間以上遅れて給与を受け取りました。給料が必要だから我慢しました。「次回は時間通りに発送します!私は約束します」という約束と約束がありました-来月遅くに受け取るだけです。私が支払いについて尋ねると、彼らは私に「なぜあなたはお金だけが心配なのですか?」というような雰囲気を与えます。-残念ながら私はしません お金を心配しないという贅沢があります。最後のストローは8月の支払いで、8月30日に郵送されるはずでした。9月12日に受け取りました。遅延の理由は?「USPSはそれを遅らせています!私たちは1日にそれを送りました!」私が得た理由です。私が最終的に郵便で小切手を受け取ったとき、封筒の切手は9月10日とマークされました-それは郵便切手機を通過した日付です。この時点で、私はあからさまに嘘をついてきました。封筒の切手は9月10日にマークされていました-切手機を通過した日付です。この時点で、私はあからさまに嘘をついてきました。封筒の切手は9月10日にマークされていました-切手機を通過した日付です。この時点で、私はあからさまに嘘をついてきました。 繰り返しますが、給料が必要です。アプリケーションの新しいサーバーへの移行を調整し、多くの新しい変更を開発し、iPhoneアプリの作業を継続しました。私はおそらく、1時間ごとの割り当てを超えたと言っていました(私は月に40時間支払われ、おそらく少なくとも50を入れました)。1日の土曜日、私は会社(主に3社の会社-これは大企業ではありません)の主な連絡先に指輪を渡し、過去2週間の私の仕事の状況について彼に知らせました。珍しいことに、9月中旬から彼からの連絡はありませんでした。彼の回答は「ああ...まあ、それは素晴らしいし、ええと..良い仕事だ。まあ、私たちは会社内で物事について話し合っており、私たちは確かにいくつかの決定を前に持っている...」-逐語的ではないしかし、あなたはアイデアを得る(私は願っていますか?)。 がらくた、この契約は早く終了します-クリスマスがあります!結構です、大丈夫です、問題ありません。私は最後の月の仕事の報酬を受け取り、それを一日と呼びます。残念ながら、私はまだ先月のチェックを受けていない、と私は今あちこちになっています。「ああ、資金の転送に問題がありました。明日、郵送してみます」と「財務担当者と一緒にVMを残しましたが、彼を把握できません」。だから、私は9月に投入したすべての仕事に対して支払われていない気がします。これは明らかに契約違反であり、私は怒っています。 不合理に考えて、私は彼らのすべてのパスワードを変更し、それらを人質にすることを考えました。考えてみる前に(ちなみに、これを行うつもりはありませんが、おそらくトラブルに巻き込まれる可能性があることに気づきました)、さまざまなアカウントのパスワードを試してみます。 グーグルアプリ?ああ、私はもう管理者ではありません。Godaddy?おっと、無効なパスワード。いい?いいえ、ここでも無効なパスワードです。Google Adsense / Analytics?無効なパスワード。専用サーバーアカウントマネージャーですか?無効なパスワード。 これで、サーバーのルートパスワードを入手しました。先週ボックスを作成したばかりで、ルートパスワードを送信する機会がありませんでした。急いでいなかった、私はサーバーを管理し、彼らは決してそれに触れることはありません。これで、これ以外のすべてのパスワードが突然変更されました。執筆は壁にある-私は外出している。これが難問です。 ルートパスワードを持っていますが、持っていません。このパスワードを彼らに与えると、私が持っているすべてのレバレッジは消えてしまいます。なぜ給料が支払われないのかという議論の中で、男は「ところで、サーバーのルートユーザー名とパスワードは何ですか?」というメールを送ってきます。彼はまったく何も知らないことを考慮して、私は彼に「管理者」アカウントを与えましたが、これにはほとんど権利がありません。私はまだサーバーへの排他的なアクセス権を持っています。どこに行けばいいかわかりません。 私は彼らのデータを人質にすることができますが、これは間違いだとほぼ確信しています。まだ支払いを受けているかどうかにかかわらず、私はそれを恐blackと見なします。 サーバー上の何かを「破壊」し、全体を「まあ、もしあなたが私にお金を払っていれば、それを修正することができます!」スピル。これは「彼は彼らの人質を保持していない」という観点から機能しますが、問題を解決するために他の人を雇うのを妨げるものは何ですか?私の知る限り、Forは「l33t hax0r」であり、無料で把握できます。 私はできる限り書類を提出し、彼を小さなクレーム裁判所に連れて行くことができます。これは契約違反です。私は支払いを受けていません。ケースがありますよね? ???? 誰もこれで経験がありますか?私に何ができる?私のオプションは何ですか?私は壊れて、私は弁護士を買う余裕がなく、私はこの給料をもらえないくらい余裕がある。私の妻は仕事をしていません(私は2つの仕事をしているので仕事をしなくてもいいです-私たちは1歳です)。すでに請求書をカバーするためにアルバイトを探しています。長期的には大丈夫ですが、これは私を信じられないほど怒らせています! 私を助けてください、私はねじ込まれようとしています。
25 legal 

6
データベースとユニット/統合テスト
Webアプリケーションを使用したユニット/統合テストについて誰かと話し合いをしましたが、1つのコアアイデアについて意見の相違があります。問題は、ユニットテストの対象となるデータベースにデータを事前に入力しておくべきだと考えている人が話していることであり、テストの実行前後に完全に空である必要があると思います。 データベースに事前入力されたデータに関する私の懸念は、データが良好な状態に維持されることを確認する方法がないことです。テスト自体はデータベース内のデータを作成、削除、変更するため、テストを開始する前にデータベースにデータを保持するのは良いことではありません。 データベースの機能をテストする最良の方法は、次のセットアップを行うことです。 テストを実際に実行する前の「セットアップ」フェーズでは、まずデータベース内のすべてのテーブルを切り捨てます 次に、実行しようとしているテストケースに必要なすべてのデータを挿入します 次に、テストケースを実行して検証します 次に、「ティアダウン」フェーズで、データベース内のすべてのテーブルを再度切り捨てます テスト対象のデータがテスト可能な優れたテストであることを保証する他の良い方法はありません。 ここに何かが足りませんか?これは、データベース関連の機能をテストする最良の方法ではありませんか?(テストを開始する前、またはテストが完了した後でも)データベースに常に存在するデータベースを事前に設定しておくと、メリットがありますか?私のプロセスを異なる方法で説明して、私のポイントをよりよく理解するためのアイデアの助けも素晴らしいでしょう(つまり、私のポイントにメリットがある場合)。

1
Redis vs Zookeeper
これら2つのサーバーが非常に異なるものを対象としていることを考慮して、これら2つのサーバーを比較するのはばかげているようです。しかし、考えてみると、構成データの保存、分散ロック、キューイングなど、多くの類似したことができます。 私はいくつかの生産関連のことのために使用しているRedisのインスタンスを持っていますが、サーバー間でいくつかの簡単な同期を行いたいと思います(主にコードを押し上げたりサーバー間で簡単なロックを必要としない構成変更)。Zookeeperは、Redisが提供しないことを何を提供してくれますか?

4
MVCでは、モデルが検証を処理する必要がありますか?
MVCパターンを使用するために開発したWebアプリケーションを再構築しようとしていますが、検証をモデルで処理すべきかどうかはわかりません。たとえば、次のようにモデルの1つを設定しています。 class AM_Products extends AM_Object { public function save( $new_data = array() ) { // Save code } } 最初の質問:では、saveメソッドが$ new_dataの検証関数を呼び出すべきか、データが既に検証されていると仮定するのか疑問に思っていますか? また、検証を提供する場合、データ型を定義するモデルコードの一部は次のようになると考えています。 class AM_Products extends AM_Object { protected function init() // Called by __construct in AM_Object { // This would match up to the database column `age` register_property( 'age', 'Age', …
25 architecture  mvc 

4
PrologがAIプログラミングに適しているのはなぜですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 閉じた3年前。 AIプログラミングに使用されるプログラミング言語を研究しています。私の大学ではLISPがAIプログラミング言語として教えられていることを知っていますが、Prologはめったに教えられません。私はPrologが好きですが、AIプログラマーではないので、PrologがLISP / Schemeよりも優れている理由を自分で判断する資格がないと思います。プログラマーがこのトピックについて何か意見を持っているのではないかと思っていました。 PrologがAIプログラミングにもっと役立つだろうとどのように主張できますか? 私はそれを少し研究していますが、私が何度も見てきた基本的な議論は、思考は論理で提示され、Prologは論理プログラミング言語であるため、Prologは意思決定マシンを簡単に構築できる、またはその効果があるということです。 AIのPrologについて言えることは他にありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.