スキップしてメイン コンテンツに移動

投稿

12月, 2018の投稿を表示しています

「CMS.js」を使って簡単にSPAなブログを公開する【完全無料】

「CMS.js」を使って簡単にSPAなブログを公開する【完全無料】誰でも簡単にSPAのブログを始められるライブラリ「CMS.js」を使って、手間なくブログ運用が出来る環境を作ってみます。※SPA … Single Page Application用意するもの自分のGitHubアカウントStackEdit (Markdownエディタ)「CMS.js」って何?Markdownで書いた記事を、JavaScriptだけで簡単に公開できるCMSツールです。PHPなどのサーバーサイド・スクリプトが不要のため、ほとんどのWEBホスティング環境で使えるという特徴があります。
また、公開先をGitHub Pagesにすると、WEBサーバまで不要になり、まさに完全無料でブログを作る事ができます。
その反面、HTMLの読み込みをJavaScriptで行なっている為、サーバーサイド・レンダリングに比べ、SEQ対策に弱いのが弱点です。ブログ公開環境の構築さっそく、「CMS.js」を使って、ブログを作っていきましょう。
「CMS.js」は、自前で用意したWEBサーバ上でも、ブログを公開する事もできますが、今回はGitHub Pages上で公開できるよう、設定します。テンプレートのコピー「CMS.js」では、基本のテンプレートがGitHub上で公開されています。
まず、そこから自分のGigHugリポジトリにテンプレートをコピーします。cms.js-starter画面右上の[Fork]をクリックして、テンプレートをコピーします。
設定ファイルの編集[Fork]すると、自分のGitHubリポジトリに、「cms.js-starter」のリポジトリ名でテンプレートがコピーされます。
コピーしたテンプレートの、設定ファイルを編集していきましょう。ブランチを「gh-pages」に切り替えます。「js」フォルダ内の、「config.js」というファイルをクリックします。コードが表示されるので、右上の鉛筆アイコンをクリックします。赤枠の設定箇所を、初期値から変更していきます。変更した設定を保存します。画面の下の方までスクロールすると、[Commit changes]というボタンがあるので、それをクリックして変更内容を保存します。設定が反映されるまで、少し時間がかかる為、1分ほど待ってから「https://<…

Markdownのテーブルを整形するWebツール

Markdownのテーブルを整形するWebツール セルの横幅が不揃で見にくい、Markdownのテーブルに... | 商品 | 説明 | |--|--| | Mac Book | 超薄いノートPC | | iPad | タブレット | | GOOGLE PIXEL XL 5.5 | 高性能スマホ | ガシッとスペースをいれて、揃えるWebツールです。 | 商品 | 説明 | |---------------------|--------------| | Mac Book | 超薄いノートPC | | iPad | タブレット | | GOOGLE PIXEL XL 5.5 | 高性能スマホ | 変換

[Python] urllibでトレースログを出力する

[Python] urllibでトレースログを出力するPython標準のurllibで、トレースログを確認する方法です。
送受信したデータの、HTTPヘッダの内容を確認する時に便利です。wiresharkでは難しい、HTTPS通信のログも簡単に確認できます。トレースログを出力するサンプルコード以下のサンプルコードで、「トレースログ出力用の設定」となっている箇所を、アプリ起動時に1回だけ通します。
それ以外は、通常のurllibの使い方と同じです。import urllib.request import urllib.parse import http.client #トレースログ出力用の設定 (ここから) http_logger = urllib.request.HTTPHandler(debuglevel=1) opener = urllib.request.build_opener( urllib.request.HTTPHandler(debuglevel=1), urllib.request.HTTPSHandler(debuglevel=1)) urllib.request.install_opener(opener)#トレースログ出力用の設定 (ここまで)#あとは、通常のurllibの使い方と同じ data = urllib.parse.urlencode({'form_param':'value'}).encode('utf-8') request = urllib.request.Request('https://www.example.com', data) response = urllib.request.urlopen(request) html = response.read()上のサンプルを実行してみると、コンソールに送受信したHTTPヘッダの内容が表示されています。send: b'POST / HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 16\r\nHost: www.exam…

[Python] JSONをXPath風に操作するJSONPath

