20220115のJavaScriptに関する記事は18件です。

Zoomのブレイクアウトルームってダサくない??

はじめに 私は現在大学4回生で論文のための実験をしているのですが、このご時世のため実験もオンラインで行うことになりました。 私の実験ではGoogle Formを使って協力者に動画の視聴→アンケート→テストという流れを2回繰り返すことでした。(下図が実験の流れ) 私は実験の協力者を募るため、教授の力を借り、Zoomでのオンライン授業で募集することになりました。 ここで問題が発生です。 上記の場合、Google FormのURLが4つあります。 どうやって4つのURLを均等に協力者に振り分けようかと私は思いました。 4つブレイクアウトルームに分かれてそれぞれに異なるリンクを貼る。→ 私がルーム毎に入退室を行う必要がある。時間がかかる。めんどくさい。 学籍番号を4で割った余り、学籍番号の下1桁でURLを指定する。 → 出席者の学籍番号は十中八九連番にはなっていなので、均等にならない。 4つのブレイクアウトルームに分かれてルームの番号を覚えてもらい、メインルームに戻り、その番号ごとにURLを指定する。 → ダサい!!!!そもそもブレイクアウトルームから戻ってこなさそう。 とりあえず私はブレイクアウトルームを断固として使いたくない!!! そこで私は何個か案を考えてみました。 ランダムジャンプするURLを貼る 実際に作った例 : https://tomomon.jp/programming/random_jump/ javascriptを使って作成する。 index.html <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>ランダムジャンプ</title> <script type="text/javascript"> <!-- var mylink = new Array( "https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s", "https://tomomon.jp/travel/my_secret_place/", "https://tomomon.jp/travel/travel_ranking/", "https://tomomon.jp/programming/ksnctf5/" ); function random_jump() { var i = Math.floor(Math.random() * mylink.length); location.href = mylink[i]; } // --> </script> </head> <body> <a href="javascript:random_jump();">ランダムに移動します</a> </body> </html> だだし、これは無作為にリンク先に飛ばされるので、偏る可能性がある。 また、新しいタブで開くとabout:blank#blockedとなってしまう。(Google Chromeの場合) 訪問順に異なるリンク先に移動させる アクセスカウンターの作成 とりあえず訪問者数を得たいので、アクセスカウンターを作成する。 実際に作った例 : https://tomomon.jp/programming/access_counter/ まず,訪問者数を格納する count.dat を作成する。 ディレクトリは下記の感じ。 % tree . . ├── count.dat └── index.php count.dat には初期値0を入れておく。 count.dat 0 index.php <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>アクセスカウンター</title> </head> <body> <div class="counter-area"> <!-- ファイルから取得したカウント数を表示する --> <p>あなたは<span class="access-count"><?php echo $count;?>番目</span>の訪問者です</p> </div> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 訪問者を訪問者数でグループに分ける。 訪問順に4つのリンクを順にアクセスするよう誘導する。 訪問者数を4で割った余って+1した番号のリンクを選ばせる。 index.php <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>アクセスカウンター</title> </head> <body> <div class="counter-area"> <!-- ファイルから取得したカウント数を表示する --> <p><span class="access-count">Link<?php echo $count%4+1 ;?></span>をクリックしなさい。</p> </div> <ul class="links"> <li><a href="https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s">Link1</a> <li><a href="https://tomomon.jp/travel/my_secret_place/">Link2</a> <li><a href="https://tomomon.jp/travel/travel_ranking/"> Link3</a> <li><a href="https://tomomon.jp/programming/ksnctf5/">Link4</a> </ul> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 表示されている4つのリンクから選んでクリックするのがダサいし面倒。間違えてクリックする可能性もある。 上記を組み合わせる 上記のアクセスカウンターを使って、ランダムアクセスを改良する。 アクセスjavascriptで書いたurlを格納した配列から訪問者数を4で割った余りを引数として、リンク先のURLを指定する。 index.html <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>ランダムジャンプ2</title> <script type="text/javascript"> <!-- var mylink = new Array( "https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s", "https://tomomon.jp/travel/my_secret_place/", "https://tomomon.jp/travel/travel_ranking/", "https://tomomon.jp/programming/ksnctf5/" ); function divide_links(num) { location.href = mylink[num]; } // --> </script> </head> <body> <div class="link"> <!-- ファイルから取得したカウント数を表示する --> <a href="javascript:divide_links(<?php echo $count%4 ;?>);">ここをクリックしてください。</a> </div> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 以下が実際に実装したもの。 これで均等にリンク先が訪問順に決定する。 また、クリックするところが一つしかないので、間違えることがなくなった。 最後に ブレイクアウトルームを使わずに済んだのですが、リンク先のURLをクリックさせるために一度HPを経由する必要があるのが少し気になります。リダイレクトを設定したらいいのかな? 普段、全くJavaScriptやPHPを触らないので、もっといい方法、間違っていることがあったら教えてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Zoomのブレイクアウトルームってダサくない??

