株式会社シベスピ 従業員ブログ

シベスピの社員ブログ。技術・想い・経験沢山書いていきます!

【エンジニア向け】JavaScriptと仲良くなろう【JavaScript入門】

最近よく目にするのが、WEBシステムの経験が浅いメンバーのJavaScriptに奮闘する姿でして。
今回は、Javaなどのオブジェクト指向で作られた言語は書いたことあるけれどJavaScriptは苦手という方向けに、JavaScriptの話をしたいと思います。

JavaScriptも扱うのはオブジェクト!

「ボタン押されたタイミングで、JavaScriptで入力値チェックして、ダメだったらアラートメッセージ出して」

これはJavaScriptで書くことあるあるですが、まず最初に立ちふさがる壁が
「入力値どうやってとるの?」ということかと思います。

まぁ調べればすぐ、document.getElementByIdに調べたいinputタグのidの値を引数に渡して、変数に戻り値代入して、その変数のvalueを使えばチェックできるぞ。等、答えは見つかります。

が、ちょっと待ってください。

document.getElementByIdを、Javaのおまじない?お約束?である、public static void main(String args[]){}と同じように、書いとけば動くおまじないと考えていませんか?

getElementByIdは引数と戻り値を持つメソッドです。

では、 documentは?
そうです。皆様?おなじみのオブジェクトです!

JavaScript が扱うのはDOM。ただしHTML != DOM

オブジェクトです!とたかだかに宣言したところで、わかりにくい。
なぜわかりにくいかといえば、HTMLを書いただけでなぜそれがオブジェクト?
え?別にクラスも作ってないし、ましてやメソッドなんて定義してないしプロパティの定義もしてない。
なんて思う方もいるかもしれません。
 
これを理解するには、まずHTML をブラウザがどう解釈し、画面に表示するかを知る必要があります。

ブラウザはHTMLを読み込んだ際、まずはそのHTMLをパース(構文解析)をし、
DOM(Document Object Model)というW3Cが定義した作りかたにのっとったオブジェクトを作成します。
そこで作成されたオブジェクトと、CSSで定義されたレイアウトを組み合わせて、画面に表示します。

つまり、ブラウザに表示されているのは単純なHTMLの解析結果ではなく、
HTMLを元にブラウザが作成した DOMというオブジェクトです。
まさにそのオブジェクトを使用するのが、JavaScript です。

余談ではありますが、DOMの実装やCSSの解釈については、各ブラウザに委ねられているため、同じことを書いてもブラウザ間で違うことが起こり得るんですね。

オブジェクトなのは分かったけど、どう実装されているわけ?

DOMは基本的に木構造でオブジェクトを実装しています。
木構造ってなんだ?ってなるかと思いますが、このような構造です。
document
└ html
 ├ head
 │ └ meta
 └ body
   └ h1

基本情報でもありますよね。2分木とか。
木構造で作られたオブジェクトであるため、各オブジェクトのことをノードと言ったりします。
まぁ、習うより見て覚えたほうが早いので、まずは下記を記載したindex.htmlファイルを用意してください。

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<script type="text/javascript">
		window.onload = function(){console.log(window);}
	</script>
</head>
<body>
</body>
</html>

このJavaScriptが何をしているかというと、ウィンドウ表示時にコンソールにJavaScriptグローバル変数であるwindowを出力しています。
このHTMLをChromeで開き開発者ツールを表示します(F12)。
そしてConsoleタブを選択すると、window変数に格納されたWindowオブジェクトが出力されているのがわかります。
Windowオブジェクトの表示

windowの左横にある▶を押下すると、Windowオブジェクトの定義がみれます。

Windowの真下にあるalertメソッドはアラートメッセージを出すためによく使うwindow.alert()です。
また、画像の一番下にあるdocumentもdocument.getElementById()などで使用する Documentオブジェクトを格納しているプロパティです。

windowとdocumentはグローバル変数のため、宣言などしなくても直接使用できます。
また、JavaScriptでグローバルなメソッドや変数を定義した場合、それはWindowオブジェクトのメソッドや変数になります。
試しにこんなのを書いてみると。

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<script type="text/javascript">
                var a = "グローバル変数だよ"; // グローバル変数のテスト
                function aGrobalMethod(){}    // グローバルメソッドのテスト
		window.onload = function(){console.log(window);}
	</script>