[Python] JSONをXPath風に操作するJSONPath最近ではすっかり、XMLよりJSON形式のAPIが多いですね。
そこで、JSONでもXPATHのように、クエリ形式で要素を検索したいと思い、 jsonpath-ngというよさげなライブラリを見つけたので、それを紹介したいと思います。インストール$ pip install --upgrade jsonpath-ng さっそく試してみるリストの下の要素を検索する例です。from jsonpath_ng import jsonpath, parse # 実験用のJSONデータ(dict) json ={'foo':[{'baz':1},{'baz':2}]}# fooリスト以下のbaz要素を検索 jsonpath_expr = parse('foo[*].baz') matches = jsonpath_expr.find(json)# 結果を表示print([match.value for match in matches])#-> [1, 2]JSONPathの構文単一要素の表現構文意味$ルート要素field要素の指定*任意の要素親子関係の表現構文意味parent.child"parent"の下の"child"を検索parent.*"parent"の全ての子要素parent.[child1, child2]"parent"の下の"child1"又は"child2"を検索parent..grandchild"parent"の子孫要素から"grandchild"を検索配列要素の表現構文意味field[idx]リストのインデックス指定field[start:end]インデックスを範囲指定field[*]リストの全インデックス条件式"price"が、300円以上の本を検索する例from jsonpath_ng.ext import parse json ={'books':[{'name':"おしゃれクッキング&quo…

[SQLAlchemy] one()とfirst()の違いって何?

[SQLAlchemy] one() / first()の違いと使い分けPythonのSQLAlchemyで、1件のレコードを取得する関数に、one()とfirst()関数の2つがある。
この2つの関数の違いが気になったので、まとめます。
関数の説明と、その使い分け方についても、解説したいと思います。one()とfirst()の違いクエリの検索レコード数によって、以下の通り挙動が変わります。
また、one_or_none() という関数もあったので、これも表にまとめました。検索結果one()関数one_or_none()first()関数0件NoResultFoundエラー発生NoneNone1件1件を返す1件を返す1件を返す2件以上NoResultFoundエラー発生NoResultFoundエラー発生先頭1件を返す一目瞭然ですが、one()関数は、検索結果が1件以外の時、one_or_none()関数は、結果が2件以上ある時、sqlalchemy.orm.exc.NoResultFoundエラーが発生します。どう使い分けるか?違いは分かりました。
では、どう使い分けるのだろうか?
明確な決まりはありませんが、およそ以下のような使い分けになると思います。one() / one_or_none()必ず1件、データが取れる仕様であれば、one()を使うべきです。こういった所の場合、下手にfirst()を使ってしまうと、仕様と異なるデータが取れたにも関わらず、後続処理が動いてしまい、データがぶっ壊れるなど、最悪の自体に陥ってしまう場合があるからです。いっそのこと、エラーでアプリを異常終了させた方がマシなので、勇気を持って one()を使いましょう。結果が1件又は0件になる時は、one_or_none() を使いましょう。first()one() の時とは逆に、仕様上 0件または、2件以上データが取れる可能性がある所は、first()を使いましょう。
first()を使う時は、以下の2点はしっかり確認しましょう。0件の時、Noneが返るが、Noneの時の処理が正しく行えているか?2件以上取れる時、ソート条件を指定して、処理すべき先頭1件を取得しているか?関連記事■ MacにPython3をインストールする! (サクッとインストールしたい人向け)Mac環境に、Pytho…

WPF/Windows Forms/WinUI がついにオープンソース化しgithubに公開されました

WPF/Windows Forms/WinUI がついにオープンソース化しgithubに公開されましたMicrosoftは12月4日(現地時間)、開発者向けイベントで、WPF、Windows Forms, Windows UI をオープンソース化してGitHubで公開したことを発表しました。私としては、UI系のフレームワークがオープンソース化されたのは、とても嬉しいです。
これまで、中のソースが見れない為に、思い通りの画面の動きにならず、詰まってしまった事もあったので、こういう時に非常に役に立ちそうです。それに、業務系システムのアプリ基盤的をよく作るのですが、.NET系のソースコードは、見ているだけで勉強になり、仕事に活かせます。※これまでも、「Reference Source」でソースコードの公開は行われていましたが、今回公開されたのは、.NET Coreに対応したバージョンとなっています。公開先のURLソースコードが公開されている、githubのリンクを貼っておきます。WPFhttps://github.com/dotnet/wpfWindows Formshttps://github.com/dotnet/winformsWinUIhttps://github.com/Microsoft/microsoft-ui-xaml

