整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

你不知道的前端图片处理(下)

者:semlinker

转发链接:https://mp.weixin.qq.com/s/WyS0buwa0wUny2AxzFARSA

标题:疫情之下(引题)

中国留学生的海外实习之路(主题)

人民日报海外版记者 周姝芸

新冠肺炎疫情之下,中国留学生的学业和职业发展均受到一定程度的影响。和职业发展紧密相关、被中国留学生看重的在留学目的地实习呈现哪些新特点?哪些途径可以获取实习机会?面试有什么技巧?本期通过与几位有经验的同学对话,聚焦疫情下中国学子的海外实习之路。

学校资源开启绿色通道

就读于美国耶鲁大学资产管理专业的肖雅蓝刚获得一个本地实习机会,“我是被雇主企业主动联系的,说起来真的要感谢学校的CDO”。CDO是什么?竟然能让雇主上门?据肖雅蓝介绍,CDO是管理学院的职业发展中心,和很多企业都有联系,学生把简历上传到CDO的网站,企业可在另一端看见。“这家公司觉得我的实习经历匹配他们的业务需求,就通过CDO联系了我。”肖雅蓝说。

无独有偶,在新加坡留学的孔苑最近也通过学校找到了不错的实习机会。孔苑就读于新加坡国立大学工程学院,实习岗位是助理估算师。“我们学校有个网站很实用,面向不同学院的学生发布有针对性的招聘信息。”孔苑回忆起找实习工作的经历说,“我在学校网站报名相关实习项目后,专门负责招聘的老师联系了我,还帮我修改简历,提了不少有用的建议。”

记者梳理相关信息发现,很多国外大学都十分重视职业中心的建设。对学生而言,它是海量就业信息汇集的枢纽,能提供各类丰富的实习机会。

有着多年留学行业工作经验的InVisor国际教育创始人杨卓伦在接受本报记者采访时介绍,国外大学官方提供的求职资源,是很多中国同学会忽略的。“很多国外大学的就业中心不仅能帮学生链接到海量职位,还会提供优质求职平台账号。不仅如此,它的服务具有延展性,不限于办讲座、搞模拟面试,如果学生去主动沟通,还可能被安排个性化服务。”

“借助学校资源是寻找实习机会的较快途径,因为很多雇主不会公开招聘,而会通过校友资源直接对接学校。”肖雅蓝谈道,“我的雇主就是我的校友,出于对学校教学的信任,和我聊了聊简历、背景,就录用了我。”

面试练习突破语言关卡

“疫情下,为了提高远程办公的沟通效率,当地企业对留学生外语表达能力的要求明显提高。”英国职业发展协会注册职业规划师丁倩倩告诉本报记者。不仅如此,疫情催生了线上招聘,视频对话模式省去了肢体语言,口头表达变得更加重要。

对此,孔苑体会很深。“刚开始找实习机会时,如果是视频面试,我就很紧张。”孔苑说,“其实学了这么年的英语,对话是没问题的,但在视频面试这个特殊场景下,想要流利娴熟地表达,还是有难度。”她分享了自己的技巧,“我在面试当天会先进行口语训练,以提前熟悉英语交流的感觉;此外,随着面试经历的增加,可以不断总结经验、调整自己,回答时更加有条理。”

“面试时,和日本同学一起竞争,语言的弱势是没办法忽视的。”从日本立命馆大学毕业不久的丁婷有同感,“我想进咨询行业实习,小组面试不仅要求用日语熟练分析案例,还需要和成员‘打配合’。”

丁婷回忆说,当时正值疫情暴发,面试转到线上,她的经验是日语面试需要大量的准备。“具体而言,就是反复练习。我找日本朋友练过,也报名参加过各种模拟面试活动。”最终,丁婷如愿收到了心仪公司的实习录取信。

据丁倩倩观察,对于中国留学生来说,“一定不要害怕说。我在英国遇到很多留学生获得面试机会后,第一个问题都是问面试用英文还是中文,建议同学们不用担心说不好,先要张开嘴,因为只有这样,你的语言水平才能更快提升”。

积极行动拓宽求职途径

“刚开始,投出的简历石沉大海。”在英国伦敦大学伯贝克学院读数字传媒管理的韩昊阳讲起了自己的求职过程,起初他在网上搜索岗位,然而数量有限,尤其是好的岗位竞争激烈,投递之后鲜有回复。发愁之际,韩昊阳向一位学姐寻求建议,得知当地有家不错的求职机构,可以帮助留学生寻找实习机会。于是,他主动联系询问,“和专业的老师沟通后,我意识到自己简历上信息堆叠,存在不少问题。最终,该机构提供了很多优质职位信息,帮我找到了现在的实习工作。”

韩昊阳的经历从侧面印证了中国留学生在寻找实习机会的过程中,化被动为主动、通过各种途径搜索实习机会的重要。