</head>
<body>
</body>
</html>

Consoleにはこう出力されます。

そんなことはいいから、要素取ってデザイン変えたいんだけど。

オブジェクトは木構造なので、documentからたどっていけば、要素にはたどり着けますし、そんなことをしなくても、document自体が便利なメソッドを持っています。

例えばこのようなtableの1行目だけ色を変えたいとなった場合、書き方はいくらもあります。

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <script></script>
</head>
<body>
<table border="1" cellspacing="0">
  <tr>
    <th>会社名</th>
    <th>一言</th>
  </tr>
  <tr>
    <td>株式会社シベスピ</td>
    <td>仲間募集中!</td>
  </tr>
</table>
</body>
</html>

例えばscriptタグ内にこのような記述をすると色が変わります。

window.addEventListener("load",loadEvent);
function loadEvent()
{
    // 各要素を取得
    // ① docmentのプロパティであるbodyのchidrenプロパティ(配列)の1つ目を取得
    var element1= document.body.children[0]; console.log(element1.tagName);
    // ② ①で取得したオブジェクトのchidrenプロパティ(配列)の1つ目を取得
    var element2= element1.children[0];      console.log(element2.tagName);
    // ③ ②で取得したオブジェクトのchidrenプロパティ(配列)の1つ目を取得
    var element3= element2.children[0];      console.log(element3.tagName);

  // 色変更
    element3.style = "background:yellow"
}

まぁこれも document.body.children[0].children[0].children[0].style = "background:yellow"と一行ではかけるのですが、何が取れているのかを確認するために変数で分けてます。

何が取れているかを見てみるとこうなります。

あれ、tbodyなんて書いてないけど、tbodyってでてると思った方は、JavaScriptが何を扱うのかを思い出してください。
JavaScript が扱うのは DOMなのでHTMLを元にブラウザが作成したオブジェクトです。
ブラウザが DOMを作成する際に、tbodyを追加しているんですね。


※ ちなみにこの書き方は絶対やっちゃだめです。tableの上に何かを追加しただけで、bodyのchildrenプロパティのインデックスが変わることから、htmlを修正するたびに改修しなくてはならないのでメンテナンス性低すぎます。

この場合はおとなしくtableにid振るなりしてgetElementByIdでtableとって1行目の色を変えるなり、1行目だけclass振ってgetElementsByClassNameつかうなり、そもそもこれぐらいだったらCSSでやりなよって話ですね。はい。

最後に

ここで一番言いたかったのは、JavaScriptが扱うのはHTMLではなく、DOMというオブジェクトということです。
同じようにJavaでオブジェクト散々扱っているのに、なぜ苦手なのかなぁと苦しんでいるメンバを見ながら思い、なるほど、DOMがわかっていないんだということに気が付いたので、この記事を書きました。
こういったことは、公式のドキュメントを読めばわかることですが、覚えることがほかにもたくさんある中それは大変かと思います。
なのでまずはConsoleや開発者ツールのSouceタブでデバッグするなどして、いろいろ試してみると面白いと思います。

以上、エンジニア向けJavaScript入門でした。

シベスピ登山部 ~高水三山編~

シベスピでは仕事と遊びにメリハリをつけて、仕事をするときはしっかりと仕事をし、遊ぶときは思いっきり遊ぶこととしています。私は過去5回ほどC#の話題でブログを書いてきましたが、ここで遊びの話題も入れていこうかなと思い、今回は数あるシベスピ活動の中の一つの登山部のお話をしていきます。


登山部の起こり

私自身昔から登山に興味はあったものの中々機会が無く、一度も登ったことがなかったのですが、Hさんが経験者であるとの事と、冬は雪が降らない山なら夏より快適とのことで

となったのが始まりです。
その後、何人かに登山の話題をしたところ、丁度予定の合ったSさんも参加し、2/17(日)、シベスピ登山部の初めての活動となりました。


高水三山