SQLAlchemyで最小値/最大値を取得する (MAX/MIN関数)[Python]

SQLAlchemyで最小値/最大値を取得する (MAX/MIN関数)[Python]Python + SQLAlchemyで、最小値/最大値を求める方法です。データベースを使うアプリであれば、大体どこかで最小値/最大値などの集計関数を使うシーンがあると思います。
SQLAlchemyでは、簡単な実装で出来るようになっているので、その方法を紹介します。サンプルコード全ユーザの、年齢の最大/最小値を求める例です。from sqlalchemy.sql import func res = db.session.query( func.max(User.Age).label("max_age"),\ func.min(User.Age).label("min_age")).\ filter(User.City=="Tokyo").\ one()max= res.max_age min= res.min_age print("max=%s min=%s"%(max,min))条件を指定したい場合は、いつものようにfilter関数を使って対象データを絞り込みます。
以下のサンプルは、東京に住むユーザに絞って、最大/最小値を求めています。res = db.session.query( func.max(User.Age).label("max_age"),\ func.min(User.Age).label("min_age")).\ filter(User.City=="Tokyo").\ one()関連記事■ MacにPython3をインストールする! (サクッとインストールしたい人向け)Mac環境に、Python3を簡単にインストールする方法を紹介しています。■ Python3入門! 基礎をおさらい (変数/演算子/条件分岐/繰り返し)1つの記事に、基本文法をまとめて書いているので、時間が空いて忘れてしまった場合でも、一気に復習出来るようになっています。よければ見てください。■ Flaskでソースの変更を検知して、Webアプリを自動リロードする[Python Tips]Flaskの開発で、ソースを…

[Python]型名を文字列で取得する

[Python]型名を文字列で取得する型名を文字列 (str) で取る方法です。
前談として、Pythonでの型の取得・判定は、下のように書きます。val =1type(val)#-> <class 'int'>iftype(val)isint:print("valの型はintです")ただし、type()関数の戻り値は、Type型のクラスになる為、文字列で型の名前を取得する場合は、下のように書くと取れます。type(val).__name__ #-> 'int'関連記事■ MacにPython3をインストールする! (サクッとインストールしたい人向け)Mac環境に、Python3を簡単にインストールする方法を紹介しています。■ Python3入門! 基礎をおさらい (変数/演算子/条件分岐/繰り返し)1つの記事に、基本文法をまとめて書いているので、時間が空いて忘れてしまった場合でも、一気に復習出来るようになっています。よければ見てください。■ Flaskでソースの変更を検知して、Webアプリを自動リロードする[Python Tips]Flaskの開発で、ソースを更新したら、自動的にWebアプリをリロードする方法です。■ Flaskで REST API開発する! 直ぐに実行できるサンプルコードで解説 【Python Tips】Pythonの軽量Webフレームワークである、FlaskでREST APIを作るまでの流れを、紹介します。■ Flask-RESTful を使って、REST APIを作る【Python Tips】Flaskと、Flask-RESTfulを使って、REST APIを作ります。
Flask-RESTfulを使うと、オブジェクト思考な感じで、REST APIが作れます。■ Pythonで小数点の四捨五入/切り捨て/切り上げを行うPythonのdecimalモジュールを使って、小数点の丸めを行う方法です。■ pipコマンドまとめ! 忘れても思い出せばいい! 【Python TIPS】よく使うpipコマンドをまとめました。■ Pythonで正規表現を使って数値/英字チェックを実装する (コピペ用)数値/半角英字などのチェック処理を、Pythonの正規表現を使って実装します。

