法人設立、法人銀行口座開設、法人本店移転の手続きメモ

法人設立

法人設立の手続きはfreeeの法人設立サービスを使ったので、フォームに必要な事項を入力すると勝手に書類が生成された。
意外と簡単。

メモ:

  • 登記の事業目的は、むやみにたくさん記述すると銀行口座開設の審査に落ちやすくなる
  • 仮想通貨関連の事業目的を書くと銀行口座開設の審査に落ちやすくなるので、仮想通貨という言葉を使わない抽象的な書き方にする
  • バーチャルオフィスだと銀行口座開設の審査に落ちやすくなる

自分の場合、バーチャルオフィス+仮想通貨関連の事業目的があったのでどの銀行も口座開設できず。
バーチャルオフィスだけでなく、シェアオフィスやレンタルオフィスも同様に審査が厳しくなり、その時点で開設できないという銀行も多い。銀行員によると、これらの物件では賃貸借契約を結ばないため、実体性がないと見なされるとのこと。

そこで事業目的の変更と、バーチャルオフィスから貸し事務所へ本店を移転。

本店移転

必要な書類
本店移転手続きの方法(会社住所変更の登記手続方法)と税務署や年金事務所などの関連手続の方法

社長ひとりの会社なら従業員はいないので、労働基準監督署ハローワークへの提出書類は不要。
市長村役場に提出する書類のうち、「事業所等変更届」は東京の場合不要。「特別徴収義務者所在地・名称等変更届」は特別徴収義務者でない場合は不要。

登記変更の手続きは、面倒だけど難しくない。法人税の確定申告とは違って専門的な知識は必要ない。


これらの変更手続きの後に再度、銀行口座開設を挑んだところ開設できた。

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