今回行った高水三山とは、奥多摩のJR軍畑駅から行ける、高水山・岩茸石山・惣岳山の総称です。3つの山の中での最大標高は793mと低めで途中にお寺やトイレ、ベンチもあり登りやすく、簡単な岩場や急な上り下りもあるなどバラエティにも富んだ山です。
都内からアクセスがしやすく日帰りで行ける初心者向けの山とのことで、Hirokiさんがチョイスしてくれました。


ダイジェスト

8:40 軍畑駅に到着

人気の山なので駅前はそこそこ人がいました。
駅前には売店があって、なにか忘れてもどうにかなりそうな感じでした。

軽く準備運動をして行くぞー。

9:50 高水山(1つ目)を登ってる最中


駅から登り始めてしばらくは森の中を進んでいるような感じで、日頃PCとスマホしか見てないような私には癒やしパワーがガンガン入ってきているようでした。

10:40 高水山(1つ目)の山頂


1つ目の山の山頂につきました。
木があるので眺望はよくありませんが、それでも初めての山頂ということもあり非常に気分が良いです。

11:20 岩茸石山(2つ目)の山頂


事実上の山頂に到着しました。
ここは周りに木がないためあたりを見回すことができ、今回の山行では一番の眺望でした。
そのためかここでお昼休憩を取る人も多かったです。

12:10 惣岳山(3つ目)への道


道中はあまり写真を撮らない派ですが急な登りで思わずパシャリ。
普通に撮ると迫力がなかったので下のアングルから撮ったことと、惣岳山の山頂の写真を取り忘れたのは内緒です。

2:00頃 下山終了


約10km、およそ6時間で終了しました。
下山では膝に負担がかかるようで少し痛みを感じましたが、初めての登山でひたすらに楽しかったです。

登山ネタでブロクを書こうと考えていなかったので、道中の良い景色や帰りの駅のスイーツなどの写真を撮っていなかったのが惜しいです。
ですが帰りに食べたラーメンはしっかり撮ってました。


終わり

シベスピ登山部第一回目の記録は以上です。
次回シベスピ登山部の活動は4/27、平成最後の山登りです。

これがきっかけで個人的にも毎週行くようになってしまいましたが、家でPCやってるよりかは遥かに健康的なので良かったかなと思ってます。
適度な運動は体に良いですし、何より良い気分転換になります。仕事柄一日中PCの前に座りっぱなしな人も多いと思いますので、いきなり登山とはいかなくても、ハイキングや軽い散歩などしてみてはどうでしょうか。

胡蝶蘭を植え替えました!

結構前の話になりますが…

12月某日、納会の前後で胡蝶蘭の植え替えを行いました。
胡蝶蘭は、本社移転の際にお祝いでいただいたものです。
寄せ植えの花は2~3ヶ月ほどで全て落ちてしまいましたが、別に枯れたわけでもないですし、捨ててしまうのも忍びなくてずっと本社の片隅に佇んでいました。

ちなみに

小さい鉢のものは、半年以上が経過した今でもまだ一部の花が付いたままです。

f:id:chivsp:20190207181626j:plain

いただいた際に添付されていたカードに「胡蝶蘭の上手な育て方」のようなことが書かれていたのはブラフで、実は造花なのでは…?という疑念を密かに抱いています。

f:id:chivsp:20190207181953j:plain
葉の陰にスナイパーが…!

それはともかく

今回は、胡蝶蘭の見た目と生育環境を整えたい!
という気持ちのもと、胡蝶蘭の植え替えを行うことにしました。

必要なものを調べる

まずは、植え替えのために必要なものと手順を調べることにしました。
今回は、花屋さんが運営しているサイト等、胡蝶蘭に詳しそうな記事をいくつか参考にしました。
複数のサイトで「同じことが書いてある部分」「真逆のことが書いてある部分」等、様々な情報があり、その中から今の自分に必要な情報をピックアップしていくことになります。
昨今よく言われていることではありますが、情報が氾濫しているだけに取捨選択の大切さが実感できました。

結局のところ

