image1 image2 image3

HELLO I'M Pinman|WELCOME TO MY PERSONAL BLOG|I LOVE TO DO CREATIVE THINGS|I'M WEB DEVELOPER

Hack NTU

    這次的Hackathon是在台大舉辦的,這也是我第一次來到台大,抱著增廣見聞的輕鬆心情我們三個中大人來參加了這次的黑客松,完全沒有準備空手就來的我們,是來結交朋友、吃東西的(? 呃..至少我們也有事先去了解主題啦,只是一直沒有好點子,想說當場再說了,第一天下午的開幕式,我們霸佔了別人的桌子,因此認識了一位即將升大五(因為他輔系電機!超強)的台大學長,就這樣我們組成了一隊。

    第一天我們研究了Intel公司提供的Intel Edison板子,但很坑的,他啥也沒提供就只有那塊板子,其他sensor啥的都要我們當場買,也就是說,結束這個活動我們會帶著一堆sensor回家(?也是不錯啦!但我們很果斷地把它給還回去了。另外有一家公司,VRwood超級慷慨,他提供每一組一個VR glass讓我們去體驗,直到最後一天我才知道,原來那是要送給我們的!!第一天廢廢的我甚麼沒做,倒是拿了不少貼紙,還有到處去攤位拍照打卡抽獎,意外的每個都被我抽中,sudo衣服兩件、windows提供的碎紙機和廣角鏡以及耳機收納盒,然後就愉快地去睡覺了(這不是黑客松嗎?還去睡!但睡在台大體育館的柔道室還滿爽的耶,冷氣夠猛!但此起彼落的打呼聲真不是蓋的。

    第二三天我們就是認真的開始趕工了,誰叫前一天我們過得太爽了,我們討論後決定要寫點餐系統,產生QRcode讓店家可以掃描後得到即時菜單,建勳負責寫後台(利用rails寫網頁端讓店家新增菜單,成品

    我和承霖是負責寫App供客戶點餐使用,成品
    
    學長是負責寫店家QRcode掃描的部分,由於沒要到成品所以就無法呈現給大家看了,整個作品的運作流程是,店家可以透過網頁端口修改菜單,顧客可從App選擇餐點數量,選擇完畢後可以提交產生QRcode
    經由掃描後店家廚房可以在網頁及時菜單上看到掃描到的餐點項目及數量。

    技術上網頁部分是利用rails寫的,據建勳說法,他說rails很好寫,寫起來很快,而在最後Expo時間我也有去欣賞各組的成品,也發現不少人都是利用rails架構網頁,讓我也想去接觸看看,App部分是利用Android Studio寫的,由於我跟承霖對App都還不是很熟悉,我們花了一天在研究,從拖拉式選單,再來是List View,我在List View這部分一直搞不訂,最後承霖自己上網找了資料把他搞定了,而我呢頓時士氣低靡,每次都被List View打死,最後承霖開始想辦法讓我振作,我就去研究了Web Service,透過URL抓取json格式內容後解析然後存起來

實作code

mainActivity.java
public class MainActivity extends Activity {

    EditText etResponse;
    TextView tvIsConnected;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // get reference to the views
        etResponse = (EditText) findViewById(R.id.etResponse);
        tvIsConnected = (TextView) findViewById(R.id.tvIsConnected);

        // check if you are connected or not
        if(isConnected()){
            tvIsConnected.setBackgroundColor(0xFF00CC00);
            tvIsConnected.setText("You are conncted");
        }
        else{
            tvIsConnected.setText("You are NOT conncted");
        }


        // call AsynTask to perform network operation on separate thread
        new HttpAsyncTask().execute("https://tranquil-eyrie-4663.herokuapp.com/items.json");
    }

    public static String GET(String url){
        InputStream inputStream = null;
        String result = "";
        try {

            // create HttpClient
            HttpClient httpclient = new DefaultHttpClient();

            // make GET request to the given URL
            HttpResponse httpResponse = httpclient.execute(new HttpGet(url));

            // receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();

            // convert inputstream to string
            if(inputStream != null)
                result = convertInputStreamToString(inputStream);
            else
                result = "Did not work!";
            Log.i("InputStream","success");

        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }

        return result;
    }

    private static String convertInputStreamToString(InputStream inputStream) throws IOException{
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)
            result += line;

        inputStream.close();
        return result;

    }

    public boolean isConnected(){
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Activity.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected())
            return true;
        else
            return false;
    }
    private class HttpAsyncTask extends AsyncTask {
        @Override
        protected String doInBackground(String... urls) {

            return GET(urls[0]);
        }
        // onPostExecute displays the results of the AsyncTask.
        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(getBaseContext(), "Received!", Toast.LENGTH_LONG).show();
            try {
                JSONObject json = new JSONObject(result);

                String str = "";

                JSONArray articles = json.getJSONArray("arraylist");
                str += "articles length = "+json.getJSONArray("arraylist").length();
                str += "\n--------\n";
                str += "names: "+articles.getJSONObject(0).getString("name");
                str += "\n--------\n";
                str += "url: "+articles.getJSONObject(0).getString("url");

                etResponse.setText(str);
                //etResponse.setText(json.toString(1));

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            }
        }
    }
}

