2017年12月29日 星期五

程序(process)與多執行緒(thread)




程序(process)
當一個程式在電腦執行時會先向系統進行註冊,系統此時會將這程序標上一個唯一的ID以作為區別,這個就是PID,也就是程序的ID。procedure在中國大陸翻譯為「程序」,在港台和其他領域則翻譯為「程式」,一般的程式為單執行緒。

多執行緒(thread)
系統可以同時間內把開多條生產線(執行緒)完成一件工作,就是多執行緒(multi-threading),讓工作在比較短的時間內完成。

結論:
1、程式=程序,只是地區的譯名不同
2、一個程序可以有單執行緒與多執行緒。如果希望提氒完成工作可以開多執行緒同時進行幾個相同的工作把作業完成。


2017年12月26日 星期二

PL/SQL常用語法(in PostgreSQL)

PL-SQL,這裡搵的是PostgreSQL的SQL語法。
比較要注意事情是分號,mssql沒有分號也可以查詢,plsql沒有分號的多筆查詢會報錯
以下是比較常出現的查詢/新增/修改/刪除語法


--建一個有id、value、remark的資料表
CREATE TABLE public.test2
(
id integer NOT NULL DEFAULT nextval('test_table_id_seq'::regclass),
value integer,
remark text
)

--刪除資料表的所有資料
delete from test2;
--刪掉資料表的結構
drop table test2;
--新增一筆資料
INSERT INTO public.test2(
value, remark)
VALUES (1, 'test');

--修改一筆資料
UPDATE public.test2
SET id=1, value=1, remark='test1'
WHERE id=919; 

--查詢資料表筆數
select count(*) from test2;

--查詢資料表
select * from test2;

--查詢資料表前500筆資料
select * from test2 limit 500



2017年11月12日 星期日

visual studio 2003 update更新教學

在工具 >擴充功能與更新



然後左邊選更新就可以看到這個列表,再把選項下載後安裝就可以了




2017年10月24日 星期二

VM檔案互傳


這個問題網路上有提到,我是覺得這個方式簡單易懂所以就分享在這邊

選擇VM視窗上方VM的選單->settings->Options頁面->Shared Folders->Always enabled->新增實體資料夾 
VMware Shared Folders:在虛擬機網路上芳鄰看到該資料夾

以下是圖片:
1、VM的選單->settings


2、Options頁面->Shared Folders->Always enabled->新增實體資料夾





以下是在vm的資料夾路徑:
在虛擬機網路上芳鄰找到該資料夾就可以和上述的實體資料夾對傳資料








2017年10月14日 星期六

[Android]android webview常用設定

android webview常用設定
大概整理了比較常用的webview的元件和項目在這邊以便查詢:



1、webSettings
詳細可以看android sdk相關文檔
設定webview的屬性處理:

方法名稱 描述
setAllowFileAccess 是否允許web連本地資料
setAppCatchMaxSize 設定快取最大值
setAppCatchEnable 設定API是否支援快取
setAppCatchPath 設定快取存放路徑
setAppCatchMode 設定快取類型,LOAD_NO_CACHE:不使用快取
setDomStorageEnabled 設定是否使用DOM Storage缓存
setJavaScriptEnabled 設定是否使用JavaScript
setSaveFromData 設定是否儲存表單數據
setSavePassword 設定是否儲存密碼
setSupportMulitipleWindows 設定是否支援多視窗瀏覽
setSupportZoom 設定是否支援頁面縮放


以下是範例:
setting.setDomStorageEnabled(true);//设置DOM Storage缓存

其他設定範例:(一般webview設定不會用到這個,這裡只是方便查詢)
物件.addJavascriptInterface(this, "javatojs");



2、webviewclient
設定webview的事件處理

方法名稱 描述
onUpdateVistiedHistory 更新歷史記錄觸發
onPageFinished 頁面載入完成觸發


以下是範例:
private final class WebViewClientImpl extends WebViewClient
{
        public void WebViewClientImpl()
        {
        }

        @Override
        public void onPageFinished(WebView view, String url)
        {
            view.loadUrl("javascript:window.ExtObj.responseResult(getFacebookShareURL())");
        }
}




