2017年5月13日土曜日

自宅サーバーという選択肢

はじめまして。私はジタクサーバー。あなたの開発ライフを守ります。
みなさんはじめまして! Githubでは@kawakawaritsuki、Life is Tech!ではごっちゃんと名乗っているものです。
自宅サーバーライフ、楽しんでますか! もう既に楽しんでいる方も、これからっていう方も是非読んでいってくださいね!
この記事はQiita版Life is Tech ! Members Advent Calendar 2016及びAdventar版LiT! Members Advent Calendar 2016、2日目の記事です。

My Server

OS:CentOS Linux release 7.3.1611 (Core)
M/B:A88M-ITX/ac R2.0
CPU:AMD A10 7870K
ROM:500GB+3TB+1TB
RAM:8GB
拡張:PT3

500GBのHDDはOSとhome。60GB程度を/に、残りをhomeに割り振ってます。
3TBのHDDはChinachu用。動画が大量に入ってます。
1TBのHDDはSamba用。ファイル共有ですね。

コマンドラインのみで使ってます。
また、SSHは鍵認証方式を使っています。
パスワードで認証している人は是非鍵認証方式に変更してみましょう。
あとサーバーに対してLAN用のDNSを設定しておくと便利ですよ。

用途

ファイルサーバー

今回の記事で取り上げる内容1つ目です。
自分用のファイルサーバーは一台あると本当に便利です。

テストサーバー

今回の記事で取り上げる内容2つ目です。
なにかサーバーを立てたいなってなった時に手元にサーバーがある安心感は他の何にも変えられません!(?)

運用サーバー

今回の記事で取り上げる内容3つ目です。
実際に稼働させるためのサーバーとしても使えます。おすすめはしませんが。
僕は本稼働のみConoHaというVPSを使っています。
今は自宅サーバー一本でやってます。

マイクラサーバー

身内でやってる奴です。 工業楽しいですよね。 どうでもいいので今回は取り上げません。

録画サーバー

Chinachuを使って録画サーバーと立ててます。 条件一致便利。 ちょっとネタがアレなので今回は取り上げません。

Wikiサーバー

これが最高なんです。
Crowiっていうソフトウェアを使ってるんですがもう手放せないです。
自分専用のWiki、しかもMarkdownで書ける。画像もアップロードし放題。
最高です。

RADIUSサーバー

マイナーすぎて通じないと思いますがWi-Fiのエンタープライズ認証をする時に使います()

ファイルサーバーとして

僕は500GB弱を割り振ってます。
開発してるとファイルってどんどん増えますよね。
そんなときにファイルサーバーが1つあると本当に便利です。
色々試していてわかったのですが、Samba(Windowsのファイル共有形式)は転送速度がサーバーのCPUの速度に依存するのに対して、ftpだとほぼ帯域最大の速度が出ました。
Core i5で運用している友達はSambaを使っていますが、僕のサーバーは性能が低いのでSFTP(SSHで接続するFTP)で運用しています。

テストサーバーとして

その場で作業用のサーバーとしては自宅サーバーは最高の選択です。 あってよかった自宅サーバー。結構助かります。 RubyやPython、Java等といった良く使うソフトウェアを先に導入しておくと便利です。

運用サーバーとして

常に自分の隣にあるのでいざという時すぐに対応出来ますが、安定感、安心感に欠くのでおすすめこそしませんが可能です。 自分専用のBASIC認証をつけたウェブページを使いたい。等と言った用途ならば良いかもしれません。

Gitサーバーとして(おまけ)

GitBucketやGitLabといった素晴らしいソフトウェアを使用すればGitサーバーを 簡単に 立てることが出来ます。 もちろんプライベートですし身内との共同開発もし放題です。 ただしGithubの最大の強みであるOSSの利点は活かせないので使い分けをしましょう。 昔書いた記事があるので参考にどうぞ。Linuxでも使えます。

ドメインについて

無料で使えるDNS(DDNSも可)は個人的にはdip.jpをおすすめしています。 詳しくはdip.jpのページなどを参考にしていただければと思いますが、便利なサービスです。 また、独自ドメインも持っています。ドメインは一つ持っていると非常に便利に使えるのでとてもおすすめですが多少金額がかさむのが難点。 気にならないなら是非取ってみると良いと思います。

