首页 文章 精选 留言 我的

精选列表

搜索[资源读取],共10000篇文章
优秀的个人博客,低调大师

Flink读取Kafka数据Sink到MySQL和HBase数据库

Flink将流数据Sink到数据库,一般需要自己自定义Sink的实现。下面示例,演示Sink到MySQL和HBase示例。 import java.util.Propertiesimport org.apache.flink.api.common.serialization.SimpleStringSchemaimport org.apache.flink.streaming.api.scala.StreamExecutionEnvironmentimport org.apache.flink.streaming.api.scala._import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer010object KafkaToSinkStreaming { def main(args: Array[String]): Unit = { val env = StreamExecutionEnvironment.getExecutionEnvironment val p = new Properties() p.setProperty("bootstrap.servers", "localhost:9092") p.setProperty("group.id", "test") val input = env.addSource(new FlinkKafkaConsumer010[String]("test", new SimpleStringSchema(), p)) // 自定义MysqlSink类,将数据Sink到mysql val sink = new MysqlSink("jdbc:mysql://localhost:3306/test", "root", "root") input.addSink(sink) // 自定义HBaseSink类,将数据Sink到HBase val hBaseSink = new HBaseSink("student", "info") input.addSink(hBaseSink) env.execute("KafkaToSinkStreaming") }} 自定义MysqlSink类 import java.sql.{Connection, DriverManager}import com.google.gson.Gsonimport org.apache.flink.configuration.Configurationimport org.apache.flink.streaming.api.functions.sink.{RichSinkFunction, SinkFunction}class MysqlSink(url: String, user: String, pwd: String) extends RichSinkFunction[String] { var conn: Connection = _ override def open(parameters: Configuration): Unit = { super.open(parameters) Class.forName("com.mysql.jdbc.Driver") conn = DriverManager.getConnection(url, user, pwd) conn.setAutoCommit(false) } override def invoke(value: String, context: SinkFunction.Context[_]): Unit = { val g = new Gson() val s = g.fromJson(value, classOf[Student]) println(value) val p = conn.prepareStatement("replace into student(name,age,sex,sid) values(?,?,?,?)") p.setString(1, s.name) p.setString(2, s.age.toString) p.setString(3, s.sex) p.setString(4, s.sid) p.execute() conn.commit() } override def close(): Unit = { super.close() conn.close() }} 自定义HBaseSink类 import com.google.gson.Gsonimport org.apache.flink.configuration.Configurationimport org.apache.flink.streaming.api.functions.sink.{RichSinkFunction, SinkFunction}import org.apache.hadoop.hbase.{HBaseConfiguration, HConstants, TableName}import org.apache.hadoop.hbase.client._import org.apache.hadoop.hbase.util.Bytesclass HBaseSink(tableName: String, family: String) extends RichSinkFunction[String] { var conn: Connection = _ override def open(parameters: Configuration): Unit = { super.open(parameters) val conf = HBaseConfiguration.create() conf.set(HConstants.ZOOKEEPER_QUORUM, "localhost") conn = ConnectionFactory.createConnection(conf) } override def invoke(value: String, context: SinkFunction.Context[_]): Unit = { val g = new Gson() val student = g.fromJson(value, classOf[Student]) println(value) println(student) val t: Table = conn.getTable(TableName.valueOf(tableName)) val put: Put = new Put(Bytes.toBytes(student.sid)) put.addColumn(Bytes.toBytes(family), Bytes.toBytes("name"), Bytes.toBytes(student.name)) put.addColumn(Bytes.toBytes(family), Bytes.toBytes("age"), Bytes.toBytes(student.age)) put.addColumn(Bytes.toBytes(family), Bytes.toBytes("sex"), Bytes.toBytes(student.sex)) t.put(put) t.close() } override def close(): Unit = { super.close() conn.close() }} Student类 case class Student(name: String, age: Int, sex: String, sid: String) 执行KafkaToSinkStreaming程序后,在kafka product端输入。 {"name":"zhangsan","age":"18","sex":"male","sid":"1001"}{"name":"lisi","age":"20","sex":"male","sid":"1002"}{"name":"laowang","age":"20","sex":"male","sid":"1003"}{"name":"caocao","age":"28","sex":"male","sid":"1004"} mysql的数据库结果: HBase数据库结果: 项目源码:https://github.com/zhang3550545/flinkdemo 相差阅读推荐:https://www.roncoo.com/view/171

优秀的个人博客,低调大师

创建IOS应用程序通用下的Setting以及读取方式

在iphone和ipad中,有一个东西大家一定很熟悉,那个东西就是Settings。 这次要学习的东西说白了很简单,就是学习如何在Settings中对一个app的某些属性进行设置,反过来,在app中更改了一些属性值,也会反应到Settings中,这个功能很常用,实现起来也相对简单,但是内容还是比较多的。 首先还是对Settings进行一个简单的说明,虽然我们经常打开Settings,但是很少对Settings进行过仔细的研究,不过作为一名ios的开发人员,有这个必要对Settings进行一番探索,看看Settings里面到底包含了哪些东西,这些东西又是什么。 首先我们打开Settings,可以看到Settings的主界面(画面截取自iphone模拟器) 可以看到,Settings的主界面是一个Table View,Style的属性是Grouped。除了常见的General、Airplane Mode、Wi-Fi、Notifications等(后面3个未在截图中出现,打开你的iphone,Settings里面会有这些选项),iphone为每个有需要的app创建了一个cell,例如Twitter、Facebook等。点击Twitter,即可以看到该app所包含的一些设置项。 Settings中的设置项是有限制的,一共可以包含以下4类:Text Field,Switch,Slider, TableView的checklist。 大家应该看出,Settings其实是一个Navigation Controller,View与View之间是继承关系。 在说一下iOS中是以什么方式来操作Settings的,这个东西叫做NSUserDefaults,它可以方便的在app与Settings进行交互,保存更新值。 好了,简单的介绍就到这里,下面我们开始这次的例子,作完这个例子,相信会对Settings有更深的了解。 1)创建一个工程,左边选择Application,右边选择Utility Application,点击Next按钮 在Product Name中输入AppSettings,然后选中Use Storyboards,点击Next按钮 点击Create按钮完成创建 观察一下程序为我们自动创建的工程项目文件,里面有一个很常见的BIDAppDelegate,另外我们刚才选中的Use Storyboard,因此有一个MainStoryboard.storyboard存在,除了这些,另外还有4个文件,分别是BIDMainViewController和BIDFlipsideViewController,这个是Utility Application模板自动为我们创建的。 由于这是我们第一次使用Utility Application,因此在这里做一些简单的介绍,Utility Application会自动帮我们创建2个view,第一个view叫做main view,第二个view叫做flipside view,在main view上面有一个information button,点击这个information button就会切换到flipside view。在flipside view的navigator bar上有一个Done按钮,点击这个Done按钮,就会切换回main view。在Project navigator中选中MainStoryboard.storyboard,就会看见2这个view,而这2个view就分别对应着BIDMainViewController和BIDFlipsideViewController。 好了,下面我们需要添加一个Settings Bundle,如果你的一个app需要在Settings中进行设置,那么在你的项目中一定要加Settings Bundle,这个东西的作用就是当你把你的app安装到iphone上后,它会自动在Settings中添加与这个项目相关的一个条目(cell)用于设置。 2)添加Settings Bundle 选择File>New>File...,在左边的选择Resource,右边选择Settings Bundle,点击Next按钮 保留默认的名字,点击Create按钮完成添加 展开Settings.bundle,有2个默认项,一个是en.lproj文件夹(这个暂时忽略,用户本地化程序的,现在无需理会),另一个是Root.plist,从后缀名我们可以断定,Settings中的项是基于Property list,也就是一个xml文件。 选中Property list,在editor pane中会显示如下内容 我们改变一下Root.list的显示方式,在editor pane的任何地方点击鼠标右键,然后在弹出的菜单中选择“Show Raw Keys/Values” 然后Root.plist会显示如下样子 最直观的发现是2个Key的名字变了,“Preference Items”变成了“PreferenceSpecifiers”,“Strings Filename”变成了“StringsTable”,其实内容并没有改变,只是显示的方式不同,这个看个人喜好吧,前者名字比较通俗移动,后者名字更贴近实现情况。 另外,我们不必过多关注StringsTable,这个值是用在localization的时候的,因此在这里你可以直接删了它。 3)添加Settings中的控件添加Text Field 接着我们展开PerferenceSpecifiers,里面有4个默认的Item,这些都是系统帮我们生成的,但是这些并不是我们这个例子想要的,所以,我们删除Item 1、Item 2、Item 3,只保留Item 0。 (上图中我把StringsTable也删了) 接着我们展开Item 0,看看里面有些什么的东西 里面有一个Title和Type键值对(也就是Dictionary),我们把注意力集中到Type,它的值是PSGroupSpecifier,说明这个item是一个group类型,在这个item之后的所有同级item,都是属于这个group的,直到下一个group类型出现。在PreferenceSpecifiers下,必须要有至少一个group存在。Title用于设置这个group的名称,这个属性是可以省略的。 在观察一下Item 0的显示方式:Item 0 (Group - Group),括号中第一个Group是只这个item的类型为PSGroupSpecifier,第二个Group是这个item的Title值。我们修改一下Title的值,设置其为“General Info” 设置完成后,你会发现Item 0的显示变成了:Item 0 (Group - General Info) PSGroupSpecifier并不是一个实际可以操作的类型,它的作用仅仅是把几个相关的属性包含在一起,形成一个table view中的group,下面我们添加可操作的节点。 首先将Item 0合拢,然后鼠标选中Item 0的整行,单击键盘上的return键,一个新的Item(Item 1)出现在Item 0的下方,并有一个列表弹出,让你选择这个Item的类型 在这里我们选择Text Field,创建完Item 1后,展开Item 1 可以看到一共有3个键值对,Type的类型为PSTextFieldSpecifier,另外2个分别是Title和Key,将Title赋值为“Username”,将Key赋值为“username”(注意大小写)。这里的Key是用于保存和获取Item 1的值的,每一个Item你可以理解为是一个Dictionary,一个Dictionary就是一个键值对,那么这个Key的作用就是获取或者保存指定的值。(Item 0中并没有Key,这个是因为Item 0的类型是PSGroupSpecifier,没有需要保存的值) 在这篇文章刚刚开始的时候,我们提到过NSUserDefaultes,NSUserDefaultes就是使用这个key来获得item的值的,也是用这个key来保存更新值的。 最后我们为Item 1再添加2个属性,选中Item 1中最后一行(Key所在的行),然后按下键盘上的return,一个新的行出现在Key的下面,另外有一个list让你选中Key的名字,这里我们选择“AutocapitalizationType”,然后设置值为“None”。同样的方法再添加一次,这次选择“AutocorrectionType”,然后设置值为“No” “AutocapitalizationType”的意思是是否自动完成输入,也就是说你输入一个单词的前几个字,系统会出现一个列表,列表里面会有相关的词汇,你只有直接选中,就可以完成输入了,这里我们设置为“None”,无需自动完成。 “AutocorrectionType”的意思是自动纠正拼写,就是系统帮你建成你输入的单词是否有拼写错误,我们同样把这个功能关掉了。 好了,保存一下Root.plist。 到此为止,我们可以试着编译运行程序了,为了使程序能够在Settings中突出显示(好找一点),我们为程序添加一个图标,先下载一个图标icon,然后在Project navigator中选中根节点AppSettings,然后在左边选择TARGETS下的AppSettings,打开Summary tab,展开iPhone / iPod Deployment Info,找到App Icons 将icon拖入到左边的图标中(右边的是视网膜屏用的图标,我们这里没有提供这个图标,所以就空着吧) 好了,编译运行一下程序,程序启动后,按Home键回到桌面,然后进入Settings,在Settings主界面的最下面,可以找到我们创建的AppSettings程序图标 点击该图标,就会进入这个程序的设置 上图中我们可以看到在Root.plist中我们设置的项还原出来的结果,首先是一个Group,Group的Title为General Info,然后在Group中是一个TextField的项,它的Title是Username。 OK,到此位置,你应该对Settings有所了解,知道里面的项是怎么产生的,每个项的属性的作用等等。下面我们接着添加更多的不同类型的项,全面的对Settings进行操作。 3)添加其他的项添加Secure Text Field 先将Item 1闭合,然后选中它,按键盘上的command+C,command+V,复制粘贴一份Item,一个新的Item 2会出现在Item 1的下面 展开Item 2,并将其下的属性设置为下面的样子 如上图所示,Item 2是用于接收密码的,它的Type类型还是为PSTextFieldSpecifier,将它的Title设为Password,Key为password,这里多了一个新的属性叫做IsSecure,当将它的值设为YES时,那么在文本框中内容就会以密码的方式显示。(你可以编译运行一下,看看是不是这个密码框的效果) 添加Multivalue Field Multivalue Field会产生一个带箭头的cell,点击该行后,会跳转到下一个table view,下一个table view中会包含多个选项,用户在多个选项中选取其中的一个,然后返回到前一个view,该cell中的内容就是用户选取的内容。 我们合拢Item 2,然后选中Item 2,按return键新建Item 3,选择Item 3的类型为Multi Value 展开Item 3,可以看到,Type的类型为PSMultiValueSpecifier。将Title设置为Protocol,Key设置为protocol。 ok,下面我们会添加一组Titles和Values,Titles保存每一个选项的显示值,Values中保存每一个选项的id,他们是一一对应的。保持Item 3展开的形态,然后选中Item 3,按return键(在Item展开的形态下选中并按retuan键,是添加当前项的子项;在Item闭合的形态下选中帮按return键,是添加同级系项),会新建一个Item 3的子项并出现一个下拉框选中子项的类型,在这里我们选择Titles。 重复上面的动作,再创建一个Item 3的子项,并选择Values。 选中Titles,然后点击加号,添加一个子项,赋值为HTTP 重复这个动作,添加以下值SMTP,NNTP,IMAP,POP3 使用同样的方法,为Values添加项,添加完后的样子如下 Values和Titles不同之处在于一个是小写一个是大写,当然,如果你全部使用大写或者小写也是没有问题的,看个人喜好了。 编译运行一个程序 在Passwrod中输入密码,显示的是一个一个的小圆点。Protocol项的右边多了一个箭头,点击该项,跳转到下一个view 这里就是我们刚才添加的Titles的内容,我们随意选中一个 选中SMTP后的状态,然后我们点击左上角的AppSettings按钮返回上一级view 刚才选中的SMTP就显示在Protocol项的右边。 添加Toggle Switch Settings ToggleSwitch很简单,就是一个switch,可以选择打开或者关闭,这个类型的目的是设置一个bool值。 合拢Item 3,然后选中,按return键,添加一个Item 4,并设置Item 4的类型为Toggle Switch,展开Item 4,设置Title为“Warp Drive”,Key为“warp”,将DefaultValue的值改为YES 好了,编译运行一下,一个Switch出现在Protocol的下面 添加Slider Setting Slider我们已经熟知,在Settings中,一个Slider可以在其2端各放置一副图片(但我发现在iphone中放置图片的例子不多),Slider本身没有带文字说明,我们也不可以在Settings中放置一个label告知用户这个slider的作用是什么,因此这里的解决方案是添加一个新的Group,然后为Group添加文字说明,告知用户slider的作用。 合拢Item 4,并选中,按return键,添加Item 5,选择Item 5的类型为Group,并设置Title值为“Warp Factor” 合拢Item 5,并选中,按return键,添加Item 6,选择Item 6的类型为Slider,根据下图设置Item 6的属性 编译运行一下程序,效果如下 刚才我们说了,Slider的两端可以各添加一个图片(图片的大小为21 * 21 pixel),我们现在就来添加,先下载这里的图片 为slider添加image的方法有些特殊,我们并不是直接将图片拖到project navigator中,然后放到slider中,Settings并没有为我们提供这样的方法。我们使用别的方法添加,首先在Project navigator中鼠标右击Settings.bundle,选择Show in Finder 在Finder中右击Settings.bundle,选择“显示包内容”(Show Package Contents) 然后将2张图片复制进包里面,然后在Project navigator中也能够看见这2张图片了 接着打开Root.plist,在Item 6中添加2项Max Value Image Filename和Min Value Image Filename,为Max赋值rabbit,为Min赋值turtle 再次编译运行,2张图片出现在slider的左右2边。 添加一个Child Settings View 这个意思就是单击table view上的一个cell,跳转到另一个Settings view。经过上面的一些讲解,我们实际上都是在对plist进行操作,由此可以推断出,所有的Settings都是以一个一个的plist文件,因此如果要跳转到另一个Settings view,那必须包含另一个plist,根据这个思路,我们进行下面的操作。 我们再创建一个Group,创建在Item 6的下面,并命名为Title 然后我们在Item 7的下面添加Item 8,按照之前的方式,现在我们应该设置Item 8的类型了,但是在默认的下拉框中并没有我们需要的类型(Child Pane),不急,我们展开Item 8(在这里确保你选择了Show Raw Keys/Values),然后点击其Type行的Value列最后边的按钮,会出现一个下拉框 在下拉框中选择PSChildPaneSpecifier,这样Item 8的类型就是一个Child Pane了。 接着设置Title为“More Settings”,Key空着,因为这是一个起到导航作用的Item,我们无需得到它的值,也就不需要它的Key了。 再接着我们选中最后一行Key,按return键添加一个,在下拉菜单中选择File 我们需要关联一个plist文件,这样就可以导航到另一个Settings view了,下载这里的More.plist,还记得刚才我们是如何为slider添加2个图片的吗?在Project navigator中鼠标右击Settings.bundle,然后选择Show in Finder,在Finder中鼠标右击Setting.bundle,选择Show Package Contents,将More.plist复制进去,这样在Project navigator中就出现More.plist了。 由于More.plist是现成帮我们做好了,因为我们不需对其进行任何操作,直接用就可以了。编译运行程序 Settings view的底部多了我们刚才添加的More Settings,点击More Settings,跳转到More.plist的Settings view 可以看到在More中前4个都是Text Field,最后一个是Mulitvalue Field,之后大家随便点吧,反正也就这些东西了。 4)总结 到此为止,所有可以在Settings中添加的控件都已经介绍了,总类不是很多,一共6种,而对于Settings的操作,也就是对一个plist文件的操作,iOS系统会自动将plist中的内容反应到Settings上去,我们只需针对plist进行操作,就可以很简单的完成Settings view的设置。在下一篇中,我们将把Settings中的值和真正的app程序连接起来,在Settings中设置值后,在app中会反应出来,在app中对一个值进行更改,在Settings中的这个值同样会被更新,连接这两个东西的桥梁就是之前提到的NSUserDefaults,我们在下一篇中进行详细的介绍,谢谢! 本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366408,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS: Xcode7安装KSImageNamed插件,自动读取图片名称