3、webChromeclient
處理例如alert、頁面載入進度事件

方法名稱 描述
onJsAlert javascript的alert事件
onJsConfirm javascript的Confirm事件
onProgressChanged 頁面進度

以下是範例:
物件.addJavascriptInterface(new WebMap2.JsCallBack(), "ExtObj");
            物件.setWebChromeClient(new WebChromeClient(){
                @Override
                public void onProgressChanged(WebView view, int newProgress) {
                 
                }
            });

2017年10月11日 星期三

[Android]如何把eclipse的程式轉入android studio

這個問題的答案很簡單,就只是下圖黃色處,import eclipse的檔案就會自動轉成支援android stuido的版本,這個問題是自己幾天沒看就退步了,特別記在這邊。

[Android] Gridview研究(一)


這篇是研究,如何使用Gridview,這裡先舉最簡單的例子,例如這個2x2的純圖片按下去可以知道按到那個項目的功能:下載連結


F:\_android_work\Android_work_new2\webview_new\GridViewEx\app



程式用書上的例子就好,我想把這個程式整個研究一遍。ImageAdapter的部份要研究一下,先研究到這邊。
xml:
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

            android:id="@+id/gridView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:numColumns="2"
        android:stretchMode="columnWidth" >

   








MainActivity:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView gridview = (GridView) findViewById(R.id.gridView1);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
Toast.makeText(this, "選取"+(arg2+1)+"", Toast.LENGTH_SHORT).show();
}
}





ImageAdapter.java:
public class ImageAdapter extends BaseAdapter {
int[] images = { R.drawable.feather1, R.drawable.feather2,
R.drawable.feather3, R.drawable.feather4,
R.drawable.feather5, R.drawable.feather6 };
Context mContext;
ImageAdapter(Context c) {
mContext = c;
}

@Override
public int getCount() {
return images.length;
}
@Override
public Object getItem(int arg0) {
return arg0;
}

@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
ImageView imageView;
if (arg1 == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(288, 288));
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
} else {
imageView = (ImageView) arg1;
}
imageView.setImageResource(images[arg0]);
return imageView;
}
}

2017年9月18日 星期一

CS0103: 名稱 'Newtonsoft' 不存在於目前內容中



有時json的相關元件會遇到這個問題,基本上就是請看下圖,或者手動更新Newtonsoft.Json.dll

原因:因為web端的版本與線上版本不同,無法從nug的部份更新
解決方式:https://json.codeplex.com/
手動下載把4.5版的Newtonsoft.Json.dll裝到專案上面就可以了




2017年9月3日 星期日

