昔、自作のCSSで作ったサイトをBulmaに切り替える(簡単なBulmaの使い方)
初めに
昔、若気の至りで作成したCSS/HTMLで作成したサイトをBULMAに切り替えてみた備忘録
結論
やっぱり、デザインに関しては中途半端にチャレンジするのであればあるものを実装したほうが良いと思いました。
切り替え自体も1時間程度で終了しましたし、スッキリしました。
変更前
変更後
手順
旧式のHTMLサイトとCSSを用意しました。
今回のサイトはCSSが該当HTML内に入っていたため1ファイルでしたが…
1,既存のCSSを全削除
不用意に残っていると悪さをしそうなのですべて削除しました。
2,Bulmaを読み込ませる
ヘッダー部に下記の1行を入れます。
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css">
3,ベースをどのように書くか調べる
とりあえず、全体構成が最初であるため BulmaのLayoutを参照します。
この中の、Containerを参照し body要素直下に埋め込みます。
こんな感じですね。
<body>
<div class="container">
<div class="notification">
</div>
</div>
</body>
4,タイトルをどうするか考える
タイトルに関してはheroというのがあったのでこれを利用しました。
こんな感じに記載すれば綺麗になりました。
<section class="hero is-info">
<div class="hero-body">
<div class="container">
<h1 class="title">
hasito.com
</h1>
<h2 class="subtitle">
しがないサラリーマンプログラマ
</h2>
</div>
</div>
</section>
5,全体構成を考える
次に、現状の構成から大きく変えない方法で少しみてみたところ…
tilesがそれっぽいのでこれをそのまま流用しました.
こんな感じの構成です。
該当の要素に各コンテンツを埋め込んでいくだけですね。
完成は下記になります。
悩んだ所
そこまでなかったので備忘録的に書いておきます。
Heroとtilesの間にmarginが生まれない
正規な解決方法があるのでしょうけど、すぐに探せなかったため改行で逃げています…
tilesが最も長い要素に依存する。
例えば横軸で長い要素が1個あると、他の要素も長く取ろうとして不格好になります。
私サイトはTwitterが長さ指定無しだったため6000px程度になりかなり見にくくなってしまいました。
Twitterの埋め込みはdata-height="x"で高さを指定できるため、これで解決しました。
pythonでLinuxコマンド文字列を整形する汎用的なプログラム
背景
Linuxコマンドを用いて例えばCPU温度などを定期的にDBに追加しています。
この時にコードをなるべく少なくしようとコマンドだけで色々と調べたのですがなかなか難易度が高かったので作成しました。
仕様
汎用的に利用できるようにしたいのでpythonのFormatのような動きを実現させたい。
コード
こうなりました。
import sys;
print(sys.argv[1].format(*sys.argv[2].split(" ")) )
- 第一引数:Formatの指定文字列
- 第二引数:空白で区切られたFormatに入れる文字列
利用方法
mosquitto_sub -t "#" -v |xargs -I@ python3 /home/hashito/command/text2format.py "insert into mqtt.msg (t,m,tm)values(\'{}\',\'{}\',UNIX_TIMESTAMP(NOW()))" @ | xargs -I@ mysql -e "@"
mqttの内容を雑にマリアDBにつっこめます
追記
@shiracamus 様からコメントいただきました。
コマンドのみだと下記の形で出来るようです。
$ echo "a b" | xargs echo | xargs printf "insert into mqtt.msg (t,m,tm)values('%s','%s',UNIX_TIMESTAMP(NOW()))"
insert into mqtt.msg (t,m,tm)values('a','b',UNIX_TIMESTAMP(NOW()))
これをずっと探していたのですが、自分の知識がなく助かりました!
ありがとうございました!
MQTTのMessageを残らずMySQL(MariaDB)に保存するコマンド
#個人的なメモ
db構造
sudo mysql -e "SHOW FULL COLUMNS FROM mqtt.msg"
+-------+---------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------+---------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| m | varchar(1124) | latin1_swedish_ci | YES | | NULL | | select,insert,update,references | |
| tm | int(11) | NULL | YES | | NULL | | select,insert,update,references | |
+-------+---------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
コマンド
mosquitto_sub -t "#" -v | xargs -I@ sudo mysql -e "insert into mqtt.msg (m,tm)values('@',$(date +%s))"
上記だと、時間が固定になってしまいます。
SQLの方で持ってくるように変更
mosquitto_sub -t "#" -v | xargs -I@ sudo mysql -e "insert into mqtt.msg (m,tm)values('@',UNIX_TIMESTAMP(NOW()))"
課題
・セキュリティ的に問題有り
・トピックとMessageが分割できていない
commentいただけると嬉しいです!
npm http-server とDockerで無料HTTPS化
#はじめに
無料でHTTPSを立てたかったので、立て方をここに残します。(備忘録)
#やり方
用意するもの
下記のものがインストールされたlinuxサーバ
・npm
<参考>Ubuntuに最新のNode.jsを難なくインストールする
・docker and docker-compose
<参考>Ubuntu に docker と docker-compose を入れる
・domain
<参考>freenomでドメインの取得
手順
1,domainの設定
用意したlinuxサーバのグローバルIPを設定してあげます。
私のはさくらインターネットで購入したので下記のようなイメージで設定しました。
2,各種インストール
httpサーバソフト:http-server
下記のコマンドでインストールしてください。
$ sudo npm install -g http-server
ジョブ管理ソフト:cron
ubuntu等の場合は最初から入っているかと思いますが、centosなどでは入っていない場合もあるようなので、下記のようにインストールしてください。
$ sudo yum -y install crontabs
ファイヤーウォール管理ソフト:ufw
下記のコマンドでインストールしてください。
$ sudo apt -y install ufw
*centos系はこちらを参照ください。<参考>ufwをcentosにインストール
2,crontabへの登録
これを実行する事により、サーバが再起動した場合も自動的に再実行されます。
下記のコマンドを実行してください。
$ sudo crontab -e
コマンドを実行すると編集画面が表示されますので、下記の行を追加し保存してください。
@reboot sudo ufw allow 80;sudo ufw allow 443
@reboot sudo http-server /{対象フォルダ} &
*{対象フォルダ}はhttpサーバで表示するindex.htmlなどが存在するフォルダを指定してください。
3,docker-compose.ymlの作成
下記のコマンドを実行し、ファイル編集を開始してください。(例ではEditorをnanoで利用しています)
$ sudo nano docker-compose.yml
新規ファイル内容は下記としてください
version: "3"
services:
https-portal:
image: steveltn/https-portal:1
ports:
- 80:80
- 443:443
environment:
DOMAINS: '{ドメイン名} -> http://dockerhost:8080'
STAGE: production
volumes:
- ./org-chimata-ssl-certs:/var/lib/https-portal
restart: always
*{ドメイン名}は用意されているドメイン名を利用ください。
4,docker-compose.ymlの実行
最初に念の為、ファイヤーウォールに穴を開けます。
$ sudo ufw allow 80;sudo ufw allow 443
http-serverを立ち上げます
$ sudo http-server /{対象フォルダ} &
下記のコマンドでhttps-portalを起動
$ sudo docker-compose up -d
これで、正常に立ち上がるはずです。
問題がある場合
まずもってログを確認していただいたほうが良いかと思います。
dockerのログの見方
1,下記のコマンドでdockerのコンテナIDを取得
$ sudo docker ps
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
> {コンテナID} steveltn/https-portal:1 "/init" 2 days ago Up 2 days 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp {user name}_https-portal_1
2,下記のコマンドでコンテナのログを取得
$ sudo docker logs {コンテナID}
そして、エラーっぽいところの行をコピーしてググる!!
他の可能性
可能性としては…
・http-serverは2回目以降は別ポートで起動します。→多重起動していないか確認
・http-serverが立ち上がっているか?→curlなどでgetして確認
・ネットワーク全体で80/443PORTは許可されているか?→外部からtelnetなどで確認
・STAGE: productionで何度も作成していないか?→Let's Encryptに回数などの制限があるようです。
Font Awesomeのアイコンを導入してみる
目的
サイトを作成するのに無料アイコンが必要だったので導入しました。
備忘録
流れ
1.登録:メール
下記のサイトにアクセスし、スタートをクリック
https://fontawesome.com/
下記に、自分のメールアドレスを入力し、「Send Kit Code」!
こんなメールが来るので「Click to Confirm Your Email Address + Set Things Up」!
2.登録:入力
新しいパスワードを入力
上から「ファーストネーム」、「ラストネーム」…「最初に使ったのはいつか」
って感じで入力。そのままですね
3.リンク取得
入力が終わると下記のような画面に移動します。
ここで表示されているコードをコピーしてホームページにCOPYすればOK
<script src="https://kit.fontawesome.com/{serial}.js" crossorigin="anonymous"></script>
例もダウンロードできます。
<!doctype html>
<html>
<head>
<!-- Place your kit's code here -->
<script src="https://kit.fontawesome.com/{serial}.js" crossorigin="anonymous"></script>
</head>
<body>
<i class="fas fa-thumbs-up fa-5x"></i>
</body>
</html>
詰まったところ
フォントの最初の文字が異なる場合がある
フォントによって最初に入ってくる文字が異なる場合がります。
これがバージョンによって異なるらしく…注意が必要です。
fa s
<i class="fas fa-map-marked-alt fa-3x"></i>
fa b
<i class="fab fa-linkedin fa-1x"></i>
こちらのサイトにあるような分類になっているようです。
https://fontawesome.com/how-to-use/on-the-web/referencing-icons/basic-use
その他
ライセンス
ここにあります。
今日(2020年3月1日)現在はGPLライセンスのようです。
https://fontawesome.com/license/free
設定変更
設定を変更し、過去のバージョンも利用できるようです。
また、SVGかWebフォントも選択可能です。
kitのホーム画面で「your kit settings.」をクリックすると下記の画面に移動します。
windows10にpythonとVisualStudioCodeをインストールする(2020年4月版)
概要
Windows10にPython3とVisualStudioCodeをインストールしたので備忘録
動画
#手順
1.Python3 インストール
1-1. ダウンロード
下記のURLからダウンロードしてください。
https://www.python.org/
1-2. 実行
ダウンロードしたファイルを実行してください。
「Add Python3.8 PATH」はチェックを入れてください。
これでPythonのインストールは完了です。
2.VisualStudioCode インストール
2-1. ダウンロード
下記のURLからダウンロードしてください。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
2-2. 実行
ダウンロードしたファイルを実行してください。
チェック項目に関しては自由に選択してください。
これでインストールは完了です。
2-3.デバッグ設定
VisualStudioCodeを起動してください。
四角が重なったようなアイコンから拡張機能をインストール出来ます。
その中からPythonを選択し、インストールしてください。
インストールが終わるとデバッグが可能になります。
実行したいpythonファイルを開いた状態で、虫のようなマークを選択、その後Run and Debugをクリックすると、下記のような画面になります。
Python Fileを選択するとデバッグすることが出来ます。
riot.jsでマウスムーブイベントでグリグリ動かす方法
最初
riotとsvgを使って手軽にぐりぐりできないかと思った。
onclickイベント?
公式のドキュメントとかを見ていると日本語ではonclickとかoninputとかのイベントしか記載がない…
試しにonmousemoveを下記のようにしてみたら動いた。
<circle onmousemove={move} cx="10" cy="20" r="20" fill="blue" />
マウスの場所…
通常、マウスのイベントの戻り値としてマウスの情報が飛んで来るのだが、riotは…?
適当に引数を追加し参照したところそれっぽい物が戻ってきていた。
move(e){
console.log(e);
}
要素への参照
マウスイベントの戻り値のpathに要素をみつけたので下記のように記載
move(e){
e.path[0].setAttribute("cx",e.offsetX);
e.path[0].setAttribute("cy",e.offsetY);
}
これでうまく動きました。
#全体のソース
<sample>
<svg id="svg" width="300" height="340" style="border-width: thick; border-color: #EEE; border-style: solid; display: block; margin: auto;">
<circle onmousemove={move} onmousedown={down} cx="10" cy="20" r="20" fill="blue" />
</svg>
<script>
var self=this;
move(e){
e.path[0].setAttribute("cx",e.offsetX);
e.path[0].setAttribute("cy",e.offsetY);
}
</script>
</sample>
<html>
<head>
<title>test</title>
</head>
<body>
<sample></sample>
<script type="riot/tag" src="sample.tag"></script>
<script src="https://cdn.jsdelivr.net/npm/riot@3.8/riot+compiler.min.js"></script>
<script>riot.mount('sample')</script>
</body>
</html>
[電子工作入門]スイッチ入力を受け取る
概要
スイッチを使って入力を受け取りLEDを光らせる回路を作成しました。
超入門だと思うので…
回路図
今回は、ポート2,4を利用します。
ポート4でスイッチを押しているかどうかを受け取り、ポート2でLEDを光らせます。
[スイッチの片方が抵抗を挟んでGNDに落ちている理由]
スイッチが切れている時に電気的にGNDにも5vにもならない状態にしないためです。
[LEDにも抵抗を挟んでいる理由]
これはLEDを5vとGNDに直接つないでしまうと、大量の電流が流れるためLEDが破損する事を防ぐためです。
※ArduinoのIOは基本的に直接つないでも問題なかったと思いましたが、念の為です。
ソースコード
void setup() {
pinMode(2, OUTPUT);
pinMode(4, INPUT);
}
void loop() {
int pin4=digitalRead(4);
digitalWrite(2, pin4);
}
setup()で各pinを初期化しています。loop()ではpin4で入力を受け取り、pin2に書き込みを行っています。
github
https://github.com/hashito/arduino_startup/tree/master/switch2led
結果

