星屑アトリエ

並行世界のエンジニア界にいる端くれ一般ぴーぽー。いろいろ備忘録。

Goのバイナリを更新してみた

前提

バイナリ落とす

https://golang.org/dl/

windowsmac向けにもあるので、サクッと勉強するのであれば
ローカル環境に簡単に構築できるはず。

今回は64bitのlinux向けのバイナリ落とした。
go1.8.3.linux-amd64.tar.gz <- この名前のファイル

インストール済みのgoをアンインストー

goはバイナリ単体で動くスタンドアロンなので、ディレクトリ消すだけ。
今回は以下のディレクトリを削除する
rm -rf /usr/local/go

落としたバイナリを解凍・展開する

tar コマンド使ってgoが標準で定めているディレクトリに解凍・展開する
定めていない人は、$GOROOTで定めているディレクトリへどうぞ

tar -xvzf go1.8.3.linux-amd64.tar.gz
mv go /usr/local/

動作確認

しましょ
go version

動けば 1.8.3 のバージョン情報が表示されるはず!

おわり

【月1ぐらいは頑張る】更新していなかったので。【割と決意表明】

あれから半年以上が経った。

たしか2016年が始まったころにこの記事を書き始めた気がする。 自分の勉強のため、アウトプットのために始めたんだけど、大して更新できなかった!!!w

記事かくって結構エビデンス作ったり、それなりに気を使ったりして大変なのね。 気を遣うっていうのは、正しいことをしっかり書くってことなんだけど。
間違ったことを書かないように、本当に今書こうとしていることは事実なのかどうかを確認する作業を挟むから、 普通に書いて1時間ぐらいのものが、2、3時間ぐらいになったりする。
まぁその分勉強になるからいいんだけど、ちょっと効率は悪いなって思う。

なんかそれだと自分が楽しめてなくて続かなかったので、
もう少し雑に生きてみようと思う。

月1の更新

これから目指す。できれば週1とか、毎日とか。
気になるテクノロジーニュースとかの感想ぐらいなら毎日書けそうかな。

さいごに

また適当に、雑にやっていくので、細かいところはこれからあまり気にしないで書くかもしれません。 なので細かいところが気になるようなことがあれば、他を当たってみてください。

細かいところにまで手が届くような記事かけるようになるのを意識してがんばるぞい

Ubuntuでショートカット(デスクトップエントリ)を作る

概要

忘れないように書いておきます。今日はもう寝よう。。
タイトルの通りです!
基本的にはパッケージマネージャからインストールすることが多いですが、
ネットから落としてきたバイナリアプリケーションをそのまま使うこともあると思います。

そんな時に、「ショートカット」がないと使い勝手悪いですよね。
Windowsでいえば、ショートカットもないしexeファイルみたいにダブルクリックでも開かないし、みたいな。
自分でターミナルから直接バイナリ実行しなきゃいけない。。

そういう時は
デスクトップエントリーファイル
というのを作ります。

こいつは、アイコンや実行ファイル先、アイコンや説明などを一つにまとめたファイルで、これ一つで実行ファイルへのリンクやアイコンの設定まで全部できてしまいます。
高性能ショートカット。

ということで作ってみまーす

環境

流れ

  • アプリの実行ファイルと場所をあらかじめ決めて調べておく
  • エントリーファイルを作る
  • エントリーファイルへ、ユーザーに対する実行権限を与える
  • Dash検索からエントリーファイルで定義した名前でアプリケーションを探してみる

例:Firefoxの場合

ダウンロード

まずは公式からダウンロードしてきます

Firefox をダウンロード — 自由なウェブブラウザー — Mozilla

tar.bz2形式なので任意のディレクトリに解凍します。
アーカイブツール使ってもいいし、コマンド使ってもいいです

~/software $ tar xjf firefox-*.tar.bz2

デスクトップエントリーファイルを作る

解凍ができたら、デスクトップエントリーファイルを作ります。
今回は ~/software/firefox に解凍していると仮定します。

まずは、

$ cd ~/.local/share/applications

に移動します

ls -aを叩くといくつか .desktop という拡張子のついたファイルがあるはず。
今回はその.desktopファイルを作っていきまーす