はじめに 私は現在大学4回生で論文のための実験をしているのですが、このご時世のため実験もオンラインで行うことになりました。 私の実験ではGoogle Formを使って協力者に動画の視聴→アンケート→テストという流れを2回繰り返すことでした。(下図が実験の流れ) 私は実験の協力者を募るため、教授の力を借り、Zoomでのオンライン授業で募集することになりました。 ここで問題が発生です。 上記の場合、Google FormのURLが4つあります。 どうやって4つのURLを均等に協力者に振り分けようかと私は思いました。 4つブレイクアウトルームに分かれてそれぞれに異なるリンクを貼る。→ 私がルーム毎に入退室を行う必要がある。時間がかかる。めんどくさい。 学籍番号を4で割った余り、学籍番号の下1桁でURLを指定する。 → 出席者の学籍番号は十中八九連番にはなっていなので、均等にならない。 4つのブレイクアウトルームに分かれてルームの番号を覚えてもらい、メインルームに戻り、その番号ごとにURLを指定する。 → ダサい!!!!そもそもブレイクアウトルームから戻ってこなさそう。 とりあえず私はブレイクアウトルームを断固として使いたくない!!! そこで私は何個か案を考えてみました。 ランダムジャンプするURLを貼る 実際に作った例 : https://tomomon.jp/programming/random_jump/ javascriptを使って作成する。 index.html <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>ランダムジャンプ</title> <script type="text/javascript"> <!-- var mylink = new Array( "https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s", "https://tomomon.jp/travel/my_secret_place/", "https://tomomon.jp/travel/travel_ranking/", "https://tomomon.jp/programming/ksnctf5/" ); function random_jump() { var i = Math.floor(Math.random() * mylink.length); location.href = mylink[i]; } // --> </script> </head> <body> <a href="javascript:random_jump();">ランダムに移動します</a> </body> </html> だだし、これは無作為にリンク先に飛ばされるので、偏る可能性がある。 また、新しいタブで開くとabout:blank#blockedとなってしまう。(Google Chromeの場合) 訪問順に異なるリンク先に移動させる アクセスカウンターの作成 とりあえず訪問者数を得たいので、アクセスカウンターを作成する。 実際に作った例 : https://tomomon.jp/programming/access_counter/ まず,訪問者数を格納する count.dat を作成する。 ディレクトリは下記の感じ。 % tree . . ├── count.dat └── index.php count.dat には初期値0を入れておく。 count.dat 0 index.php <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>アクセスカウンター</title> </head> <body> <div class="counter-area"> <!-- ファイルから取得したカウント数を表示する --> <p>あなたは<span class="access-count"><?php echo $count;?>番目</span>の訪問者です</p> </div> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 訪問者を訪問者数でグループに分ける。 訪問順に4つのリンクを順にアクセスするよう誘導する。 訪問者数を4で割った余って+1した番号のリンクを選ばせる。 index.php <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>アクセスカウンター</title> </head> <body> <div class="counter-area"> <!-- ファイルから取得したカウント数を表示する --> <p><span class="access-count">Link<?php echo $count%4+1 ;?></span>をクリックしなさい。</p> </div> <ul class="links"> <li><a href="https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s">Link1</a> <li><a href="https://tomomon.jp/travel/my_secret_place/">Link2</a> <li><a href="https://tomomon.jp/travel/travel_ranking/"> Link3</a> <li><a href="https://tomomon.jp/programming/ksnctf5/">Link4</a> </ul> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 表示されている4つのリンクから選んでクリックするのがダサいし面倒。間違えてクリックする可能性もある。 上記を組み合わせる 上記のアクセスカウンターを使って、ランダムアクセスを改良する。 アクセスjavascriptで書いたurlを格納した配列から訪問者数を4で割った余りを引数として、リンク先のURLを指定する。 index.html <?php //カウント数が記録してあるファイルを読み書きできるモードで開く $fp = fopen('count.dat', 'r+b'); //ファイルを排他ロックする flock($fp, LOCK_EX); //ファイルからカウント数を取得する $count = fgets($fp); //カウント数を1増やす $count++; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>ランダムジャンプ2</title> <script type="text/javascript"> <!-- var mylink = new Array( "https://www.youtube.com/watch?v=vLV0UZ308bQ&t=155s", "https://tomomon.jp/travel/my_secret_place/", "https://tomomon.jp/travel/travel_ranking/", "https://tomomon.jp/programming/ksnctf5/" ); function divide_links(num) { location.href = mylink[num]; } // --> </script> </head> <body> <div class="link"> <!-- ファイルから取得したカウント数を表示する --> <a href="javascript:divide_links(<?php echo $count%4 ;?>);">ここをクリックしてください。</a> </div> </body> </html> <?php //ポインターをファイルの先頭に戻す rewind($fp); //最新のアクセス数をファイルに書き込む fwrite($fp, $count); //ファイルのロックを解除する flock($fp, LOCK_UN); //ファイルを閉じる fclose($fp); ?> 以下が実際に実装したもの。 これで均等にリンク先が訪問順に決定する。 また、クリックするところが一つしかないので、間違えることがなくなった。 最後に ブレイクアウトルームを使わずに済んだのですが、リンク先のURLをクリックさせるために一度HPを経由する必要があるのが少し気になります。リダイレクトを設定したらいいのかな? 普段、全くJavaScriptやPHPを触らないので、もっといい方法、間違っていることがあったら教えてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaScript関数

関数を定義する JavaScriptでは、関数は次のように定義される。 function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上記のabs()関数の定義は次のとおりです。 functionは関数を定義することを示す。 absは関数の名前です。 (x)のxは関数のパラメーターであり、複数のパラメーターは[,]で区切られている。 {...}の間のコードは関数本体であり、複数のコードを含める。 要注意:関数本体内のステートメントが実行される時、returnが実行されると、関数が実行完了、結果が返される。 したがって、条件付きの判断とループにより、関数内に非常に複雑なロジックが実装できる。 returnステートメントがない場合、関数は実行後に結果も返しますが、結果はundefinedです。 JavaScript関数もオブジェクトであるため、上記で定義したabs()関数は関数オブジェクトであり、関数名absは関数を指す変数と見られる。 したがって、関数を定義する2番目の方法は次のとおりです。 var abs = function (x) { if (x >= 0) { return x; } else { return -x; } }; このように、function(x){...}は無名関数であり、関数名はありません。 ただし、この無名関数は変数absに割り当てられているため、変数absを介して関数を呼び出すことができる。 上記の2つの定義は完全に同じです。 関数を呼び出す 関数を呼び出す時に、パラメーターを順序で渡す。 abs(10); // 10を返す abs(-8); // 8を返す 定義されているよりも少ないパラメータを渡しても問題はありません。 abs(); // NaNを返す この時点、abs(x)関数のパラメーターxはundefined受信され、結果はNaNです。 変数のスコープ JavaScriptでは、var宣言された変数はスコープされる。 変数が関数本体の内部で宣言されている場合、変数のスコープは関数本体全体であり、変数を関数の外部で参照することはできません。 function foo() { var x = 1; x = x + 1; } x = x + 2; // ReferenceError! 関数の外部で変数xを参照できません 2つの異なる関数が同じ変数を宣言する場合、その変数はそれぞれの関数の本体内でのみ機能する。つまり、異なる関数内の同じ名前の変数は互いに独立しており、互いに影響を与えません。 function foo() { var x = 1; x = x + 1; } function bar() { var x = 'A'; x = x + 'B'; } JavaScript関数はネスト(関数内関数)できるため、この時点で、内部関数は外部関数に定義された変数にアクセスできますが、その逆はできません。 function foo() { var x = 1; function bar() { var y = x + 1; // barはfooの変数xにアクセスできる } var z = y + 1; // ReferenceError! fooはbarの変数yにアクセスできません } 内部関数と外部関数の変数名が同じ名前の場合はどうなりますか?それをテストしてみましょう: function foo() { var x = 1; function bar() { var x = 'A'; console.log('x in bar() = ' + x); // 'A' } console.log('x in foo() = ' + x); // 1 bar(); } foo(); // 結果: // x in foo() = 1 // x in bar() = A これは、JavaScript関数が変数を探すときに独自の関数の定義から始まり、「内部」から「外部」まで検索することを示している。内部関数が外部関数と同じ名前の変数を定義している場合、内部関数の変数は外部関数の変数をシールドする。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