HTTP REST APIでAzure IoT Hubにメッセージを送信する (C#)

HTTP REST APIでAzure IoT Hubにメッセージを送信する (C#)Azure IoT Hubに、HTTP REST APIでメッセージを送る方法です。
Azure IoT Device Client SDKは使いません。HTTP RESTでメッセージを送信するまでの流れは、こんな感じになります。デバイスの登録 (Azureポータルで作業)SASトークンの作成 (C#)RESTでメッセージを送信 (C#)やってみるデバイスの登録Azureポータルで、メッセージを送信するデバイスを登録します。Iot Hubのページから、[IoT devices] -> [Add]を選択
下の画面で、Iotデバイスを登録します。
Device IDは任意の値、認証には Symmetric keyを選択します。
デバイスが登録されると、一覧にデバイスが追加されます。
一覧から登録したデバイスを選択して、デバイスの詳細を表示します。
ここに表示される、[Device ID][Primary Key(共有アクセスキー)]を、後から使うのでメモしておきます。SASトークンの作成 (C#)ここからC#のコードを組んでいきます。デバイスIDと共有アクセスキーから、SASトークンを生成するメソッドを作ります。
ここで作成するGenerateSasToken()メソッドを、後述するメッセージ送信のサンプルコードから呼びます。using System;using System.Globalization;using System.Net;using System.Net.Http;using System.Security.Cryptography;using System.Text;/// <summary>/// Azure IOT Hub用のSASトークンの作成/// </summary>/// <returns>SASトークン</returns>/// <param name="resourceUri">リソースURL</param>/// <param name="key">共有アクセスキー</param>/// <param na…

Flask-RESTful を使って、REST APIを作る【Python Tips】

Flask-RESTful を使って、REST APIを作る【Python Tips】Flask + Flask-RESTful を使って、Pythonで REST APIを作ってみます。
前回 作成したREST APIを、Flask-RESTfulを使って書き直していきます。インストールFlaskと、Flask-RESTfulをインストールします。$ pip install flask flask_restful サンプルードユーザを、取得/登録/更新/削除する、REST APIのサンプルです。
HTTPメソッドによって、処理モードを振り分けています。HTTP メソッドURLペイロード処理内容GET/user?id=<USERID>なしユーザを1件取得POST/user/ユーザ情報(JSON)ユーザの登録PUT/user/ユーザ情報(JSON)ユーザの更新DELETE/user?id=<USERID>なしユーザの削除# coding: utf-8from flask import Flask, abort, request from flask_restful import Resource, Api app = Flask(__name__) api = Api(app)# テストデータ users =[{"id":"U001","name":"ユーザ太郎","age":27},{"id":"U002","name":"ユーザ二郎","age":20},{"id":"U003","name":"ユーザ三郎","age":10}]classUser(Resource):defget(self):""" ユーザを1件取得する """id= request.args.get('id') result =[n for n in…

Pythonで小数点の四捨五入/切り捨て/切り上げを行う

Pythonで小数点の四捨五入/切り捨て/切り上げを行うPythonのdecimalモジュールを使って、小数点の丸めを行っていきます。
丸めには、Decimalオブジェクトの quantize() 関数を使います。quantize() 関数の使い方小数点以下を切り上げる例です。# coding: utf-8from decimal import* Decimal(str("1.5")).quantize(Decimal('0'), rounding=ROUND_UP)#-> 2quantize()は、第一引数で丸めを行う小数点桁数、第二引数で丸めオプションを指定します。
この引数について、以降に詳しく解説していきます。小数を任意の桁数で丸めるquantize()の第一引数に、丸める桁数と同じ少数点桁数の数値を、'0.1'や'0.01'のように文字列で指定します。少数点第二位で丸めるDecimal(str("1.25")).quantize(Decimal('0.1'), rounding=ROUND_UP)#=> 1.3整数1の位を丸める少数だけでなく、整数も丸める事が出来ます。
但し、整数で丸める場合は、指数表記の文字列で指定する必要があります。Decimal(str("15.00")).quantize(Decimal('1E1'), rounding=ROUND_UP)#=> 2E+1丸めオプションを指定するquantize()の第二引数には、丸めオプションを指定します。
指定可能なオプションは、以下のいずれかです。ROUND_CEILING正の無限大に近づくように丸めるモードです。value.quantize(Decimal('0'), rounding=ROUND_CEILING)# 10.1 -> 11# 10.5 -> 11# -10.1 -> -10# -10.5 -> -10ROUND_DOWN0 に近づくように丸めるモードです。(切り捨て)value.quantize(Decimal('0'), rounding=ROUND_DOW…