回線について

プライベートIPではなく、グローバルIPが振られている必要があります。 但し、これは外部に公開する目的がある場合のみです。 自分の家の中だけでファイル共有やテストサーバーとして運用する場合は問題ありません。 尚、外部に公開する場合はポート開放が必要です。 ルーターの設定を変更しましょう。

Dockerについて

テスト用にサーバーを立てる場合はDockerを使うと快適に使うことができます。 是非調べてみてください。 闇にハマります。本当に奥が深いです。

OSについて

僕はLinuxを使っています。 もちろんWindowsでも可能ではありますが、PSがよく分からない上GUIだと重い、接続制限(規約)があるなどと言った理由で使用していません。 接続数制限については学生なら無料でWindows Serverを入手出来ますが、結局汎用性が低かったりしてあまり使うことがない気がします。 但し、ファイルサーバーとして使う場合はSambaは"Windowsファイル共有"なので、Windows Serverの方が良いと思います。

おまけ

Life is Tech!要素がすっかすかになってしまったのでこんな時に便利!自宅サーバー!コーナーです笑

Web開発の成果を発表会や展示の時に公開したい!

自宅サーバーにアクセスしてぱぱっと公開しましょう! Webサービスコース(Sinatra)の方はRuby、Webデザインコースの方はApacheや下の小技等を使いましょう。 そしてIP、ポートをURLバーに打ち込んでテストします! うまく開けたら、発表会の時は短縮URL、展示会のときはQRコードにして画面に表示しておきましょう!

ファイルを間違えて消してしまう地獄に陥る前に!

どのキャンプに行っても絶対何人も現れるファイルが消えた事例。 いくら気をつけていても何故かファイルを失くすのです。 そのためにバックアップは必須!
  • 前述したGitサーバーを使うもよし!
  • 慣れた方法でサーバーにファイルを保管するもよし!
とにかくバックアップはお忘れなく!

一瞬で公開する小技

前提としてpythonが入っている必要があります。
公開したいWebページのルートディレクトリに移動して
sudo python -m SimpleHTTPServer 80
というコマンドを打つだけです。
起動したら別のPCからサーバーのIPを開いてみましょう。 きちんとindex.htmlが表示されたら成功です。
実際に公開したい場合は先にポート開放をしておきましょう。 また、80番ポートは危険なので他ポートをおすすめします。
本当に楽で便利です。ただあくまでも本稼働向きではなくテスト用と考えたほうが良さそうです。 本稼働の場合はきちんとApacheなどを使いましょう。

最後に

内容が貧弱すぎるので徐々に追記していきたいと思います。 サーバーをまるっと変える予定があるのでその時に更新するかもしれません。
明日、3日目は@Windows_Tenさんの「開発が捗る環境づくり」です! 捗るのって大切なので楽しみです。
最後まで読んでいただきありがとうございました。

ATtiny85にArduinoで書き込んでみた

環境

自分はMacOSX10.11.3でArduino1.0.5を使っています。 もちろんWindowsでも出来るはずです!

普段は1.6.xを使っているのですが、自分の環境では手順1で引っかかってしまったので、1.0.5を使っています。 Arduino1.0.5はここでDLできます。 https://www.arduino.cc/en/Main/OldSoftwareReleases#1.0.x

手順

  1. ArduinoIDEの準備をする
  2. ArduinoにArduinoISPを書き込む
  3. いい感じに配線する
  4. 書き込む

1.ArduinoIDEの準備をする

http://make.kosakalab.com/make/electronic-work/arduino-ide-arduinoisp/ こちらのページの

ATmega/ATtiny記述ファイルアーカイブ

から、hardware.zipをDLします。 そして、自分の標準のフォルダ(Arduinoフォルダ)に解凍したものを入れます。

そしてArduinoIDEを起動します(この時点で起動していた場合は再起動させてください)。 ツールのマイコンボードの中にATtinyなどが追加されていればOKです。

2.ArduinoにArduinoISPを書き込む