InDesign JavaScript XML 属性の名前を変更

属性の名前を変更するスクリプトは、これで良いのかな・・・? /* このスクリプトを利用して起こった不具合の責任は取れません。 ご了承下さい。 更新 2022/01/15 */ // アプリ指定 #target "indesign"; // スクリプト名 var scriptName = "属性の名前を変更"; // 変更名 var changeName = prompt("選択された属性の名前を変更します。" + "\r" + "名前を入力して下さい。", "", scriptName); // キャンセルされた時の処理 if(changeName == null){ // スクリプトを終了 exit(); } // スクリプトを実行 app.doScript(function(){ // 選択を入れる var selectionArray = app.activeDocument.selection; // 追加等の属性 var targetAttributeArray = []; // 結果数 var resultNumber = 0; // 選択の数だけ繰り返す for (var i = 0; i < selectionArray.length; i++){ // 選択が属性の場合 if (selectionArray[i].constructor.name == "XMLAttribute") { // 変更名と選択されている属性の名前が違う場合 if(selectionArray[i].name != changeName){ // 親要素に変更名の属性が存在する場合 if(selectionArray[i].parent.xmlAttributes.itemByName(changeName).isValid == true){ // 属性に値を入れる selectionArray[i].parent.xmlAttributes.itemByName(changeName).value = selectionArray[i].value; // 追加等の属性に追加 targetAttributeArray.push(selectionArray[i].parent.xmlAttributes.itemByName(changeName)); // 存在しない場合 }else{ // エラー処理 try{ // 属性を追加 targetAttributeArray.push(selectionArray[i].parent.xmlAttributes.add(changeName, selectionArray[i].value)); // エラーの場合 }catch(e){ // 警告 alert("属性名に使えない文字が含まれている様です。"); // 終了 exit(); } } // 選択されている属性を削除 selectionArray[i].remove(); // 結果数を追加 resultNumber++; // 名前が同じ場合 }else{ // 追加等の属性に追加 targetAttributeArray.push(selectionArray[i]); } // 違う場合 }else{ // 結果表示 alert("処理数 " + resultNumber, scriptName); // 終了 exit(); } } // 追加等の属性を選択 app.activeDocument.selection = targetAttributeArray; // 結果表示 alert("変更数 " + resultNumber, scriptName); // 一つのアンドゥ履歴にする }, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT, scriptName);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MapLibre GL JSがv2.0.0になりました

はじめに 昨年にプロプライエタリとなったMapbox GL JSのオープンソースフォークであるMapLibre GL JSのv2.0.0がリリースされました。これまでのアップデートは、Mapbox GL JS v1.13.0の機能を踏襲したマイナーアップデートが主でしたが、v2.0.0を迎え、本格的に機能が枝分かれしてきたので、これまでのアップデートによる変更点を紹介します。筆者の主観で、実用上大きな変更点だと思った箇所を列挙していきます。 チェンジログ v2.0.0より前は互換性が維持されていましたが、v2で多くの破壊的変更がありました。 TypeScriptで書き直された Mapbox GL JSはFlowによる型付けで、これは依然として変わっていません。フォーク後、割と早期にリライトが始まっていたと思います。使用者目線では、DefinitelyTypedから型定義持ってくる必要がなくなってうれしいですね。 型名の変更 TypeScriptで書き直された直後は型名はDefinetelyTypedに準拠していましたが、v2.0.0で型名が変わりました。 Style => StyleSpecification AnyLayer => LayerSpecification AnySourceData => SourceSpecification MapboxEvent => MapLibreEvent MapboxOptions => MapOptions MapBoxZoomEvent => MapLibreZoomEvent *SourceRaw + *SourceOptions => *SourceSpecification *Source (source implementation definition) were removed *Layer => *LayerSpecification *Paint => *LayerSpecification['paint'] *Layout => *LayerSpecification['layout'] MapboxGeoJSONFeature => GeoJSONFeature 地図を60度以上に傾けられるようになった Mapbox GL JSからのフォーク時には、地図の傾き(pitch)は60度が上限でした。この上限が85度になりました。わりとうれしい。 Mapbox-APIへの依存がなくなった Mapbox GL JSでは、styleのURL指定において、mapbox://というprefixがMapbox-APIに関する特別な意味を持っており、mapboxTokenを用いて認証していましたが、この仕様が削除されました。Mapbox-APIを使うならMapbox GL JSを使うでしょうから、困る人はいないでしょう。 OSSとマネタイズの関係は色々考えさせられます TypeScriptによる実装例 <div id="map" style="height: 100vh"></div> import { Map, StyleSpecification } from 'maplibre-gl'; import 'maplibre-gl/dist/maplibre-gl.css'; const style: StyleSpecification = { version: 8, sources: { OSM: { type: 'raster', tiles: ['http://tile.openstreetmap.org/{z}/{x}/{y}.png'], tileSize: 256, attribution: '<a href="http://osm.org/copyright">© OpenStreetMap contributors</a>', }, }, layers: [ { id: 'OSM', type: 'raster', source: 'OSM', minzoom: 0, maxzoom: 18, }, ], }; const map = new Map({ container: 'map', style, center: [140, 40], zoom: 5, maxPitch: 85, // デフォルト値は60 }); 終わりに v2.0.0となり、Mapboxとは違う方向への変化が本格化しそうです。AWSでもベクタータイルの配信が始まり、そのフロントエンドはMapLibre GL JSの利用が想定されていたり、おっきい会社さんのコミッターがいらっしゃるらしかったり、今後も安定したメンテナンスが期待されます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TypeScript または JavaScriptで作りたいプログラムの仕様:Web上の値の更新と合計