vim firefox.desktop としてファイルを作っていきましょう(ファイル名は何でもいいです。)
vimの使い方はこのサイトを見ればわかるかも

www.sejuku.net

firefox.desktop

[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=Firefox
Commend=Firefox for ubuntu 16.04 #ここは好きなコメントでいいと思う
Exec=/home/{user}/software/firefox/firefox
Icon=/home/{user}/software/firefox/firefox.png # Firefox自体にアイコンは無いので、フリーのアイコンを落としましょう

最低限これだけ書いていればOKです。
他にもバージョンを指定できたり、オプションはいくつかあるので詳しくはぐぐってみてくださいw
アイコンは落としてきましょう!

実行権限を与える

実行権限を与えてデスクトップに移動させます

$ chmod 773 firefox.desktop
$ cp firefox.desktop ~/デスクトップ/

最近のUbuntuはマルチバイトに対応してるんだよねぇ…
ちょっと慣れてくると日本語に直すの面倒で正直英語のままであってほしいw

と、desktopに何も置きたくない場合は、 cp コマンド叩かなくてもいいです。 実行権限だけ与えて、 .local/share/applications に移動すればアイコン化されたファイルが存在すると思います。

ランチャーに登録

デスクトップ画面に戻ったら、すでにアイコンが設定されたショートカットみたいなのが出来てると思います。
良ければD&Dでランチャーに登録してみてください!

それでは、良きUbuntuライフを!

端っこエンジニア@VPSにLaravelをインストールする  VPS導入編

概要

いつもはスマホアプリ作ってて、簡単な機能作って遊んだりしてます。
で、少しずつお仕事頂いてるうちに、自分でサーバ立ててAPI作って、もっとアプリらしいことしたいなぁって思って、 Laravelを入れてみようかなぁって思いました。

VPSを直で借りたので、Homesteadとか使わないで、自力で導入して少しでもスキルアップもできたらなぁって。
正直シェルの機能とかコマンドとか、Web鯖の仕組みとかバックエンドもろもろ知らないので、 少しずつ勉強して活かしていきたいと思って書きます。

無宗教なので、興味持ったことだけやっていこうかなぁと。
あと、マサカリに弱すぎて死ぬことがあるので、何か思うところがある方、優しく手解きしてくれると嬉しいです!

VPSを借りる

お金ないので、ServersMan借りました。
ちょっと勉強するぐらいなので、月500円のやつをばw
ゲームの課金より安い(でもIT業界もとい僕の懐が暖かくなるなら今やってるゲームの課金も厭わないぞぉ

ちなみにServersManはここです

dream.jp

借り方はまぁ、よしなに、流れに沿って。クレカあると便利です。
あと、土日で契約しても平日に処理されるので、金土日で契約するのはおススメしませんw(僕は3日ぐらい待ちました

サーバにログインする

全世界待望の、サーバに潜る時がやってきました!
でもサーバへのアクセスってどうやるんだろ。。
そこからつまづく端っこ族なう。

windowsだと、Teratermとかがクライアントとして有名ですかね。
でもあれか、windows10なら Bash on Ubuntu on Windowsがあるのでそれでもいいかも。

とにかく、僕はbash環境でやるべく、Ubuntu16.04導入済みの遊びノートからアクセスするようにしました。せっかくだしw

で、こうやります。

ssh root@xxx.xxx.xxx.xxx -p xxxx

root@の後には、契約時に指定されたIPアドレス、-pオプションの後に指定されたポート番号を入力します。
すると、パスワード求められるので、これも契約に書かれているパスワードを入力します。

まずはパスワード変える

ログイン出来たらまず、作業しやすいように+最低限のセキュリティ対策のためにログインのパスワード変えました。
まぁrootでログインできないようにするんでしょうけど、遊ぶぐらいなので後でやります

passwd root

パスワードは最低限、 文字・記号・数字 は必ず1つ以上入れて、かつ 10字以上 にしました。
ランダムに織り交ぜるのがいいと思うんですけどね。
とりあえず以上の条件にしておけば、総当たりでチェックされても10字以上なら多分かなり時間かかるし、一旦は大丈夫かなぁと。
辞書類推とかあった気がするので、キャラの名前使うときは要注意で。
あと、大文字・小文字を1字以上入れると尚よさそう。
ここら辺は全然専門じゃないので、kwskって人は調べてみると面白いかも。僕も調べます。

パスワードクラック - Wikipedia

総当たり攻撃 - Wikipedia

この記事書きつつ、気になって調べてたら最低10桁以上っていうのがあった

www.appps.jp

セキュリティ回りもしっかり勉強していきたいなー。
Web業界はhttps必須みたいな流れになってるし、iOSなんかhttpsにしろーってお達し出してるし

まとめ

VPSの導入でやったこと

  • VPSを借りる
    ServersManを借りた
  • ログインする
    sshでログインする
  • パスワードを自分用に変更する
    最低10字以上、英字+数字+記号で。(英字は、大文字小文字と尚よい)

次回予告!

せっかくサーバ入れたんだし、ブラウザで自分のページが見たいじゃない!
でもなんか仕事してると nginx っていうWebサーバをよく耳にする。
処理が早いとか、大量リクエスト来てもapacheより安心とか、何それ美味しそう・・・

次回!nginx + php7をdebian 7に導入!

WebAPI トレーニング 05 -エンドポイント設計編-

エンドポイントとホスト名の設計

よくある例

http://api.fugahoge.com/v1
http://api-public.ikatako.com/v2

ホスト名にプラス、v1やv2といった数値が入っていることが結構ある。
これは API自体のバージョンを表す もの。

あとは api という単語をホスト名に入れておくことで、DNSレベルで分けられて 自サーバ側で管理しやすいというのもあるっぽい。

api-public のように、オープン/パブリックなAPIであることを明示しておいて、 BtoCとBtoBで、エンドポイントを変えて可視性の段階を設けるのもありっぽい。
こっちはBtoC(第三者利用可能)用、あっちはBtoB(提携企業向け)用、って分けると分かり易いかも。

何がいいかは、その都度の状況と背景を考慮して最適化するのがよろしそう。

REST LEVEL3 APIとHATEOASの概念

HATEOASとは、を、結論から簡単に言えば、こんな感じなのかな。
最初に叩いたAPIから、次に起こせる行動のためのURIをリンクとして含める ようなAPIって感じかな。

最初にAPIを叩いたら、数珠式に叩くであろうAPIURIをあらかじめ仕込んでおくことで、API利用者側は具体的なURIや必要なパラメータを意識することなく、APIを簡単に利用することができる。

それがHATEOASという考え方であり、設計レベルでいえば0〜3まであるうちの、 最高の3らしい。

ちなみにLevel0から3までの区分はこんな感じ

REST LEVEL 達成基準
0 HTTPを使っている
1 リソースの概念を導入
2 HTTPの動詞(GET, POSTなどのメソッド)を導入
3 HATEOASの概念導入

で、上記のことを提唱したのが、「Roy Fieldingの論文」らしい。
自分の意識が最高を超えたら読もう。。

HATEOASは、 hypermedia as the engine of application state
の略。
アプリケーションが持つ状態のエンジンとしてのハイパーメディア??

HATEOASの概念を入れるメリット

  • クライアントがURIを知ることが、最初の導線以外知る必要ないので、 URIの変更がしやすくなるのと、 改造しやすい(Hackable) である必要がない
  • スマホアプリの開発では、最初の導線のみハードコーディングにすることで、 内部では動的にURIを利用できるから、仕様の変更に強いアプリにすることができる。 (いちいちアップデートする必要がない!!!!)
  • URIの間違いに起因するバグを減らせる(動的にURIを利用できるから

たしかに。

まぁただ、その分、サーバ側からJSONとかレスポンス返す時にそういう配慮が必要になってきそうで、ちょっとバックエンド側のコストが高くなりそうやな・・・

次回

-エンドポイント設計編- はこれにて終了!
クライアント側の設計方法を知ったので、今度はサーバ側の設計方法(レスポンスについて)勉強していきまーすっ!!

Web API トレーニング 04 -エンドポイント設計編-

クエリパラメータとパスに仕込んでおくパラメータについて

クエリパラメータってなんだ

このパスのうち、

http://fugahoge.com/search?id=12345

?id=12345
と指定している部分。
URLに直接パラメーターをつけることができる仕組み。

パスに仕込んでおくパラメータってなんだ

エンドポイントの設計方針として、
「リソースを表現する」というのがある。
で、データはリソースそのものであるから、パスに予め仕込めるようにしていいんじゃないのか、っていう話

http://fugahoge.com/user/12345

両者の使い分け

  • 一意のリソースを表すのに適した・必要な情報・条件であるかどうか
  • 省略可能かどうか

ということらしい。 例えば、ユーザーをUserIDで取得したい、といった場合は、UserIDを指定することで、参照したいユーザの情報一式が一意に定まるので、パスに仕込んでおくほうがいい。
一方で、アクセストークンなどはクエリパラメータとして仕込むのがいいとのこと。
アクセストークンは、「リソースを参照する」ことが目的ではなく、「ユーザーを認可する」ことが目的で、リソースそのものとは無関係だから、パスに仕込んでしまうのは直感的じゃないのかなぁと。

省略可能かどうか、の話について。
例えばユーザーのリストを取得したい、といった場合に、リストを全部取得する、ということはなくて、「条件をつけて検索する」ことが多い。 また省略した場合はデフォルトの条件をつけて検索することが多いので、この場合は、クエリパラメータとして表現するのが妥当。

ここからは自分の解釈ですが、
- 既存のリソースを参照する場合 => パスにパラメータを仕込む - 条件をつけて「絞り込み検索」を行う時や、一意のリソースを直接参照する目的ではないAPIの場合 => クエリパラメータ

とするのかなと、考えたりしてます。

次回

今まではエンドポイントの設計を見てきたので、今度は、 http://fugahoge.com/v1/... と、エンドポイントで共通して使われる最初のホスト名についての設計について、勉強考察してみたいと思いますー!

Web API トレーニング 03 -エンドポイント設計編-

もっと見る データは絶対位置で取得する!

「もっと見る」「さらに読む」とか、追加データを取得したい、いわゆる
ページネーション について、実装面を考えてみる

ページネーションで相対位置を利用する

相対位置っていうのは、先ほどの、「どこから、どこまでを」という条件データを元に、
相対的に決まるデータの位置のこと

どこから => offset, pageに該当
どこまで => limit, per-pageに該当

問題になるのはデータの取得量ではなく、取得するための位置検索条件が問題になる。

相対位置を利用する上での問題点

  • offsetの位置を最初から数える可能性がある。
    図Aを見ると、例えば1000番目の記事を取得しようとして、1000番はどれだ…と、DBエンジンによっては
    線形探索してしまうこともよくある。(あんまり調べてないけど、そういうのもあるらしい)

  • 更新の激しいテーブルを使ってると、欲しいデータがずれる場合がある
    図Bを見ると、1分前に取得した記事の場所が10番目にあったはずなのに、30秒後には12番目になってる
    こういうことがあると、データを取得した先で個数の整合できずにアプリ落ちたり、ほしいデータが全然fetchできない、という状態になることもある(こっちが致命的かな)

//図Aかく
書いたら更新します・・・・!!!

//図Bかく
書いたら更新しますゆえ・・・!

じゃあページネーションは絶対位置を利用しよう!

絶対位置とは

データ自身を元に、絶対的に決まるデータの位置のこと
「どこから、どこまで」の指定を、 offset/limit で設定するのではなく、
「どのデータから、どこまで」の指定を、created_at/limit で設定する

例えば「データがつくられた日付 created_at から、 limit 分取得する」みたいに指定する。

絶対位置を使う利点

絶対位置を使う利点は、相対位置の問題点を解決することにある

結局、一番致命的なのは「データのズレ」なので、
そこを解消するには、取得した最後のデータのうち、ユニークかつ時系列に取得可能なプロパティ を保存しておくのが大事

そのプロパティAは、ユニークで時系列なプロパティなので、そのプロパティA以降のプロパティB, C, Dと結びついた各データを狙い通りに取得できる。
テーブルの更新による影響を受けないのが一番利点かなと。

あとoffset使ってると、線形探索してしまうけど、 プロパティAを用いると、インデックスさえ貼っておけばすぐに参照できるんじゃないかなと。

//図C作る
作りますうううう

次回

クエリパラメータと、予めパスに仕込むパラメータの使い分けについて書きます