記得要在manifest.xml加上
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    我跟承霖分開寫了者兩個最後要合併後,發現這個web service是非同步的方式去取得資料,因此當List View內部要去撈呈現資料時,總是出現資料是空的狀態,所以都無法呈現,倘若網路速度可以快到資料去撈時已經抓好那就沒問題了,但是我們當時已經快走投無路了,想說既然都已經完成了這樣那後續要做修改應該問題不大,因此我們最終作法是將json檔存到project中,再去將資料撈 出來,web service的部分先省略掉

    最後將撈出來的資料,存到array list中,由於我們產生QRcode的方式是透過json格式去產生,因此需要再將顧客訂的菜單以json格式透過google API提供的服務產生,將訂單存承json格式的方式是(activity1.java編碼成json傳給activity2.java接收)

activity1.java
private String JSONString;
try {

    JSONEncode();
} catch (JSONException e) {
    e.printStackTrace();
}
Intent i = new Intent(MainActivity.this,MainActivity2Activity.class);
i.putExtra("items_json", "{\"arraylist\":[{\"id\":1,\"rid\":0,\"itms\":"+JSONString+"}]}");
startActivity(i);

activity2.java
String raw_json = intent.getStringExtra("items_json");

    這大概是我們在App上比較主要的技術,第二天我基本上都沒有睡覺,前一天過得太愜意導致第二天睡都不能睡,一直撐到第三天早上七點終於完成了我們的作品,趕緊上傳,抱著睡袋去睡覺!睡三個小時又爬起來等待Expo的開始。

    在Expo中看到了大家各式各樣的點子,有些團隊將點子架構的非常完整,有些團隊已經將成品做的非常的完整了,其中有一組他們是做類似保全的App,雖然他們的App還沒有完整的呈現出來,但整體構想令我印象深刻,大致上是說,每個人可以透過App開啟保護模式,特定時間內未解除,會發起緊訊,之後將會通知緊急連絡人或警察等,身為女性的我,認為當在夜間一個人走在無人的小徑中時,有這App能確保我們能夠更加的安全。

    在這三天中除了幾百組的團隊一起在coding之外,現場也有許多的Teck talking,我去聽了兩場,一個是介紹Mack School,我想這是所有資訊領域對資訊很有興趣的學生夢寐以求的學校了,一群人一同為一個東西寫程式解決問題,一起研發有趣的軟體等,相較於我們現在在學校所學的一些東西,不能說他一定沒有用處,但有些未必是我們所感興趣的,卻還是一定要修,而且不能夠被當,演變成我們最終修課目標是不要被教授當掉,甚至是為了分數去死記某些東西,最終甚麼也沒得到!

    另一場Talking是Fred主講的,他介紹了Qt以及QML帶來的有趣東西,之前6月時去參加台灣黑客松也有QML這個議題,但當時對這東西沒有深入了解,也不知道他能夠做些甚麼?聽了Fred的介紹才知道,他是一種長得像是CSS語法,但其實是類似C的程式,而台灣客松的倒數計時就是用QML所架構的,幾行簡單的語法就能夠寫出動畫,感覺值得自行摸索一翻

黑客松倒數計時器


    三天的活動,收穫不少,學到一些新東西,還有和團隊一起完整一個小小的專案,雖然沒有貢獻很多,但從中學到了一些技術,接下來和承霖一起報了台灣黑客松九月場次,我們計劃只要有空就去參加台灣黑客松,一起想一個較大型的Project每一次黑客松都將這個Project做得更完美。

戰利品

Share this:

CONVERSATION

3 意見:

  1. 你好,我是大陆人,查询opencv的时候偶然发现了你的blog,然后碰巧发现你也参加了HackNTU。我是在15年夏天去参加的,不知道你参加的是那一年的。我主攻opencv和android,应该和你差不多,如果有兴趣咱们可以多交流一下。这是我的邮箱 hackersteveguanqi@gmail.com 我的领英:https://cn.linkedin.com/in/yuguanqi

    回覆刪除