タイムリープTypeScript 〜TypeScript始めたてのあの頃に知っておきたかったこと〜 Advent Calendar 2021 TypeScript始めたてに知ったこと 知ることより、実現することが大事。 「知っている」ことと「実現する」こと データサイエンティストの気づき『勉強だけして仕事に役立てない人。大嫌い』それ自分かもってなった。 背水の陣はしけた。 仕様 作りたいのは、Qiitaの記事で、記事のviewsなどを集計している表の、値を最新値に更新し、集計すること。 Qiita記事(そのうち、他の記事でもの拡張性は考慮してもしなくてもよい。) 記事中にURLがある。 URLへ接続し、viewsの最新値を取得(いいね(LGTM)、stockなどへの拡張性は考慮してもしなくてもよい。) 記事中の値を最新値に更新。 合計を再計算。 一部の機能だけだったり、いろいろな制約がついてもかまわない。 対象 Qiita記事 いいね と views の関係。Qiita(16)。統計と確率(21) 「色 いろいろ」 Advent Calendar 2021 一覧 Advent Calendar 2022 計画と記録 Advent Calendar 2021 への招待記事 views 順番の推移 viewsが1,000,000, goodsが10,000が第五目標を達成した人、達成していない人。 記録 過去にも、一度やりかけたことがある。 views一覧を作るまで(第一日目) Qiita(27)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Reactで手書き風アニメーションしたい!

はじめに こんにちは!UI/UX大好きそるとです! 突然Reactで手書き風アニメーションをしてみたくなったのでやってみました。 Reactじゃなくても使える方法なのでぜひ参考にしてみてください! 前提 僕のこんな突然の思いつきにお金を投資するのはもったいなので以下の条件でできる方法を探してみました。 課金したくない めんどくさくない カスタムできる 実現方法 1. Figmaで手書き文字を書く Figmaとは、ブラウザ上で簡単にデザインができるツールです。フリープランがあり無料で利用できるので、誰にでも手軽に導入することができます。 タブレットとタッチペンがあれば尚よしですが、無い人も最悪マウスで書くことができます。 Figmaを起動したらメニューにあるペンマークのアイコンから「Pencil」を選択して自分が好きな文字を書きます。 こんな感じ ↓ 2. 手書き文字をSVG形式でエクスポート 書いた文字を選択し、画面右下の「Export Group 1」をクリックしてSVG形式でエクスポートします。 3. エクスポートしたSVGをプロジェクトフォルダにコピー エクスポートしたSVGを自分のプロジェクトフォルダの好きな場所にコピーします。 4. vivus.jsをインストール vivus.jsは簡単に手書きSVG画像をアニメーションさせることができるライブラリです。SVG画像のパスが一つひとつ線を描いているようなアニメーションを作ることができます。 $ npm install vivus 5. 実装 作成したSVGをインポートしてvivusを実行すれば手書き風アニメーションの完成です! App.js import { useEffect } from "react"; import title from './title.svg' //手書き文字のSVG import Vivus from "vivus"; function App() { useEffect(() => { // アニメーション new Vivus('title', {duration: 300, file: title, type: "oneByOne"}); },[]) return ( <div id="title"/> ); } export default App; 完成イメージ 初期起動時のローディングアニメーションとして使用しても良いですよね 補足 今回はFigmaを使ってSVG画像を作成しましたが、Illustratorやその他のデザインツールを使用しても同じことができます。あくまで無課金で実現したかったのでFigmaを使用しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[備忘録] pdf.jsで日本語が読み込めない場合はcMapを設定する必要があった

このバージョンを使用しました。 "pdfjs-dist": "^2.12.313", npmでpdfjsをインストールしてelectronで使おうとしたとき、このようなエラーが出て一部の日本語がレンダリングされない問題に引っかかりました。 Warning: loadFont - translateFont failed: "TypeError: Failed to fetch". Warning: Error during font loading: Failed to fetch getDocumentするときにcMapフォルダがある場所を指定してやると表示されるようになりました。 pdfjs.getDocument({ url: path, cMapUrl: "cmaps/", cMapPacked: true, });
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

BigQueryのUDFをJavaScriptで定義すると、int型の引数はstring型の値としてインタープリタに渡ってくる

掲題のとおり。 実行例
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【具体例あり】変数・定数宣言の時の論理演算子 && と || の挙動と AND, OR の結びつけ【 Javascript 】

この記事を書いた経緯 普段このような認識で開発していたのですが、ふと気になって、何で変数・定数宣言の時の論理演算子 && と || って何であの挙動になるのかについて調べてみました。 MDN の ・論理積 (&&) - JavaScript | MDN ・論理和 (||) - JavaScript | MDN を読んでみてもピンと来なかったのですが、 読んだ内容を整理して自分で色々実験してみたら、どうしてその挙動になるのかが分かりました。 同じ道を辿る方は多くいらっしゃると思うので、内容をまとめて投稿しました。 筆者のこれまでの状況 普段 && と || は完全に AND と OR のつもりで使っている。 「&& は左側が true の時に右側のものが返される、 || は左側が false の時に右側のものが返される」ということ自体は知っていたけど、前述の AND や OR とは全く別の使い方だと思っていた。 結論 → 別の使い方ではありませんでした。 (むしろ、本来の用法は後者で、前者の使い方はその応用でした) 実験してみた ① && の場合 ( boolean && boolean ) true && true // 左側が true なので、右側の true が返される 結果 : true true && false // 左側が true なので、右側の false が返される 結果 : false false && true // 左側が false なので、左側の false が返される 結果 : false false && false // 左側が false なので、左側の false が返される 結果 : false ② || の場合 ( boolean || boolean ) true || true // 左側が true なので、左側の true が返される 結果 : true true || false // 左側が true なので、左側の true が返される 結果 : true false || true // 左側が false なので、右側の true が返される 結果 : true false || false // 左側が false なので、右側の false が返される 結果 : false たしかに、 AND と OR と同じ動き方しとる!! Σ ( ゜゜) ちなみに… JavaScript において、 true とみなされるもの、 false とみなされるもの ・Truthy (真値) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN こちらに書かれている通り、 false 0 -0 0n "" // 空の文字列。 '' や `` も当てはまる。 null undefined NaN これらが false とみなされ、それ以外のものは true とみなされます。 なので、あまり見ない記法なのですが const name = 0 || 'Tomoki'; console.log(name); // Tomoki const age = 'aiueo' && 25; console.log(age); // 25 一応こんな感じにも書けます。(わざわざこう書くべき状況は思いつかないのですが) まとめ 「&& は左側が true の時に右側のものが返され、 || は左側が false の時に右側のものが返される」 AND , OR として && , || を使う用法は、上記を利用している。 勉強している時は何でもそうですが、ただ暗記するよりも、しつこいくらい丁寧に確かめてみて腑に落ちる状態にする & 有機的に意味や用法を結びつける事が大事だなと改めて思いました。 参考 ・論理積 (&&) - JavaScript | MDN ・論理和 (||) - JavaScript | MDN ・Truthy (真値) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【個人開発】海とサーフィンが好きすぎて、海のように見え方が変わるサーフィン日記共有サービスを作ってみた。

