payara5 で java.lang.NoSuchMethodError: sun.security.ssl.SSLSessionImpl

ssl通信を行おうとするとエラー

java.lang.NoSuchMethodError: sun.security.ssl.SSLSessionImpl.(Lsun/security/ssl/ProtocolVersion;Lsun/security/ssl/CipherSuite;Ljava/util/Collection;Lsun/security/ssl/SessionId;Ljava/lang/String;IZ)V

解決方法
TLS fails with jdk 8u191 · Issue #3284 · payara/Payara · GitHub

1) go to path : $JDK_HOME$ /jre/lib/
1.1) copy this file : /jsse.jar

2) go to path : $PAYARA5_INSTALL$/glassfish/lib/
2.1) backup : grizzly-npn-bootstrap.jar

3) open "jsse.jar" with an archive editor
3.1) go to path (in archive) : sun/security/ssl
3.2) extract folder "ssl"

4) open "grizzly-npn-bootstrap.jar" with an archive editor
4.1) merge the "ssl" folder extracted from the "jsse.jar" archive with the "ssl" folder
into "grizzly-npn-bootstrap.jar", overwriting the files with the same name

5) restart payara.
and normally everything works properly

上にある2つのjarを両方解凍し、jsse.jarの方のsslフォルダの中身をgrizzly-npn-bootstrap.jarの方のsslに上書きコピー。
zip圧縮して拡張子をjarに変えて元の場所に配置。
で再起動。

で直った。
JDKバージョンを変えると良くなるという報告がいくつかあったが自分は治らなかった。

巨大な配列のソートの計算量を減らす

要件:100万レコードからなる{ID,SCORE}の中からTOP N件をSCORE降順で得たい。


普通にやる

        HashMap<String, Double> items = new HashMap<>();
        for (int i = 0; i < 1000000; i++) {
            items.put(String.valueOf(i), r.nextDouble());
        }
        
        List<Entry<String, Double>> entries = new ArrayList<>(items.entrySet());
        long t10 = System.currentTimeMillis();
        Collections.sort(entries, new Comparator<Entry<String, Double>>() {
            //比較関数
            @Override
            public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
                //return o1.getValue().compareTo(o2.getValue());    //昇順
                return o2.getValue().compareTo(o1.getValue());    //降順
            }
        });
        long t11 = System.currentTimeMillis();
        System.out.println((t11 - t10)  + "ms");


TOP Nだけを常時監視する

        System.out.println("#### sort only for top N");
        int TOP_N = 1000000;
        double[] items2 = new double[TOP_N];
        long t20 = System.currentTimeMillis();
        for (int i = 0; i < TOP_N; i++) {
            items2[i] = r.nextDouble();
        }
        List<Integer> topIndexes = sortedTopNIndex(items2, 1000);
        
        long t21 = System.currentTimeMillis();
        System.out.println((t21 - t20)  + "ms");



    public static List<Integer> sortedTopNIndex(double[] arr, int n) {
        List<Integer> indexes = new ArrayList<>();
        double minInTopN = -1.0;
        
        int len = arr.length;
        loop1: for(int i=0; i<len; i++){
            double val = arr[i];
            if (val > minInTopN){
                int indexesLen = indexes.size();
                for (int j=0; j<n && j<indexesLen; j++){
                     int index = indexes.get(j);
                     double topVal = arr[index];
                     if (val < topVal){
                         indexes.add(j, i);
                         if (indexes.size() > n){
                             indexes.remove(0);
                         }
                         minInTopN = arr[indexes.get(0)];
                         continue loop1;
                     }
                }
                indexes.add(i);
                if (indexes.size() > n){
                    indexes.remove(0);
                }
                minInTopN = arr[indexes.get(0)];
                continue loop1;
            }
        }
        
        return indexes;
    }

結果
普通にやる:1301ms
TOP Nだけを常時監視する:94ms

storyboardでのScrollViewレイアウト

Swift - How to use Scrollview Xcode 7 (Storyboard) - YouTube
いろいろ大変だったが、結局この動画で一瞬で解決(xcode7)


この動画のままだとなぜか横スクロールがでてくる。
ScrollViewが一番上のViewに対して持っている右端と左端の制約をそれぞれ-20に設定すれば 横スクロールは消えた。

もう、なんでこんなにわかりずらいのか。
苛苛


ーー
あーやっぱダメだった


結局、プログラムからスクロールの高さを直接指定するという方法が一番ストレスがなさそう。

・スクロールの直下をViewにする
・そのViewの中に思いのままに縦長のコンテンツをstoryboardで配置
・描写したものの一番底にあるオブジェクトの絶対Y座標を取得
・ScrollViewの高さをその絶対Y座標に指定する


参考:画面描画後にスクロールの高さと幅を直接指定して変更する
SwiftでAuto Layoutした時の座標の取り方 - grachroのブログ[iOS] Auto Layout を使いこなす。UITableViewCell と UIScrollView 編 - それはBooks


参考:オブジェクトの絶対座標取得
SwiftでAuto Layoutした時の座標の取り方 - grachroのブログ

//あとで書く

push通知ハマりポイント

Provisioning Profile で登録している 名前とxcode側の名前(Bundle Identifier)が一致しないとアプリ側に送られてこない。
エラーも何もでないからどこが原因かわかりづらかった。もう。

{"message":"Missing Authentication Token"}

POSTの場合、リクエストの投げ方が間違っているこういうエラーがでる。わかりにくい。

こうするとうまくいった

curl -H "Content-Type: application/x-www-form-urlencoded" -X POST -d '{"hoge":"123"}' https://aaaaaaaaaaa


参考
AWS API GatewayでContent-Type:application/x-www-form-urlencoded のPOSTデータを受け取り JSONに変換する - Qiita