どうしようか多少悩んだりもしましたが、基本的にはそんなに弱い植物ではないことがわかったので、多少間違ったとしてもなんとかなりそうだなという結論に達しました。
植え替えの季節については「春がいい」とか「秋がいい」とか、やはり気候の安定した時期をオススメするものが多くあり、「まあ冬とか夏ってあんまりよくないよね」とは思いましたが、春まで待って胡蝶蘭根腐れ(根っこが腐ってしまうことが多いようです)が進行してもよくないなと考えたのと、室内だからある程度どうにかなるだろうという意識もあり、12月に決行することにしました。

分かったこと~必要なもの~

①バーク
水苔
③植え替えのための鉢
④水受けの皿
⑤レジャーシート

他にも、いずれかの株が病気になっていた場合に他の株に感染するのを防ぐため、殺菌したハサミも必要とありました。が、ぱっと見病気のありそうな株もいなかったので今回は省略し、普通のハサミを利用しました。

いざ、植え替え!

①道具をそろえる

バークと水苔は通販サイトで通販しました。
その他の道具は、植え替え当日、社長主導のもとに購入してきました。

②鉢から出す

鉢から出したばかりのものはこんな感じです。

 

f:id:chivsp:20190305181713j:plain

水苔に根がしっかり絡まっています。

③古い水苔を取り除き、痛んだ根を切る

水苔を取り去った状態が「ラピュタみたい!」と盛り上がりました。

痛んだり腐ってしまった根は切り落としてしまったほうが良いとのことだったので、あわせて切り落として、次に進みます。

④新しい水苔を詰める

元気な根だけの状態になったら、新しい水苔に根をしっかり巻き付けます。
⑤植え替える

ここまでできたら、あとは鉢を変えて隙間にバークを詰めるだけです。

 納会前にはこの状態になりました!

⑥二週間後に水やりをする

二週間後がちょうど年末だったので、2018年最後の出勤日に水をあげました。
今年は年末年始の休暇が長かったこともあり少し不安はありましたが、年始も元気な姿で出迎えてくれました。

そして2019年

植え替えは上手くいったようで、約二か月が経過した今も本社に緑を与えてくれています。

f:id:chivsp:20190305183402j:plain

最近、これは新しい花芽か根か…な?みたいなものも生えてきたりして、今後がちょっと楽しみです。

f:id:chivsp:20190207181843j:plain

 からの更に後日談

この記事の下書きを始めたのは1月半ばのことでした。
ブログを書く時間がうまく見つけられなかったりして現在(3月)に至りますが、なんと。

f:id:chivsp:20190305183145j:plain

花が落ちて新しい芽が生えてつぼみが付きました。
この間、わずか2週間。
やはりこれは胡蝶蘭ではないのでは…?と一部のメンバーの間で話題です。

 

本社の入り口に飾ってありますので、来社の折には是非ご覧くださいませ。

最近始めたお金の管理方法

最近、家計簿をつけることを始めました。
始めたきっかけは支払い方法が多々あることで管理が難しいと感じたからです。
大きく分けて4つになります。
・現金
・クレジット
・デビット
プリペイド
ほとんどの人がこの中の複数方法で支払いを行っていると思います。
私は全て使用しています。クレジットカードがAMEXでデビットがJCBプリペイドがMasterCardと会社が違うため、基本的にはクレジットカードで支払っていますが、使用できない場合違う支払い方法を行ったり、ゲームの支払いにはプリペイドでチャージした分を使用するなど支払い方法がバラバラのため使用金額と残金を把握するのが難しくなってしまっています。
各支払い方法は全て携帯のアプリで確認することはできますが、別々に確認する必要があるのと更新が遅れる等であまり当てに出来ません。
そこで携帯で家計簿のアプリを使うようにしました。元々PCに家計簿のアプリを入れて使っていたのですが、飲み会の割り勘や自動販売機でレシートが無かったりなど記帳漏れが多くなりやめてしまいましたが、携帯アプリならいつでも入力できるし残金等も即座に総額で確認できるためとても使い勝手が良いです。
これにより無駄遣いがかなり減りました。
会社の後輩にもお金がないと言っている子が多く管理がうまく出来ていないため無駄遣いが多いのかなと思い、ブログで紹介できればいいなと思い紹介させていただきました。
家計簿の携帯アプリは種類がいっぱいあるので無料なのを何個か使ってみて自分に合ったものを使うのがいいと思います。ぜひお試しあれ('ω')ノ
最後にスイカなどは電車に乗る際に記帳するよりチャージする時に記帳する方がめんどくさがりの人にはお勧めです。

