- 投稿日:2019-04-11T23:25:50+09:00
初心者teamlabのオンラインスキルアップ課題step1をやってみた(コード初心者向け記事)
dockerって何とか、DBとの連携でコード上で具体的にどうするのとか、初心者的にはイメージがつかないほど良くわからないので、teamlabさんのオンラインスキルアップ課題をやってみた。
こちらから課題にアクセスします。
STEP1の内容は下記のようになっています。
- インターネットのしくみ
- WEBサーバについて
- HTMLとCSSについて 4-a. 【Windows】Dockerと開発環境の作り方 4-b. 【Mac】Dockerと開発環境の作り方
- PHPを書いてみる
- PHPでGET/POSTをやってみる
- データベースについて
- SQLを書いてみる
- PHPでデータベースを操作してみる
- 10. GitとGitHubについて
4-b:【Mac】Dockerと開発環境の作り方
1,2,3はわかった気になってとりあえず進めて、まずは4のDockerのセットアップから入ります。
docker-compose -vdockerがちゃんとインストールされているか上記のコマンドで確かめます。
docker-compose up -dteamlabさんのサイトからダウンロードしたフォルダに遷移して、上のコマンドを叩くとコンテナを作成して、起動します。
※Dockerのコマンドに関してはこちら
なんかいろいろエラーは起きたのですが、無事?doneになっています。
「skillup-php-step1-master」をダウンロードして解凍したフォルダに移動したいけど移動できない!っていう場合にですが、フォルダさえ探せれば、フォルダごとターミナルに落としてあげることでpathが表示されるので、あとは先頭にcdつけるだけでフォルダに移動できるはずです。1-6:PHPでGET/POSTをやってみる
1-5は普通にコピペでコード貼って、Dockerで立ち上げたlocalhostにアクセスするだけなので、はしおります。
まず、エディターがない人は適当なエディターをインストールしてください。
(ぼくはsublimeをつかっています。)とりあえず、課題のpostだけやってみました
index.html1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>POSTのサンプル</title> </head> <body> <p>コメントしてください。</p> <form method="POST" action="index.php"> <input name="comment" /> <input type="submit" value="送信" /> </form> </body> </html>php1
<?php //commentがPOSTされているなら if(isset($_POST["comment"])){ //エスケープしてから表示 $comment = htmlspecialchars($_POST["comment"]); print("あなたのコメントは「 ${comment} 」です。"); } else { ?>最後にこの課題があります。
[課題]送信する内容を変更してみよう
掲示板に必要な情報としては少なくとも名前と本文が必要です。名前も送信し、受け取るように変更してみましょう。余力のある人はタイトル・文字色・メールアドレスなども追加してみましょう。なんかとりえあえず複数のデータを送ってみてほしいとのことだったので、僕は次のようにしました。
index.html2
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>POSTのサンプル</title> </head> <body> <style> .cell{ padding: 1px 15px; margin: 1px 30px; line-height: 0.1; } </style> <h1>「同窓会の参加有無」</h1> <div class=cell> <form method="POST" action="index.php"> <ol> <li><p>氏名:<input name="name" /></p></li> <li><p>メール:<input name="mail" /></p></li> <li><p>参加可否:<input name="comment" /></p></li> <input type="submit" value="送信" style= "width:150px;,height:100px;"/> </div> </form> </body> </html>php 2
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>POSTのサンプル</title> </head> <body> <?php //commentがPOSTされているなら if(isset($_POST["mail"],$_POST["name"],$_POST["comment"])){ //エスケープしてから表示 $mails = htmlspecialchars($_POST["mail"]); $names = htmlspecialchars($_POST["name"]); $comments = htmlspecialchars($_POST["comment"]); print("あなたの入力した情報は以下になります。<br/>"); print("名前:${mails}<br/>"); print("メール:${names}<br/>"); print("参加有無:${comments}<br/>"); }else{ print("情報の入力が正しくありません。"); } ?> </body> </html>震えるくらいクソコードであることはなんとなくですが、自覚してます....
STEP1-9.PHPでデータベースを操作してみる
これやってみたのですが、すごい勉強になりました。
phpでデータベースをこうやっていじるんだ!みたいなのがなんとなくですが理解できます。こちらも特に説明を読んでいけば問題なく進めました。
唯一初心者目線でひっかかりそうなのが、データベースにアクセスするときに自分でつけたデータベースの名前じゃないと、エラーになるので注意が必要。
僕の場合はdbname=「TEST」ではなくて「text」でしたので最初はエラってました。実行結果1
先程はDBのname,textを全て表示したが今度はJohnにしぼったものだけを表示させます。
実行コード
<?php $dsn = 'pgsql:dbname=test;host=pgsql;port=5432'; $user = 'postgres'; $pass = 'example'; try { // DBに接続する $dbh = new PDO($dsn, $user, $pass); //$query_result = $dbh->query('SELECT * FROM test_comments'); $sth_select = $dbh->prepare('SELECT * FROM test_comments WHERE name = ?'); // prepareメソッド(INSERT)最下部でinsertするname/textを定義 $sth = $dbh->prepare('INSERT INTO test_comments (name, text) VALUES (?, ?)'); // DBを切断する $dbh = null; } catch (PDOException $e) { // 接続にエラーが発生した場合ここに入る print "DB ERROR: " . $e->getMessage() . "<br/>"; die(); } ?> <?php //これでdbのnameとtextに新たに文字列が加わる $name = "John"; $text = "Power to the People"; $sth->execute(array($name, $text)); ?> <?php $name = "John"; $sth_select->execute(array($name)); //実行したクエリから実行結果を取得している $prepare_result = $sth_select->fetchAll(); foreach($prepare_result as $row) { print $row["name"] . ": " . $row["text"] . "<br/>"; } $sth_select->execute(array($name)); ?>実行結果2
とりあえず、無事表示されました。
次は気が向いたらSTEP2をやります。
- 投稿日:2019-04-11T23:25:50+09:00
初心者がteamlabのオンラインスキルアップ課題step1をやってみた(コード初心者向け記事)
dockerって何とか、DBとの連携でコード上で具体的にどうするのとか、初心者的にはイメージがつかないほど良くわからないので、teamlabさんのオンラインスキルアップ課題をやってみた。
こちらから課題にアクセスします。
STEP1の内容は下記のようになっています。
- インターネットのしくみ
- WEBサーバについて
- HTMLとCSSについて 4-a. 【Windows】Dockerと開発環境の作り方 4-b. 【Mac】Dockerと開発環境の作り方
- PHPを書いてみる
- PHPでGET/POSTをやってみる
- データベースについて
- SQLを書いてみる
- PHPでデータベースを操作してみる
- 10. GitとGitHubについて
4-b:【Mac】Dockerと開発環境の作り方
1,2,3はわかった気になってとりあえず進めて、まずは4のDockerのセットアップから入ります。
docker-compose -vdockerがちゃんとインストールされているか上記のコマンドで確かめます。
docker-compose up -dteamlabさんのサイトからダウンロードしたフォルダに遷移して、上のコマンドを叩くとコンテナを作成して、起動します。
※Dockerのコマンドに関してはこちら
なんかいろいろエラーは起きたのですが、無事?doneになっています。
「skillup-php-step1-master」をダウンロードして解凍したフォルダに移動したいけど移動できない!っていう場合にですが、フォルダさえ探せれば、フォルダごとターミナルに落としてあげることでpathが表示されるので、あとは先頭にcdつけるだけでフォルダに移動できるはずです。1-6:PHPでGET/POSTをやってみる
1-5は普通にコピペでコード貼って、Dockerで立ち上げたlocalhostにアクセスするだけなので、はしおります。
まず、エディターがない人は適当なエディターをインストールしてください。
(ぼくはsublimeをつかっています。)とりあえず、課題のpostだけやってみました
index.html1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>POSTのサンプル</title> </head> <body> <p>コメントしてください。</p> <form method="POST" action="index.php"> <input name="comment" /> <input type="submit" value="送信" /> </form> </body> </html>php1
<?php //commentがPOSTされているなら if(isset($_POST["comment"])){ //エスケープしてから表示 $comment = htmlspecialchars($_POST["comment"]); print("あなたのコメントは「 ${comment} 」です。"); } else { ?>最後にこの課題があります。
[課題]送信する内容を変更してみよう
掲示板に必要な情報としては少なくとも名前と本文が必要です。名前も送信し、受け取るように変更してみましょう。余力のある人はタイトル・文字色・メールアドレスなども追加してみましょう。なんかとりえあえず複数のデータを送ってみてほしいとのことだったので、僕は次のようにしました。
index.html2
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>POSTのサンプル</title> </head> <body> <style> .cell{ padding: 1px 15px; margin: 1px 30px; line-height: 0.1; } </style> <h1>「同窓会の参加有無」</h1> <div class=cell> <form method="POST" action="index.php"> <ol> <li><p>氏名:<input name="name" /></p></li> <li><p>メール:<input name="mail" /></p></li> <li><p>参加可否:<input name="comment" /></p></li> <input type="submit" value="送信" style= "width:150px;,height:100px;"/> </div> </form> </body> </html>php 2
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>POSTのサンプル</title> </head> <body> <?php //commentがPOSTされているなら if(isset($_POST["mail"],$_POST["name"],$_POST["comment"])){ //エスケープしてから表示 $mails = htmlspecialchars($_POST["mail"]); $names = htmlspecialchars($_POST["name"]); $comments = htmlspecialchars($_POST["comment"]); print("あなたの入力した情報は以下になります。<br/>"); print("名前:${mails}<br/>"); print("メール:${names}<br/>"); print("参加有無:${comments}<br/>"); }else{ print("情報の入力が正しくありません。"); } ?> </body> </html>震えるくらいクソコードであることはなんとなくですが、自覚してます....
STEP1-9.PHPでデータベースを操作してみる
これやってみたのですが、すごい勉強になりました。
phpでデータベースをこうやっていじるんだ!みたいなのがなんとなくですが理解できます。こちらも特に説明を読んでいけば問題なく進めました。
唯一初心者目線でひっかかりそうなのが、データベースにアクセスするときに自分でつけたデータベースの名前じゃないと、エラーになるので注意が必要。
僕の場合はdbname=「TEST」ではなくて「text」でしたので最初はエラってました。実行結果1
先程はDBのname,textを全て表示したが今度はJohnにしぼったものだけを表示させます。
実行コード
<?php $dsn = 'pgsql:dbname=test;host=pgsql;port=5432'; $user = 'postgres'; $pass = 'example'; try { // DBに接続する $dbh = new PDO($dsn, $user, $pass); //$query_result = $dbh->query('SELECT * FROM test_comments'); $sth_select = $dbh->prepare('SELECT * FROM test_comments WHERE name = ?'); // prepareメソッド(INSERT)最下部でinsertするname/textを定義 $sth = $dbh->prepare('INSERT INTO test_comments (name, text) VALUES (?, ?)'); // DBを切断する $dbh = null; } catch (PDOException $e) { // 接続にエラーが発生した場合ここに入る print "DB ERROR: " . $e->getMessage() . "<br/>"; die(); } ?> <?php //これでdbのnameとtextに新たに文字列が加わる $name = "John"; $text = "Power to the People"; $sth->execute(array($name, $text)); ?> <?php $name = "John"; $sth_select->execute(array($name)); //実行したクエリから実行結果を取得している $prepare_result = $sth_select->fetchAll(); foreach($prepare_result as $row) { print $row["name"] . ": " . $row["text"] . "<br/>"; } $sth_select->execute(array($name)); ?>実行結果2
とりあえず、無事表示されました。
次は気が向いたらSTEP2をやります。
- 投稿日:2019-04-11T23:20:34+09:00
複数HTMLファイルでCSSを共有する場合の便利な手段
こんにちは、ブログ「学生ブロックチェーンエンジニアのブログ」を運営しているアカネヤ(@ToshioAkaneya)です。
複数HTMLファイルでCSSを共有する場合の便利な手段
複数HTMLファイルでCSSを共有すると、意図しないHTMLファイルの方にCSSの変更が適用されてしまうことがあります。
オススメの解決策は、HTMLファイルのbodyタグにクラスを指定することです。
例
index.html<body class="index"> <h1>タイトル</h1> ... </body>about.html<body class="about"> <h1>タイトル</h1> ... </body>main.css.index h1 { color: black; } .about h1 { color: black; }はてなブックマーク・Pocketはこちらから
- 投稿日:2019-04-11T23:12:47+09:00
4/11 javascript 例外処理
- 投稿日:2019-04-11T22:49:29+09:00
head内に入れるべきタグ一覧
自分のメモ用
内に入れるべきタグと重要度一覧。
文字のエンコード
<meta charset="utf-8">重要度:★★★
文字コードを指定するためのもの。
日本語サイトなら必須。Internet Explorer用の設定
<meta http-equiv="X-UA-Compatible" content="IE=edge" />重要度:★★★
IEには過去バージョンで表示させる「互換モード」があり、デザイン崩れが起きる場合がある。
これを指定すれば、常に「標準モード」で表示される。viewport設定
<meta name="viewport" content="width=device-width,initial-scale=1" />重要度:★★★
「レスポンシブデザイン」のサイトを作成するなら必須。タイトルタグ
<title>ページタイトル</title>重要度:★★★
SEO対策
指定したタイトルを検索結果やブラウザのタブに表示させる。メタディスクリプション
<meta name="description" content="ページの説明文" />重要度:★★
そのページがどんな内容なのか100文字以下で記載。
検索結果の下の説明文に反映される。
(SEO対策には直接的な効果はない。)OGPタグ
<meta property="og:url" content="ページURL" /> <meta property="og:title" content="ページタイトル" /> <meta property="og:type" content="ページタイプ" /> <meta property="og:desvription" content="記事の抜粋文" /> <meta property="og:img" content="画像URL" /> <meta property="og:site_name" content="サイト名" /> <meta property="og:local" content="ja_JP" /> <!-- twitter card --> <meta name="twitter:card" content="カード種類" /> <meta name="twitter:site" content="@Twitterユーザ名" />重要度:★★★
facebookやTwitterなどのソーシャルメディアでシェアをされた時に、よくあるやつ。
必須項目
og:title ページタイトル
og:type ページ種類(website、blog、video、article など)
og:image サムネイル画像
og:url webページのURLURLの正規化
<link rel="canonical" href="正規化するURL">重要度:★★
SEO対策
内容が全く同じページが複数ある場合、検索エンジンからの評価を統一するために使用する。
例:PCとスマホで同じ内容でもURLが違う場合サイトアイコン(favicon)
<link rel="icon" href="./favicon.ico"> <link rel="apple-touch-icon" sizes="180×180" href="./apple-touch-icon-180×180.png">重要度:★★
ブラウザのタブに表示やブックマークした時のサイトアイコンとして使用される。
2行目はiPhoneで使用され、Webページをホーム画面に追加した時のアイコン画像として使用される。
windows用タイル設定
<meta name="msapplication-TileImage" content="画像URL" /> <meta name="msapplication-TileColor" content="カラーコード" />重要度:★
Windows8~できたピン留機能用のアイコン設定。
タイル画像と背景色を設定できる。metaタグコピペ用
<meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width,initial-scale=1" /> <title>ページタイトル</title> <meta name="description" content="ページの説明文" /> <link rel="icon" href="./favicon.ico"> <link rel="apple-touch-icon" sizes="180×180" href="./apple-touch-icon-180×180.png"> <!-- ogp --> <meta property="og:url" content="ページURL" /> <meta property="og:title" content="ページタイトル" /> <meta property="og:type" content="ページタイプ" /> <meta property="og:desvription" content="記事の抜粋文" /> <meta property="og:img" content="画像URL" /> <meta property="og:site_name" content="サイト名" /> <meta property="og:local" content="ja_JP" /> <!-- twitter card --> <meta name="twitter:card" content="カード種類" /> <meta name="twitter:site" content="@Twitterユーザ名" />任意で消したり、追加したりどうぞ。
index.htmlテンプレ
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Site Title</title> <link rel="icon" href="favicon.ico"> </head> <body> <header> header </header> <main> main </main> <footer> footer </footer> </body> </html>毎回書くのめんどくさいので、、、
参考記事
以上です。
変更や追加があったら随時更新します。
- 投稿日:2019-04-11T22:06:48+09:00
Qiitaのサイトバグを見つけたのでコード解析 ? 原因見つけて報告 ? 一瞬で修正してくれました!【神対応】
インクリメンツし過ぎてハミ出ちゃいました、的な!
— 無職やめ太郎(本名) (@Yametaro1983) April 11, 2019バグの内容
Qiitaは通知が100件以上になると、「99+」と表示される仕様がありました。
しかし実はそのアルゴリズム、『トレンド画面』しか効いておらず、他の画面では『素の数字』が表示されていたのです。プロフィールや記事ページは100を越えて表示され、それ以外は99+となるみたいですね。 pic.twitter.com/BXVZ8gi2Ds
— std::がっちょ( ¨̮ ) (@wanotaitei) April 11, 2019
他にも、結構通知を貯金されて気づいていらっしゃる方がいたんですね。Qiitaで有名な@suin さんまで・・・
これやりたくなるの分かるw
— suin❄️PHPでオブジェクト指向 (@suin) April 10, 2019
うっかりクリックして貯めた数百が吹き飛ぶ
↓
そっとインスペクタ開く
って流れ、やったなあ… https://t.co/uT7VnWTAu7
JS の丸め処理が評価される前は、そのままの数字が出る。閾値は1000なのかな pic.twitter.com/EGRVZJh0eV
— Enjoy Hacking! (@zaru) April 10, 2019
『13954件ってなんだよ(羨望)(感動)』早速Qiitaのコードを解析してみる
【1/2】トレンド画面
【2/2】それ以外の画面
既に構造が変わっていますね。
特にglobalHeaderなるidが、トレンド画面にしか存在していないのが気になります。
多分セレクタミスをしているのでしょうね。スクリプトを調査するため、Source画面でJSファイルを掘り出してみましょう。
いっぱいありますね!
QiitaはRuby on Railsで作られているので、サーバーが絡んでたら終わりです。
rbファイルとかphpファイルはSourceで確認できないからです。とりあえず望みに賭けて、それっぽいjsファイルを目星付けてみます。
indexの隣にあったり、社名の入ったCDNの中なんかは当たりが多いですね。qiita用のCDN・・・これが怪しいですね。早速見てみましょう。
セレクタが不明なので、「99+」で検索してみます。
い ま し た
変数名からして、こいつが99%悪さしてそうですね(99+だけに)。
中のコードはmin(最小化)されているので、beautifyして正体を顕にしてあげましょう
使うサイトはこちら⇛ https://beautifier.io/変換したらsyntaxの効いているエディタにコピペして、解析を始めてみましょう。
ここの部分ですね。
99<t.unreadNotificationsCount?"99+":t.unreadNotificationsCount
- unreadNotificationsCountが99より大きい場合、"99+”に書き換える。
- それ以外の場合は、unreadNotificationsCountのまま。
この処理が、トレンド画面にしか反映されていないわけです。
トレンド画面以外のページでは、「スキップしている」or「前の処理でエラーを起こしてしまっている」の2パターンが考えられますね。そしたら色々、前の方の条件式を見てみるか・・・
あ り ま し たやっぱりglobalHeaderじゃないか!
関数の中まで追うまでもなく、このglobalHeaderが存在しないページでは以降の処理に不具合が出る事が想定されますね。
ここまでの検証はパッと5分程でした。Qiitaに報告
Qiitaのお問い合わせからバグを報告してみます。
こういうissue文が一番、プログラマーに文才を求められる瞬間ですね。
読み返すと非常に読みづらい・・・githubでこんなissue文書いたら、弾かれそうですね(笑)結果
2時間で直してくれました。
神対応すぎる、さすがQiita様!Qiita、通知バグなおってた。
— std::がっちょ( ¨̮ ) (@wanotaitei) April 11, 2019
運営さん対応がはやい。 pic.twitter.com/biaju0b1Oxまとめ
全然技術的な話が無くって申し訳ありません。
一番言いたかった事は、そう、冒頭の「Increments株式会社なのにインクリメントの表示処理バグってる(笑)」
この奇跡ともいえるギャグを広めたかっただけです・・・改めて、光速の対応をして頂いたQiita運営様、本当にありがとうございました。
(できれば99+の方ではなく、無制限表示の方が嬉しいです・・・)おまけ
99+じゃなくて、ちゃんとインクリメンツしておくんなはれや、ってことですね!
— 無職やめ太郎(本名) (@Yametaro1983) April 11, 2019
Incrementsだけに!
- 投稿日:2019-04-11T21:13:21+09:00
Remove your all hunger and complete all your needs by call girls
Conserve your prolonged length romance by reigniting the spark and creating 'special' time for every other. Just because you're not ready to see every single other type, it doesn't mean that you can't have a date together. It comes again to artistic thinking. There are so several video clip chat solutions accessible now that eating a meal or watching a motion picture collectively actually is attainable, even when you happen to be a bunch of miles apart.
These are just some basic techniques that you can set into motion swiftly to help save your great length connection. But of the program, it might not be that uncomplicated. You may perhaps have trust difficulties or be finding it definitely challenging to open up to your lover and say just how you experience. If that's the scenario, you may want to consider trying to get assistance from an outside source that will assist you the two to re-link and convey back the spark that you've misplaced.
We have ultimate call girl mobile number and photo
If you are hunger for romance and want to fulfill your desire then you are just one step away. With Call girl you can easily remove your all hunger and complete all your needs and demands with. Feel the ultimate satisfaction and turn you are all dream fantasies into reality. We have ultimate call girl mobile number and photo and these call girls are educated and look like high profile models. These girls are passionate and you can go anywhere with them because they are classy. You can also feel the dating and night dining pleasure with. Get high profile call girl names and mobile number at the cheap rate and get unlimited pleasure with them and make your life interesting. They are naughty and always ready for fun because they are open minded and give you proper and complete fun for the full night and you will never forget these moments.
- 投稿日:2019-04-11T14:18:22+09:00
cssにパラメータを渡して表示を切り替える
最近、cssに外から任意の値を与えて表示を弄れるという事に気付いたので、備忘録として。
cssには変数の仕組みがあって、定義を纏める事が出来る。
test.css:root { --color: red; } div { color: white; background-color: var(--color) }これを、htmlから使うと
test1.html<html> <head> <link rel="stylesheet" type="text/css" href="test.css"> </head> <body> <div>赤</div> </body> </html>でもこれ、css内で変数として使いまわせるってだけじゃなくて、html側から直接スタイル指定して、変数の上書きも出来る
つまり以下の様なhtmlであればtest2.html<html> <head> <link rel="stylesheet" type="text/css" href="test.css"> </head> <body> <div>赤</div> <div style="--color: blue;">青</div> <div style="--color: gold;">金</div> </body> </html>この仕組みの何が嬉しいかというと、例えば、ユーザー毎に画面デザインを変えたい様な場合に、直接htmlでスタイルを弄ってしまうのではなく、あくまでデザインの指定はcssに寄せたままで値だけを切り替えるのを、htmlとcss間のやり取りだけで実現出来る所。
直接スタイルを弄るだと(<div style="background-color: blue;">みたいな形)、同じスタイルの指定がcssとhtmlで重複してしまうけれど、値だけ渡せれば、デザインはcssで決定するという原則を、ある程度守り続ける事が出来る。
さらにこの実現において、javascriptを通さずにいられる。
デザインはデザインの問題として完結出来るなら、それに越したことは無いので、こうやって閉じ込めてしまえると、気持ちがいい。rails/haml/scssのアプリで動的に表示を切り替えるのに、大変お世話になりました。
- 投稿日:2019-04-11T14:18:22+09:00
cssに外からパラメータを渡して表示を切り替える
最近、cssに外から任意の値を与えて表示を弄れるという事に気付いたので、備忘録として。
cssには変数の仕組みがあって、定義を纏める事が出来る。
test.css:root { --color: red; } div { color: white; background-color: var(--color) }これを、htmlから使うと
test1.html<html> <head> <link rel="stylesheet" type="text/css" href="test.css"> </head> <body> <div>赤</div> </body> </html>でもこれ、css内で変数として使いまわせるってだけじゃなくて、html側から直接スタイル指定して、変数の上書きも出来る
つまり以下の様なhtmlであればtest2.html<html> <head> <link rel="stylesheet" type="text/css" href="test.css"> </head> <body> <div>赤</div> <div style="--color: blue;">青</div> <div style="--color: gold;">金</div> </body> </html>この仕組みの何が嬉しいかというと、例えば、ユーザー毎に画面デザインを変えたい様な場合に、直接htmlでスタイルを弄ってしまうのではなく、あくまでデザインの指定はcssに寄せたままで値だけを切り替えるのを、htmlとcss間のやり取りだけで実現出来る所。
直接スタイルを弄るだと(<div style="background-color: blue;">みたいな形)、同じスタイルの指定がcssとhtmlで重複してしまうけれど、値だけ渡せれば、デザインはcssで決定するという原則を、ある程度守り続ける事が出来る。
さらにこの実現において、javascriptを通さずにいられる。
デザインはデザインの問題として完結出来るなら、それに越したことは無いので、こうやって閉じ込めてしまえると、気持ちがいい。rails/haml/scssのアプリで動的に表示を切り替えるのに、大変お世話になりました。
- 投稿日:2019-04-11T14:01:39+09:00
Clipkitで記事の目次を表示する
目次の実装
show.html{% assign headings = article.items | headings_per_page %} {% if headings.size > 0 %} <div class="toc"> <h3>目次</h3> <ul> {% for heading in headings %} <li class="lv{{ heading['level'] }}"> <a href="{{ heading['path'] }}">{{ heading['title'] }}</a> </li> {% endfor %} </ul> </div> {% endif %}記事詳細テンプレートにて、以上のコードを目次の挿入したい箇所に記述してください。
変数headingsに見出しアイテムがセットされており、{% if headings.size > 0 %}...{% endif %}は見出しアイテムが1つ以上あれば、目次を表示するというロジックになります。
したがって、見出しアイテムが1つもない場合、目次は表示されません。
- 投稿日:2019-04-11T11:39:20+09:00
#GCP ( Google Cloud Platform ) の Google翻訳API で #MarkDown を翻訳するとスタイルが崩れてしまうので #ruby gem で一旦 #HTML 変換してから Markdown に逆変換する #shell コマンドの例
Prepare
sudo gem install reverse_markdownsudo gem install redcarpet- install gcloud
- setting Google Translate API on GCP
tmp/example.md
``` # あまがみヘッダー *そうだ京都行かない。* ## うずらの卵 - 神風パラダイス - おおむね大丈夫です ``` print('孫氏や老師の楽園') print('一寸先はホタテ') ```~/.secret/google-service-credential.json
your GCP service account file json
get-token.sh
GOOGLE_APPLICATION_CREDENTIALS=~/.secret/google-service-credential.json gcloud authtranslate.sh
#!/usr/bin/env bash basedir=$(dirname "$0") TOKEN=$("$basedir"/get-token.sh) \ "$basedir"/translate.py | \ jq --raw-output '.data.translations[].translatedText'translate.py
Google Translate API では resouce として html 形式を指定することが出来る (デフォルトはこちら)
Method: translate | Cloud Translation API | Google Cloud
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os, sys, requests, json, fileinput, re #resource_message = '' #for text in sys.stdin.readlines(): # resource_message += re.sub(r'\\n', "\n", text) resource_message = sys.stdin.read() from_language = os.environ.get('FROM') if os.environ.get('FROM') else 'ja' to_language = os.environ.get('TO') if os.environ.get('TO') else 'en' translate_format = os.environ.get('FORMAT') if os.environ.get('FORMAT') else 'text' data = { 'q': resource_message, 'source': from_language, 'target': to_language, 'format': translate_format } url = 'https://translation.googleapis.com/language/translate/v2' token = os.environ['TOKEN'] headers = { 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json', } res = requests.post(url, headers=headers, json=data) print(json.dumps(res.json()))exe
- テキストは翻訳され、コードは翻訳されていないのが分かる
- PHP / Github スタイルのバッククォート複数個での コードブロック記法が、半角スペース4個でのベーシック記法に崩れてしまっているが、良い ruby gem や python module などが見つからなかったのでとりあえず放置
$ redcarpet --parse=fenced_code_blocks ./tmp/example.md | FORMAT=html ./translate.sh | reverse_markdownただしGoogle翻訳時にコードブロック内の改行が崩れてしまうようなので、独自対応する必要があるかもしれない
# Amagami header _Yes I can not go to Kyoto._ ## Quail egg - Kamikaze Paradise - Mostly okay print('孫氏や老師の楽園') print('一寸先はホタテ')Original by Github issue
- 投稿日:2019-04-11T10:24:00+09:00
#ruby や #python で #markdown を #HTML に #shell のコマンドで変換できるモジュール四種類の簡単な結果比較
Install
gem install [module_name]or
pip install [module_name]markdown text
# header *あ* ## header2 - list - list ``` print('ok') print('yes') ```ruby redcarpet
$ redcarpet ./tmp/markdownsingle quote HTML escaped
<h1>header</h1> <p><em>あ</em></p> <h2>header2</h2> <ul> <li>list</li> <li>list</li> </ul> <p><code> print('ok') print('yes') </code></p>enable multiple backquotes code block style
$ redcarpet --parse=fenced_code_blocks ./tmp/markdown<h1>header</h1> <p><em>あ</em></p> <h2>header2</h2> <ul> <li>list</li> <li>list</li> </ul> <pre><code>print('ok') print('yes') </code></pre>ruby karmdown
$ kramdown ./tmp/markdownIndented
<h1 id="header">header</h1> <p><em>あ</em></p> <h2 id="header2">header2</h2> <ul> <li>list</li> <li>list</li> </ul> <p><code> print('ok') print('yes') </code></p>python markdown
$ python3 -m markdown ./tmp/markdown<h1>header</h1> <p><em>あ</em></p> <h2>header2</h2> <ul> <li>list</li> <li>list</li> </ul> <p><code>print('ok') print('yes')</code></p>python markdown2
$ python3 -m markdown2 ./tmp/markdown<h1>header</h1> <p><em>あ</em></p> <h2>header2</h2> <ul> <li>list</li> <li>list</li> </ul> <p><code> print('ok') print('yes') </code></p>Original by Github issue
- 投稿日:2019-04-11T05:55:01+09:00
接骨院の先生がはじめてプログラミングを勉強してみた
はじめまして
プログラミングとは全く関係のない仕事についています。
柔道整復師というやつです。
仕事内容として接骨院で捻挫などを治療する人です。
プログラマーさんだったら、腰痛などでお世話になっているかたも多いんじゃないでしょうか。なぜそんなやつがプログラミングを勉強しようかなと思った?と思われるんですが、
ちょっと教育関係の仕事もやってた過去もあり、教育のプログラムを作れない方と思ったわけです。実質今、中高生や英会話などのプログラムはいっぱい出ているけれども実際こういうローカル?に近い仕事の勉強方法なんてあんまり出てこないわけです。
ほとんど”柔道整復師”というキーワードを調べても、国家試験か求人くらいしか出てこないんですよ。学生時代の自分はどうしても楽をしたいなーと思ってても、過去問の本や教科書くらいしか勉強する道具がないんですよね。(ほんの少し国家試験アプリとかでてるけど、使いづらい)
今は、いろんなスマホでのツールがいっぱいありますけど、それを駆使して使うような学生も未だわずかなんですよね。(せいぜい教科書を写メってアプリで保存するくらい)教員側もたかをくくってるのか実際最終的には過去問を解けば問題ない。
というなもので変化がないんですよね。ならば、ネット上で学生が簡単に使えるようなツールを使ってしまえば、全体的に水準が高まるんじゃないかなと思ってるんですよね。
そんなこんなでとりあえず今は仕事の合間をぬってProgateを使って初心者講座をやってる次第であります。 HTML・CSSとPHPをやってる次第であります。
正直いえば、本格的なプログラマーさんからはそんなちまちまやってたらできるものもできないと思われても仕方ないと思いますが、一生懸命やっていきたいなと思います。
実際にやりたいことは、4択問題の作成プログラムを作りたいなと思ってます。
よくjavascriptで自動ツールがあると思いますが、もうちょっと分野別だったり文字検索だったりタグ付け、コメントができる機能が欲しいなと思ってます。こんな自分ですが、何かしらアドバイスいただけたら幸いです。