はじめに 天気が雪の日は雪が降ります。 サーフィンをしたことがありますか? 一度きりの人生、自然と一体になれるこんな素晴らしいスポーツをやってみる事もしないなんて勿体ない事です。 私は海とサーフィンを愛しています。 自身の大好きなものを題材に作品を作って誰かの心に届くものにしたい!そんな想いがあります。 初めまして。りゅうじと申します。 【Twitter】 https://twitter.com/otokomigakimasu 【今回作ったサービス】 https://www.namikki.jp 私はエンジニアの方は全員海の近くに住んでサーフィンをした方がいいと思っています。 メリット 都会で家賃が高い→海の側なら家賃が安い ジムで筋トレ→サーフィンで筋トレ 日頃PCから電磁波を浴びている→サーフィン(素足で浜辺を歩くことでアーシングする) 散歩して日光を浴びてセロトニンを出したい→サーフィンは太陽光を浴びられます サウナと水風呂で整いたい→サーフィンは本当に整います ダイエット→サーフィンすれば痩せて引き締まります メンタルが不安定→サーフィンすると気持ちが明るくなります アンチエイジング→サーフィンしてる方は皆さん若々しいです これら表面的なものは付加価値です。 実際にやってみると本質はここではありません。 自然に発生する波と一体になる感覚は筆舌に尽くし難いものです。 サーフィンの道具を買うといった初期投資も、家賃の差額とジムに通っている方ならジムの会員費1年分あれば十分元が取れてしまうでしょう。 正直きっかけはなんだっていいのです。 さあ、サーフィンしましょう! Namikki(なみっき) https://www.namikki.jp/ サービス概要 愛知県田原市の伊良湖エリアのサーファーがサーフィン日記を共有できるSNSサービスです。 エリアを限定して始動しましたが、これから私が様々な地域でサーフィンする中で拡張していく予定です。 1. 田原市の3時間ごとの天気予報5日間分を表示 2. 投稿機能 (無限スクロールにしました) サーファーはスマートフォンからSNSに投稿される方が多いので、スマホファーストの実装しています。 そのため、無限スクロールを採用しました。 3. いいね・コメントがあった場合に通知機能をつけました。 自身の投稿・自身がコメントした投稿したコメントに反応があると右上のベルに赤いマークがついて通知がきたとわかるようにしました。 このサービスが交流のきっかけになってもらえたらと思い実装しました。 通知ページ 使用技術 Ruby 2.7.2 Rails 6.1.4.1 JavaScript 主なGem better_errors bullet sorcery carrier_wave rails_admin factory-bot capybara pry-byebug rubocop テスト RSpec フロントライブラリ JQuery ストレージサービス Amazon S3 ER図 こだわったポイント 海はその日の天気によって見え方が変わるので Namikkiも同様にするために…。 取得した天気予報に応じて背景画像を変化させました 雨の日 雷雨 雪の日 今後実装したい事 今後、自身が実際にサーフィンしたエリアも追加します 返信相手を指定してその人にのみ通知がいくようにする(現状は投稿にコメントした人全員に通知がいきます) 終わりに 最後まで読んでいただきありがとうございました。 これからサーフィンを始める方にとっては、初めてサーフィンをした日記からつけていただき感じた事を記録しておくと財産になります。 今回リリース時では私の地元の海、伊良湖エリアを限定にしたサービスにしました。 実際にこれから、様々な海でサーフィンしていき、その都度このサービスを拡張させていきたいと考えています。 自分の作った作品と共に成長したい!と考えています。 【Twitter】 https://twitter.com/otokomigakimasu 【今回作ったサービス】 https://www.namikki.jp
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Uncaught TypeError: Cannot set properties of null (setting 'onclick')

前提 「クリック」の文字をクリックすると「クリックされた!」に変換するプログラムの作成。 以下のエラーがでた。 Uncaught TypeError: Cannot set properties of null (setting 'onclick') HTML <body> <div id="text-button"><p id="text">クリック</p></div> </body> Javascript document.getElementById("text-button").onclick = function() { document.getElementById("text").innerHTML = "クリックされた!"; }; 解決法 以下に変更。 Javascript window.onload = function () { document.getElementById("text-button").onclick = function () { document.getElementById("text").innerHTML = "クリックされた!"; }; }; window.onload = function () とは ページが完全に読み込まれた直後に実行させたいスクリプトを書く方法である。 原因 <div id="text-button"><p id="text">クリック</p></div> が実行される前に document.getElementById("text-button").onclick = function() { document.getElementById("text").innerHTML = "クリックされた!"; }; が実行されているから document.getElementById("text-button").onclickが nullになり、エラーが出る。 "text-button"なんて無いって言われている。 終わりに 実行タイミングを理解する必要がある。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

'el' is defined but never used no-unused-vars...の解決方法。

