- 投稿日:2019-06-07T22:25:25+09:00
VSCodeでHTML/CSSファイルを編集しながらリアルタイムでプレビューする方法
はじめに
未来電子テクノロジーでインターンをしているにのみやです。
この記事では、一からwebページを作ってみる際に、「絵を描くように、ファイルを編集しながらプレビューしたい」と思って調べてみたことをまとめてみました。
プログラミングを始めて二週間ほどなので、間違いも多いと思います。
間違いがあれば、ぜひ教えてください。STEP1 Live Serverをインストールする
Live Serverにアクセスしてインストールします。
STEP2 セッティングする
1.VSCode左上、ファイル内の自動保存を有効にします。
3.プレビューしたいHTMLファイル上で右クリックし、「Open in browser」をクリックします。
するとブラウザが開き、プレビューできるようになるので、画面分割モードなどにすることで編集しながらリアルタイムでプレビューできます。
※画像ではわかりにくいですが、HTML/CSSファイルを編集して一秒くらいするとブラウザで変更が反映されます。おわりに
ざっと説明しましたが、「わかりにくい!」や「間違えている!」などのご意見がありましたらぜひ教えてください。
- 投稿日:2019-06-07T22:09:30+09:00
JavaScriptによる共通HTMLの挿入
JQueryを使わずにheader・footerなどの共通のHTML文をJavaScriptで挿入する方法です。
といっても、innerHTMLで挿入するだけなんですけどね・・・HTML
index.html<!DOCTYPE html> <html> <head> <title>innerTest</title> <script type="text/javascript"> function header(){ var h = document.getElementById("header"); h.innerHTML = "HelloWorld"; } </script> </head> <body> <div id="header"></div> <script type="text/javascript">header();</script> </body> </html>
- 投稿日:2019-06-07T21:02:50+09:00
FlaskとFirebaseで団体名簿のwebアプリを作った
初めてまともにWebアプリを作ったから知見をまとめる
各リンク
- Flask関連
- Flask-login関連
- Flask-Bootstrap関連
- Firebase関連
- heroku関連
やったこと
- flaskのwebページ
- Firebaseに個人データを顔写真を格納
- Flask-bootstrapを使ってレスポンシブ対応
- Flask-Loginを使ってサイトの保護
学んだこと
- firebaseとpython間でのデータの送受信
- flask-bootstrapを使ったhtml表記
- herokuでアップロード
感想
- 勉強用でherokuを使ったが、普通にAWS or GCPを使うべきだった(個人アカウントを作りたくなかったから致し方無い)
- Flask-Loginが何度もログイン要請をしてくる訳が分からない。
- バイトはデータ系なのでPython(Flask)で書いたが、JSとかGO言語とかを勉強したほうがよさそうだなと思った。
- 投稿日:2019-06-07T21:01:16+09:00
Flask基本 色々まとめておく
友人に頼まれ、先日初めてWebアプリを作ったので色々勉強したことをまとめておこうと思った。
バイトでpythonを使っている関係でFlaskで書いた。
Flaskの開発者はAprilフールの冗談でこのフレームワークを発案したらしいが、それを見た人が熱狂して結局作ったらしい。そんな細かい知識は面倒なので割愛して、いろいろまとめておく。Flask基本
app.pyfrom flask import Flask import os app = Flask(__name__) app.config = os.urandom(24) @app.route('/') def index(): return 'Hello World' @app.route('/flask') def home(): return 'Hello Flask' if __name__ == '__main__': app.run(host='127.0.0.1', port=5000, debug=True)マイクロフレームワークであるFlaskの中でも最も簡単なコードだと思われる。
ざっくり説明すると、変数appにFlaskクラスのオブジェクトを入れている。
configは一応設定用で書いたがこの場合必ずしも必要ではない。@app.route('/')は、ルーティングを意味していて、つまりページのurlを示している。
この場合だと、http://127.0.0.1:5000 を開くと Hello Worldと返ってくるし、
http://127.0.0.1:5000/flask を開くと Hello Flaskと返ってくる。app.run()でアプリがローカル上で立ち上がる仕組みになっている。
Flaskのディレクトリ構成
よくあるのが
app.py
ー application
ー /config.py
ー /view.py
ー /model.py
ー /templates
ーー/layout.html
ーー/home.html
ー /static
ーー/style.cssみたいな感じ。
app.pyだけだと膨大なコードになって、不便なのでこんな感じで分けている。
app.pyfrom application.view import app if __name__ == '__main__': app.run(host='127.0.0.1', port=5000, debug=True)applicationの中のviewからappを持ってくる。
config.pyfrom flask import Flask import os app = Flask(__name) app.config = os.urandom(24)configはこういう設定系を置いておく
view.pyfrom .config import app @app.route('/') def index(): return 'Hello World' @app.route('/flask') def home(): return 'Hello Flask'viewは主にルーティングの処理とかを書く
因みにmodel.pyはクラスを書くことが多い。
templatesとJinja2
HTMLファイルを読み込むために、view.pyを書き換える。
view.pyfrom .config import app from flask import render_template @app.route('/') def index(): return render_template('layout.html') @app.route('/flask') def home(): return render_template('home.html')これで、layout.htmlとhome.htmlをそれぞれ読み込める
HTMLファイルを入れておくのがtemplatesディレクトリになる
layout.html<h1>Hello World</h1> {% block body %}{% endblock %}home.html{% extends "layout.html" %} {% block body %} <h2>Hello Flask</h2> {% endblock %}見ていただければ分かると思うが、layout.htmlの中に
{% block body %} {% endblock %}
とあり、home.htmlにも同様なものがある。これがJinja2であり、{% extends "layout.html" %}
によって、home.htmlはlayout.htmlからHello Worldを継承することができる。model.pyについては、Flask_loginのページで書く。
- 投稿日:2019-06-07T20:05:08+09:00
WKWebViewでローカルのindex.htmlを読み込んでscriptを実行してみた
ネットを介してのWebView表示ではなく、手元にあるHTMLをWebViewで表示、scriptタグ内のJSメソッドの呼び出し方法をまとめます。
SwiftでWebViewを表示させる場合、WKWebViewを使うことがほとんどだと思います。現在ではUIWebViewは非推奨です。そちらについては以下の記事がとても参考になります。
[参考元]:UIWebViewを使わない理由とWKWebViewを使う理由環境
OS: Mojave 10.14.5
Xcode: 10.1
Swift 4.2HTML
今回はindex.htmlをWKWebViewでロードし、
<script>
タグ内にあるJSメソッドを呼び出すことをします。
HTMLファイルはプロジェクト内に置きます。置き場は自由で構わないのですが、例として以下のように配置しておきます。例project ├─Resource │ ├index.html │ └sample.json │ └─View └SomeViewControllerHTMLのロード
ローカルのHTMLファイルはパスを取得する必要があり、取得には
Bundle.main.path
を使用します。
仕様ではBundle.main.path
はプロジェクトのBuild Setting
>Copy Bundle Resources
にあるファイルを取得するようです。
まずこの項目を確認し、取得したいHTMLファイルがなければ追加しておきましょう。[参考元]:Swiftでプロジェクト内のファイルを取得する際の注意点2つ
HTMLファイルのパスをURL型にキャストしてWebViewの
loadFileURL
の引数に与えます。これでWebViewにロードできました。func loadLocalHTML() { guard let path: String = Bundle.main.path(forResource: "index", ofType: "html") else { return } let localHTMLUrl = URL(fileURLWithPath: path, isDirectory: false) webView.loadFileURL(localHTMLUrl, allowingReadAccessTo: localHTMLUrl) }Swift側からscript内のjsを実行
実行タイミング
<script>
タグにあるメソッドは、HTML全てがロードし終わってから呼び出さないとメソッド呼び出しに失敗します。
ロードが終わったことを通知するdelegateがWKNavigationDelegate
にあります。delegateの通知先は自分であることの宣言を忘れずに。
SomeViewContollerwebView.navigationDelegate = selfSomeViewControllerextension SomeViewController: WKNavigationDelegate { func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { // ここでJSの実行をする } }JSの実行
evaluateJavaScript
を使います。引数のjavaScriptString
に、実行するメソッドをString
で渡します。
また、ここのString
ではjsの文法で書く必要があります。jsの知見が乏しい筆者はここで躓きました。[公式リファレンス]:evaluateJavaScript(_:completionHandler:)
<script>
の中身は以下のようなものと仮定して、initHTML関数に引数を渡し実行する方法を解説します。<script> function initHTML(id, jsonData, onload) { console.log('initHTMLだお'); console.log(id, jsonData); onload(); } </script>引数
Swiftは静的型付け、JSは動的型付けなので、ゆるい方向への値渡しです。
initHTMLの引数(id, jsonData, onload)は、Swift側ではそれぞれInt,Json,関数として渡します。基本は文字列リテラル内での値の展開
\()
を使います。
Jsonに関しては、Jsonファイルを読み取ってData
->String
に変換して、値展開で渡しています。Stringで渡してもWebView側でJsonとして扱ってくれます。
関数はjsの書き方であるアロー関数を用いて書きましょう。extension SomeViewController: WKNavigationDelegate { func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { let intValue = 10 guard let json = getLocalJson() else { return } guard let strJson = String(data: json, encoding: .utf8) else { return } let script = "initHTML(\(intValue), \(strJson), () => { console.log('Swiftから渡された値だお') });" webView.evaluateJavaScript(script) { object, error in print(error ?? "成功") } } func getLocalJson() -> Data? { guard let path = Bundle.main.path(forResource: "sample", ofType: "json") else { return nil } let url = URL(fileURLWithPath: path) let json: Data? do { json = try Data(contentsOf: url) } catch { json = nil } return json } }コンソールの確認
JSの実行ができたらコンソールを確認しましょう。
しかしWebViewで実行したJSコンソールログはXcodeでは見れません。
ブラウザであるSafari
で見ることができます。開発
->端末名
->index.js
と選択するとWebインスペクターが開きます。呼び出しがうまくいってログが出力されています!
表示がない場合は左上らへんにある更新マークを押しましょう。次回
WebViewのJS内でprojectのソース(画像とか)にアクセスしたときに発生するエラー、
Orijin null is not byAccess-Control-Allow-Origin
編に続く...WWDC19あとがき
SwiftUIめっちゃすごい。iOSのUI回りに激震が走りましたね。
ここまでUIの作成ハードルが下がると我々iOSエンジニアの価値が相対的に下がっていくのでは…
Combine frameworkの登場により、Rxライブラリは今後必要なくなるのかな。ただObserverパターンの考え方は必要なのでここはそれなりにハードルは依然高そう。参考
- 投稿日:2019-06-07T16:07:32+09:00
IEでformタグ内にtemplateタグを使う方法
概要
IEは<template>に対応していないため,<form>内に<input>を持つような<template>を配置してしまうと<template>内まで送信されてしまうことを回避する方法を紹介します.
状況
<form> <input type="text" id="input1"> <template> <input type="text" id="input[_new]"> </template> </form>この場合,IEでは<template>以下の<input type="text" id="input[_new]">まで送信されてしまいます.
回避方法
templateタグにdisabled属性を与える.
理由
IEでは,親タグがdisabled属性を持つと,disabled属性が子のタグまで伝搬する仕様を利用した手法です.
例えば<div> <input type="text" value="input1"> <input type="text" value="input2" disabled> </div> <div disabled> <input type="text" value="input3"> <input type="text" value="input4" disabled> </div>のようなHTMLを書くと,Chromeなどでは
と,自身のdisabled属性の有無で判定されますが,IEでは
と,親タグのdisabled属性が伝搬してしまいます.したがって<template>にdisabled属性を与えれば,<template>以下の要素はすべて送信されなくなります.
まとめ
IEでも動く<form>内に<template>を置く方法を紹介しました.
この方法を用いると,<input>にrequired属性を加えていても動作するようになります.
しかし,この方法はIEの特殊な仕様を用いているため,注意が必要です.
そもそもIEが<template>に対応していればよいのですが...