【NewsPicksより】Amazonが医薬品流通を変える? Apple、Google、MSも 加熱するIT企業の医療進出
記事
内容
- 丸亀製麺を筆頭に事業拡大中のトリドールが「ライフスタイル・グローバル企業」の転換を目指している
- 技術革新の成長でめまぐるしく動く経済の中、外食産業すら失われてしまうような、予測しづらいことでさえも十分に起こる可能性はある。
- 過去の例は、アパレル産業。かつてはネットで服飾品を買うことを異端と見ていたが、今は当たり前の習慣となっている。
- そのために、「外食」にとらわれず、人のライフスタイルに寄り添い、人々の変化を敏感に感じ取れる企業にしようとしている
感想・意見
- 今はどの企業も、特定の分野だけに絞った経営は大きなリスクを伴うようになっている。
- 企業が生き残る方法として、大きく2つを考えた
- 1つ目は、この記事と同じように、特定の分野に限った市場獲得を目指すのではなく、市場動向を素早く察知し、素早く戦略を取れる企業体制にすること
- 2つ目は、自分のビジネスにテクノロジーを取り入れ、新しい動向を自分たちで生み出すこと
iframeを使って簡単に外部のHTMLを読み込む
iframe
を使ってHTMLを埋め込む軽いタスクをいくつか行ったのでまとめます。
特に技術的に難しいことではないのですが、
明らか利便性が高く
、
エンジニア以外の方でも役に立つ機会がありそうなので見ていただければと思います。
● iframeって何?🤔
- iframeとはHTML要素の一種です。
- HTMLの中に、さらに入れ子でHTML・ドキュメントなどを埋め込むことができます。
例
今回の例では、この記事の中にgoogle-slideを埋め込んでいます。
以下のように埋め込んであります。
今回の例では、この記事の中にgoogle-slideを埋め込んでいます。 <iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQup_zf4MKi0R65BBVdCS9XZmkDK2VvSQG371xeqQBI5gZd8azMmQopLJLgN3OrbslKmtueiEKh_7Bi/embed?start=false&loop=true&delayms=2000" width="960" height="360" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"> </iframe>
属性
よく使用する属性をまとめました。他にも設定できる属性はたくさんあるので、気になった方は調べてみてください。
属性 | 意味 |
---|---|
src | 埋め込むhtmlを指定 |
height | iframeの高さを変更 |
width | iframeの横幅を変更 |
target | iframe内のリンクを使用した時の動作の指定 |
● 主な用途
webページ内に外部のドキュメントや資料を埋め込む
- 業務の中では、頻繁に更新したいコンテンツに対してiframeで埋め込むように変更しました。
- iframeで埋め込むことによって、毎回アプリケーションのリリースをしなくても埋め込んだ資料の更新だけですむようにしています。
動画を埋め込む
- 例えばyoutubeも簡単に埋め込むことができます。個人で運営しているサイトや、ブログなどに利用できます。
- 例えばyoutubeも簡単に埋め込むことができます。個人で運営しているサイトや、ブログなどに利用できます。 <iframe src="//www.youtube.com/embed/F6oGPunohOA" width="560" height="315"> </iframe>
● メリット😊
- リリース不要でコンテンツの変更・更新ができます。
- 例えば、webサービスの「FAQ欄」や「最新情報欄」は、日々修正や更新が必要ですが、srcで指定されているドキュメントを変更すれば良いので、リアルタイムで修正、更新を行うことができます。
● デメリット😭
- 外部ファイルを読み込むので、時間がかかることもあります。
- SEO上不利になることがあります。
- ユーザーからはコンテンツがあるように見えますが、HTMLとしてはコンテンツが少ない(iframe要素しかない)ので、ページ自体の評価が上がりません。
● HTML5から推奨されるようになった🎉
HTML4.01までは非推奨と見なされてきました
- HTML 4.01のDTD* は以下の3種類があり、それに準じてマークアップを行う必要がありました。
- Strict(厳格なHTML)
- Transitional(過渡的なHTML)
- Frameset(フレームを使用できるHTML)
W3C* はStrictを推奨していました。一方iframeはFramesetに適用していたので、非推奨とされてきました
※DTD...Document_Type_Definition(マークアップの構成要素、指定できる属性などを定めた規則)
※W3C...World_Wide_Web_Consortium(ブラウザーやサーバーについての技術に関する標準化を推進する団体)
HTML5.0からは推奨されるようになりました
HTML5.0のDTDは1つのみで、iframeも正式にW3Cから認められ、非推奨ではなくなりました
- その代わり、サポートされない属性も増えてしまいました。
- scrolling: スクロールの表示・非表示の設定
- frameborder: iframeの境界線の表示・非表示の設定
- その代わり、サポートされない属性も増えてしまいました。
自信を持ってiframeを使えます。
まとめ
- iframeは簡単に使えることができますし、使用できそうな機会もそれなりにあると思うので、その時はぜひ使ってみてください。
- HTML5.0から正式に推奨されているので、エンジニアがコード見ても冷たい目で見られずすみますね。(見られたことはないけど)
【NewsPicksより】Amazonが医薬品流通を変える? Apple、Google、MSも 加熱するIT企業の医療進出
Form・clean()・field・creaned_dataの関係
DjangoのFormについて(clean()・cleaned_data・メソッド呼び出し順)まとめました
- is_valid()が呼ばれてからどのようにメソッドが呼ばれるか
- clean()・cleaned_dataはどこで呼び出し・生成されるか
記事を書いた理由
- Form・clean()・field・creaned_dataの関係、呼び出し順がさっぱり分からなかったから
- その問題に出会ったきっかけは以下
- 業務でDjangoのFormの改修に取り組むことがあった
- 既存のロジックでは、clean()をオーバーライドしたり、cleand_data変数をごにょごにょしていた
djangoのソースコード(記事中はDjango 2.0.1です)
※ field... Fieldのインスタンス, form... Formのインスタンス
結論
呼び出しの順番
form.is_valid()が呼ばれてから ↓
- form.errors()
- form.full_clean()
- form.cleaned_data生成
- form._clean_fields()
- field.clean()
- form.clean<field名>()
- form._clean_form()
- form.clean()
- form._post_clean()
- form.full_clean()
clean()
- field.clean()とform.clean()の二種類がある
field.clean()
- 各fieldの値に対してvalidationチェックを行う
- 返り値はfieldの値
form.clean()
- デフォルトではcleaned_dataを返すだけ
- cleaned_dataを扱えるので、各fieldを跨いだvalidationチェックが可能
- 返り値はself.cleaned_data
form.clean_<field名>()
- 各fieldの値に対してvalidationチェックを行う
- 返り値はfieldの値
form.cleaned_data
- dict型の変数
- form.full_clean()の中で生成される
- 最初は field.clean()が返した値が格納される
- form_clean_<field名>(), form.clean()などで値を扱うことができ、返した値が格納される
詳細
is_valid()
- is_valid()が呼ばれると、下記の条件でbool値を返す
- self.is_bound == True and self.errors == False
def is_valid(self): """Return True if the form has no errors, or False otherwise.""" return self.is_bound and not self.errors
self.is_bound
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=ErrorList, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None): self.is_bound = data is not None or files is not None self._errors = None
self.errors
- propertyデコレータによってerrors()が実行される
- self._errorsを参照し、Noneでなければis_valid() == False となる
- form.full_clean()を呼び出す
@property def errors(self): """Return an ErrorDict for the data provided for the form.""" if self._errors is None: self.form.full_clean() return self._errors
今回の記事のポイント↓↓
- errors()の内部でform.full_clean()が呼ばれており、その中でclean()やcreaned_dataが扱われる
form.full_clean()
- dict型のself.clearned_dataが生成される
form.full_clean()の中では以下の3つのメソッドが呼び出される
- _clean_fields()
- _clean_form()
- _post_clean()
上記メソッドの中でvalidationチェックを行い、各メソッドの条件によってValidationErrorを発生させる
def full_clean(self): """ Clean all of self.data and populate self._errors and self.cleaned_data. """ self._errors = ErrorDict() if not self.is_bound: # Stop further processing. return self.cleaned_data = {} # If the form is permitted to be empty, and none of the form data has # changed from the initial data, short circuit any validation. if self.empty_permitted and not self.has_changed(): return self._clean_fields() self._clean_form() self._post_clean()
3つのメソッドを見ていきましょう
_clean_fields()
- 各fieldに対してfield.clean()が呼び出される
- field.clean()が返した値がcleaned_dataに格納される
- form.clean_<field_name>()があった場合は呼び出し、返した値でcleaned_dataを上書く
def _clean_fields(self): for name, field in self.fields.items(): # value_from_datadict() gets the data from the data dictionaries. # Each widget type knows how to retrieve its own data, because some # widgets split data over several HTML fields. if field.disabled: value = self.get_initial_for_field(field, name) else: value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) try: if isinstance(field, FileField): initial = self.get_initial_for_field(field, name) value = field.clean(value, initial) else: value = field.clean(value) self.cleaned_data[name] = value if hasattr(self, 'clean_%s' % name): value = getattr(self, 'clean_%s' % name)() self.cleaned_data[name] = value except ValidationError as e: self.add_error(name, e)
Fieldのclean()
- validate()によってrequiredのvalidationチェックのみ行われる
- run_validators()によって、他のvalidationチェック(max, min...)が行われる
def clean(self, value): """ Validate the given value and return its "cleaned" value as an appropriate Python object. Raise ValidationError for any errors. """ value = self.to_python(value) self.validate(value) self.run_validators(value) return value
ValidationErrorが発生する条件
- データの型がfield指定の型と異なっている場合
- field.clean()でエラーを吐いた場合
- clean_<field_name>でエラーが吐かれている場合
_clean_form()
- form.clean()が呼び出される
- clean()はデフォルトではcleaned_dataを返すだけですが、ここでオーバーライドしてカスタマイズすることがある
def clean(self): """ Hook for doing any extra form-wide cleaning after Field.clean() has been called on every field. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field named '__all__'. """ return self.cleaned_data .... def _clean_form(self): try: cleaned_data = self.clean() except ValidationError as e: self.add_error(None, e) else: if cleaned_data is not None: self.cleaned_data = cleaned_data
ValidationErrorが発生する条件
- form.clean()でエラーを吐く場合
_post_clean()
- Formのインスタンスメソッドとしては何も行わない
- BaseModelForm(BaseForm)でオーバーライドされており、validationチェックが行われる
def _post_clean(self): """ An internal hook for performing additional cleaning after form cleaning is complete. Used for model validation in model forms. """ pass
最後に
- どこにvalidationを置くのがベストか考えたい
- プロジェクトのアーキテクチャに沿う
- validationの存在目的の整理
読んでいただきありがとうございました。
(要リライト)
【NewsPicksより】フェイスブック株価急落、表示方針の大転換で利用時間の減少見通す
【NewsPicksより】モスバーガーが「創業以来2度目の絶不調」に苦しむ致命的な原因
記事
内容
- モスバーガーが創業以来二度目の不調(純利益減少)に苦しんでいる
原因
- デフレによるフランチャイズ店の後退
- 「健康志向」向けのファーストフード店の日本進出(黒船バーガー)
- コンビニの拡大による、消費者行動の変化
感想・意見
利益減少の理由は「モスバーガーというブランドイメージが薄れている」こと
マクドナルドのを不況を見ると
- そもそもマクドナルドは「高品質」「健康志向」を目指してはいないので、よく言ってしまえば衛生問題などはあまりブランドイメージに響来ませんでした。なのでV時回復を成し遂げることができた要因でもあるだろう。
モスバーガーがこれから新たなブランドイメージを確立させるには、大きな時間もしくは斬新的な商品、ビジネス戦略が必要になる。
2018年の目標
あけましておめでとうございます!!!
2018年の目標を立てました。
「年始に立てる目標なんてすぐに忘れる」「節目に立てた目標ほど達成されない」などという意見もありますが、
目標立てずにダラダラするより、たとえ1つでもいいから達成して自分の自信になればと思っていたので立てました!
目標を立てる上で工夫したこと
- 期間ごとに小さな目標も立てて、習慣化することにした
- そのうちいくつかは年内の目標達成にも繋がっています
- 習慣化するものは、去年からの継続が多く、新しいことは少なめ
- 年始の意気込みだけで終わらないようにするためです
- 新しいことが浮かんだら、その日からやっていこうと思ってます
目標
毎日すること
- 朝に下記のいずれかを行う
- ジムに通う
- 去年から継続(B-monster)
- メモ書きをする(0秒思考)
- 去年から継続(去年はかなり頻度は少なかった)
- 瞑想をする
- 10分でもいいので続ける
- ジムに通う
週に1回は行うこと
- newspicksの記事を読んでコメントする
- 普段は技術系のことばかり見ているので、他の情報も得るため
- ブログを更新する
- ブログの内容はなんでもいいが、振り返りやアウトプットの意味も込めて
- 過去記事はただのメモになってるので、もう少し読みやすい記事も増やす
年内に行うこと
- 受託案件を受ける
- 経験としても1回受けるかどうかで大きな違いがあると思う
- 体脂肪を6%落とす
- 去年は体脂肪を5%落とした(そこから正月太りで2%増えた)ので、継続していく
- ポートフォリオサイトを作る
- もう作っている・作りたい友人がいるので、一緒にやるのもあり
技術面(仕事で使っているのも多々、さらに理解を深める)
2018年もよろしくお願いします(^ ^)