对此,杨卓伦持相同观点。他认为,留学生可以用好领英等职业社交平台、校友通讯录,同时积极参加线上活动,这些途径都能帮助大家第一时间获得实习机会、前辈的内推以及业内人士的指点。

据杨卓伦观察,疫情期间,拓展当地人脉难度加大,原因在于线上的人际交往较难深入,能得到的内推机会减少,而直接在招聘网站投递简历则竞争激烈。主动、积极、提早准备,是中国留学生求职制胜的必备素质和技能。

丁婷的成功经验正是“提早准备”。“一方面,寻找实习机会不能拖延,提早准备才能赢在起跑线上。在日本实习求职,需要提前1年就开始准备。我刚读研究生时,就意识到必须要行动了。”丁婷说。

有接触大量留学生经验的丁倩倩则建议同学们定一个求职计划,例如明确一下每周花几小时用在寻找实习工作上。“无论是疫情当中,还是今后遇到的各种变化,留学生们需要具备在未知变数中迅速行动的能力。”丁倩倩说。

国家不同实习机会不同(链接)

毕业于日本立命馆大学的丁婷建议多尝试,比如日本的实习种类通常分长期和短期。长期实习具体时间没有限制,短期实习时长一天甚至半天,目的是让求职者提前感受公司氛围,了解公司文化。学生可以借此进入不同行业,多体验、多选择。

据毕业于德国开姆尼茨工业大学的洪海沛介绍,在德国寻找实习机会的渠道有学校网站、职业社交平台、公司官网、熟人推荐等。他曾在当地找到一家腕表公司实习,因为这家公司需要一名既懂德语又懂中文的同学做翻译工作,正好与洪海沛的学历背景匹配,顺利通过面试入职。

确实,留学生和本地学生竞争,要明白自己的优劣势所在,避开薄弱的求职领域,把精力放在成功率更高的岗位上。很少有公司会为了国际化而国际化,但有些岗位倾向招收中国学生,比如有中国地区业务的公司,这类岗位就可以重点关注。

lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<TITLE> New Document </TITLE>

<META NAME="Generator" CONTENT="EditPlus">

<META NAME="Author" CONTENT="">

<META NAME="Keywords" CONTENT="">

<META NAME="Description" CONTENT="">

<style>

html, body {

height: 100%;

padding: 0;

margin: 0;

background: #000;

}

canvas {

position: absolute;

width: 100%;

height: 100%;

}

</style>

</HEAD>

<BODY>

</style>

<canvas id="pinkboard"></canvas>

<script>

/*

* Settings

*/

var settings = {

particles: {

length: 500, // maximum amount of particles

duration: 2, // particle duration in sec

velocity: 100, // particle velocity in pixels/sec

effect: -0.75, // play with this for a nice effect

size: 30, // particle size in pixels

},

};

/*

* RequestAnimationFrame polyfill by Erik Möller

*/

