20190411のHTMLに関する記事は13件です。

初心者teamlabのオンラインスキルアップ課題step1をやってみた(コード初心者向け記事)

dockerって何とか、DBとの連携でコード上で具体的にどうするのとか、初心者的にはイメージがつかないほど良くわからないので、teamlabさんのオンラインスキルアップ課題をやってみた。

こちらから課題にアクセスします。

STEP1の内容は下記のようになっています。

  1. インターネットのしくみ
  2. WEBサーバについて
  3. HTMLとCSSについて 4-a. 【Windows】Dockerと開発環境の作り方 4-b. 【Mac】Dockerと開発環境の作り方
  4. PHPを書いてみる
  5. PHPでGET/POSTをやってみる
  6. データベースについて
  7. SQLを書いてみる
  8. PHPでデータベースを操作してみる
  9. 10. GitとGitHubについて

4-b:【Mac】Dockerと開発環境の作り方

1,2,3はわかった気になってとりあえず進めて、まずは4のDockerのセットアップから入ります。

docker-compose -v

dockerがちゃんとインストールされているか上記のコマンドで確かめます。

docker-compose up -d

teamlabさんのサイトからダウンロードしたフォルダに遷移して、上のコマンドを叩くとコンテナを作成して、起動します。

※Dockerのコマンドに関してはこちら

スクリーンショット 2019-04-09 15.36.00.png
なんかいろいろエラーは起きたのですが、無事?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

スクリーンショット 2019-04-09 19.22.48.png

先程は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

スクリーンショット 2019-04-09 20.34.46.png

とりあえず、無事表示されました。

次は気が向いたらSTEP2をやります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者がteamlabのオンラインスキルアップ課題step1をやってみた(コード初心者向け記事)

dockerって何とか、DBとの連携でコード上で具体的にどうするのとか、初心者的にはイメージがつかないほど良くわからないので、teamlabさんのオンラインスキルアップ課題をやってみた。

こちらから課題にアクセスします。

STEP1の内容は下記のようになっています。

  1. インターネットのしくみ
  2. WEBサーバについて
  3. HTMLとCSSについて 4-a. 【Windows】Dockerと開発環境の作り方 4-b. 【Mac】Dockerと開発環境の作り方
  4. PHPを書いてみる
  5. PHPでGET/POSTをやってみる
  6. データベースについて
  7. SQLを書いてみる
  8. PHPでデータベースを操作してみる
  9. 10. GitとGitHubについて

4-b:【Mac】Dockerと開発環境の作り方

1,2,3はわかった気になってとりあえず進めて、まずは4のDockerのセットアップから入ります。

docker-compose -v

dockerがちゃんとインストールされているか上記のコマンドで確かめます。

docker-compose up -d

teamlabさんのサイトからダウンロードしたフォルダに遷移して、上のコマンドを叩くとコンテナを作成して、起動します。

※Dockerのコマンドに関してはこちら

スクリーンショット 2019-04-09 15.36.00.png
なんかいろいろエラーは起きたのですが、無事?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

スクリーンショット 2019-04-09 19.22.48.png

先程は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

スクリーンショット 2019-04-09 20.34.46.png

とりあえず、無事表示されました。

次は気が向いたらSTEP2をやります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

複数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はこちらから

はてなブックマークに追加
Pocketに追加

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

4/11 javascript 例外処理

javascript 例外処理

javascriptの例外処理構文

