Const adTypeBinary = 1
Const adTypeText = 2
Const adBTypeContent = 1
Const adBTypeBody = 2
Const adBTypeFooter = 3
Public Function UploadFile() As Boolean
Dim FilePath As String: FilePath = "d:\証明写真サンプル.jpg"
Dim strMethod As String: strMethod = "POST"
Dim strUri As String: strUri = "http://localhost"
Dim strResult As String
'---------------------------------
' リクエストパラメタ用の領域を生成
'---------------------------------
Dim tempParamStream As Object
Set tempParamStream = CreateObject("ADODB.Stream")
tempParamStream.Open
'---------------------------------
' リクエストパラメタ作成
'---------------------------------
Dim FileName As String
FileName = Dir(FilePath)
Dim JsonObject As Object
Set JsonObject = New Dictionary
JsonObject.Add "name", FileName
JsonObject.Add "parent", New Dictionary
JsonObject("parent").Add "id", 0
If SetNomarlParameter(tempParamStream, "attributes", JsonConverter.ConvertToJson(JsonObject)) Then
End If
If SetFileParmater(tempParamStream, "file", FilePath, "application/octet-stream") Then
End If
If SetEndParameter(tempParamStream) Then
End If
'---------------------------------
' リクエストパラメタ取得
'---------------------------------
Dim snedParameter As Variant
GetSendParameter snedParameter, tempParamStream
'---------------------------------
' リクエスト
'---------------------------------
Dim objHTTP As Object
Set objHTTP = CreateObject("msxml2.xmlhttp")
objHTTP.Open strMethod, strUri, False
objHTTP.setRequestHeader "Content-Type", "multipart/form-data; boundary=" + getBoundy(adBTypeContent)
objHTTP.send snedParameter
statusCode = objHTTP.status
strResult = StrConv(objHTTP.responsebody, vbUnicode)
Set objHTTP = Nothing
UploadFile = True
End Function
②データフォームのパラメタ設定
Private Function SetNomarlParameter( _
ByRef tempParamStream As Object, _
ByVal fname As String, _
ByVal fvalue As String) As Boolean
If fvalue <> "" Then
ChangeStreamType tempParamStream, adTypeText
Dim params As String
params = ""
params = params + getBoundy(adBTypeBody)
params = params + "Content-Disposition: form-data; name=""" + fname + """" + vbCrLf
params = params + vbCrLf
params = params + fvalue + vbCrLf
tempParamStream.WriteText params
End If
SetNomarlParameter = True
End Function
③ファイル(バイナリデータ)のパラメタ設定
Private Function SetFileParmater( _
ByRef tempParamStream As Object, _
ByVal fname As String, _
ByVal fvalue As String, _
ByVal fct As String) As Boolean
'-------------------------------------
' テキストデータ
'-------------------------------------
ChangeStreamType tempParamStream, adTypeText
Dim params As String
params = ""
params = params + getBoundy(adBTypeBody)
params = params + "Content-Disposition: form-data; name=""" + fname + """; filename=""" + fvalue + """" + vbCrLf
params = params + "Content-Type: " + fct + vbCrLf
params = params + vbCrLf
tempParamStream.WriteText params
'-------------------------------------
' バイナリデータ
'-------------------------------------
ChangeStreamType tempParamStream, adTypeBinary
Dim fileStream As Object
Set fileStream = CreateObject("ADODB.Stream")
fileStream.Type = adTypeBinary
fileStream.Open
fileStream.LoadFromFile fvalue
tempParamStream.Write fileStream.Read()
fileStream.Close
Set fileStream = Nothing
SetFileParmater = True
End Function
④フッタのパラメタ設定
Private Function SetEndParameter( _
ByRef tempParamStream As Object) As Boolean
ChangeStreamType tempParamStream, adTypeText
tempParamStream.WriteText getBoundy(adBTypeFooter)
SetEndParameter = True
End Function
⑤送信するパラメタを取得
Private Function GetSendParameter( _
ByRef parameter As Variant, _
ByRef stream As Object) As Boolean
ChangeStreamType stream, adTypeBinary
stream.Position = 0
parameter = stream.Read
stream.Close
Set stream = Nothing
GetSendParameter = True
End Function
Private Function ChangeStreamType( _
ByRef stream As Object, _
ByVal adType As Integer) As Boolean
Dim p As Long
p = stream.Position
stream.Position = 0
stream.Type = adType
If adType = adTypeText Then
stream.Charset = "UTF-8"
End If
stream.Position = p
ChangeStreamType = True
End Function
Private Function getBoundy(ByVal adType As Integer) As String
Static sBoundy As String
If sBoundy = "" Then
Dim multipartChars As String: multipartChars = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim boundary As String: boundary = "--------------------"
Dim i, point As Integer
For i = 1 To 20
Randomize
point = Int(Len(multipartChars) * Rnd + 1)
boundary = boundary + Mid(multipartChars, point, 1)
Next
sBoundy = boundary + Format(Now, "yyyymmddHHMMSS")
End If
Select Case adType
Case adBTypeContent
getBoundy = sBoundy
Case adBTypeBody
getBoundy = "--" + sBoundy + vbCrLf
Case adBTypeFooter
getBoundy = vbCrLf + "--" + sBoundy + "--" + vbCrLf
End Select
End Function
require "slack"
Slack.configure do |config|
config.token = "YOUR_TOKEN"
endSlack.auth_test
コンソールでこれをそのまま実行すると、認証に成功しようが失敗しようが特に何も表示されません。
p なり何なりで Slack.auth_test の返り値を見てみると、認証に成功した場合はURLなどが、失敗した場合はエラーの内容がhashで返ってきます。 基本的にはSlack Web API https://api.slack.com/web のそのままです。slack-apiはトークンまわりやJSONのparseをしてくれるだけで、このあたりは自力です。DIYです。
class MainActivity : AppCompatActivity() {
lateinit var mRealm: Realm
lateinit var mRecyclerView: RecyclerView
lateinit var mAdapter: RecyclerViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_recycler_view)
// Realmのセットアップ
val realmConfig = RealmConfiguration.Builder(baseContext)
.deleteRealmIfMigrationNeeded()
.build()
mRealm = Realm.getInstance(realmConfig)
// Realmを読み込み
val dateList: RealmResults<CurrentTimeModel> = mRealm.where(CurrentTimeModel::class.java).findAll()
// RecyclerViewのセットアップ
mRecyclerView = findViewById(R.id.recycler_view) as RecyclerView
mAdapter = RecyclerViewAdapter(dateList)
val layoutManager = LinearLayoutManager(applicationContext)
mRecyclerView.layoutManager = layoutManager
mRecyclerView.itemAnimator = DefaultItemAnimator()
mRecyclerView.adapter = mAdapter
mRecyclerView.addItemDecoration(DividerItemDecoration(this))
// ボタンのセットアップ
val fabAddCurrentDateTime = findViewById(R.id.fab_add_current_date_time)
fabAddCurrentDateTime.setOnClickListener { addCurrentDateTime() }
val fabDeleteAllRecords = findViewById(R.id.fab_delete_all_records)
fabDeleteAllRecords.setOnClickListener { deleteAllRecords() }
}
override fun onDestroy() {
super.onDestroy()
mRealm.close()
}
fun addCurrentDateTime() {
mRealm.executeTransaction {
val currentDateTime = mRealm.createObject(CurrentTimeModel::class.java)
// LocalDateTime.now()がMIN_APIで使えないので、KotlinMomentを使用
currentDateTime.currentTime = Moment().toString()
mRealm.copyToRealm(currentDateTime)
}
mAdapter.notifyDataSetChanged()
}
fun deleteAllRecords() {
mRealm.executeTransaction {
mRealm.where(CurrentTimeModel::class.java)
.findAll()
.deleteAllFromRealm()
}
mAdapter.notifyDataSetChanged()
}
}
Model
open class CurrentTimeModel(
open var currentTime: String = ""
): RealmObject() {}
エラーが出る
Realmを使っていて、エラーが出て詰まる場面が2つありました。 1. 新しくモデルクラスを追加したときに、class com.list_sample.realmkotlinsample.FooModel is not part of the schema for this Realm. というエラーが出る 2. 既に使っているモデルクラスをリネームしたり、パッケージ移動したりすると `Error:Execution failed for task ‘:app:transformClassesWithRealmTransformerForDebug’.
SFよりも現実よりなお話をしたつもりですが、当記事はワープや0秒通勤が実現可能だと担保する物ではありません。また、繰り返しになりますが、イメージだけでもお伝えするために、事実にフィクションを織り交ぜた説明を行っております。「ホンマでっか!?」的な姿勢で読んでいただけたら幸いです。 *参考文献* 「Echoes from the Abyss: Evidence for Planck-scale structure at black hole horizons」Jahed Abedi, Hannah Dykaar, Niayesh Afshordi
'---------------------------------
' リクエスト
'---------------------------------
Dim objHTTP As Object
Set objHTTP = CreateObject("msxml2.xmlhttp")
objHTTP.Open "POST", "http://localhost:8080", False
objHTTP.setRequestHeader "Content-Type", "text/plain"
objHTTP.send JsonConverter.ConvertToJson(JsonObject)
' レスポンスコード(正常)
If objHTTP.status = 200 Then
MsgBox "正常に終了しました"
End If
History API で戻った場合でも turbolinks.load で呼ばれるようになりました。 そのため、二重に表示されることがあります。 戻るボタン押下時にはキャッシュを使って表示しますので、turbolinks:before-cache イベントを使って不要なDOMのクリアなどを行う必要があります。