評価の結果が厳しくなっているように感じる

営業部)大泉です。

黒歴史を思い出し、反省

先日1年ぶりに前の会社の仲良し元同僚と集まって飲みました。
20代から30代後半までの社会人としては青年期・多感な(?)時代を、同じ会社という枠内で過ごしてきただけあって、1年ぶりでも変わらず盛り上がった訳ですが、いつもどおり私のやんちゃ時代・軍曹時代の黒歴史もたくさんいじられた訳で・・・
悪い記憶は消す機能が拡充されているらしく、だいぶ忘れていて恥ずかしくて仕方なかったこともありましたが、触発されてたくさん昔のことも思い出し、最近好きで読んでいるコラムの以下の名言(?)との一致にハッとしました。
『そもそも自分に誇りを持っていて、内面の充実した人は威張りませんし、簡単にキレません。』
『バランスが崩された時(=周りに強くあたる時)は自分の問題がわかる時です。』
本当にそのとおりですね。
そして私も少しは成長したらしく「最近は昔みたいなことも少なくなったね~」と、元同僚たちにご評価頂きました。身体とともに精神的にも多少丸くなったようです。。。

直近の営業で感じたこと

最近の話をもう一つ。
周辺で急にベンダ(会社)・要員交代が発生したり、新規顧客を訪問した際に「ベンダ・要員を交代したいので提案頂けませんか?」とご要望頂くことが続いています。
交代したい理由をうかがうと同一現場で長期従事したことの慣れなのか「(怠慢から)品質が低下した」「指示に従わない」「勤怠が悪い」といった所が主でした。
お仕事のお話を頂けることは大変有り難いのですが、正直「それ位なら現場や営業経由でのクレーム、所属会社での指導などで改善できないのかな?」と思うこともあります。
特に人不足の昨今ですので、長期従事要員の交代にはかなりの労力を費やすことが想定されます。
その上でのご要望なので相当とは思いますが、そこに至るまでに改善の余地は無かったのか?と、私自身も少々怖くなりました。

改善のきっかけ

私のやんちゃ時代でもそれなりに、
 先輩に怒られ
 上長に怒られ
 ベンダーリーダーに怒られ
 営業経由で怒られ(初期クレーム)
 顧客に怒られ(直接クレーム)
していたので、無用な反発(やんちゃを怒るの大変だったろうなぁ・・・)もしましたが、冷静になると自身の至らなさを認識して改善に繋げることが出来ました。
指導する(怒る)側にも動機や欲求が必要なので、
怒られない(熱い指導もされない)
代わりに交代(切られる、仕事を失う)という結果に至る、
というのも分かる部分も有りますが、私の感覚するとだいぶクールな時代になってしまったな、とも思います。
20代の頃、とっても嫌いな昭和感バリバリのPMに「学生はテストで評価だが、社会人は毎日の結果で評価されるんだ!」なんて言われて、はいはいって聞き流していましたが、逆に今よりはとても優しい時代だったのか、とも思います。
営業部としてもクレームに至る前の顧客からの小さなご不満を詳細ヒアリングできるように、そしてそれを社内に指導・展開できるように、更に努めていかなければと感じました。

まとめ

表面上は穏やかで、結果にはクールで厳しい時代。
そんな時代に「男気」と「三方良し」を掲げるシベスピは、時代遅れ?いやいや、一周回って正解でしょ!とチャレンジを続けたいと改めて思いました。
「熱意」と「誠意」と「アイデア」で、顧客バリューアップに直結するエンジニア集団へ!
そんなシベスピ精神で、引き続き皆さんに期待しています。

部長の小言③

先日の夕会で、仕事が発生した時に必ず行なわければならないことは何ですかの質問にほとんどの人が答えられず、ここのブログにも書いてあるのに読まれていないということだろうかと不安に思いつつ、第三弾を書こうと思います。

