艺考吧。 面试的时候大方,能放得开就好,南广的老师都挺和蔼
strikingly美 英 ['straɪkɪŋli]adv.极;醒目地网络惊人地;显著地;明显地
上班肯定累,经常加班,竞争压力大,人累心更累
strikingly公司靠谱的
说产品,Strikingly 的编辑器编辑功能比 Wix 差不少,不过可能对没什么审美的国内大众来说,这倒是件好事。国内的业务在建站之外还是以微信生态为主,公众号、小程序什么的。CEO 曾经表示理想状态是用上线了做一个小程序,可以一键在各种小程序平台发布。这个想法很有价值,但目前看来还是微信为主。确实也希望他们的业务能发展得越来越好。
总结一下就是,这是一家褪去了 YC 光环的国产创业公司。如果你是客户,他们还挺靠谱。如果你是程序员,要是喜欢互联网,世界那么大,为什么不去尝试下呢?
Last day 定好之后,接到了挺多圈内小伙伴的询问和关怀。也接到了猎头公司的联系电话。我还妹有走呐!!我不是我没有你们憋担心啊!!!
想来想去,终于点开了这个知乎问题,毕竟也就现在才终于可以好好填这是一种什么样的体验了。
先介绍一下,我是上线了的品牌运营,马上这个职级前面可以加个“前”。17 年 5 月底入职,18 年 8 月上旬离职。
17 年 5 月,我和老东家的合同刚好到期,在续约合同制定出来前,收到了来自 Strikingly HR 小姐姐的面试邀请。
第一轮是电话面试,面试官非常认真仔细。因为我大学期间就开始做杂志,所以工作时间从 09 年就开始啦。面试官审核了我简历里每一个看上去不合常理的细节后,给我发了一套笔试题。
笔试通过之后,进入最终面试。面试官是 CEO David,他是我见过最聪明的人之一。而且他非常有绅士风度,我的英文发音超级烂,可是他并因此没嘲笑我。他提出了很多尖锐而直接的问题,很多都是百度都搜不到答案那种,只能凭直觉来回答。面试结束之后,我甚至以为自己面试失败了。
然而当天晚上 7 点,就接到了电话 HR 小姐姐的电话,她问我:“可以提供一下背调电话吗?”我高兴得在非常熟悉的贵州餐厅里抓着老板的手臂说:“啊!再给我一碗酸汤肉末粉!我还能吃!”老板很嫌弃:“不能心情好就吃这么多啊。”
之后就算是真的进入了 Strikingly 啦。
入职当天拿到了一件紫色的厂服,这件厂服是 David 出席活动时的必备服装,也是员工们夏天常穿的衣服。公司很给力,在员工福利方面,谈了很多家餐饮合作,因为太多实在是写不完了。但至少,穿着厂服在大学路上很多咖啡店买咖啡都能打折。
阿姨为大家精心准备了一日三餐和水果,这几天还煮了大麦茶,行政小姐姐也会给大家投放各种零食,咖啡机旁,一直都有香香的咖啡豆……
虽然工作很饱和也很努力,但是来 Strikingly 之后还是默默胖了一圈……不要问为啥,谁早餐能吃三个包子两个蛋两碗粥谁都会胖!!!
在 Strikingly 工作最棒的就是公司会鼓励员工去做“真正正确的事”。我是自媒体人,公众号也有个小几千粉,在后台总有商务合作的需求。来了 Strikingly 之后,就开始尝试着把找我打广告的广告主们变成上线了的合作伙伴。最初其实并没有十足的把握,也不确定公司会不会接受。但结果是,接受、可以、支持。
在 Strikingly,你所有的资源和优势都可以得到充分的发挥,小伙伴们一起头脑风暴也总能撞出新的火花。当我的好朋友逐渐全部成为上线了的用户后,更让我确定了自己所深爱的产品就是优秀到无可替代的。喵的,我安利大家吃甜酸羊肉都快三十年了你们咋不吃,上线了我还没全力安利你们都变成用户了而且还天天夸紫色好看是怎么回事!
咳…貌似跑偏了。
在 Strikingly ,你可以做更多尝试,就像我,以前只会写文章出方案做pr写脚本做bd做活动。但来了 Strikingly 我开始试着做知识付费,了解用户需求,甚至可以开始给产品提意见。不瞒你说,这种感觉真的是让人上瘾啊。而且我还在英语很烂的情况下,跑完了 YC 519 的活动……在 Strikingly ,你永远可以突破上限,永远可以推翻过去的自己,也永远有机会做更多从未做过也不敢想的事情。
在这里工作的一年间,我也有过工作失误,甚至其实是比较大的失误。我跟朋友说“妈的这要是其他公司,连挽救机会都不会给,直接就能把我给开了”。但是这里是 Strikingly 啊,做错了,赶紧危机公关回来,让成果盖过失误,让正确替代疏忽,认真检讨绝不再犯,就还有机会跟 Strikingly 一起继续前行。不过这并不是纵容和姑息,一直犯错绝不改正的人,最终结局还是会被开除。
在这里要万分感谢 Strikingly 一年内给我的机会和鼓励,“要做正确的事”、“做个有责任感的人”,我想可以受益终生。
回忆到这里,有很多不舍,但是我还是准备离开了。就好像初三那年,再舍不得同学们,最终还是要毕业。
Last day 定好了之后,我开始撰写交接文档、把去年到今年的文件整理整齐,陆续把合作伙伴对接给其他的小伙伴们。
因为这里是 Strikingly ,因为这里是教会我拥有更好职业素养的 Strikingly ,所以,在 Last day 到来之前,我还是会全力以赴做好每一件事。
感谢招我进来的 Melody,感谢面试我的 Leif ,感谢带领我成长的 David ,感谢为我做离职的 Kanna。感谢市场团队的每一个小可爱。感谢技术大佬们的给力和靠谱。感谢销售兄弟们的给力。感谢代理商小伙伴们的信赖。感谢合作伙伴们的关照。
100+ 合作伙伴,十多场百人到千人的大会,两个独家小程序系列课,400 多天。这份答卷,我想,至少可以给到及格线。
我,胖咪,从 Strikingly ,毕业啦。
之前看了Mahout官方示例 20news 的调用实现;于是想根据示例的流程实现其他例子。网上看到了一个关于天气适不适合打羽毛球的例子。
训练数据:
Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No
检测数据:
sunny,hot,high,weak
结果:
Yes=》 0.007039
No=》 0.027418
于是使用Java代码调用Mahout的工具类实现分类。
基本思想:
1. 构造分类数据。
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
接下来贴下我的代码实现=》
1. 构造分类数据:
在hdfs主要创建一个文件夹路径 /zhoujainfeng/playtennis/input 并将分类文件夹 no 和 yes 的数据传到hdfs上面。
数据文件格式,如D1文件内容: Sunny Hot High Weak
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
这三步,代码我就一次全贴出来;主要是两个类 PlayTennis1 和 BayesCheckData = =》
package myTesting.bayes;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.ToolRunner;
import org.apache.mahout.classifier.naivebayes.training.TrainNaiveBayesJob;
import org.apache.mahout.text.SequenceFilesFromDirectory;
import org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles;
public class PlayTennis1 {
private static final String WORK_DIR = "hdfs://192.168.9.72:9000/zhoujianfeng/playtennis";
/*
* 测试代码
*/
public static void main(String[] args) {
//将训练数据转换成 vector数据
makeTrainVector();
//产生训练模型
makeModel(false);
//测试检测数据
BayesCheckData.printResult();
}
public static void makeCheckVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"testinput";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeTrainVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"input";
String output = WORK_DIR+Path.SEPARATOR+"tennis-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeModel(boolean completelyNB){
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-vectors"+Path.SEPARATOR+"tfidf-vectors";
String model = WORK_DIR+Path.SEPARATOR+"model";
String labelindex = WORK_DIR+Path.SEPARATOR+"labelindex";
Path in = new Path(input);
Path out = new Path(model);
Path label = new Path(labelindex);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
if(fs.exists(label)){
//boolean参数是,是否递归删除的意思
fs.delete(label, true);
}
TrainNaiveBayesJob tnbj = new TrainNaiveBayesJob();
String[] params =null;
if(completelyNB){
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow","-c"};
}else{
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow"};
}
ToolRunner.run(tnbj, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("生成训练模型失败!");
System.exit(3);
}
}
}
package myTesting.bayes;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.mahout.classifier.naivebayes.BayesUtils;
import org.apache.mahout.classifier.naivebayes.NaiveBayesModel;
import org.apache.mahout.classifier.naivebayes.StandardNaiveBayesClassifier;
import org.apache.mahout.common.Pair;
import org.apache.mahout.common.iterator.sequencefile.PathType;
import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirIterable;
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.Vector.Element;
import org.apache.mahout.vectorizer.TFIDF;
import com.google.common.collect.ConcurrentHashMultiset;
import com.google.common.collect.Multiset;
public class BayesCheckData {
private static StandardNaiveBayesClassifier classifier;
private static Map<String, Integer> dictionary;
private static Map<Integer, Long> documentFrequency;
private static Map<Integer, String> labelIndex;
public void init(Configuration conf){
try {
String modelPath = "/zhoujianfeng/playtennis/model";
String dictionaryPath = "/zhoujianfeng/playtennis/tennis-vectors/dictionary.file-0";
String documentFrequencyPath = "/zhoujianfeng/playtennis/tennis-vectors/df-count";
String labelIndexPath = "/zhoujianfeng/playtennis/labelindex";
dictionary = readDictionnary(conf, new Path(dictionaryPath));
documentFrequency = readDocumentFrequency(conf, new Path(documentFrequencyPath));
labelIndex = BayesUtils.readLabelIndex(conf, new Path(labelIndexPath));
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), conf);
classifier = new StandardNaiveBayesClassifier(model);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("检测数据构造成vectors初始化时报错。。。。");
System.exit(4);
}
}
/**
* 加载字典文件,Key: TermValue; Value:TermID
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<String, Integer> readDictionnary(Configuration conf, Path dictionnaryDir) {
Map<String, Integer> dictionnary = new HashMap<String, Integer>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
String name = path.getName();
return name.startsWith("dictionary.file");
}
};
for (Pair<Text, IntWritable> pair : new SequenceFileDirIterable<Text, IntWritable>(dictionnaryDir, PathType.LIST, filter, conf)) {
dictionnary.put(pair.getFirst().toString(), pair.getSecond().get());
}
return dictionnary;
}
/**
* 加载df-count目录下TermDoc频率文件,Key: TermID; Value:DocFreq
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<Integer, Long> readDocumentFrequency(Configuration conf, Path documentFrequencyDir) {
Map<Integer, Long> documentFrequency = new HashMap<Integer, Long>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
return path.getName().startsWith("part-r");
}
};
for (Pair<IntWritable, LongWritable> pair : new SequenceFileDirIterable<IntWritable, LongWritable>(documentFrequencyDir, PathType.LIST, filter, conf)) {
documentFrequency.put(pair.getFirst().get(), pair.getSecond().get());
}
return documentFrequency;
}
public static String getCheckResult(){
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String classify = "NaN";
BayesCheckData cdv = new BayesCheckData();
cdv.init(conf);
System.out.println("init done...............");
Vector vector = new RandomAccessSparseVector(10000);
TFIDF tfidf = new TFIDF();
//sunny,hot,high,weak
Multiset<String> words = ConcurrentHashMultiset.create();
words.add("sunny",1);
words.add("hot",1);
words.add("high",1);
words.add("weak",1);
int documentCount = documentFrequency.get(-1).intValue(); // key=-1时表示总文档数
for (Multiset.Entry<String> entry : words.entrySet()) {
String word = entry.getElement();
int count = entry.getCount();
Integer wordId = dictionary.get(word); // 需要从dictionary.file-0文件(tf-vector)下得到wordID,
if (StringUtils.isEmpty(wordId.toString())){
continue;
}
if (documentFrequency.get(wordId) == null){
continue;
}
Long freq = documentFrequency.get(wordId);
double tfIdfValue = tfidf.calculate(count, freq.intValue(), 1, documentCount);
vector.setQuick(wordId, tfIdfValue);
}
// 利用贝叶斯算法开始分类,并提取得分最好的分类label
Vector resultVector = classifier.classifyFull(vector);
double bestScore = -Double.MAX_VALUE;
int bestCategoryId = -1;
for(Element element: resultVector.all()) {
int categoryId = element.index();
double score = element.get();
System.out.println("categoryId:"+categoryId+" score:"+score);
if (score > bestScore) {
bestScore = score;
bestCategoryId = categoryId;
}
}
classify = labelIndex.get(bestCategoryId)+"(categoryId="+bestCategoryId+")";
return classify;
}
public static void printResult(){
System.out.println("检测所属类别是:"+getCheckResult());
}
}
1. 请介绍一下WebGIS的概念和作用,以及在实际应用中的优势和挑战。
WebGIS是一种基于Web技术的地理信息系统,通过将地理数据和功能以可视化的方式呈现在Web浏览器中,实现地理空间数据的共享和分析。它可以用于地图浏览、空间查询、地理分析等多种应用场景。WebGIS的优势包括易于访问、跨平台、实时更新、可定制性强等,但也面临着数据安全性、性能优化、用户体验等挑战。
2. 请谈谈您在WebGIS开发方面的经验和技能。
我在WebGIS开发方面有丰富的经验和技能。我熟悉常用的WebGIS开发框架和工具,如ArcGIS API for JavaScript、Leaflet、OpenLayers等。我能够使用HTML、CSS和JavaScript等前端技术进行地图展示和交互设计,并能够使用后端技术如Python、Java等进行地理数据处理和分析。我还具备数据库管理和地理空间数据建模的能力,能够设计和优化WebGIS系统的架构。
3. 请描述一下您在以往项目中使用WebGIS解决的具体问题和取得的成果。
在以往的项目中,我使用WebGIS解决了许多具体问题并取得了显著的成果。例如,在一次城市规划项目中,我开发了一个基于WebGIS的交通流量分析系统,帮助规划师们评估不同交通方案的效果。另外,在一次环境监测项目中,我使用WebGIS技术实现了实时的空气质量监测和预警系统,提供了准确的空气质量数据和可视化的分析结果,帮助政府和公众做出相应的决策。
4. 请谈谈您对WebGIS未来发展的看法和期望。
我认为WebGIS在未来会继续发展壮大。随着云计算、大数据和人工智能等技术的不断进步,WebGIS将能够处理更大规模的地理数据、提供更丰富的地理分析功能,并与其他领域的技术进行深度融合。我期望未来的WebGIS能够更加智能化、个性化,为用户提供更好的地理信息服务,助力各行各业的决策和发展。
这块您需要了解下stm32等单片机的基本编程和简单的硬件设计,最好能够了解模电和数电相关的知识更好,还有能够会做操作系统,简单的有ucos,freeRTOS等等。最好能够使用PCB画图软件以及keil4等软件。希望对您能够有用。
1.负责区域大客户/行业客户管理系统销售拓展工作,并完成销售流程;
2.维护关键客户关系,与客户决策者保持良好的沟通;
3.管理并带领团队完成完成年度销售任务。
你好,面试题类型有很多,以下是一些常见的类型:
1. 技术面试题:考察候选人技术能力和经验。
2. 行为面试题:考察候选人在过去的工作或生活中的行为表现,以预测其未来的表现。
3. 情境面试题:考察候选人在未知情境下的决策能力和解决问题的能力。
4. 案例面试题:考察候选人解决实际问题的能力,模拟真实工作场景。
5. 逻辑推理题:考察候选人的逻辑思维能力和分析能力。
6. 开放性面试题:考察候选人的个性、价值观以及沟通能力。
7. 挑战性面试题:考察候选人的应变能力和创造力,通常是一些非常具有挑战性的问题。