距離センサを使ってみた
概要
距離センサを購入したので試してみました。
部品
距離センサ:HC-SR04
83円
※参考にしたSwitchScienceによるとこれには一部欠陥があるようで、そちらのほうが良いかもしれません。
表示機:TM1637が組み込まれた7セグLED
73円
コンピュータ:Arduino UNO互換機
699円
#配線
Triggerを10マイクロ秒以上 UPさせると、40kHzで8回距離を測り、その結果をEchoに周波数で返す仕様らしいです。
#ソースコード
#include <Arduino.h>
#include <TM1637Display.h>
#include <Wire.h>
#define SERIAL_BAUD 115200
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
int Trig = 5;
int Echo = 4;
void setup() {
Serial.begin(SERIAL_BAUD);
while(!Serial) {}
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
Wire.begin();
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
display.setBrightness(0x0f);
display.setSegments(data);
delay(1000);
}
void loop() {
int Duration;
float Distance;
digitalWrite(Trig,LOW);
delayMicroseconds(1);
digitalWrite(Trig,HIGH);
delayMicroseconds(11);
digitalWrite(Trig,LOW);
Duration = pulseIn(Echo,HIGH);
if (Duration>0) {
Distance = Duration/2;
Distance = Distance*340*100/1000000; // 340m/s = 34000cm/s = 0.034cm/us
Serial.print(Distance);
Serial.println(" cm");
display.showNumberDec((unsigned int)(Distance*100), false);
// analogWrite(11, (unsigned int)(100-Distance));//ビープ音
}
delay(100);
}