[asp.net][c#]無法辨認的屬性 'targetFramework'。


問題圖是這張。看到這個問題請先看.net framework的版本,如果是2.0要在修改應用程式集區:



右鍵改成4.0





另一種方式是刪掉紅色的這行例如
compilation debug="false" targetFramework="4.0" 


2017年8月13日 星期日

[小遊戲]信任的演化


信任的演化網頁。這是一個討論「何謂信任」的小遊戲,用以下的小遊戲為例,以五種類型的相處策略為例:

模仿貓: 哈囉!我第一次會出「合作」。之後,我會選和你前一步一模一樣的選擇
黑到底:絕不合作,這是弱肉強食的世界
紅嬰仔: 我們大家做朋友吧!
牛文聰:我哞佮意輸的感覺。我會先給你面子「合作」,但是最好不要用「欺騙」惹我生氣,我袂爽就會想要報仇!
福爾摩星兒: 分析人是我的特長。遊戲開始我會「合作」、「欺騙」、「合作」、「合作」。如果你反過來欺騙我,我就會像模仿貓那樣跟著你出牌。如果你一直不騙回來,那我就會像黑到底那樣榨乾你。



實際測試的結果:
五到六步以內黑方優勢,但隨著局勢逐步地進展,黑到底會不知不覺被消滅


遊戲的結論說明了:
1、一直欺騙別人,黑到底的相處方式,長期來看會被視為不好相處而整組被淘汰掉
2、承上,條件包括:「重複的互動」、「非零和」、「犯錯機率低」這三個條件

這個遊戲很像「詐欺遊戲」,一開始欺騙人的多數都能賺大錢,但隨著局勢的演進,欺騙人獲利的人會很難組到隊,漸漸地就會被社會所淘汰掉。
此外另一個重點是,惡人(黑色)不好是當然的爛好人(粉紅色)也是不好的選擇民粹or情緒化型(黃色)、見機行事型(褐色)的人長期來看也是較不好的選擇。這是實驗數據推演的結論。



此外我發現到二個有趣的現象:
1、黃色型(民粹or情緒化型) > 惡人(黑色)
黃色型的人基本上會針對黑色類型的人進行反擊,但能和藍色型的人相處良好,短期來看黑色的勢力會快速被黃色消滅。
看看這個例子,用筆記制裁惡人的死亡筆記本男主角會有專屬的電視台並不是難以想像的事情,所以似乎也有民粹某程度而言好像也不錯的說法。
至於黃色和藍色型的人相處那就是數量的問題,沒有相克的情況。



2、褐色型(見機行事型) > 黃色型(民粹or情緒化型)
也就是說如果場上只有褐色與黃色,情緒化型的人容易被見機行事型的人騙到,或者見機行事型的人比較能在各種地方獲利,詐欺遊戲的劇情時常會有各種的說詞去說服不理性的路人這只是一時的操作錯誤之後再大撈一票的例子,這就是民粹or情緒化型的人長期來看不好的玾由




3、如果只有福爾摩星、粉紅、模仿貓的情況,因為福爾摩星初期會佔到粉紅的便宜,但福爾摩星有測試成本,長期可能會略輸模仿貓一些,但也可能是機率的問題,其餘和黃色vs黑色vs藍色(實驗1)的結果接近


2017年6月25日 星期日

由 GridView 'GridView1' 引發但尚未處理的事件 PageIndexChanging。


錯誤訊息是這個:

由 GridView 'GridView1' 引發但尚未處理的事件 PageIndexChanging。

一般網路上教的是加上以下的程式碼,但試過會出錯,點選兩下是加GridView1_SelectedIndexChanged與要求不符。
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
GridView1.DataBind();
}


其實答案很簡單,在Gridview加上OnPageIndexChanging="GridView1_PageIndexChanging"就可以執行了

2017年6月22日 星期四

jqGrid錯誤訊息、jqGrid建置


這篇文章是要討論jqGrid常遇到的問題,也列出相關的錯誤訊息以便訂正。
例一:

Cannot read property 'msie' of undefined



例二:
這是錯誤訊息的例子
也是屬於引用js錯誤的例子:
Uncaught TypeError: $(…).jqGrid is not a function

這兩個問題的答案相同,都是js沒正確會發生的情況,情況一是新版的jquery用到了舊版的jqgrid發生的情況。



那麼怎麼加js檔好?基本上用相對路徑比較好,上述的例子有可能是讀不到那個js檔造成的。以下是測試可以運作的版本:藍色部份去掉會沒有排版。






2017年6月17日 星期六



在SQL產生insert程式碼


這次的題目是,如何在SQL產生insert的程式碼

在Oracle基本上就有這個功能而且操作很直覺,那麼SQL當然也有這個功能,它的關鍵字:SQL Server、Insert Scripts

當然別的部落格也有這個東西的教學,我看到的是英文介面,就用中文介面來看一看:



1、資料庫右鍵 > 工作 > 產生指令碼




2、選擇物件,選資料表



3、在這個畫面選進階


4、這個畫面在「要編寫指令碼的資料類型」中選擇「結構描述與資料」的話就可以得到前述資料表資料的insert script語法



5、最後是產出指令碼,這是schema碼還有insert scripts的版本


最後拿這個程式碼就可以把資料移動到另一台sql server了

2017年5月13日 星期六


這個網頁是個畫demo簡報的工具,有時間來研究一下。

https://moqups.com/?utm_expid=100030427-10.DlsdnCC0S_yiVKohsi4CHw.0


2017年4月25日 星期二

listView的相關知識



1、
listView通常用SimpleAdapter、自定義BaseAdapter這兩種方法


