2019/03/26

cloudatcost IPアドレスの Update を行う(centos7編)

気がついたら cloudatcost のコンパネにIPアドレス変更(2019-2-22までにやっとけよ)のボタン
 
とっくに過ぎてるというか、接続不能になって気づいたわけですが...
ということで Update 手順

【注意】IPv4を変更すると、アドレスおよびゲートウェイ、アプリケーションが利用するリッスンIP/ポートを設定し直すまで、ネットワークが利用不能になります

コンパネから
  1. 対象サーバの  コンソール (右上の)が利用可能なのを確認
  2. IPv4:  Update ボタンを押して、確認画面で Continue を押す
    IPv4: Pending Migration... となる
  3. しばらくすると(3~15min)、新しいIPアドレスが IPv4: のところに表示される

コンパネのWebコンソールからログイン
Centos7 の場合、下記のように nmcli コマンドを利用して変更を行う

デバイスとコネクションを確認
# nmcli d

DEVICE  TYPE      STATE      CONNECTION
ens33   ethernet  connected  System eth0
lo      loopback  unmanaged  --     

新しいIPを設定
# nmcli c modify "System eth0" ipv4.addresses xxx.xxx.xxx.xxx/24

ここで コネクション名(System eth0)へデバイス名(ens33)を指定したりすると
Error: unknown connection 'ens33'
のようなエラーとなる


新しいGWを設定
# nmcli c modify "System eth0" ipv4.gateway xxx.xxx.xxx.1

DNSを設定(必要であれば)
# nmcli c modify "System eth0" ipv4.dns 1.1.1.1

ネットワークを再起動して反映
# systemctl restart network

確認(デバイスを指定)
#nmcli d show ens33

※アプリケーションでリッスンアドレスなどへグローバルIPを設定しているところがあれば、それらも変更する

2019/03/12

VB6, VBA でレジストリから元号を取得

VB6, VBA でレジストリから元号(和暦情報)を配列で取り出す関数をベタなAPIのみで構成
format関数って、ee年 のように eの直後に年が続くと 1年ではなく元年と表記されるんですね~

得られる配列は今の所、下記の形
第1引数→012345
01868/01/01明治_明_Meiji_M明治MeijiM
11912/07/30大正_大_Taisho_T大正TaishoT
21926/12/25昭和_昭_Showa_S昭和ShowaS
31989/01/08平成_平_Heisei_H平成HeiseiH
第2引数↑

※古い順である保証はありません
※2019/3/13頃のOSアップデートで、レジストリの値が全角合成文字(㍻)から先頭文字(平)に変更されています

配列から取得
    Dim Gengo()
    Dim I As Long
    Dim S As String

    Gengo = GetGengoDimFromReg()
    For I = UBound(Gengo, 2) To 0 Step -1
        S = S & Gengo(0, I) & " = " & Gengo(1, I) & Chr(13) & Chr(10)
    Next I

    ' S
FormatJ関数
s = FormatJ(Now, "g gg ggg e ee yyyy-mm-dd hh:nn")


モジュール本体
Option Compare Database
Option Explicit

Private Declare Function RegOpenKeyEx Lib "ADVAPI32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "ADVAPI32" (ByVal hKey As Long) As Long
Private Declare Function RegQueryValueExstr Lib "ADVAPI32" Alias "RegQueryValueExA" (ByVal hKey&, ByVal lpValueName$, ByVal lpReserved&, ByVal lpType&, ByVal lpData$, lpcbData&) As Long
Private Declare Function RegEnumValue Lib "ADVAPI32" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long

Private Const HKEY_LOCAL_MACHINE = &H80000002

Private Const ERROR_SUCCESS = 0

Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_ENUMERATE_SUB_KEYS = &H8

Private GengoDimCache()