Vue.jsでVue CLIを使った環境で学習していて、 npm run serveでサーバー立ち上げた際に問題が起こりました。 kushiyama_makoto@MakotonoMacBook-Air udemy-vuejs4 % npm run serve > udemy-vuejs4@0.1.0 serve > vue-cli-service serve INFO Starting development server... 98% after emitting CopyPlugin ERROR Failed to compile with 1 error 14:40:38 error in ./src/App.vue Module Error (from ./node_modules/eslint-loader/index.js): /Users/kushiyama_makoto/udemy-vuejs4/src/App.vue 75:19 error 'el' is defined but never used no-unused-vars 89:18 error 'el' is defined but never used no-unused-vars 92:22 error 'el' is defined but never used no-unused-vars 95:19 error 'el' is defined but never used no-unused-vars 109:18 error 'el' is defined but never used no-unused-vars 112:22 error 'el' is defined but never used no-unused-vars 119:1 error Irregular whitespace not allowed no-irregular-whitespace ✖ 7 problems (7 errors, 0 warnings) @ ./src/main.js 6:0-28 10:13-16 @ multi (webpack)-dev-server/client?http://192.168.11.4:8080&sockPath=/sockjs-node (webpack)/hot/dev-server.js ./src/main.js 「elが定義されてるけど、一度も使用されてない???」 ちょっとよくわからないので、しばらくググってましたが時間だけが過ぎました。(土日だけ勉強に当ててるので、1週間くらいかかりました。意味わからんくて寝込みました。) ただある日、記事にたどり着いいたので紹介します。こちらです。 https://qiita.com/Nelson605/items/8b1a4cefef7a84a0dec0 こちらに記述されている部分のどこかのファイルに記述するのかな(おそらくjsonファイルかな)。。。 さらにこちらのstackOverFlowの記事にさらに細かくありました!! https://stackoverflow.com/questions/61874994/vue-disable-no-unused-vars-error-the-simplest-fix やはりpakage.jsonに追記するみたいです。 実際に追加しました。 動いた!!! 因みに、このような記事もありました。 https://qiita.com/blajir/items/82127aaa57e4d73a8389 原因は、 JavaScriptの構文チェックツールが動いたからですかね。 なので、今回の対応はチェックツールのno-unused-varsを無効することによってエラーを解消したようです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

'el' is defined but never used no-unused-vars...のエラー解決方法。

Vue.jsでVue CLIを使った環境で学習していて、 npm run serveでサーバー立ち上げた際に問題が起こりました。 kushiyama_makoto@MakotonoMacBook-Air udemy-vuejs4 % npm run serve > udemy-vuejs4@0.1.0 serve > vue-cli-service serve INFO Starting development server... 98% after emitting CopyPlugin ERROR Failed to compile with 1 error 14:40:38 error in ./src/App.vue Module Error (from ./node_modules/eslint-loader/index.js): /Users/kushiyama_makoto/udemy-vuejs4/src/App.vue 75:19 error 'el' is defined but never used no-unused-vars 89:18 error 'el' is defined but never used no-unused-vars 92:22 error 'el' is defined but never used no-unused-vars 95:19 error 'el' is defined but never used no-unused-vars 109:18 error 'el' is defined but never used no-unused-vars 112:22 error 'el' is defined but never used no-unused-vars 119:1 error Irregular whitespace not allowed no-irregular-whitespace ✖ 7 problems (7 errors, 0 warnings) @ ./src/main.js 6:0-28 10:13-16 @ multi (webpack)-dev-server/client?http://192.168.11.4:8080&sockPath=/sockjs-node (webpack)/hot/dev-server.js ./src/main.js 「elが定義されてるけど、一度も使用されてない???」 ちょっとよくわからないので、しばらくググってましたが時間だけが過ぎました。(土日だけ勉強に当ててるので、1週間くらいかかりました。意味わからんくて寝込みました。) ただある日、記事にたどり着いいたので紹介します。こちらです。 https://qiita.com/Nelson605/items/8b1a4cefef7a84a0dec0 こちらに記述されている部分のどこかのファイルに記述するのかな(おそらくjsonファイルかな)。。。 さらにこちらのstackOverFlowの記事にさらに細かくありました!! https://stackoverflow.com/questions/61874994/vue-disable-no-unused-vars-error-the-simplest-fix やはりpakage.jsonに追記するみたいです。 実際に追加しました。 動いた!!! 因みに、このような記事もありました。 https://qiita.com/blajir/items/82127aaa57e4d73a8389 原因は、 JavaScriptの構文チェックツールが動いたからですかね。 なので、今回の対応はチェックツールのno-unused-varsを無効することによってエラーを解消したようです。 ※追記 普通にpackage.jsonにrulesの項目あるのでここ(下記のスクショ)に追加でよかったみたいです。。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【超入門】JavaScriptの超基本を自分の言葉で解説してみた

