いわむぶろぐ

Webエンジニア@スタートアップ@のんびり綴ってます。

【NewsPicksより】Amazonが医薬品流通を変える? Apple、Google、MSも 加熱するIT企業の医療進出

記事

newspicks.com

内容

  • 丸亀製麺を筆頭に事業拡大中のトリドールが「ライフスタイル・グローバル企業」の転換を目指している
  • 技術革新の成長でめまぐるしく動く経済の中、外食産業すら失われてしまうような、予測しづらいことでさえも十分に起こる可能性はある。
    • 過去の例は、アパレル産業。かつてはネットで服飾品を買うことを異端と見ていたが、今は当たり前の習慣となっている。
    • そのために、「外食」にとらわれず、人のライフスタイルに寄り添い、人々の変化を敏感に感じ取れる企業にしようとしている

感想・意見

  • 今はどの企業も、特定の分野だけに絞った経営は大きなリスクを伴うようになっている。
  • 企業が生き残る方法として、大きく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からは推奨されるようになりました

まとめ

  • iframeは簡単に使えることができますし、使用できそうな機会もそれなりにあると思うので、その時はぜひ使ってみてください。
  • HTML5.0から正式に推奨されているので、エンジニアがコード見ても冷たい目で見られずすみますね。(見られたことはないけど)

【NewsPicksより】Amazonが医薬品流通を変える? Apple、Google、MSも 加熱するIT企業の医療進出

記事

newspicks.com

内容

  • Amazon, Alphabet, Apple, Microsoftそれぞれが、医療分野市場開拓に乗り出している
  • Amazon: 医薬品販売と既存のアマゾンサービスの連携による医薬品供給事業への進出
    • 中間業者を省いた流通モデルによって収益増加
    • プライムナウとの連携
  • Alphabet: 「寿命の延長」を目的とした手術用ロボットの開発、極秘プロジェクトのGoogle X
  • Apple: 医療アプリの占有、健康管理アプリや、診断・検査アプリも視野に入れている
  • Microsoft: AIを組み合わせた医療技術の開発、医療用チャットボット

感想・意見

  • どの分野もテクノロジーと組み合わせることによって、大きな武器となっている。
  • アマゾンの既存の武器である流通との組み合わせ、Appleのアプリとの組み合わせなど、既存の武器と組み合わせるビジネスモデルも生えるだろう。
  • googlemicrosoftは、AI、機械学習を利用した医療機器の開発という面では、少し市場が被っている気がするが、特にGoogle Xなど、極秘で進んでいるプロジェクトの今後の動向に期待だ。

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です)

github.com

※ 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()

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

  • インスタンス生成時にコンストラクタによってis_bound変数が生成される
    • dataもしくはfileがNoneではないかどうかが判断される
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を置くのがベストか考えたい

読んでいただきありがとうございました。

(要リライト)

【NewsPicksより】フェイスブック株価急落、表示方針の大転換で利用時間の減少見通す

記事

newspicks.com

内容

  • Facebookは、アプリ内でニュース記事よりも友人や家族の投稿を増やすようにした。
  • Facebook自身が「Facebookで過ごす時間は減るが、Facebookの時間が有意義なものになる」と発表
    • その影響を受け、一時的に株価が急落している

感想・意見

今回この記事をみて、facebookは、今回の方針転換は、CSRとシェア拡大の両方を狙って施行した戦略だと考えた。

  • ネット社会が普及し、人々はネットに夢中になり、オフライン上の大切な繋がりを疎かにしていることを世間の一部は危惧している。その問題点の改善として、SNSシェアトップを誇る企業としてこのような方針を定めた。
  • また、このCSR活動のさらなる思惑として、オフライン上の大切な繋がりを、SNSを通じてさらに深まるようにし、結果的にSNS依存を深め、シェア拡大を考えてとった戦略である。

【NewsPicksより】モスバーガーが「創業以来2度目の絶不調」に苦しむ致命的な原因

記事

newspicks.com

内容

  • モスバーガーが創業以来二度目の不調(純利益減少)に苦しんでいる

原因

感想・意見

利益減少の理由は「モスバーガーというブランドイメージが薄れている」こと

  • モスバーガーといえば「健康志向」「少し高価・高品質」が売りでしたが、今となってはモスバーガーよりも健康志向な、またはモスバーガーよりも高価なファーストフード店は存在し、消費者にも認知されているから。

マクドナルドのを不況を見ると

  • そもそもマクドナルドは「高品質」「健康志向」を目指してはいないので、よく言ってしまえば衛生問題などはあまりブランドイメージに響来ませんでした。なのでV時回復を成し遂げることができた要因でもあるだろう。

モスバーガーがこれから新たなブランドイメージを確立させるには、大きな時間もしくは斬新的な商品、ビジネス戦略が必要になる。

2018年の目標

あけましておめでとうございます!!!

 

2018年の目標を立てました。

「年始に立てる目標なんてすぐに忘れる」「節目に立てた目標ほど達成されない」などという意見もありますが、

目標立てずにダラダラするより、たとえ1つでもいいから達成して自分の自信になればと思っていたので立てました!

目標を立てる上で工夫したこと

  • 期間ごとに小さな目標も立てて、習慣化することにした
    • そのうちいくつかは年内の目標達成にも繋がっています
  • 習慣化するものは、去年からの継続が多く、新しいことは少なめ
    • 年始の意気込みだけで終わらないようにするためです
    • 新しいことが浮かんだら、その日からやっていこうと思ってます

目標

毎日すること

  • 朝に下記のいずれかを行う
    • ジムに通う
      • 去年から継続(B-monster)
    • メモ書きをする(0秒思考)
      • 去年から継続(去年はかなり頻度は少なかった)
    • 瞑想をする
      • 10分でもいいので続ける

週に1回は行うこと

  • newspicksの記事を読んでコメントする
    • 普段は技術系のことばかり見ているので、他の情報も得るため
  • ブログを更新する
    • ブログの内容はなんでもいいが、振り返りやアウトプットの意味も込めて
    • 過去記事はただのメモになってるので、もう少し読みやすい記事も増やす

年内に行うこと

  • 受託案件を受ける
    • 経験としても1回受けるかどうかで大きな違いがあると思う
  • 体脂肪を6%落とす
    • 去年は体脂肪を5%落とした(そこから正月太りで2%増えた)ので、継続していく
  • ポートフォリオサイトを作る
    • もう作っている・作りたい友人がいるので、一緒にやるのもあり

技術面(仕事で使っているのも多々、さらに理解を深める)

2018年もよろしくお願いします(^ ^)