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

要件: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

一括で複数ファイルアップロード

今いるディレクトリのファイル全部アップロード

find . -type f -print0 | xargs -0 -I% aws s3 cp % s3://path_to_upload/

さくらVPSでUnicode::Japaneseインストール

yum install perl-ExtUtils-Embed
cpan Unicode::Japanese

参考:
Perl - Unicode::Japaneseのインストール失敗をなんとかしてみた - Qiita

java.lang.NoClassDefFoundError JaxbAnnotationIntrospector

はまり

[GLASSFISH-21141] Missing jackson-module-jaxb-annotations JAR causes error on first Jersey/Jackson JSON response - Java.net JIRA

A quick hack how I managed to overcome this on GlassFish Server Open Source Edition 4.1 (build 13):
0) stopped the server
1) downloaded and copied the jars below into glassfish4\glassfish\modules (version: 2.4.2 for all)
jackson-annotations.jar
jackson-core.jar
jackson-databind.jar
jackson-jaxrs-base.jar
jackson-jaxrs-json-provider.jar
jackson-module-jaxb-annotations.jar
2) deleted the osgi-cache: removed glassfish4\glassfish\domains\domain1\osgi-cache\felix
3) re-started the server