2、
Android SimpleAdapter 的list刷新问题。
使用SimpleAdapter 创建的list,是不能通过notifyDataSetChanged 来更新的,因为SimpleAdapter 主要是用来创建静态的数据的列表,如果要实现动态更新数据,需要自己定义一个基于BaseAdapter的adapter,然后通过notifyDataSetChanged 来更新list。

If you look at the SimpleAdapter description it says it is "An easy adapter to map static data to views defined in an XML file." I've added the emphasis -- put simply, SimpleAdapater isn't built for use with data that changes; it handles static data only. If you can't use an ArrayAdapter because your data has more than a single bit of text, then you will either have to build your own custom ListAdapter, or put your data in a DB and use one of the CursorAdapters.


3、
也就是說如果要寫一個可能會刷新的ListView就要自定義介面。這個程式是我找到的例子。因為這篇還算是草稿,這邊只貼BaseAdapter的部份:檔案連結


import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.TextView;
import java.util.ArrayList;import java.util.HashMap;
public class lvButtonAdapter extends BaseAdapter {
    private class buttonViewHolder {
        ImageView appIcon;        TextView appName;        ImageButton buttonClose;    }

    private ArrayList, 
Object>> mAppList; private LayoutInflater mInflater; private Context mContext; private String[] keyString; private int[] valueViewID; private buttonViewHolder holder;
public lvButtonAdapter(Context c, ArrayList, Object>> appList, int resource, String[] from, int[] to) {
mAppList = appList; mContext = c; mInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); keyString = new String[from.length]; valueViewID = new int[to.length]; System.arraycopy(from, 0, keyString, 0, from.length); System.arraycopy(to, 0, valueViewID, 0, to.length); }

@Override public int getCount() {
return mAppList.size(); }

@Override public Object getItem(int position) {
return mAppList.get(position); }

@Override public long getItemId(int position) {
return position; }

public void removeItem(int position){
mAppList.remove(position); this.notifyDataSetChanged(); }

@Override public View getView(int position, View convertView, ViewGroup parent) {
if (convertView != null) {
holder = (buttonViewHolder) convertView.getTag(); } else {
convertView = mInflater.inflate(R.layout.lvitem, null); holder = new buttonViewHolder(); holder.appIcon = (ImageView)convertView.findViewById(valueViewID[0]); holder.appName = (TextView)convertView.findViewById(valueViewID[1]); holder.buttonClose = (ImageButton)convertView.findViewById(valueViewID[2]); convertView.setTag(holder); }

HashMap, Object> appInfo = mAppList.get(position); if (appInfo != null) {
String aname = (String) appInfo.get(keyString[1]); int mid = (Integer)appInfo.get(keyString[0]); int bid = (Integer)appInfo.get(keyString[2]); holder.appName.setText(aname); holder.appIcon.setImageDrawable(holder.appIcon.getResources().getDrawable(mid)); holder.buttonClose.setImageDrawable(holder.buttonClose.getResources().getDrawable(bid)); holder.buttonClose.setOnClickListener(new lvButtonListener(position)); }
return convertView; }

class lvButtonListener implements View.OnClickListener {
private int position;
lvButtonListener(int pos) {
position = pos; }

@Override public void onClick(View v) {
int vid=v.getId(); if (vid == holder.buttonClose.getId())
removeItem(position); }
}
}


參考網頁

2017年4月14日 星期五