Arduinoのツールバーのファイルの中の、スケッチの例の中にあるArduinoISPをクリックします。 するとソースが表示されるので、それをArduinoに書き込んでください。

3.いい感じに配線する

こんな感じです

さっきのページにも配線図はありますが、書き込むだけの装置なら正直これだけで十分です。(テストするなら話は別)

4.書き込む

ソースコードが書けたら、先ほどの配線をしたArduinoを接続します。 そして、ArduinoIDEのツールの中の マイコンボードをATtiny85に 書き込み装置をArduino as ISPに設定します。

そして、いざ書き込み! 普通に書き込みボタンを押します。 エラーが出ることが結構ありますが、案外書き込めてます。 試してみてください!

「ln.is」について調べてみた。

最近(?)Twitterで問題になったりならなかったりする、「ln.is」について調べてみた。

最初に

真似しないでくださいね。。。笑

とりあえずやってみた。

http://linkis.com/ にアクセス!

そこから試しに短縮URL(じゃない気がするけど笑)を生成してみた。

検証1(URLについて)

(最初からコレでいいじゃんというツッコミは置いといてw)

検証2(ページについて)

ページの5分の1くらいのサイズにLinkis特有のメニューが出てる。

↑こんな感じ

短縮元ページはiFrameで表示してるみたい。 ファビコンはlinkis.comのものに差し替わってる。 このメニューで出来ることは、いいね!とシェアと共有元の人、それにページに対してコメントも付けれるみたい。

やりたいことは分かるんですがちょっと嫌ですねー。

検証3(ツイートのURLが自動的に書き換わる)

ページを見てたら、「Twitter automation」という項目があったので、チェックに入れてみた。 https://twitter.com/Dummy01001/status/697019738594140160 ちゃっかり書き換わった。 URLが入ったツイートをされると、一度ツイートを削除してURLを書き換えてもう一度ツイートする仕組みのようだ。

結果

  1. ページに独自のメニューを出すサービス。コメントとか出来る。
  2. 1については、ページの改竄とも取れる。
  3. ツイートに含まれてるURLを勝手に書き換えるといった事も出来るようだ。
  4. このサービスを使ったページを開くと承認を促されるため他人に広がりやすい

他人に迷惑?

迷惑といえば迷惑かもしれない。 とりあえずサイトを運営されている方に申し訳ない それに、どうやらこのサービスを使ったページを開くと、認証を促されることがある模様?(確認は取れていません) (追記:5/9)

このように、Twitterと連携しましょう的なものが表示されることを確認しました。 おそらく何のことか分からず、連携ボタンを押して他人に回って〜という無限ループが生まれるんでしょうね。。。 (前回確認が取れなかったのはおそらくlink.isのアカウントにログインしたままだったからだと思います) (追記ここまで)

少なくとも自分から使ってないかぎりは自分にとって迷惑ですね(汗)

感想

自分は公式のページから試したものの、意味わからないまま認証したりしてそう。。。 おそらく、ln.isのURLでツイートしてる人の大半は気づいてないと思う。 一回認証しちゃうとそれ以降ずっとらしい。

結論

たまにはTwitterなどのSNSの認証状態を確認していらないものを外そう!

(追記:2/9)

確認方法

https://twitter.com/settings/applications このページに、「Linkis.com」という項目があったらそれです。

解除方法

こんなサービス使わない!という人は、確認方法で書いたページで、いらないものの「許可を取り消す」ボタンを押します。 その後、 http://ln.is へ行き、Settingの中のACCOUNTSページで、ログアウトボタンを押してください。 (追記ここまで)

2017年5月10日水曜日

WPA2Enterpriseな無線環境を作りたい妄想

こんにちは。みずこーひーです。 今すごく迷走してます。。。 WPA2Enterpriseな環境を作ってみたい。。。けど対応APたっけえ!!! って感じです。 やるなら外部RADIUS鯖が良いんですよね。あととにかく早い方がうれしいですが。 AirMac Extremeとかリースアップの業務用APでも手に入れた方が良いのか。。。 最低でも300Mbps出れば実用の範囲内(今はacで理論値1Gbps超えの実測500Mbps弱) くらげみたいなAirMac落札してみますかね。。。