目次 1.はじめに 2.JavaScriptとは 3.JSファイルの読み込み 4.開発者ツール 5.console.log 6.コメントアウト 7.変数 【この記事を読むのはこんな人】 ・HTML、CSSは理解出来ている ・JavaScriptを始めたが全く理解できない ・実際にJavaScriptを使用するイメージがつかない 1. はじめに 副業で自分のアウトプットも兼ね、エンジニア未経験の方にプログラミングを教え始めたのですが、フロントエンドを目指す方にとって、JavaScriptが一つ大きな壁であることが分かりました。 「HTMLとCSSは何とか出来たが、JavaScriptに入った途端全然理解できなくなった」 「console.logって画面に表示されないけど使うの?」 「getElementByidとか長すぎるし何でこれを使うのか分からない」 と、初歩的な部分がどうしても理解できず、先へ進めないとのことでした。 HTML、CSSと進み、次のJavaScriptで挫折しそうな初心者の方へ向けて、疑問を少しでも解消出来れば良いなと思い、記事に起こしました。 2. JavaScriptとは 一言でいえば「模型を生き物にするもの」です。 まず模型はHTML、CSSで作成します。 今回は猫の模型でイメージしてみましょう。 猫の模型.png HTMLで猫の骨格を作成して、CSSで肉の大きさや毛の色を調整しています。 ※上記はあくまでイメージの画像です。 実際にHTMLやCSSでこの猫ちゃんを作成しようとすると非常に手間がかかると思われます(笑) この動けない模型のままでは可哀そうなので、JavaScriptで生き物にしてあげましょう。 ・猫を触ると「ニャー」と鳴く処理 模型の状態だと動かないから「静的なWebページ」 生き物にすると動くから「動的なWebページ」 動かないから静的、動くから動的。こんな感じの理解でOKです。 ※CSSアニメーションとかでも動的にも出来ますが、 今回はJavaScriptのイメージをつかむという観点なので置いておきます。 3. JSファイルの読み込み JavaScriptは下記のように読み込みます。 <script type="text/javascript" src="./js/cat.js"> </script> 実際のコード <./js/cat.jsの中身> <フォルダ構成例> ここで混乱するかと思われる点は「外部定義」と「直接定義」です。 簡単に言えば、上記のようにJavaScriptを記述したファイルを外部から読み込ませるか、HTMLに直接記述してしまうかという点です。 直接定義例 2つの定義ともメリットデメリットはありますが、今はこの程度の認識でOKです。気になった方は調べてみてください。 私自身は外部定義で記述することが多かったです。 (フォルダ分けがパッとみてわかりやすいため) 作業の内容や仕事の現場によりけりな部分もあるので、その都度確認してみてください。 4. 開発者ツール HTML、CSS、JavaScriptの状態を検証できる必須と言っても良いツール。 コードの対応箇所やエラー検証、デバッグに使用される。 Windowsの場合「F12」 Macの場合「Command + Option + i」を押せばツールが開く。 ※下記の参考例はMacです 記述したHTMLに対応する箇所が青くなります 下記例はタグに触っているため、全体が青くなってます ブラウザ上でcssを変更してみたり、サーバーへのリクエスト値を変えたりと 開発者ツールを極めて損はありません。 後述するconsole.logの値が見られるのも機能の一つです。 具体的に説明しすぎると長くなるため、必要な時に随時調べて使用していくのが良いかと思われます。 5. console.log console.logは名前の通り「コンソールにログ」を残せるものです。 コンソールは開発者ツールから見ることができます。 ブラウザ(画面)上で表向きには表示させず、 猫が鳴いた処理の開始と終了を知らせる console.log記述例 ブラウザ上の開発者ツールで見た時の挙動 ここで初学者の方は疑問に思うかもしれません。 「F12を押さないと見れないの?」 「直接画面上に表示されないのに何の意味があるの?」 このような疑問を持った方は、次のように考えてみてください。 外面と内面は違う HTMLで外面が表示されている時、JavaScriptの内面では様々なことが行われています。 開発者ツールでは、その内面で行われているJavaScriptの処理を確認することが出来るのです。 また、console.logはJavaScriptのデバッグにもよく使用されています。 6. コメントアウト コメントアウトは自分、あるいは人に見せるためのメモ書きです。 これで記述した文字はコードとして認識されず、ブラウザにも表示されません。 最初コードを書くのに慣れない場合は、言語化し理解を深めるため、積極的に書いていくのも良いでしょう。 コメントアウト例 ・「//」と記述してから行末までの部分 ・複数行記述する場合は「/**/」 ※言語によってコメントアウトの方法が違う場合があるため注意 「//」を使用した例 HTMLで<!-->を使用した例 コードの説明や一時的にコードを無効化させて 後でコードを復活させたい場合に利用する。 頻繁に利用シーンがあるので慣れておきましょう。 7. 変数 「値を入れておく箱」と例えられることが多いです。 では、箱って具体的に何が出来るでしょうか? 中に物を入れる var box = '荷物'; 中の物を出す var box = '荷物'; // 「荷物」と表示される console.log(box); 中の物を交換する var box = 'りんご'; // この時点では「りんご」と表示 console.log(box); // 中身を交換する box = 'いちご'; // 「いちご」と表示される console.log(box); 運べる // それぞれ箱を用意 var box1 = 'りんご' var box2 = 'いちご' var box3 = 'みかん' // 順番にトラックへ箱を積んでいく(配列) var truck = []; truck[0] = box1; truck[1] = box2; truck[2] = box3; // 「0:"りんご" 1:"いちご" 2:"みかん"」と表示 console.log(truck); ★変数宣言 コンピューターにこれからこの箱を使いますよと教える JavaScriptは主に「var」「let」「const」3種類の宣言方法がある 「変数は値を入れる箱」としてイメージのままで、私の覚え方を下記に記載します。 ①var 無料の開けっ放しの箱。 開けたままのため何処からでも中の物を出し入れ可能。(再代入〇) 無料のため再度箱の作り直し可能。(再宣言〇) ②let 高級な開けっ放しの箱。 開けたままのため何処からでも中の物を出し入れ可能。(再代入〇) 高級なため再度作り直しは不可。(再宣言×) ③const 箱に中身を入れ、ガムテープでガチガチに蓋をした箱。 そのため再度開けて物の出し入れ不可。(再宣言・再代入×) 中身がもう変わらないため分かりやすい。 コード例) // var=無料の開けっ放しの箱 var freeBox = 'りんご'; // 再代入〇 freeBox = 'いちご' // 「いちご」と表示 console.log(freeBox) // 再宣言〇 var freeBox = 'みかん'; // 「みかん」と表示 console.log(freeBox) // let=高級な開けっ放しの箱 let luxuryBox = 'ぞう' // 再代入〇 luxuryBox = 'ごりら' // 「ごりら」と表示 console.log(luxuryBox) // 再宣言×(エラー) let luxuryBox = 'きりん' // 箱に中身有でガチガチに蓋をした箱 const closedBox = 'ピカチュウ' // 再代入×(エラー) closedBox = 'フシギダネ' // 再宣言×(エラー) const closedBox = 'リザードン' ざっくりでもイメージ出来れば御の字のため、 ひとまずスコープやホスティングは置いておきます。 それぞれの細かな違いについて気になる方は自分で調べてみてください。 ※気が向いたら記事にするかも。。 まとめ 最初は「自分の記述したコードがイメージ通りに動作する」という 楽しさを知ることが、継続に繋がる一つではないかと考えております。 暗中模索で進めていく楽しさもありますが、その楽しさはある程度慣れてから生まれるものです。 プログラミング開始初っ端でつまづくほどきついことはないと思います。 (2年前未経験からエンジニアを目指した自分がそうでした笑) 閲覧数やブックマークなど反応がいくつかあれば、別記事でJavaScriptに関して投稿するかもです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Javascript/Typescript】fetch APIでmultipart/form-dataを送信したい(備忘録)