[c#]上傳程式網頁範例


因為我看到很多教學網頁都寫得很難懂,像是把上傳限制和上傳程式分開寫教學,所以我測試了一個實際上可以跑的精簡版本放在這邊,希望能加快寫程式查資料的速度。

註:
//假設主目錄在C:\TESTA\WebSite1,圖片資料夾在C:\TESTA\WebSite1\FileUploadDemo





--
前端:
擺至少三個元件如下:
--





--
後端:
簡單地說只有這一小段,註解是安裝的注意事項
--

//上傳excel檔案
    protected void uploadExcelFile()
    {
        //假設主目錄在C:\TESTA\WebSite1,圖片資料夾在C:\TESTA\WebSite1\FileUploadDemo
        String saveDir = "\\WebSite1\\FileUploadDemo\\";
        String appPath = Request.PhysicalApplicationPath;

        if (FileUpload1.HasFile)
        {
            String savePath = appPath + saveDir + FileUpload1.FileName;
            FileUpload1.SaveAs(savePath);
            Label5.Text = "上傳成功,檔名:" + savePath;
        }
        else
        {
            Label5.Text = "請先挑選檔案再上傳";
        }
    }





--
webconfig的部份:
--

   
   

--
執行結果:
成功的話上傳會有檔案,注意有20mb的限制(webconfig)
--




這是連結


2017年4月12日 星期三

[Android]詢問對話框



 這個例子是在主頁面按返回上頁鍵會跳出對話框,確定後離開程式








以下是程式碼:

@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event)
{
    if (keyCode == KeyEvent.KEYCODE_BACK && this.getTitle().equals("") )
    {
        // 創建退出對話框        AlertDialog.Builder d = new AlertDialog.Builder(this)
                .setMessage("確定要退出嗎")
                .setCancelable(false);
        d.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override            public void onClick(DialogInterface dialog, int which) {
                finish();            }
        });        d.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override            public void onClick(DialogInterface dialog, int which) {

            }
        });        d.show();    }else if(keyCode == KeyEvent.KEYCODE_DEL){

    }else{
        finish();    }
    return false;}



[android]Text字體



https://dotblogs.com.tw/hanry/2012/05/15/72196

若使用Text需要運用到不同字體的時候,可以在Text裡proper找textStyle輸入

正常=normal

粗體=bold

斜體=italic文字

android:textStyle="bold"


以下的例子是實際上可能會看得到的排版,介紹如下:
xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:orientation="horizontal"    android:paddingBottom="10dp"    android:background="#BBBBBB"    android:layout_height="150dp">
            android:layout_width="150dp"        android:layout_height="150dp"        app:srcCompat="@mipmap/ic_launcher"        android:layout_marginStart="12dp"        android:id="@+id/image"        android:scaleType="centerCrop"        android:layout_alignParentBottom="true"        android:layout_alignParentStart="true" />
            android:orientation="vertical"        android:layout_width="match_parent"        android:layout_height="match_parent">
                    android:text="TextView"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"            android:layout_marginLeft="5dp"            android:layout_marginRight="5dp"            android:textStyle="bold"            android:id="@+id/f_name"            android:layout_below="@+id/f_name"            android:layout_alignParentEnd="true" />
                    android:text="TextView"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="5dp"            android:layout_marginLeft="5dp"            android:layout_marginRight="5dp"            android:id="@+id/d_name"            android:layout_alignTop="@+id/image"            android:layout_alignParentEnd="true" />    


[Android]intent事件(兩種寫法)

有兩種intent的事件寫法,記錄在這邊:


1、
第一種是送值到下一個頁面,在下一個頁面收值
(主頁面)送出:
Intent intent=new Intent(this, PhotoDetail.class);intent.putExtra("photo", MainActivity.contactTemp.getPhoto() );this.startActivity(intent);

(頁面二)收值:
Uri imgUri=Uri.parse("file://" + getIntent().getStringExtra("photo"));



2、
第二種寫法是有回傳值的類型,例如這個:

(主頁面)送出:
startActivityForResult(new Intent(MainActivity.this, AddNotes.class), 1);

(主頁面)收回傳值
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        Bundle bundleResult = data.getExtras();
        String photo = bundleResult.getString("photo").toString();
    }
}




註:請記得在AndroidManifest.xml加activite,以這個程式為例就是以下的寫法:
android:name=".PhotoDetail">



這邊順便寫一寫如何引用照想功能的api:
Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(it,100);
startActivityForResult(it,100);




2017年4月11日 星期二

onclick()在xml的加入教學


這個程式是onclick的筆記
android:onClick="onClick"

public void onClick(View view){
     Toast.makeText(AndroidOnClickActivity.this,
       "Button Clicked", Toast.LENGTH_LONG).show();
    }


xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
<Button 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Click Me"
    android:onClick="onClick"
    />
</LinearLayout>




?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.AndroidOnClick;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
 
public class AndroidOnClickActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
     
    public void onClick(View view){
     Toast.makeText(AndroidOnClickActivity.this,
       "Button Clicked", Toast.LENGTH_LONG).show();
    }
}