WindowsにGitサーバーを立ててみた話

普段は、Macを利用してプログラミングをしているのですが、この際自分用の自由なGitサーバーが欲しくなったので、自前の自宅サーバー(Windows7Pro)にサーバーを立ててみました。

サーバーソフトウェア選び

いろんなソフトがあるようですが、今回はGitBucketというソフトウェアを使ってみました。GitHubのクローンのようなものです。日本の方が作られているとのこと。

ダウンロード

####GitBucket本体 https://github.com/takezoe/gitbucket/releases このサイトの、warファイルをDLします。

Java(JRE)

このソフトはJavaで実行するので、JREが必要です。

起動方法

基本的にはbatファイルを作成して起動するのがいいと思います。

warファイルがデスクトップに有ることを前提として、

  • デスクトップ右クリック
  • 新規作成→テキスト
  • ファイル名を「好きな名前.bat」となるようにする。
  • そして、そのファイルを右クリックして編集。

ファイルの中に、

java -jar gitbucket.war

と書いて、保存して終了する。

そして、その生成したbatファイルをダブルクリックすると起動出来ます。

操作方法

起動ができたら、その端末のブラウザから http://localhost:8080 へアクセスします。 UIはまさにGithubなので使い慣れていれば安心です。

その他のPCからは、 http://192.168.XXX.XXX:8080 と、IPアドレスを指定してあげます。

開けない場合はファイアウォールから許可してください。

初期設定

初めて起動した時は、アカウントを作ることはできないので ID:root PW:root と入力してログインします。

その後、右上のスパナマークをクリックして、System Settingsへ移動すれば、ユーザーを作れるようにしたりすることができます。

ログインはメールアドレスではなく、IDでのログインとなります。

ポートについて

さすがにポートが8080だと都合が悪い場合もあると思うので、ポートの変更方法について

batファイルのgitbucket.warの最後にスペースを開けて

--port=80

などと追記することで、設定できます。

最後に

かなり簡単にGitのサーバーを実装することが出来ました。 warファイルはJavaなので、LinuxでもMacでも簡単にインストールできると思います。 内容に、誤字や不備があればコメントいただけると幸いです。

JavaでHttpのGETとかPOSTをさくっと実装したい

こんにちは。中3(執筆時)のどこにでもいそうなプログラミングバカです。 今回は最近個人的にPOSTとかしまくったアプリを作っててその時に作った何かの残骸っぽいもの。 簡単に言うとGET/POSTがさくっと使えるクラス。

ソース


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;

public class HttpConnector {

    String host = "";//ここにドメインとか書いておくとコンストラクタのhostにファイル名を指定することができる
    String message = "";
    String contentType = "";//ContentTypeをここに指定しておく。

    private OnHttpResponseListener resLis = null;
    private OnHttpErrorListener errLis = null;

    public HttpConnector(){}
    public HttpConnector(String host){
        this.host += host;
    }
    public HttpConnector(String host, String message){
        this.host += host;
        this.message = message;
    }

    public void get(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(host);
                    URLConnection uc = url.openConnection();

                    InputStream is = uc.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                    StringBuffer sb = new StringBuffer();
                    String s;
                    while ((s = reader.readLine()) != null) {
                        sb.append(s);
                    }
                    if (resLis != null)
                        resLis.onResponse(sb.toString());
                    reader.close();

                } catch (IOException e) {
                    if (errLis != null)
                        errLis.onError(0);
                }
            }
        }).start();
    }

    //ポスト用コマンド
    public void post(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(host);
                    URLConnection uc = url.openConnection();
                    uc.setDoOutput(true);
                    uc.setRequestProperty("Content-type", "application/json");
                    OutputStream os = uc.getOutputStream();

                    PrintStream ps = new PrintStream(os);
                    ps.print(message);
                    ps.close();

                    InputStream is = uc.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                    StringBuffer sb = new StringBuffer();
                    String s;
                    while ((s = reader.readLine()) != null) {
                        sb.append(s);
                    }
                    if (resLis != null)
                        resLis.onResponse(sb.toString());
                    reader.close();

                } catch (IOException e) {
                    if (errLis != null)
                        errLis.onError(0);
                }
            }
        }).start();
    }

    public void setHost(String host){
        this.host = host;
    }

    public String getHost(){
        return host;
    }

    public void setContentType(String contentType){
        this.contentType = contentType;
    }

    public String getContentType(){
        return contentType;
    }

    public void setMessage(String message){
        this.message = message;
    }

    public String getMessage(){
        return message;
    }

    public void setOnHttpResponseListener(OnHttpResponseListener listener){
        this.resLis = listener;
    }

    public void setOnHttpErrorListener(OnHttpErrorListener listener){
        this.errLis = listener;
    }

    public void removeResponseListener(){
        this.resLis = null;
    }

    public void removeErrorListener(){
        this.errLis = null;
    }

}