結論 Content-Typeに値を設定しない & FormDataオブジェクトをbodyにセット FormDataオブジェクトをbodyにセットすれば、fetch APIが予期に計らって、HTTPリクエストを作ってくれるようです。 サンプルコード ※ TSで書いてるので型まわりのコードも含まれています。 type contentProps = { title: string, description: string, image: Blob | null } const CreateContent = async (props: contentProps) => { const headers = new Headers({ // 略 }) const body = new FormData() body.append("title", props.title) body.append("description", props.description) if (props.image != null) { body.append("image", props.image, 'image.jpg') } const data: RequestInit = { method: 'POST', headers: headers, body: body } const response = await fetch('http://localhost:8080/contents', data) .then((response) => {return (response.json()).then((data) => {return data})}).catch((error) => { console.log(error) }) return response } 備考:NGだったパターン Content-Typeにmultipart/form-dataをセット。 Content-Typeにmultipart/form-data; boundary=-------------------[ランダム半角英数列] bodyからContent-Typeを削除する(StackOverflow) 2つ目bodyのセットの仕方によってはうまくいくかもしれない。 3つめのContent-Type削除はおそらく特殊ケース。 参考 どんぴしゃだったStackOverflowの質問 FormData#append (MDN)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HTMLとCSSとJavaScriptをひたすら書いて動かして理解する【1回目】

はじめに 最近は仕事でhtmlとcssとJavaScriptを使う機会が多くなりました。期待通りに動くものは作れるものの基本的な理解が追い付いていないような気がする今日この頃です。なので、基本的なことから、積み上げて、この記事に書いていこうと計画を立てております。 まずは最も単純なページを作成する index.html <html> <head> <meta charset="utf-8"> <title>タイトル</title> </head> <body> ボディ </body> </html> ビデオを再生する機能を追加する 動画ファイルを準備します。 今回はWindowsのカメラ機能を使って動画を作成しました。 1.Windowsスタート⇒カメラでカメラ機能を起動します。 2.ビデオのボタンを押して、ビデオの撮影を開始します。 3.録画停止ボタンを押して、録画を停止します。 4.ピクチャフォルダのカメラロールフォルダにmp4ファイルが生成されます。 5.mp4ファイルのファイル名をtest01.mp4に変更します。 index.htmlにvideoタグのプログラムを1行追加します。controlsを付けると再生ボタンが表示されますので付けましょう。 index.html <html> <head> <meta charset="utf-8"> <title>タイトル</title> </head> <body> <video src="./test01.mp4" width="640" height="480" controls /> </body> </html> そして、index.htmlとtest01.mp4を同じフォルダに配置して、index.htmlをダブルクリックします。さっきのmp4がブラウザで再生することができました。 ビデオ再生画面を複数並べます。 まずは横並びにします。 <video>タグを</video>で閉じています。 index.html <html> <head> <meta charset="utf-8"> <title>タイトル</title> </head> <body> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> </body> </html> 横に並びました。 つぎは縦並びにします。 </video>に<br>で改行を追加しました。 index.html <html> <head> <meta charset="utf-8"> <title>タイトル</title> </head> <body> <video src="./test01.mp4" width="640" height="480" controls ></video><br> <video src="./test01.mp4" width="640" height="480" controls ></video><br> <video src="./test01.mp4" width="640" height="480" controls ></video><br> <video src="./test01.mp4" width="640" height="480" controls ></video><br> <video src="./test01.mp4" width="640" height="480" controls ></video><br> <video src="./test01.mp4" width="640" height="480" controls ></video><br> <video src="./test01.mp4" width="640" height="480" controls ></video> </body> </html> 縦に並びました。次はcssを使用して縦並びにします。 つぎはcssを使用して縦並びにします。 index.cssファイルを作成して、index.html,test04.mp4と同じフォルダに配置します。<br>は削除します。 index.html <html> <head> <link rel="stylesheet" href="index.css"> <meta charset="utf-8"> <title>タイトル</title> </head> <body> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> </body> </html> ビデオ属性をブロック要素にするだけで縦に並びます。 index.css video { display:block; } cssを編集して、斜めに並べます。 index.css video { display:block; } video:first-child{ margin-left:0em; } video:nth-child(2){ margin-left:40em; } video:nth-child(3){ margin-left:80em; } video:nth-child(4){ margin-left:120em; } video:nth-child(5){ margin-left:160em; } video:nth-child(6){ margin-left:200em; } video:nth-child(7){ margin-left:240em; } マウスオーバーしたビデオを拡大するようにしてみます。 index.htmlを編集します。<video>を<div>要素で囲みます。classはclass01を付与。 index.html <html> <head> <link rel="stylesheet" href="index.css"> <meta charset="utf-8"> <title>タイトル</title> </head> <body> <div class="class01"> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> <video src="./test01.mp4" width="640" height="480" controls ></video> </div> </body> </html> index.css .class01 video { transition: 1.0s; } .class01 video:hover { transform: scale(1.5, 1.5); } video { display:block; } video:first-child{ margin-left:0em; } video:nth-child(2){ margin-left:40em; } video:nth-child(3){ margin-left:80em; } video:nth-child(4){ margin-left:120em; } video:nth-child(5){ margin-left:160em; } video:nth-child(6){ margin-left:200em; } video:nth-child(7){ margin-left:240em; } マウスオーバーしたビデオが拡大されました。今回は1.5倍。transformのscaleを1.5にしているので。ちなみに、transitionの1.0sは拡大するまでの秒数です。10sとかにしてみると、拡大するまでに時間が掛かって気持ち悪い動きになります。 おわりに 今回は、ブラウザで動画を再生する簡単なプログラムを作成しました。引き続き、簡単なプログラムをひたすら書いて記事にしていこうと思います。 それでは、また。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JSON.stringifyのreplacer関数内のif文の条件にtypeofが必要な理由は?

オブジェクトからJSON文字列を作成するには、JSON.stringifyを使います。 JSON.stringifyは、target、replacer、spaceの引数があります。 replacer関数内のif文の条件typeofが無い場合は、undefinedになってしまいます。 const target = {a: "apple", b: "banana", l: "lemon"}; function replacerNG(prop, value) { if (value !== "banana") { return } return value; } console.log(JSON.stringify(target, replacerNG)); > undefined replacer関数内のif文の条件typeofがある場合は、条件にあった「banana」が変換されています。 const target = {a: "apple", b: "banana", l: "lemon"}; function replacerOK(prop, value) { if (typeof value === "string" && value !== "banana") { return } return value; } console.log(JSON.stringify(target, replacerOK)); > {"b":"banana"} これは、replace関数の挙動に関係があります。 オブジェクトのプロパティごとに繰り返し、replacer関数が呼び出されます。 1回目の呼び出しでは、key="", value={a: "apple", b: "banana", l: "lemon"}が渡されます。 2回目の呼び出しでは、key="a"、value="apple"が渡され、3回目の呼び出しでは、key="b"、value="banana"、4回目の呼び出しでは、key="l"、value="lemon"が渡れます。 つまり、1回目の呼び出しでは、value={a: "apple"、b: "banana"、l: "lemon"}と、"banana"の比較が行われ、条件式の結果がtrueとなり、undefinedが戻されることになります。 このような挙動を避けるために、if文の条件にtypeofを含める必要があります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む