'use strict';
{
try { let result = 100 * num;
console.log(result);} catch (e)
{console.log(e.message); }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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などのソーシャルメディアでシェアをされた時に、よくあるやつ。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3235323636372f64383863326663352d323235372d666138622d623432312d3362613161306438303433352e706e67.png

必須項目
og:title ページタイトル
og:type  ページ種類(website、blog、video、article など)
og:image サムネイル画像
og:url webページのURL

OGPの設定の仕方

URLの正規化

<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ページをホーム画面に追加した時のアイコン画像として使用される。

2019年版ホームページのタブ画像作成と設定方法まとめ
favicon作成

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>

毎回書くのめんどくさいので、、、

参考記事

head内に書くべきタグの総まとめ

以上です。
変更や追加があったら随時更新します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Qiitaのサイトバグを見つけたのでコード解析 ? 原因見つけて報告 ? 一瞬で修正してくれました!【神対応】

バグの内容

Qiitaは通知が100件以上になると、「99+」と表示される仕様がありました。
しかし実はそのアルゴリズム、『トレンド画面』しか効いておらず、他の画面では『素の数字』が表示されていたのです。




他にも、結構通知を貯金されて気づいていらっしゃる方がいたんですね。Qiitaで有名な@suin さんまで・・・





『13954件ってなんだよ(羨望)(感動)』

早速Qiitaのコードを解析してみる

【1/2】トレンド画面

スクリーンショット 2019-04-11 21.34.31.png

【2/2】それ以外の画面

スクリーンショット 2019-04-11 21.35.09.png

既に構造が変わっていますね。
特にglobalHeaderなるidが、トレンド画面にしか存在していないのが気になります。
多分セレクタミスをしているのでしょうね。

スクリプトを調査するため、Source画面でJSファイルを掘り出してみましょう。

スクリーンショット 2019-04-11 21.38.12.png

いっぱいありますね!
QiitaはRuby on Railsで作られているので、サーバーが絡んでたら終わりです。
rbファイルとかphpファイルはSourceで確認できないからです。

とりあえず望みに賭けて、それっぽいjsファイルを目星付けてみます。
indexの隣にあったり、社名の入ったCDNの中なんかは当たりが多いですね。

スクリーンショット 2019-04-11 21.41.57.png

qiita用のCDN・・・これが怪しいですね。早速見てみましょう。
セレクタが不明なので、「99+」で検索してみます。
スクリーンショット 2019-04-11 21.47.19.png

い ま し た

変数名からして、こいつが99%悪さしてそうですね(99+だけに)。
中のコードはmin(最小化)されているので、beautifyして正体を顕にしてあげましょう
使うサイトはこちら⇛ https://beautifier.io/

これ?を・・・
スクリーンショット 2019-04-11 21.44.55.png

こう?します!
スクリーンショット 2019-04-11 21.45.04.png

変換したらsyntaxの効いているエディタにコピペして、解析を始めてみましょう。
スクリーンショット 2019-04-11 21.51.28.png

ここの部分ですね。

99<t.unreadNotificationsCount?"99+":t.unreadNotificationsCount
  • unreadNotificationsCountが99より大きい場合、"99+”に書き換える。
  • それ以外の場合は、unreadNotificationsCountのまま。

この処理が、トレンド画面にしか反映されていないわけです。
トレンド画面以外のページでは、「スキップしている」or「前の処理でエラーを起こしてしまっている」の2パターンが考えられますね。

そしたら色々、前の方の条件式を見てみるか・・・
あ り ま し た

スクリーンショット 2019-04-11 21.56.39.png

やっぱりglobalHeaderじゃないか!
関数の中まで追うまでもなく、このglobalHeaderが存在しないページでは以降の処理に不具合が出る事が想定されますね。
ここまでの検証はパッと5分程でした。

Qiitaに報告

Qiitaのお問い合わせからバグを報告してみます。

D33UNOqU4AE-Gzd.jpeg

こういうissue文が一番、プログラマーに文才を求められる瞬間ですね。
読み返すと非常に読みづらい・・・githubでこんなissue文書いたら、弾かれそうですね(笑)

結果

2時間で直してくれました。
神対応すぎる、さすがQiita様!

まとめ

全然技術的な話が無くって申し訳ありません。
一番言いたかった事は、そう、冒頭の

Increments株式会社なのにインクリメントの表示処理バグってる(笑)
この奇跡ともいえるギャグを広めたかっただけです・・・

改めて、光速の対応をして頂いたQiita運営様、本当にありがとうございました。
(できれば99+の方ではなく、無制限表示の方が嬉しいです・・・)

おまけ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.    

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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>

こうなる
image.png

でもこれ、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>

こうなる
image.png

この仕組みの何が嬉しいかというと、例えば、ユーザー毎に画面デザインを変えたい様な場合に、直接htmlでスタイルを弄ってしまうのではなく、あくまでデザインの指定はcssに寄せたままで値だけを切り替えるのを、htmlとcss間のやり取りだけで実現出来る所。
直接スタイルを弄るだと(<div style="background-color: blue;">みたいな形)、同じスタイルの指定がcssとhtmlで重複してしまうけれど、値だけ渡せれば、デザインはcssで決定するという原則を、ある程度守り続ける事が出来る。
さらにこの実現において、javascriptを通さずにいられる。
デザインはデザインの問題として完結出来るなら、それに越したことは無いので、こうやって閉じ込めてしまえると、気持ちがいい。

rails/haml/scssのアプリで動的に表示を切り替えるのに、大変お世話になりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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>

こうなる
image.png

でもこれ、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>

こうなる
image.png

この仕組みの何が嬉しいかというと、例えば、ユーザー毎に画面デザインを変えたい様な場合に、直接htmlでスタイルを弄ってしまうのではなく、あくまでデザインの指定はcssに寄せたままで値だけを切り替えるのを、htmlとcss間のやり取りだけで実現出来る所。
直接スタイルを弄るだと(<div style="background-color: blue;">みたいな形)、同じスタイルの指定がcssとhtmlで重複してしまうけれど、値だけ渡せれば、デザインはcssで決定するという原則を、ある程度守り続ける事が出来る。
さらにこの実現において、javascriptを通さずにいられる。
デザインはデザインの問題として完結出来るなら、それに越したことは無いので、こうやって閉じ込めてしまえると、気持ちがいい。

rails/haml/scssのアプリで動的に表示を切り替えるのに、大変お世話になりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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つもない場合、目次は表示されません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

#GCP ( Google Cloud Platform ) の Google翻訳API で #MarkDown を翻訳するとスタイルが崩れてしまうので #ruby gem で一旦 #HTML 変換してから Markdown に逆変換する #shell コマンドの例

Prepare

  • sudo gem install reverse_markdown
  • sudo 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 auth

translate.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

https://github.com/YumaInaura/YumaInaura/issues/1178

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

#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/markdown

single quote HTML escaped

<h1>header</h1>

<p><em></em></p>

<h2>header2</h2>

<ul>
<li>list</li>
<li>list</li>
</ul>

<p><code>
print(&#39;ok&#39;)
print(&#39;yes&#39;)
</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(&#39;ok&#39;)
print(&#39;yes&#39;)
</code></pre>

ruby karmdown

$ kramdown ./tmp/markdown

Indented

<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

https://github.com/YumaInaura/YumaInaura/issues/1174

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

接骨院の先生がはじめてプログラミングを勉強してみた

はじめまして
プログラミングとは全く関係のない仕事についています。
柔道整復師というやつです。
仕事内容として接骨院で捻挫などを治療する人です。
プログラマーさんだったら、腰痛などでお世話になっているかたも多いんじゃないでしょうか。

なぜそんなやつがプログラミングを勉強しようかなと思った?と思われるんですが、
ちょっと教育関係の仕事もやってた過去もあり、教育のプログラムを作れない方と思ったわけです。

実質今、中高生や英会話などのプログラムはいっぱい出ているけれども実際こういうローカル?に近い仕事の勉強方法なんてあんまり出てこないわけです。
ほとんど”柔道整復師”というキーワードを調べても、国家試験か求人くらいしか出てこないんですよ。

学生時代の自分はどうしても楽をしたいなーと思ってても、過去問の本や教科書くらいしか勉強する道具がないんですよね。(ほんの少し国家試験アプリとかでてるけど、使いづらい)
今は、いろんなスマホでのツールがいっぱいありますけど、それを駆使して使うような学生も未だわずかなんですよね。(せいぜい教科書を写メってアプリで保存するくらい)

教員側もたかをくくってるのか実際最終的には過去問を解けば問題ない。
というなもので変化がないんですよね。

ならば、ネット上で学生が簡単に使えるようなツールを使ってしまえば、全体的に水準が高まるんじゃないかなと思ってるんですよね。

そんなこんなでとりあえず今は仕事の合間をぬってProgateを使って初心者講座をやってる次第であります。 HTML・CSSとPHPをやってる次第であります。

正直いえば、本格的なプログラマーさんからはそんなちまちまやってたらできるものもできないと思われても仕方ないと思いますが、一生懸命やっていきたいなと思います。

実際にやりたいことは、4択問題の作成プログラムを作りたいなと思ってます。
よくjavascriptで自動ツールがあると思いますが、もうちょっと分野別だったり文字検索だったりタグ付け、コメントができる機能が欲しいなと思ってます。

こんな自分ですが、何かしらアドバイスいただけたら幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む