import java.util.EventListener;

public interface OnHttpResponseListener extends EventListener {
    void onResponse(String response);
}

import java.util.EventListener;

public interface OnHttpErrorListener extends EventListener {
    void onError(int error);
}

説明

適当に作ってるんでエラー番号の処理とかは書いてません。すみません。 Androidで使う場合はHandlerをかませる必要があることが有ります。コメントしていただければそれ用のソースも公開します。 ほとんど例外書いてないんであまり変なことはしないほうがいいかも。

使い方

GET


HttpConnector httpConnector = new HttpConnector("http://example.com/");
httpConnector.setOnHttpResponseListener(new OnHttpResponseListener() {
    @Override
    public void onResponse(String response) {
        System.out.println("Response:" + response);
    }
});
httpConnector.setOnHttpErrorListener(new OnHttpErrorListener() {
    @Override
    public void onError(int error) {
        System.out.println("Error:" + error);//現状0しかない
    }
});
httpConnector.get();

HttpConnector httpConnector = new HttpConnector("http://example.com/"); でホスト指定。 変更する際はsetHostとかでできます。 setOnHttpResponseListenerで成功時のリスナ、setOnHttpErrorListenerで失敗時のリスナを指定。(強制ではないのでエラーのみ未実装とかでもOK。) OnHttpResponseListenerのresponseに受信した文字列が入ります。 そして、最後のhttpConnector.get()で受信を開始します。処理はスレッドで行うようにしてます。

###POST

HttpConnector httpConnector = new HttpConnector("http://example.com/","POSTするメッセージ");
//HttpConnector httpConnector = new HttpConnector("http://example.com/");
//httpConnector.setMeesage("POSTするメッセージ");//この2行でも可
httpConnector.setOnHttpResponseListener(new OnHttpResponseListener() {
    @Override
    public void onResponse(String response) {
        System.out.println("Response:" + response);
    }
});
httpConnector.setOnHttpErrorListener(new OnHttpErrorListener() {
    @Override
    public void onError(int error) {
        System.out.println("Error:" + error);//現状0しかない
    }
});
httpConnector.post();//ここ重要

Getとの違いは、POSTするメッセージを指定すること(コンストラクタでも指定できるしsetMessage()メソッドでも指定可)と、最後のhttpConnector.post()でポストをすることです。

どうでもいい応用

例えば、同じドメインで複数の場所にアクセスするとき

HttpConnector httpConnector = new HttpConnector("get");//実質http://example.com/getと同じ
HttpConnector httpConnector = new HttpConnector("post");//実質http://example.com/postと同じ

っていう使い方ができます。

最後に

読みにくい文章を最後まで読んでいただいてありがとうございました! 誤字やソースのミスがあればバシバシ言ってもらえると嬉しいです! 一人でも役に立てれば幸いです!

Crashlyticsを活用しよう

はじめまして。LiT!ではごっちゃんと名乗っているメンバーです。

今回は Android iOS コースのメンバーで特に そろそろリリースしたいなあ って思っている人向けの記事です。 ...とは言いましたが、リリースする予定が無い自分用のアプリでもかなり便利です。 とりあえず入れておきましょう。

Crashlyticsを活用すれば、リリース後のあんな困った!やこんな困った!を簡単に解決できちゃいます。