官方文档: ## How do I use it? Build the KSImageNamed target in the Xcode project and the plug-in will automatically be installed in `~/Library/Developer/Xcode/Plug-ins`. Relaunch Xcode and `imageNamed:` will magically start autocompleting your images. 翻译如下: ##我如何去使用这个插件? 编译ksimagenamed目标在Xcode项目,之后插件会自动被安装在`~/Library/Developer/Xcode/Plug-ins`上。重新启动Xcode,此时` imagenamed:`会奇迹般地开始自动加载你需要的对应名称的图片。 **Important**: Old versions of KSImageNamed were installed in `~/Library/Developer/Application Support/Developer/Shared/Xcode/Plug-ins`. Make sure to remove `KSImageNamed.xcplugin` from there before installing the new one. 翻译如下: *重要点*:老版本的ksimagenamed被安装在`~/Library/Developer/Application Support/Developer/Shared/Xcode/Plug-ins上。确保去除旧版本的` ksimagenamed.xcplugin `,然后在同一地方再安装新的‘ksimagenamed.xcplugin `。 ## How do I include file extensions when autocompleting? Enter the following command and relaunch Xcode:`defaults write com.apple.dt.Xcode KSShowExtensionInImageCompletion -bool YES` 翻译如下: ##我如何去使用这个插件? 当自动加载图片时,我怎么引入包含文件的扩展名? 输入以下命令并重新启动Xcode `defaults write com.apple.dt.Xcode KSShowExtensionInImageCompletion -bool YES` 以上是官方文档在第一次安装的时候切记在跳出bundle选择的时候选择load bundle,不然会安装失败,这样的话,解决方法如下:官方文档中说安装地址在~/Library/Developer/Application Support/Developer/Shared/Xcode/Plug-ins,但我的安装地址是在~/Library/Developer/Xcode/Plug-ins(安装的时候选择的吧,给忘了),rm -rf 删除那个KSImageNamed.xcplugin文档,然后命令行敲入`defaults write com.apple.dt.Xcode KSShowExtensionInImageCompletion -bool NO`注意是NO,然后重新安装就可以了,别忘记load bundle! 如果曾经安装过,那么就先删除那个插件(过程如上),再`defaults write com.apple.dt.Xcode KSShowExtensionInImageCompletion -bool NO`,ok,重新来过 就是这样 插件在Github的下载地址:https://github.com/ksuther/KSImageNamed-Xcode 程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式! 本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/5162361.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android读取用户号码,手机串号,SIM卡序列号

1、使用TelephonyManager提供的方法,核心代码: TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); String imei = tm.getDeviceId(); //取出IMEI Log.d(TAG, "IMEI:"+imei); String tel = tm.getLine1Number(); //取出MSISDN,很可能为空 Log.d(TAG, "MSISDN:"+tel); String iccid =tm.getSimSerialNumber(); //取出ICCID Log.d(TAG, "ICCID:"+iccid); String imsi =tm.getSubscriberId(); //取出IMSI Log.d(TAG, "IMSI:"+imsi); 2、加入权限 在manifest.xml文件中要添加 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/archive/2012/03/08/2385515.html ,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册