私も大切にしていて、是非皆に覚えて欲しい言葉があます。

「正しい判断は、正しい情報と正しい分析の上に初めて成立する。」byヤ〇

仕事に限らず、人生は判断する場面が多々あります。
それぞれの場面において、正しい判断をすることができているでしょうか?
正しい判断を行わないと、期待する結果が得られないことは解ると思いますが、意外に人は正しい判断ができないものです。
それは何故かというと、この言葉通りでもある正しい情報を収集しないケースが多く、また情報を収集したとしても正しい分析をしていないからです。
今回この話をするに至った背景は、プロジェクトがどうとかの小難しいところからでた話ではありません。

何か事象が起こる→情報もなく脊髄反射で怒る

というケースを数カ月で何度も見かけ、もう少し情報を仕入れていれば怒るに至らなかっただろうなと思われるケースが多々ありました。
またみんなと議論をしていてゴールが見えない事が多々あり、それは情報・分析がなく思い付きで話し、感情論になっているからだと思っています。
議論のゴールはより良い判断を導き出すのが目的で、判断に至るまでの各ステップの内容の精査になるはずです。
なので、「その情報は間違っている」とか「その情報からその分析は間違っている」といった話になるはずです。
意見対立はいい事ですが、今後反論する際には情報の正しさとか分析の正しさに対して議論してもらいたいと思っています。

未開の地開拓、先遣隊の運命や如何に!

未開の地開拓、先遣隊の運命や如何に!


声高に次回予告をしたにも関わらず、ずっと書いていなかった佐藤です。
すみません。すっかり忘れてました。

前回、エビの赤ちゃんが産まれた話を書きましたので、
今回はその続きの出来事を書きます。

エビの赤ちゃんもいっぱい産まれ、そろそろ水槽が狭く感じてきたので、
もっと大きな水槽に移し変えよう、今度は水草一面に敷き詰めようと計画し、
水槽台から底面フィルター、外部フィルター、ライト2個と購入しました。
最初が肝心と、底面フィルターを設置して、その上に網を敷いてから土を入れる。
水草敷き詰めたいので、まずは大きなソイルを入れてから、その上に小さなソイルを
入れるなど、少しこだわってみました。

さて、箱の準備が終わり、水も張り終わったので、水草を埋めてみたところ、
すぐに浮いてきて全然刺さってくれない

1時間格闘し、何とか植え終わったと思ったら、次の日にはまた浮いてくる。
それでも半分くらいは残ったので、まあここから広がってくれればよいかと
そのまま静観すること1ヶ月、そろそろ生体入れて水作りしていくことに。

まずはパイロットフィッシュとして、アフリカンランプアイ2匹と
ネオンテトラ3匹を新しい水槽に移動。

お前たち、ここの水を開拓しておくれーと、送り出したのですが、
この地が思った以上に荒地で。。。

底面フィルターにポンプ2個+外部フィルターと、取り付けたので、
激流のごとき水流が発生している状況。。。
なるほど、それで水草も抜けるのかと・・・

これは如何と、水流を弱めるために色々と改造。。。
何とか少し穏やかにはなったものの、これまでの水槽に比べたらまだ大分強い。。。

それでも何とか3週間くらい経過した頃、尾びれがなくなってきてるやつが。。。
水が悪かったのか、水流によるストレスか、、、

兎にも角にも何とかせねばと薬を投入。
隔離して投入しようか悩んだけれど、他の魚もかかっている可能性があるので、
そのまま投入し、温度も2度ほど上げてみる。

この薬が強力で、水槽の中がまっ黄色になってしまい、水草までも。

なので、魚を元に戻し、また水を抜いてと・・・・

その後、水を少しだけ張って、水草を定着させてと、試行錯誤していた頃がこんな感じ。

f:id:chivsp:20190208170650j:plain

そこから半年くらいたって、エビも増えたり減ったり、水草はエビに全部食べられたり
魚の種類も変わったりと変化し続けています。

最近はグッピーがたくさん産まれすぎて、過密水槽になってしまうのではと
懸念している状況ですw


次回は、熱帯魚じゃなくて真面目な話しもしようかな。。。