ブログ

  • 【知らなきゃ損】三項演算子が便利って話

    【知らなきゃ損】三項演算子が便利って話

    皆さん、こんにちは。すなです。

    最近、エンジニアをしていて「やっぱりプログラミングって楽しいなぁ」とつくづく感じる日々です。

    今日はそのプログラミングの技術的なお話。

    要はif-else構文と同じ

    エンジニアの皆さん、変数に何かを代入するときにif-elseで場合分けして代入するみたいなシチュエーション、よくありませんか?

    文章だけだと分からないので下の例を。

    $result = file_get_contents($file_path);
    if ($result) {
      $announce = "ファイルを取得しました";
    } else {
      $announce = "ファイルがありません";
    }
    echo $announce;

    これはfile_get_contentsというurl先のWebページの内容を取得できるPHPの関数です。返り値として読み込んだデータを返し、失敗した場合はFALSEを返します。

    したいことに対してコードが多過ぎる

    これ$announceに文字を代入したいだけなのに、控えめに言って無駄が多過ぎますよね?

    変数に文字列を代入するために、if-else構文で3行使ってますし、変数に文字列を代入するほぼ一緒のコードが2回出てきます。

    三項演算子を使おう

    そんな時は今回ご紹介する「三項演算子」を使いましょう。

    さっきと同じコードを三項演算子を使って書いてみます。

    $result = file_get_contents($file_path);
    $announce = $result ? "ファイルを取得しました" : "ファイルがありません";
    echo $announce;

    見てください、この収納の良さ。それでいて綺麗ですね。

    三項演算子に初めて触れる方は何をしてるかさっぱり分からないかも知れませんね。実は大したことないので、解説します。

    条件式 ? trueのとき : falseのとき

    もう答え書いちゃいました。そういうことです。

    すみません、ちゃんと解説しますね。

    $condition = true;
    $result = $condition ? "これはtrueです" : "これはfalseです";
    echo $result;
    // これはtrueです

    条件式

    最初に条件式を書きます。ここがtrueかfalseになります。上記の例で言うと$conditionの位置が条件式で、これの中身を判定します。

    ? true

    条件式のあとに「?」を書いて、その次に条件式がtrueだったときに返す値を入れます。上記の例は$conditionがtrueのとき、「これはtrueです」を返します。

    : false

    そのあとに「:」を続けて、今度は条件式がfalseだったときに返す値を入れます。上記の例は$conditionがfalseのとき、「これはfalseです」を返します。

    さっきの例全体としては、$conditionがtrueなので三項演算子は全体として「これはtrueです」を返します。それが「$result = 」と繋がっているので、$resultに「これはtrueです」が代入されます。

    もちろん$condition === falseのときは$resultに「これはfalseです」が入ります。

    他の例

    他にも例を見てみましょう。

    $age = 18;// 自分の年齢
    $alcohol = 20 < $age ? "最初の一杯は?" : "飲酒は二十歳になってから";
    print $alcohol;
    // 飲酒は二十歳になってから

    $ageに皆さんの年齢を代入してみてください。そのあと、三項演算子の「条件式」のところで真偽を判定します。例の場合は、「20 < $age」がfalseなので、$alcoholには「飲酒は二十歳になってから」が代入されます。


    // 入力されたパスワードが合っていたとして
    echo $password === $_POST["password"] ? "ログインしました" : "パスワードが間違っています";
    // ログインしました

    これはformタグから入力されたパスワードを判定して、ログインするかしないかを返します。三項演算子自体が文字列を表すので、echoで直接出力すると結果が表示されます。


  • LPサイト制作で痛感した必要なスキル

    LPサイト制作で痛感した必要なスキル

    皆さん、こんにちは。すなです。

    最近、本業の方が少し落ち着いてきたのでフリーランスの活動を再開する様になりました。

    先日、「会社のLPを作成してほしい」という旨の案件を受注いたしました。その時に痛感したフリーランスエンジニアとして持つべき能力を紹介したいと思います。

    「分からないから外注している」という事実を理解すべき

    先日僕はある案件をとあるクラウドソーシングのサイトで受注しました。クライアントは企業の方で、ご依頼内容は「会社のランディングページを作成してほしい」というものでした。

    この案件を見つけたときの僕の頭の中は以下です。

    今までLP作ったことないけど、クライアントの参考サイト見た感じシンプルだから、他より低価格で提案して、受注できたら頑張るか。

    この目測が大きな誤りでした。その結果、僕はこの案件を最後2徹して納品しました。

    LP制作で必要なスキル

    LP制作には以下の能力が必要です。

    • サイト自体を作る → HTML、CSS、WordPressならPHPも
    • ページ内のコンテンツを作る → IllustratorやPhotoshop

    Webサイトを作るの自体はHTMLやCSSなどのプログラミングや、それをサーバーにアップロードするなどのパソコン周りの能力が必要になります。しかしそのページの中身の文章や画像・イラストにはIllustratorPhotoshopなどのスキルが必要になります。

    受注してから後悔

    実際に案件を受注してクライアントと話を進めるうちに「LP制作はプログラミングだけのスキルじゃ無理」って事実に気付きました。その参考サイトは割とシンプルで、その時の僕にはプログラミングだけでいけそうに見えました。プログラミング以外にもデザインのスキルが必要だと言うことに気付きました。その時はかなり死にたい気持ちになりました。

    納期は近いし、案件は僕のスキルを大幅に超えてるし、今更断れないし、どうしよ、、、。

    「鬼模倣」&「鬼ググり」でなんとかなった

    どうにもならないことを悲観してもしょうがないので、僕はクライアントから頂いた、参考にしたいWebサイトをめちゃくちゃ観察し、鬼の様に模倣することにしました。お陰で0から作るのではなく、参考サイトと同じ風に見える様に作業すればいいやと思える様になりました。

    そこからは怒涛の鬼ググりです。

    たまたまIllustratorをインストールしていたので、あとは鬼の様に使い方を調べて、なんとか参考サイトの画像と同じ様に見える様に鬼作業しました。

    案件を受注した日から納品まで4日間しかなく、最後は2徹しました。しかし飲まず食わずの4日間に鬼模倣&鬼ググりをしたお陰で最後は無事に納品。クライアントからokを貰い、その日は久々に0時に布団に入りました。

    勉強になったこと

    この案件はかなり勉強させていただくことが沢山でした。

    LPはプログラミングだけでは作れない

    まず、LPはプログラミングスキルだけでは作れない、と気付かせてもらいました。今回の案件ではプログラミングは1割くらいで、残りの9割の時間はIllustratorの使い方を調べてました。

    個人だと限界がある

    次に、個人だと限界がある、というのも分かりました。誰かが言ってるのを聞いたことあるのですが、

    早く行きたければ1人で行け、遠く行きたければ皆んなで行け。

    1人だとスピードは早いのですが、長持ちしない。グループだと時間はかかるけど、大きな力で遠くに行ける。本当にそうだなと思いました。

    別にこの案件を1人でずっとやる必要はなくて、デザイナーやIllustratorやPhotoshopが使える人が知り合いにいれば、その人に頼んで自分はプログラミングだけをやれば良いですね。そしたら僕ももっと寝れたと思います。

    最後はなんとかなる

    最後に、これが1番勉強になったのですが、結局は何とかなる、と知りました。

    クライアントからヒアリングしたときはかなり絶望して、「なんでこの案件取ったんだろう、、、」と後悔しました。

    しかし、寝る時間も削って(あまり良くはないですが、、、)納期に遅れるなら頂く報酬も全返しして、自分では無理なら、無理な箇所を自分が外注して、身銭を切ってでもクライアントに商品をお渡しする。

    最悪、自分がその案件を納品できなくて、とても怒られたとしても死ぬわけではないですし、隣の部屋の人は平気で生き続けます。宇宙はとても広いので、目の前の後悔の囚われないで、一旦落ち着いて、自分ができることをやりましょう。

    【結論】

    最後はなんだか宗教じみたお話みたくなっちゃいましたが、つまりは全力で頑張ろうというお話です。あれ、徹夜とかしたくないからエンジニアになったんじゃないっけ、、、。

    まあ一旦忘れて次の案件でも探しましょうか。

  • CUIとGUIってなに?

    CUIとGUIってなに?

    この前、仕事で完成物を提出しようとSourcetreeを久々に開いたらエラーが起きて、その場ですぐにプルリクを作成できなかったことがあった。エラーを解決しようとSourcetreeについて調べたら「SourcetreeでgitをGUIで操作できる」と書いてあった。「GUI?」ってなったから、調べたのをまとめてみた。

    そもそもUIとは

    結論から言うと、GUIは「Graphical User Interface」の略で、CUIは「Character-based User Interface」の略である。GUIはユーザーインターフェース(UI)がグラフィカルで、CUIはユーザーインターフェースがキャラクターベースドになっている。まずはUIが何かってところから見ていこう。

    ユーザーと機械の接点

    ユーザーインターフェースは一般にUIと省略して使われることが多い。そのUIとは一体なんなのか。それは「ユーザーと機械の接点」全般を意味する。

    日本語で「ユーザー」は「利用者」、「インターフェース」は「接点」を意味する。例えば、あなたがスマホを使いたい時、iPhoneだったら本体の右側面に電源ボタンがあると思う。そのボタンを押すとiPhoneは画面がつく。これはUIの1つだ。iPhoneの電源をつけるための、「あなた」と「機械」の「接点」である。他にもパソコンでデスクトップからGoogle Chromeのアプリのアイコンを押すと、Google Chromeのブラウザが立ち上がり、画面に表示される。このアプリも、「あなた」と「機械」の「接点」である。洋服がしまってあるタンスの取手もあなたがタンスを開くための接点、UIと言えるだろう。例を挙げるとキリがないけど、世の中にあるもののたくさんはUIの側面を持つ。

    パソコンにおけるUI

    時をGUI・CUIの話に戻そう。Gのグラフィカルは英語で「絵画的な」という意味。一方で、Cのキャラクターベースドは、キャラクターが「文字、記号」を意味するから、「文字ベースの」という意味がある。つまり、GUIは視覚的なUI、CUIは文字ベースのUIという意味になっている。

    GUIは見た目で操作

    GUIはUIがグラフィカルだから、例えばパソコンのデスクトップ上のファイルを開くは、そのファイルのアイコンをクリックするとファイルが開ける。ユーザーとファイルの接点は画面上のアイコンである。

    sample_folderに入っているindex.html
    index.htmlのファイルをクリックして開いた時

    CUIはコマンドで操作

    一方で、CUIはUIが文字ベースだから、同じくデスクトップ上のファイルをCUI的に開こうと思ったら、例えばターミナルを開いてディレクトリを移動してvimコマンドで開くという方法がある(恐らくエンジニアじゃ無い人は何を言っているのか全然分からないと思うけど)。

    ターミナルで見たsample_folderとindex.html
    vimで開いたindex.html

    Apple社の「Macintosh」が登場

    今の様にパソコンが普及する前は、元々コンピューターを操作する方法はCUIしかなかったらしい。一部の技術者(エンジニア)が文字ベースの操作を行って、知識が無い人が端から見ると何をしているか全く分からない様な状態だった。

    それがApple社のMacintosh(通称、Mac)が登場し、多くにユーザーに広まったことによってGUIが大幅に浸透したと聞いたことがある。

    【結論】

    プログラミングを始めたての人は見た目でも使いやすいVSCodeなどのエディタを使うことが多いと思う(自分もずっと使っている)が、ある程度技術力がつくとvimで操作する方がラクになるらしい。僕も早くvimmerになりたいなぁ。

  • ::beforeとは

    ::beforeとは

    Webサイト制作の勉強をしている時に、参考にしているWebサイトに「::before」という要素があった。見たことはあったけど、ちゃんとその機能について調べたことなかったから、気になって調べることにした。

    before要素とは

    表面的に言うと「cssの擬似要素」らしい。全然意味分からんから、もう少し深掘りしてみよう。

    擬似要素とは

    まず擬似要素ってなんやねん、って話。「MDN web docs」によると、擬似要素は

    CSSの擬似要素はセレクターに付加するキーワードで、選択された要素の特定の部分にスタイル付けできるようにするものです。

    https://developer.mozilla.org/ja/docs/Web/CSS/Pseudo-elements

    と書いてある。文字の説明だと全然分からんから、実例を見て理解することにする。例えばこちら。

    <p class="hello">こんにちは</p>
    </style>.hello::first-letter {color: red;}</style>

    こんにちは

    上記の様にpタグで囲った「こんにちは」という文字列を、擬似要素でfirst-letterのcolorをredにすると、「こ」のみが赤色に変化する。

    次はこれ。

    <div>
      Hello, world!<br>
      This is Suna.
    </div>
    div::first-line {font-weight: bold;}
    Hello, world!
    This is Suna.

    こうやって書くと、divタグ中の最初の文章「Hello, world!」だけfont-weightがboldになる。

    要はHTML上では存在しない要素をcssで擬似的に作ることができるって感じかな。

    before要素で何ができるの?

    上記の例の様に、beforeを用いてできることを列挙してみる。

    <p class="line">私は2文目です。</p>
    .line::before { content: "私が1文目だ。"; }

    私は2文目です。

    本来コード上では「私は2行目です。」という文字列しか存在しないけど、ブラウザ上では「私が1行目だ。」という文字列がpタグの「私が2行目です。」の前に表示される。

    また、beforeとコンビのafterをセットで使って以下の様な表記もできる。

    <p>初めまして。</p>
    p::before { content: "「"; }
    p::after { content: "」"; }

    初めまして。

    上記の様にcssを書くと、ブラウザ上では『「初めまして。」』と表示される。

    また「サルワカ」に書いてあったのだが、FontAwesomeのアイコンを上手い具合に表示できるみたい!テンションが上がって、日本語が下手過ぎるので、これも例を見せて紹介しようと思う。

    <p>これはブックマークです。</p>
    p::before {
      font-family: "Font Awesome 5 Free";
      content: "\f02e";
    }

    cssでfont-familyに「Font Awesome 5 free」、contentにFontAwesomeのunicodeを書くと以下の様にFont Awesomeのアイコンが文章の前に表示されます。

    これはブックマークです。

    この様にbeforeを上手に使えば、HTML自体を操作しなくても表現したい要素をcssで追加的に記述することができる。

    【結論】

    beforeを有効に用いることができると表現の幅が広がるねっ!よく調べてみると擬似クラスってものもあるらしい。今度はそれについても調べてみようかな。

  • English Expressions #1

    English Expressions #1

    This is my studying diary. I write some new English expressions I learned during my study. Let’s go!!!

    Jacked

    well muscled, iron-bound, pumped.

    It means someone is super muscled. Imagine people like Arnold Schwarzenegger. He is a jacked person.

    at the end of the day

    something that you say before you give the most important fact of a situation.

    I’ve started studying English these days, but at the end of the day, I think I’ll forget everything.

    fair enough

    used to admit that something is reasonable or acceptable.

    I’ll eat the meat, and you eat the rice. Is it fair enough?

    when it comes to

    used to identify the specific topic that is being talked about.

    When it comes to Sushi, I LOVE tuna.

  • プロテインの効果的な飲み方

    プロテインの効果的な飲み方

    最近の自粛期間で何か新しいことができないかって調べてて、筋トレを始めることにした。せっかく筋トレを始めたし、プロテインも一緒に飲もうって思って買ったんだけど、どうやったら1番効果が出るかを調べてみた。

    プロテインの役割

    そもそもプロテインが何をする物なのか、イマイチちゃんと知らなかった。「筋トレの後に飲むといい」くらいのことしか知らなかったから調べてみることにした。

    プロテインは英語で「タンパク質」っていう意味。名前の通り、タンパク質を供給してくれる。

    一般には体重のグラム分のタンパク質を1日に摂取するのが目安らしい。その目安量を摂取し切れない人や、筋トレをしていて多めにタンパク質を摂りたい人が食事以外にタンパク質(やそれ以外の栄養素)を摂取するためにある。

    プロテインの種類

    プロテインに種類があるって知ってた?原料や製法で以下の3種類がある。

    • ホエイプロテイン
    • カゼインプロテイン
    • ソイプロテイン

    ホエイプロテイン

    有名なプロテインの商品のせいで、プロテインと聞くとこの「ホエイプロテイン」を思い浮かべる人も多いと思う。これは原料が牛乳の、動物性のプロテイン。水に溶けやすくて、体内への吸収が速い。

    カゼインプロテイン

    これも牛乳が原料の動物性のプロテイン。水に溶けにくいから体内への吸収時間が遅いのが特徴。

    ソイプロテイン

    このプロテインは原料が大豆の植物性のプロテインである。動物性のプロテインと比べて、糖質・脂質が少なくて植物性タンパク質が多い。このソイプロテインも水に溶けにくいから体内への吸収速度は遅い。

    種類分類原料吸収
    ホエイプロテイン動物性牛乳速い
    カゼインプロテイン動物性牛乳遅い
    ソイプロテイン植物性大豆遅い
    プロテインの種類

    無駄にしないための飲み方

    せっかく買ったプロテインを無駄にしないための飲み方を調べてみた。ポイントはそれぞれの吸収速度を基準に飲むといいと思う。

    筋トレの直後に

    当たり前過ぎるけど、筋トレの直後は飲むといいよね。筋肉が疲弊して修復に栄養素を必要としてるから、この時は体内にすぐに摂取できる吸収速度が速いホエイプロテインを摂取すると1番効果があるよね。

    間食に

    吸収が遅く、腹持ちがいいからカゼインやソイプロテインを摂取するのがオススメ。

    就寝前に

    寝ている間に分泌される成長ホルモンにタンパク質を供給するために、就寝前に摂ったり、その他にも食事で足らない成分を補うために、食事と一緒に摂取するのもあり。就寝前については、ゆっくり吸収させるために吸収速度が遅いプロテインを飲むのがオススメ。

    【結論】

    英語で「タンパク質」っていう意味ってことは、逆の世界線だったら世界中で「Tanpakusitsu」って商品名が名付けられたってことだよね。そう考えるとおもろいね。

  • 「SQSに渡して非同期にする」とはどういう意味なのか?

    「SQSに渡して非同期にする」とはどういう意味なのか?

    最近仕事である処理を作成した。その機能がある程度まとまってきたとき、上司に「その処理はまるまるSQSに渡して非同期処理させてほしい」と言われて、その場で「はい!」と答えたが、全部の単語の意味が分からなかったため調べることにした。

    SQSとは

    Amazon Web Service(以下、AWS)の中の1つのサービス。Amazon Simple Queue Serviceを略して「Amazon SQS」や単に「SQS」と呼ぶ。
    AWSのドキュメントを参照すると、

    Amazon Simple Queue Serviceは、分散されたソフトウェアシステムとコンポーネントを統合および分離することができる、安全で耐久性があり、利用可能なホストされたキューを提供します。(更に続く、、、)

    https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html

    と書いてある。いや、全然分からんわ。もう少し深掘りすることにしよう。

    AWSってなによ

    そもそも論すぎるが名前だけたくさん聞いて、イマイチその詳細が掴めていないAWS。それの概要について調べてみた。

    AWSは、Amazonが提供しているWebサービス。Amazonの自社サイト「Amazon.com」の運営で得たノウハウを活用して、それを外部にも商品としてサービスを展開した。具体的には、サーバやデータベースをネット上で貸し出している。

    AWSの様な、サービスをネット上で貸し出す方法を「クラウドコンピューティング」という。一方で自社内にサーバなどの設備を用意するのを「オンプレミス」という。

    多くの場合は、オンプレミスではサーバやソフトウェアなどの情報システムを企業が管理する施設内に管理して、運用することがあたり前だった(寧ろそれ以外がない)。その機材を買うお金や設置する費用、施設の物理的な制限など、あらゆるリソースを割かないといけないのがオンプレミスである。

    その一方で、最近台頭してきたクラウドコンピューティングはネット上でサーバなどの情報システムを貸し出すため、導入した企業が実際に設置するためのリソースを割かなくて良くなった(実際は物理的な設置場所は世界各地に存在するが、それはAmazonが管理するため、借りる企業が管理する必要がない)。

    これらのメリットから、人材・土地・資金などが豊富ではないような小さい企業を中心にAWSが世界の色んな人に使われだしている。そのサービスの中の1つがAmazon SQSってわけ。

    Queue(キュー)とは

    SQSの中にQueue(キュー)という単語が含まれている。queueとはどういう意味なのか。

    weblio英和辞典によると、

    (順番を待つ人や乗り物の)列

    と書いてある。ざっくり言うと「列、待つ」みたいなニュアンスが大事らしい。

    Queue自体は、物事が並ぶ順番を指すことが多い様だ(文脈で変わることがあると何かに書いてあった)。

    例えば、真夏に自動販売機に行列ができていたとする。現在並んでいる順番は「A, B, C, D」である。この時にXが自販機で飲み物を買おうとした場合、いきなり自販機で飲み物を買うのではなくて、一旦列の最後尾に並ばないといけない。この様な仕組みを「キュー」と呼ぶ。システム関係で言うと、データをキューで順番に並ばせて、処理が行われるのを待たせるということだ。

    キューから要素が出ることを「エンキュー(enqueue)」、要素が追加されることを「デキュー(dequeue)」という(調べたらキューで用いる単語らしい。スタックの時はpushとpopっていうらしい)。

    列の先頭から順々に処理されることを「FIFO(First In First Out)」という。日本語で書くと「先入先出」と表現する。キューは「FIFO」を用いている。列があった時、列の先頭から順に処理され、後から来たデータは列の最後の格納されるということです。上記の自販機の列や(追い越しがない)トンネルから出てくる順番が該当する。

    逆に列の末尾から順々に処理されることを「LIFO(Last In First Out)」、日本語では「後入先出」と表現する。キューとは対義語の「スタック」がこの処理をする。列があった時に、後から来た要素を列の末尾に追加しても、その末尾から処理するということだ。FIFOよりケースは少ないが、例えば取り込んで山積みになった洗濯物を上から畳んだらLIFOである。食事で使った食器を上から洗っていったらそれもLIFOになる。

    実践的にキューを理解

    ここで実用例として、パソコンからデータを紙に印刷したい時を想像する。その時にする処理として、

    • コピーしたいデータをコピー機に送信する
    • コピー機がコピーする
    • (完成)

    至極当たり前だが、上記の3つが流れである。まだキューは発生しない。問題となるのが、コピーしたい人が複数存在する時だ。A、BとCの3人がほぼ同時に同じコピー機にコピーしたいデータを送信したとする。タイミングの差でデータがB→A→Cの順番でコピー機に届いたとする。しかし、実際にコピー機が届いたデータを紙にするのにはある程度の時間がかかる。この時にそれらのデータをキューとして並ばせて、順々にコピーすると言う作業が必要になる。ここで「キュー」が登場する。もちろんこの時のキューは「B、A、C」である。

    最初に届いたBをまずコピーする。そのコピーが終了するまで、AとCはキューに入って待つことになる。もちろん順番は「A、C」である。Bが終了したら、次はAの処理が始まる。Cはまだキューの残って順番を待っている。Aが処理中の時に、例えばDが新しく来たとする。「Dをコピーする」とパソコンから信号を受けたコピー機は、Dが来た途端にAのコピーを中断してDをコピーし始めるわけではない。キューを利用し、DをCの次に並ばせて自分の番が来るのを待つ。これで送信した順番に(正確には受信された順番だが)コピーが処理されることになった。

    普段エンジニアとしてプログラムをいじっていると、配列(?)を先頭から取り出し、追加する要素を配列の末尾に追加する作業を高速で処理するのには高度な技術力を要することが想像つく。

    非同期とは

    通信や処理には2つの種類がある。「同期通信」と「非同期通信」の2種類である。

    同期通信とは、相手に要求を出したときにその返答を待つ通信のこと。一方で非同期通信とは、相手に出した要求の返答を待たない通信。

    加えると同期通信は相手の応答を待つが、文字通り「待つ」ので、この間は他の処理ができなくなる。その「待つ」動作をしないで他の通信もするのが非同期になる。

    同期通信の場合は要求の送信タイミングと応答の受信タイミングが一緒だから、データ量が少なくて済む(らしい)。一方で非同期通信は、そのタイミングが異なるから、応答を受け取れるようにするために通信データに「スタートビット」と「ストップビット」というデータを付加して送受信する。非同期通信はこういう冗長なデータが含まれるからデータ量が多くなってしまうというデメリットも存在する。

    通信を待ってもいい処理の場合は同期通信にして、スピード感が必要な通信の場合は非同期通信にするといいね。

    「SQSに渡して非同期通信にする」の意味は?

    さっきのコピー機の例をまた考えよう。処理の順番は「B, A, C」だった。キュー的にBが最初にコピーを開始されるが、その間AとCはコピーがされるのを待つことになる。これらの通信が同期通信だとすると、AとCのパソコンはコピーが完了するまで通信ができず、ずっと待ってる状態になってしまう(多分最初のBも同じと思われる)。だから、これらを非同期にすることでコピーが終わるのを待たなくても、自分のパソコンは普通に作動するような仕組みを実現したいのが狙いだと思う。

    【結論】

    SQSがあると非同期にできるから、即時性が求められる通信にはもってこいだねっ!

  • SSH公開鍵ってなに?

    SSH公開鍵ってなに?

    仕事でsourcetreeを使っているときターミナルから直接pushしようとしたら、SSH公開鍵がどうのこうの、、、ってでてきた。前から言葉は良く目にするけど、中身をちゃんと調べたことなかったから良い機会だと思って調べることにした。

    そもそもSSHとは

    SSHは「Secure Shell」の略。概要を先に説明すると、ネットワークに接続された機器を遠隔で操作して管理するための手段・プロトコルらしい。

    暗号化

    SSHは他のネットワークを操作するための方法、プロトコル。最大の特徴は、このプロトコル(=SSH)は通信の時のデータが「暗号化」されるという点である。セキュリティの観点で言うSSHの対義語に「telnet」というプロトコルがある。こちらはデータが暗号化されないという点で、SSHの登場で最近はあまり使われなくなっている。調べているのを見た感じ、FTPも同様のプロトコル(=telnet?)を使ってるっぽい。このFTPもtelnetも通信内容を暗号化せずに「平文」でやりとりするから安全ではない。

    認証方法

    SSHには「認証方法」がある。なんかSSH周りでこの「認証」という文字はよく見かけるから最初はSSH特有の何かだと思っていたけど、多分どのプロトコル(やそれ以外)にも「認証」自体はあって(telnetにもそれ用のがあると思う)、SSHが色んな場所で用いられているのと認証がちょい複雑だから、よく「SSH認証」みたいなキーワードを目にするんだと思う。

    認証の代表的なものには以下の2つがある。

    • パスワード認証
    • 公開鍵認証

    パスワード認証

    まずは理解が簡単なパスワード認証について見ていくことにする。パスワード認証の仕組みとしては、サーバー側でアカウントに対してパスワードを設定して、遠隔のパソコンからログインするときにそのアカウントとパスワードを入力するとそのサーバーにログインできる(多分)。つまりこの認証方法が簡単と言われる理由は、一旦サーバーのアカウントを作成すれば、あとはパスワードがあればどこからでもログインできる点にある。アクセス自体は簡単だけど、逆にパスワードがバレたら誰でもログインできてしまうから、危険性が低いとは言えない。

    まあ超ざっくりとしか調べてないから、なんかミスってる気もしないでもないけど、とりまこれでいいや。

    公開鍵認証

    今度は「公開鍵認証」について見ていくことにする。前述のパスワード認証に比べて設定の手間は多いが、その分安全性は高い。仕組みは以下である。

    自分側(クライアント)のパソコンでターミナルを操作して、キーペアというものを作成する。このキーペアの中身は鍵で以下の2種類が生成される。

    • 公開鍵
    • 秘密鍵

    この2つの鍵はデータを暗号にしたり、その暗号を解除する機能がある。2つは大きな意味でセットで連動するが、詳細を見てみるともう少し複雑な仕組みが働いている。

    自分のパソコンでキーペアを生成したら、この内の「公開鍵」を接続したいサーバーに渡す。これで事前の準備は完了。ユーザーがこれ以上の操作をする必要はない(はず)。

    流れとしては、クライアントが特定のサーバーに接続したいと要求を出した時、サーバーはあるデータをクライアントに送信する。その時にはサーバーは、元々クライアント側から貰っていた公開鍵の暗号化する機能を使って、データを暗号化する。自分が生成した公開鍵によって暗号化されたデータを、クライアントで受信したあとは、自分の秘密鍵の解読する機能を使って暗号化したデータを再びサーバーに返す。サーバーはクライアントから受信したあとは自分の秘密鍵の解読する機能を使って、暗号化されたデータを解読する。解読したデータを再びサーバーに返す。サーバーはクライアントから受診したデータと自分が元々送信したデータを比較して、中身が等しかったら、そのクライアントからの応答に応じる、という流れ。

    【結論】

    なんとなく流していたSSH認証っていうワードをある程度理解できたから良かった。公開鍵は暗号化するだけの鍵で、秘密鍵は解読するだけの鍵。