(function(){var b=0;var c=["ms","moz","webkit","o"];for(var a=0;a<c.length&&!window.requestAnimationFrame;++a){window.requestAnimationFrame=window[c[a]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[c[a]+"CancelAnimationFrame"]||window[c[a]+"CancelRequestAnimationFrame"]}if(!window.requestAnimationFrame){window.requestAnimationFrame=function(h,e){var d=new Date().getTime();var f=Math.max(0,16-(d-b));var g=window.setTimeout(function(){h(d+f)},f);b=d+f;return g}}if(!window.cancelAnimationFrame){window.cancelAnimationFrame=function(d){clearTimeout(d)}}}());


/*

* Point class

*/

var Point = (function() {

function Point(x, y) {

this.x = (typeof x !== 'undefined') ? x : 0;

this.y = (typeof y !== 'undefined') ? y : 0;

}

Point.prototype.clone = function() {

return new Point(this.x, this.y);

};

Point.prototype.length = function(length) {

if (typeof length == 'undefined')

return Math.sqrt(this.x * this.x + this.y * this.y);

this.normalize();

this.x *= length;

this.y *= length;

return this;

};

Point.prototype.normalize = function() {

var length = this.length();

this.x /= length;

this.y /= length;

return this;

};

return Point;

})();

/*

* Particle class

*/

var Particle = (function() {

function Particle() {

this.position = new Point();

this.velocity = new Point();

this.acceleration = new Point();

this.age = 0;

}

Particle.prototype.initialize = function(x, y, dx, dy) {

this.position.x = x;

this.position.y = y;

this.velocity.x = dx;

this.velocity.y = dy;

this.acceleration.x = dx * settings.particles.effect;

this.acceleration.y = dy * settings.particles.effect;

this.age = 0;

};

Particle.prototype.update = function(deltaTime) {

this.position.x += this.velocity.x * deltaTime;

this.position.y += this.velocity.y * deltaTime;

this.velocity.x += this.acceleration.x * deltaTime;

this.velocity.y += this.acceleration.y * deltaTime;

this.age += deltaTime;

};

Particle.prototype.draw = function(context, image) {

function ease(t) {

return (--t) * t * t + 1;

}

var size = image.width * ease(this.age / settings.particles.duration);

context.globalAlpha = 1 - this.age / settings.particles.duration;

context.drawImage(image, this.position.x - size / 2, this.position.y - size / 2, size, size);

};

return Particle;

})();

/*

* ParticlePool class

*/

var ParticlePool = (function() {

var particles,

firstActive = 0,

firstFree = 0,

duration = settings.particles.duration;

function ParticlePool(length) {

// create and populate particle pool

particles = new Array(length);

for (var i = 0; i < particles.length; i++)

particles[i] = new Particle();

}

ParticlePool.prototype.add = function(x, y, dx, dy) {

particles[firstFree].initialize(x, y, dx, dy);

// handle circular queue

firstFree++;

if (firstFree == particles.length) firstFree = 0;

if (firstActive == firstFree ) firstActive++;

if (firstActive == particles.length) firstActive = 0;

};

ParticlePool.prototype.update = function(deltaTime) {

var i;

// update active particles

if (firstActive < firstFree) {

for (i = firstActive; i < firstFree; i++)

particles[i].update(deltaTime);

}

if (firstFree < firstActive) {

for (i = firstActive; i < particles.length; i++)

particles[i].update(deltaTime);

for (i = 0; i < firstFree; i++)

particles[i].update(deltaTime);

}

// remove inactive particles

while (particles[firstActive].age >= duration && firstActive != firstFree) {

firstActive++;

if (firstActive == particles.length) firstActive = 0;

}

};

ParticlePool.prototype.draw = function(context, image) {

// draw active particles

if (firstActive < firstFree) {

for (i = firstActive; i < firstFree; i++)

particles[i].draw(context, image);

}

if (firstFree < firstActive) {

for (i = firstActive; i < particles.length; i++)

particles[i].draw(context, image);

for (i = 0; i < firstFree; i++)

particles[i].draw(context, image);

}

};

return ParticlePool;

})();

/*

* Putting it all together

*/

(function(canvas) {

var context = canvas.getContext('2d'),

particles = new ParticlePool(settings.particles.length),

particleRate = settings.particles.length / settings.particles.duration, // particles/sec

time;

// get point on heart with -PI <= t <= PI

function pointOnHeart(t) {

return new Point(

160 * Math.pow(Math.sin(t), 3),

130 * Math.cos(t) - 50 * Math.cos(2 * t) - 20 * Math.cos(3 * t) - 10 * Math.cos(4 * t) + 25

);

}

// creating the particle image using a dummy canvas

var image = (function() {

var canvas = document.createElement('canvas'),

context = canvas.getContext('2d');

canvas.width = settings.particles.size;

canvas.height = settings.particles.size;

// helper function to create the path

function to(t) {

var point = pointOnHeart(t);

point.x = settings.particles.size / 2 + point.x * settings.particles.size / 350;

point.y = settings.particles.size / 2 - point.y * settings.particles.size / 350;

return point;

}

// create the path

context.beginPath();

var t = -Math.PI;

var point = to(t);

context.moveTo(point.x, point.y);

while (t < Math.PI) {

t += 0.01; // baby steps!

point = to(t);

context.lineTo(point.x, point.y);

}

context.closePath();

// create the fill

context.fillStyle = '#ea80b0';

context.fill();

// create the image

var image = new Image();

image.src = canvas.toDataURL();

return image;

})();

// render that thing!

function render() {

// next animation frame

requestAnimationFrame(render);

// update time

var newTime = new Date().getTime() / 1000,

deltaTime = newTime - (time || newTime);

time = newTime;

// clear canvas

context.clearRect(0, 0, canvas.width, canvas.height);

// create new particles

var amount = particleRate * deltaTime;

for (var i = 0; i < amount; i++) {

var pos = pointOnHeart(Math.PI - 2 * Math.PI * Math.random());

var dir = pos.clone().length(settings.particles.velocity);

particles.add(canvas.width / 2 + pos.x, canvas.height / 2 - pos.y, dir.x, -dir.y);

}

// update and draw particles

particles.update(deltaTime);

particles.draw(context, image);

}

// handle (re-)sizing of the canvas

function onResize() {

canvas.width = canvas.clientWidth;

canvas.height = canvas.clientHeight;

}

window.onresize = onResize;

// delay rendering bootstrap

setTimeout(function() {

onResize();

render();

}, 10);

})(document.getElementById('pinkboard'));

</script>

</BODY>

</HTML>