一篇不錯的Fresco文章
今天只是入門級別的,改天會出一個深度一點的文章介紹用法。
題外話:最近消沉了有快三個月了,這幾天都不知道自己在幹嘛,這是春節之後的第一篇博文,從今天開始讓一切都不一樣:
Code Behavior, one can.t be less.
Fresco是一個Facebook開源的Android圖片載入庫,效能真的讓我無話可說,而且滿足了我對圖片載入的一切幻想,所以我必須為它寫一篇文章,當然更多的是自己的總結與記錄。
Fresco開源地址:https://github.com/facebook/fresco
Fresco文件地址:https://www.fresco-cn.org
前端時間我寫了一個Android相簿庫Album:Fresco
後一點都不卡了,而且Fresco
做到的幾個內建效果讓我欣喜若狂,所以我把我的使用總結記錄下來:
依賴Fresco
// 一般依賴:
compile 'com.facebook.fresco:fresco:0.14.1'
// 如果需要支援gif,再新增:
compile 'com.facebook.fresco:animated-gif:0.12.0'
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
初始化
建議在App啟動就初始化,所以建議寫在Application#onCreate()
manifest.xml
註冊Application
。
一般初始化:
public classAppextendsApplication {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
高階初始化-配置快取資料夾
// 高階初始化:
Fresco.initialize(this, ImagePipelineConfig.newBuilder(App.this )
.setMainDiskCacheConfig(
DiskCacheConfig.newBuilder(this)
.setBaseDirectoryPath(new File("SD卡路徑")) // 注意Android執行時許可權。
.build()
)
.build()
);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
上面的高階初始化當然不止這麼一點點,這裡舉出一個敏感的例子,就是配置快取SD卡路徑,這裡涉及到Android6.0執行時許可權,我也給一個解決方案,我使用的許可權管理庫是AndPermission
(https://github.com/yanzhenjie/AndPermission):
首先在Application
中判斷是否有SD卡許可權,如果有則初始化到SD卡,如果沒有則採用預設配置:
public classAppextendsApplication {
private static App app;
@Override
public void onCreate() {
super.onCreate();
app = this;
// 如果有SD卡許可權則直接初始化到SD卡。
if (AndPermission.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE))
initFresco();
else { // 沒有許可權,暫時使用預設配置。
Fresco.initialize(this);
}
}
/**
* 高階初始話Fresco。
*/
public void initFresco() {
// 高階初始化:
Fresco.initialize(this, ImagePipelineConfig.newBuilder(App.this)
.setMainDiskCacheConfig(
DiskCacheConfig.newBuilder(this)
.setBaseDirectoryPath(new File("SD卡的路徑..."))
.build()
)
.build()
);
}
public static App get() {
return app;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
然後在SplashActivity
申請SD卡許可權,已被下次進入App
時初始化Fresco
時擁有SD卡許可權:
public classSplashActivityextendsAppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 申請許可權。
AndPermission.with(this)
.requestCode(100)
.permission(Manifest.permission.READ_CALENDAR)
.send();
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
AndPermission.onRequestPermissionsResult(requestCode, permissions, grantResults, listener);
}
/**
* 許可權監聽。
*/
private PermissionListener listener = new PermissionListener() {
@Override
public void onSucceed(int requestCode, List<String> grantPermissions) {
if(requestCode == 100)
// 啟動app:
startActivity(new Intent(SplashActivity.this, MainActivity.class));
}
@Override
public void onFailed(int requestCode, List<String> deniedPermissions) {
if(requestCode == 100)
// 使用者不授權,則退出app:
finish();
}
};
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
高階初始化-配置網路層為OkHttp
Fresco
預設使用HttpURLConnection
作為網路層,當然也可以配置OkHttp作為它的網路層,配置OkHttp為它的網路層需要依賴下面的庫:
compile "com.facebook.fresco:imagepipeline-okhttp3:0.12.0+"
- 1
- 1
然後在Application中初始化的時候注意:
/**
* 初始話Fresco。
*/
public void initFresco() {
// 你的OkHttpClient根據你的設計來,建議是單例:
OkHttpClient okHttpClient = new OkHttpClient();
Fresco.initialize(this, OkHttpImagePipelineConfigFactory.newBuilder(App.this, okHttpClient)
.setMainDiskCacheConfig(
DiskCacheConfig.newBuilder(this)
.setBaseDirectoryPath(new File("SD卡的路徑..."))
.build()
)
.build()
);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
這裡只需要注意原來的ImagePipelineConfig
換成了OkHttpImagePipelineConfigFactory
,並且需要一個OkHttpClient
的物件。
載入網路圖片、url、assets、res、本地File圖片
先給出支援的URI格式列表(列表來自fresco-cn.org):
Type | Scheme | Sample |
---|---|---|
http遠端圖片 | http://或者https:// | HttpURLConnection或者OkHttp |
本地檔案 | file:// | FileInputStream |
Content provider | content:// | ContentResolver |
res目錄下的資源 | res:// | Resources.openRawResource |
asset目錄下的資源 | asset:// | AssetManager |
Uri中指定圖片資料 | data:mime/type;base64, | 資料型別必須符合rfc2397規定 (僅支援 UTF-8) |
SimpleDraweeView
實際開發中,如果沒有特殊需求,我們一般使用SimpleDraweeView
來佔位,傳統的圖片載入框架一般是使用ImageView
,例如:
<ImageView
.../>
- 1
- 2
- 1
- 2
在使用Fresco
時我們一般使用SimpleDraweeView
,它也是繼承ImageView
的:
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_head_background"android:layout_width="match_parent"android:layout_height="@dimen/dp_200"/>
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
把它當成我們平常使用的ImageView
即可,不過我們要注意Fresco
不支援wrap_content
(具體原因看這裡),需要使用match_parent
或者顯示指定view寬高,有些同學看到這個就很頭疼了,但是這真的不是什麼問題,下面給出解決方案:
一、由伺服器返回URL時返回圖片的寬高資訊
平常我們伺服器這樣返回圖片url的:
{
"name":"嚴振杰",
"head":"http://www.yanzhenjie.com/images/main/yzj_head.png"}
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
使用Fresco我們可以把一個圖片url當成一個物件包裹起來:
{
"name":"嚴振杰",
"head":
{
"url":"http://www.yanzhenjie.com/images/main/yzj_head.png",
"width":"500",
"height":"500"}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
或者在URL後面跟一個寬高的引數:
{
"name":"嚴振杰",
"head":"http://www.yanzhenjie.com/images/main/yzj_head.png?width=500&height=500"}
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
二、根據設計師的給的尺寸,預先設定圖片寬高
設計師設計UI的時候肯定會用一個螢幕作為標準,比如iOS的750*1340
,或者Android的720*1280
,我們可以根據設計圖和手機實際寬高計算出View在手機中應有的寬高,見下面的程式碼。
最後:我們在解析出來寬高後,我們可以動態的設定SimpleDraweeView
的寬高:
/**
* 設定view大小。
*
* @param view View。
* @param width 指定寬。
* @param width 指定高。
*/
public static void requestLayout(View view, int width, int height) {
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
if (layoutParams == null) {
layoutParams = new ViewGroup.LayoutParams(width, height);
view.setLayoutParams(layoutParams);
} else {
view.getLayoutParams().width = width;
view.getLayoutParams().height = height;
view.requestLayout();
}
}
/**
* 根據設計圖寬高,計算出View在該螢幕上的實際寬高。
*
* @param width 設計圖中View寬。
* @param height 設計圖中View高。
*/
public static void calcRealSizeByDesign(View view, int width, int height) {
int realWidth, realHeight;
realWidth = 裝置螢幕寬度 * width / 設計圖螢幕寬度;
realHeight = measure[0] * height / width;
requestLayout(view, realWidth, realHeight);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
基礎配置和注意的地方講完了,那麼下面就是重頭戲了,如何載入圖片。
一、載入http/https遠端圖片
/**
* 顯示http或者https遠端圖片。
*
* @param draweeView imageView。
* @param url 連線地址。
*/
public static void showUrl(SimpleDraweeView draweeView, String url) {
try {
draweeView.setImageURI(Uri.parse(url));
} catch (Exception e) {
e.printStackTrace();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
二、顯示本地圖片
這裡就有個坑了,先看一下下面我寫了兩個方法,一個需要傳入View的實際寬高,一個不需要。上面已經說了,SimpleDraweeView
需要在xml中、java中指定它的寬高,或者是使用match_parent
。
這裡需要注意,1. 如果view指定的寬高不是match_parent
則直接呼叫第二個不需要傳入寬高的發那個發,如果為SimpleDraweeView
寫的寬高是match_parent
時,載入圖片需要告訴Fresco
你的View在螢幕上的實際寬高是多少,否則是不能加載出來的。
比如,你的SimpleDraweeView
是全屏的,那麼你就填入螢幕的寬高,如果不是全屏,就利用上面講的方法測量出View的實際寬高後傳入。
/**
* 顯示一個本地圖片。
*
* @param draweeView imageView。
* @param path 路徑。
* @param width 實際寬。
* @param height 實際高度。
*/
public static void showFile(SimpleDraweeView draweeView, String path, int width, int height) {
try {
Uri uri = Uri.parse("file://" + path);
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setResizeOptions(new ResizeOptions(width, height))
.build();
AbstractDraweeController controller = Fresco.newDraweeControllerBuilder()
.setOldController(draweeView.getController())
.setImageRequest(request)
.build();
draweeView.setController(controller);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 顯示本地圖片。
*
* @param draweeView imageView。
* @param path 路徑。
*/
public static void showFile(SimpleDraweeView draweeView, String path) {
try {
Uri uri = Uri.parse("file://" + path);
draweeView.setImageURI(uri);
} catch (Exception e) {
e.printStackTrace();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
三、顯示res中圖片
這裡要注意,我們在為res中的圖片生成Uri的時候:
Uri uri = Uri.parse("res://包名(任何字串或者留空)/" + R.drawable.ic_launcher);
- 1
- 1
所以我們一般留空,因此我們的程式碼看起來是下面的樣子:
/**
* 顯示一個Res中的圖片。
*
* @param draweeView ImageView。
* @param resId 資源ID。
*/
public static void showRes(SimpleDraweeView draweeView, @DrawableRes int resId) {
try {
// 你沒看錯,這裡是三個///。
draweeView.setImageURI(Uri.parse("res:///" + resId));
} catch (Exception e) {
e.printStackTrace();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
四、顯示ContentProvider圖片
/**
* 顯示content provider圖片。
*
* @param draweeView image view。
* @param path 路徑。
*/
public static void showContentProvider(SimpleDraweeView draweeView, String path) {
try {
draweeView.setImageURI(Uri.parse("content://" + path));
} catch (Exception e) {
e.printStackTrace();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
五、顯示assets中的圖片
/**
* 顯示Assets中的圖片。
*
* @param draweeView ImageView.
* @param path 路徑。
*/
public static void showAsset(SimpleDraweeView draweeView, String path) {
try {
draweeView.setImageURI(Uri.parse("asset://" + path));
} catch (Exception e) {
e.printStackTrace();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
你以為到這裡就完了嗎?並沒有,繼續看。
一些預設屬性的設定
<com.facebook.drawee.view.SimpleDraweeView
android:layout_width="20dp"
android:layout_height="20dp"
fresco:fadeDuration="300" // 淡出時間,毫秒。
fresco:actualImageScaleType="focusCrop" // 等同於android:scaleType。
fresco:placeholderImage="@color/wait_color" // 載入中…時顯示的圖。
fresco:placeholderImageScaleType="fitCenter" // 載入中…顯示圖的縮放模式。
fresco:failureImage="@drawable/error" // 載入失敗時顯示的圖。
fresco:failureImageScaleType="centerInside" // 載入失敗時顯示圖的縮放模式。
fresco:retryImage="@drawable/retrying" // 重試時顯示圖。
fresco:retryImageScaleType="centerCrop" // 重試時顯示圖的縮放模式。
fresco:progressBarImage="@drawable/progress_bar" // 進度條顯示圖。
fresco:progressBarImageScaleType="centerInside" // 進度條時顯示圖的縮放模式。
fresco:progressBarAutoRotateInterval="1000" // 進度條旋轉時間間隔。
fresco:backgroundImage="@color/blue" // 背景圖,不會被View遮擋。
fresco:roundAsCircle="false" // 是否是圓形圖片。
fresco:roundedCornerRadius="1dp" // 四角圓角度數,如果是圓形圖片,這個屬性被忽略。
fresco:roundTopLeft="true" // 左上角是否圓角。
fresco:roundTopRight="false" // 右上角是否圓角。
fresco:roundBottomLeft="false" // 左下角是否圓角。
fresco:roundBottomRight="true" // 左下角是否圓角。
fresco:roundingBorderWidth="2dp" // 描邊的寬度。
fresco:roundingBorderColor="@color/border_color" 描邊的顏色。
/>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
xml中可以配置,在Java程式碼中也是可以配置的,我這裡列出一部分API:
SimpleDraweeView simpleDraweeView = new SimpleDraweeView(context);
simpleDraweeView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1));
GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(context.getResources())
.setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER)
.setPlaceholderImage(R.drawable.fresco_failed)
.setPlaceholderImageScaleType(ScalingUtils.ScaleType.FIT_XY)
.setFailureImage(R.drawable.fresco_failed)
.setPressedStateOverlay(ResCompat.getDrawable(R.drawable.transparent_half_1))
.setFailureImageScaleType(ScalingUtils.ScaleType.FIT_XY)
.build();
simpleDraweeView.setHierarchy(hierarchy);
// load image from ...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
一些特殊效果
第一個,先來一個圓形圖片帶白色的邊:
綜合上面的屬性這裡就不多解釋了:
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_user_fund_user_head"android:layout_width="80dp"android:layout_height="80dp"fresco:roundAsCircle="true" // 圓形圖片。
fresco:roundingBorderColor="@color/white" // 白色描邊。
fresco:roundingBorderWidth="2dp"/> // 描邊寬度。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
第二個,Fresco高斯模糊:
相關推薦
看到一篇不錯的文章 轉載一下:原碼, 反碼, 補碼 詳解
本篇文章講解了計算機的原碼, 反碼和補碼. 並且進行了深入探求了為何要使用反碼和補碼, 以及更進一步的論證了為何可以用反碼, 補碼的加法計算原碼的減法. 論證部分如有不對的地方請各位牛人幫忙指正! 希望本文對大家學習計算機基礎有所幫助!
一. 機器數和真值
在學習原碼, 反碼和補碼之前, 需要先了解
oracle之sequence的cache解析,一篇不錯的文章
SQL> oradebug setmypid;
已處理的語句
SQL> oradebug unlimit;
已處理的語句
SQL> oradebugevent 10046 trace name context forever, level 12
已處理的
一篇不錯的Fresco文章
今天只是入門級別的,改天會出一個深度一點的文章介紹用法。
題外話:最近消沉了有快三個月了,這幾天都不知道自己在幹嘛,這是春節之後的第一篇博文,從今天開始讓一切都不一樣:
Code Behavior, one can.t be less.
Fres
一篇不錯的面試文章
前言
打算換個工作,近一個月面試了不少的公司,下面將一些面試經驗和思考分享給大家。另外校招也快要開始了,為在校的學生提供一些經驗供參考,希望都能找到滿意的工作。
剛開始面試的幾家公司,就是備受各種打擊、就是一頓狂問,結果答上來的問題沒
一篇不錯的講解Java異常的文章
六種異常處理的陋習
你覺得自己是一個Java專家嗎?是否肯定自己已經全面掌握了Java的異常處理機制?在下面這段程式碼中,你能夠迅速找出異常處理的六個問題嗎?
Python多執行緒程式設計,執行緒鎖,以及補充上一篇多程序文章
程序補充
程序間的訊號
訊號是唯一的非同步通訊方法
一個程序向另一個程序傳送一個訊號來傳遞某種資訊,接受者根據傳遞的資訊來做相應的事
$ kill -l檢視系統訊號說明
$ kill -9 pid號對程序傳送訊號
訊號名稱
說明
CSDN如何轉載一篇好的文章
轉載CSDN部落格步驟:
1.CSDN部落格頁面右鍵,點選【檢查】
點選檢查後,頁面右側出現html程式碼,如下圖
2.如果需要轉載全文,則在html程式碼下側點選選中article_content 即可,會在程式碼框中自動選中article_
14點最新方法教你如何偽原創一篇高質量文章
一、從寫首尾段
首段和尾端對搜尋引擎來說,判斷原創度至關重要,因此偽原創一篇文章必須處理首尾段。
處理方法1:直接刪除首尾段重寫,讀懂文章中心意思,寫出摘要內容作為首段,寫出總結內容作為尾端,此為最佳偽原創方法。
處理方法2:在原始首尾段上面做修改,比如詞語替換,結
一篇不錯的libevent入門教程
首先給出官方文件吧:http://libevent.org ,首頁有個Programming with Libevent,裡面是一節一節的介紹libevent,但是感覺資訊量太大了,而且還是英文的-。-(當然,如果想好好用libevent,看看還是很有必要的
一篇不錯的fvwm入門教程.
原文出處: http://learn.tsinghua.edu.cn/homepage/2003214890/publish/GNU/fvwm.html
FVWM 的旅程
先去看看王垠寫的 Fvwm簡明使用手冊 ,然後到 FVWM 看看 screenshots ,最好挑
【Android】資料儲存資料庫SQLite(之前有看到的一篇關於SQLite文章,簡單明瞭、覆蓋較全面適合學習)
一:前言
之前介紹過Android中儲存資料的兩種方式:SharedPreferences和File,這篇介紹另一種儲存資料的方式——資料庫SQLite——輕量級資料庫系統。
資料庫:簡單來說可視為電子化的檔案櫃——儲存電子檔案的處所,使用者可以對檔案中的資料執行新增、擷取
對微軟的敵視何時休? 從一篇語言評論文章對C#的評價說起
看到一篇公眾號文章《2020年什麼程式語言最受歡迎,待遇最高?》,其中對C#的描述如下: 點選閱讀原文,看到這是一篇翻譯文章:https://codinginfinite.com/top-programming-languages-2020-stats-surveys/ 這篇文章裡列出的那些語言之中,明顯的G
寫的不錯的一篇雲資料庫的文章
本文作者:許中清,騰訊雲自研資料庫CynosDB的分散式儲存CynosStore負責人。從事資料庫核心開發、資料庫產品架構和規劃。曾就職於華為,2015年加入騰訊,參與過TBase(PGXZ)、CynosDB等資料庫產品研發。專注於關係資料庫、
一篇文章快速了解 量子計算機 (精心整理) (二)
難題 表示 學技術 公司 如何實現 lan 文章 區分 核心 好了,下面轉入量子計算機的總結:
有趣的量子理論
量子論的一些基本論點顯得並不“玄乎”,但它的推論顯得很“玄”。我們假設一個“量子”距離也就是最小距離的兩個端點A和B。按照量子論,物體從A不經過A和B中的
關於0基礎磁盤管理(gpt UEFI...)最好的一篇文章(來自gentoo linux)
blog book wiki mark size hand jsb handbook gen
放鏈接:https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Disks
順便幾張圖
一篇文章貫穿ACE各種發送接收組件 1.2版
font 多次 ++ 兩個 sock tor 當前 int cto
TCP通信過程介紹
首先介紹一下socket通信的基本過程:這裏先如果有兩個家夥在通信,一個是S。還有一個叫C
(1)S打開port監聽本地的port看看有沒有人來連接;
(2)與此同一時候C試
一篇文章學懂Shell腳本
總結 當前 工程 chmod unix ima date don auto
Shell腳本,就是利用Shell的命令解釋的功能,對一個純文本的文件進行解析,然後執行這些功能,也可以說Shell腳本就是一系列命令的集合。Shell可以直接使用在win/Unix/Linux
轉一篇MYSQL文章《數據庫表設計,沒有最好只有最適合》
其他 eqv 新的 fmt 記錄 ces 末尾 base64 過程 http://mp.weixin.qq.com/s/a8klpzM5iam0_JYSw7-U4g
我們在設計數據庫的時候,是否會突破常規,找到最適合自己需求的設計方案,下面來舉個例子:
常用的鄰接表設計
針對學習技術的過程,有一篇文章寫的很好
什麽 鏈接 方法 面向 bsp 獲得 甜美 promise 有效 摘自:https://www.zhihu.com/question/29138020/answer/72193349
很多“大牛”都會告誡初學者,用這個用那個,少走彎路,這樣反而把初學者推向了真正的彎路。
一篇文章學會shell工具篇之sed
哪些 我們 特殊字符 倉庫 刪除 編輯 sta datafile action
sed工具執行原理; 有關sed的參數及action的常見操作方法; 定址; 模式空間和保持空間; 使用標簽
1.首先先來了解一下什麽是sed?
sed叫做流編輯器,在shell腳本