また、今回の記事ではAndroidを対象として書いています。 iOSについても後日追記したいとは考えていますが今のところはAndroidのみです。

この記事はQiita版Life is Tech ! Members Advent Calendar 2016及びAdventar版LiT! Members Advent Calendar 2016、6日目の記事です。

Crashlyticsとは

簡単に言えばエラーが起きた時 自動的に エラーの情報が開発者に送信されるサービスです。 CrashlyticsはTwitter社が提供しているサービスなので安心です。

Androidだと、エラーが発生した時「問題が発生したため◯◯を終了します」というものが度々表示され、レポートボタンを押せば開発者にエラー情報を送信できます。 しかし、これは任意であるため、殆どの人が押しません。 これでは、開発者が気づかないエラーが紛れ込んでいる可能性もあります。

しかしCrashlyticsは完全に自動で送信されるため、バグがあったときに 素早く 対処することが出来ます。

また、リリースする予定が無いアプリでも、いきなりなんか落ちた!って事、よくあると思います。しかし、そのタイミングでPCに繋いでいないとエラーログが見れなくてもやもやっとすることが僕は沢山あります。

そんな時でも、Crashlyticsを入れておけば落ち着いてからエラーを見返すことが出来ます。 しかもずっと残るので安心です。

PCへの導入

https://get.fabric.io/ とりあえずアクセス! このページではFabricと書いてありますが、CrashlyticsはFabricの中の一つのサービスなのでまずはFabricの登録をします。

公式サイト見たら簡単に出来ますが一応手順を簡単に書いておきます。

まずはGet Started with Fabricをクリックしてアカウントを作ります。エラー情報が来た時などにログインするのできちんと覚えておきましょう。

無事、登録/ログインが出来たらダッシュボードが開くと思います。

https://fabric.io/downloads/android

このページの手順に従って準備します。

Android StudioのメニューのWindowsならFile-Settings、MacならAndroid Studio-Preferences を開いて、その中のPluginsを選択します。

そして、Browse repositoriesをクリックし、検索窓にFabricと入力し、"Fabric for Android"をインストールします。

その後Android Studioを再起動するとFabricのアイコンが表示されていると思います。

導入はこれで完了です。

アプリへの導入

Android Studioの上のバーのFabricボタンを押します。 すると右側に電源ボタンみたいなのが出てくると思うのでそれをクリックしてログインします。 Kit選択画面まで進んだら、Crashlyticsを選択し、Installボタンをクリックします。 ここで、ソースコードの編集部分が表示されるので確認したらApplyボタンをクリックします。

これで導入自体は完了です。 簡単ですね!

一度インストールした状態でFabricのサイトにアクセスするとアプリ名が表示されているはずです。 Crashlyticsの項目を選択すると、エラーの情報などを閲覧することが出来ます。

また、エラーが発生したときには自分宛てにメールが届きます。 これで見逃すことはありませんね!

最後に

ライブラリやサービスには、利用者にとって便利なものが沢山あります。 しかし、もちろん開発者の手助けになるものも色々あります。

便利なサービスを活用してより良いソフトウェアを作ることもまた、とても良いことです。

今回はCrashlyticsを紹介しましたが、Crashlytics以外にも様々なサービスがあります。是非色々探して使ってみてください! また、これ凄く便利!というものを見つけたらQiitaなどに投稿していただければまた別の人の役に立つと思います!

長い文章を最後まで読んでいただきありがとうございました。 写真や画像がなく凄く読みづらかったと思います。 きっと探せばもっと分かりやすい説明があると思うので1情報として活用していただければと思います。 申し訳ありませんでしたm(-_-)m

明日は@Windows_Tenさんの"MODのテクスチャを作ろう"です! Moddingは闇に包まれてる気がしますができれば楽しいんでしょうね(遠い目)。 僕も少しは作ってますが...

お楽しみに!

はじめまして。

はじめまして。みずこーひーです。
この度Qiitaに書いてた記事を引っ越しました。
Qiitaが改善されたら戻っても良いんですけどね。。。

Androidとかそれ以外の事とか書きます。