Function FormatJ(ByVal iDate As Date, ByVal FormatStr As String)
    Dim refGengo() As String
    Dim refWareki As Long

    If DateToWareki(iDate, refGengo, refWareki) Then
        FormatStr = Replace(FormatStr, "ggg", """" & refGengo(2) & """") ' 平成
        FormatStr = Replace(FormatStr, "gg", """" & refGengo(3) & """")  ' 平
        FormatStr = Replace(FormatStr, "g", """" & refGengo(5) & """")   ' H
        
        If refWareki = 1 Then
            ' Format関数は eの後に年があると「元年」表示となる
            FormatStr = Replace(FormatStr, "ee年", """元年""")
            FormatStr = Replace(FormatStr, "ee\年", """元年""")
            FormatStr = Replace(FormatStr, "e年", """元年""")
            FormatStr = Replace(FormatStr, "e\年", """元年""")
        End If
        
        FormatStr = Replace(FormatStr, "ee", """" & Right("0" & Trim(Str(refWareki)), 2) & """")
        FormatStr = Replace(FormatStr, "e", """" & Trim(Str(refWareki)) & """")
    End If
    
    FormatJ = Format(iDate, FormatStr)
End Function



Function DateToWareki(ByVal iDate As Date, ByRef refGengo() As String, ByRef refWareki As Long) As Boolean
    Dim Gengo()
    Dim I As Long
    Dim J As Long
    Dim S As String
    Dim TempDate As Date

    DateToWareki = False
    
    Gengo = GetGengoDim()
    If Sgn(Gengo) <> 0 Then
        TempDate = 0
        For I = 0 To UBound(Gengo, 2)
            If (Gengo(0, I) > TempDate) And (iDate >= Gengo(0, I)) Then
                TempDate = Gengo(0, I)
            
                ReDim refGengo(UBound(Gengo, 1))
                For J = UBound(Gengo, 1) To 0 Step -1
                    refGengo(J) = Gengo(J, I)
                Next J
                refWareki = Year(iDate) - Year(Gengo(0, I)) + 1
                
                DateToWareki = True
            End If
        Next I
    End If
End Function



' レジストリから元号を取得して配列で返す
Function GetGengoDimFromReg()
    If Sgn(GengoDimCache) <> 0 Then
        GetGengoDimFromReg = GengoDimCache ' キャッシュ
        Exit Function
    End If


    Dim hKey As Long
    
    Dim dwIndex As Long
    Dim lpName As String
    Dim lpcbName As Long
    
    Dim lpType As Long
    Dim lpData As String
    Dim lpcbData As Long
    
    Dim lpValue As String
    Dim lpcbValue As Long
    
    Dim DimLen As Long
    Dim YMD() As String
    Dim Gengo() As String
    Dim Result()
    
    If (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras", 0, KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS, hKey) = ERROR_SUCCESS) Then
        
        dwIndex = 0
        Do
            lpType = 0
            lpcbName = 256
            lpName = String(lpcbName, Chr(0))
            
            lpcbData = 256
            lpData = String(lpcbData, Chr(0))
            
            ' エントリ取得
            If (RegEnumValue(hKey, dwIndex, lpName, lpcbName, 0, lpType, lpData, lpcbData) = ERROR_SUCCESS) Then
                lpName = Left(lpName, InStr(1, lpName, Chr(0)) - 1) ' "1989 01 08"
                
                ' データ取得
                lpcbValue = 256
                lpValue = String(lpcbValue, Chr(0))
                
                If (RegQueryValueExstr(hKey, lpName, 0, 0, lpValue, lpcbValue) = ERROR_SUCCESS) Then
                    lpValue = Left(lpValue, InStr(1, lpValue, Chr(0)) - 1) ' "平成_㍻_Heisei_H" winUpdate→ "平成_平_Heisei_H"
                    
                    ' 配列へ
                    If Sgn(Result) = 0 Then
                        ReDim Preserve Result(5, 0)
                    Else
                        ReDim Preserve Result(5, UBound(Result, 2) + 1)
                    End If
                    DimLen = UBound(Result, 2)
                    
                    YMD = Split(lpName, " ", 3) ' "1989 01 08"
                    Result(0, DimLen) = DateSerial(Int(YMD(0)), Int(YMD(1)), Int(YMD(2)))
                    
                    Result(1, DimLen) = lpValue   ' 平成_平_Heisei_H
                    Gengo = Split(lpValue, "_", 4)
                    Result(2, DimLen) = Gengo(0) ' 平成
                    Result(3, DimLen) = Gengo(1) ' 平
                    Result(4, DimLen) = Gengo(2) ' Heisei
                    Result(5, DimLen) = Gengo(3) ' H
                End If
                
                dwIndex = dwIndex + 1
            Else
                Exit Do
            
            End If
        
        Loop
        
        Call RegCloseKey(hKey)
    End If
    
    GengoDimCache = Result
    GetGengoDimFromReg = Result
End Function

2019/03/11

ネットボランチDDNSで正しいIPを得られない

2019-03-08 あたりから 8.8.8.8 や 1.1.1.1 を含む複数の DNSサーバへ定期的に問い合わせると、一つ前の IP が返ったり、現在の IPが返ったり不安定な状況が続いている

試しに netvolante.jp で指定されている NS

secondary.netvolante.jp
sby-daemon.netvolante.jp
act-daemon.netvolante.jp

へ問い合わせを行うと act-daemon.netvolante.jp のみ古いアドレスを返してくるので、この辺りに問題があるのかもしれません

2019/03/08

javascript の json で単純な配列の個数やデータの取り出し

javascript の json で単純な配列の個数やデータの取り出し

key : value 形式ではなく、単純な配列を JSON.parse した時に得られる object は、key に配列の添字(0~)が入った状態なので

個数は Object.keys(jsonObject).length で求められ、データの取り出しは
var json_users = JSON.parse('["osomatsu","kadomatsu","iyami"]');
for(var key in json_users){
 alert(key + '=' + json_users[key]);
}

var json_users = JSON.parse('["osomatsu","kadomatsu","iyami"]');
for(var i = Object.keys(json_users).length -1; i >= 0; i--){
 alert(i + '=' + json_users[i]);
}
な感じ

2019/03/05

python の socket の udp 送信でブロードキャストしようとするとエラーが発生する

python の socket の udp 送信で、ユニキャストでは動作するがブロードキャストしようとすると
PermissionError: [Errno 13] Permission denied
のエラーが発生する
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # ←コレ
sock.sendto(message.encode(), (host, port))
socket.SO_BROADCAST オプションを追加する

2019/03/04

adhell3.1.1.x を Android Studio でビルド

【重要】Adhell で利用可能な Knox キーが発行できなくなりました




adhell3.1.1.x 系をビルドしたときのメモ 【2018-03-04更新】

前提条件
  • Android Studio がセットアップ・アップデートされている
  • https://seap.samsung.com/ の登録を済ませている(ライブラリのダウンロードとキー取得に必要)

  1. gitlab からソースをダウンロード・解凍
  2. knox android サイト から Knox SDK 3.3.x と supportlib.jar をダウンロードして
    ※3.1.1.259 は Knox SDK 3.3 (API level 28) の knoxsdk.jar を利用

    各 libs の knoxsdk.jar と supportlib.jar を ソースの app/libs(なければ作成) へコピー

    上記ライブラリは、頻繁にアップデートされているのでその都度ダウンロードがオススメです。「エラー: シンボルを見つけられません」という表示は上記ライブラリのバージョンが古い可能性があります
  3. パッケージ名を変更 → ファイル app/app.properties (なければテキストファイルを作成)へ下記の形式で記述
    package.name=com.example.adhell3_1_x_x ←他の人とバッティングしないような文字列
    Package Disabler を利用する場合は下記も同じファイルへ記述
    enable.disableApps=true
    enable.appComponent=true

  4. Android Studio でソース(のディレクトリ)を開く
    build sync 等、画面下のほうが落ち着くまで、しばらく待ちます
  5. Android Studio の Settings で Configure on demand のチェックを外す → 2018-11-19 現在 Android Studio 3.2.1 ではこの設定は無くなっているので不要です
  6. ビルド

  7. ビルドが完了すると右下に下記のようなのが出てapkが作成されるので、実機へ移してインストールする
    app/build/outputs/apk/debug/app-debug.apk ←ココ

adhell3.1.1.x の実行には 各 knox ライセンスキーが必要です

現在利用可能なキーは  ELMキー で adhell 3.1.1.265 以降で対応しています
※複数キーは生成できないのでキー取得前に revoke 可能なキーはすべて revokeしてから ELMキーを取得してください

キーには有効期限があり、期限をすぎると再度取得するか、期限前に削除→再生成します
サイトからキー削除後に端末を再起動すると、adhellからキー入力を促されます