Javaでメソッドを引数みたいな感じで別クラスに渡して別クラスでメソッドを実行させる方法

何を書いているか良くわからない。というか表現があっているかもよくわかってない。

Pythonでいう関数渡し的なのをJavaでやりたい

 

やりたいこと

private void AAA(){

class InnerClass{
InnerClass(){

//InnerClassの中身

}

}

new InnerClass();//InnerClass実行

BBB();//こいつに new InnerClass()を渡して実行させたい

}

 

class void BBB(){

//BBBの中身

//InnerClassを実行させたい場所

}

 

これ、実はThreadで解決できる。

じつは常識なのかな?私は知らなかった。

解決法:

private void AAA(){

class NewInnerThread extends Thread {
public void run() {
//InnerClassの中身

}
}

new NewInnerThread ().run();

BBB(new NewInnerThread ());//こいつに new NewInnerThread ()渡す

}

 

class void BBB(Thread thread1){

//BBBの中身

thread1.run();

}

 

これでとりあえず解決できた。

 

 

Windowsで絶対パスかどうかをチェックする正規表現

folderPathRegex=r'^[a-zA-Z]:\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*$'
です
日本語ネットワーク名対応のネットワークフォルダパスは
netfolderPathRegex=r'^\\\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?){1,}\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*$'
です


Pycharmでtensorflow-gpuをWindows 10 pro 1803に新規インストール

tensorflowのGPU版をWindows 10 pro 1803に入れたのでメモ

Cuda9を公式からダウンロードして入れる

インストールおわったら

cudnn-9.0-windows10-x64-v7.1っていうCuDNNをインストールしたCudaに追加
場所は

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0

です

Anaconda3-5.2.0-Windows-x86_64を新規インストール

Pycharmも最新版をインストール

Pycharmを起動したら新規プロジェクトに
Project interpreter:New Virtualenv environment
を開いて
New environment using に Virtualenvを選択して
Base interpreterにさっきインストールした Anaconda3を選択

pycharmのterminalで

pip3 install –upgrade tensorflow-gpu

を実行

これで出来るはず

OANDAのFIXprotocolでレートを取得

色々あってドル円とかのレートデータを高速で取得する必要があった。
調べたところThe Financial Information eXchange (FIX) protocolがなんか良い感じでスタンダードらしいからそれで構築することにした。

使用したものはQuickFIX/J

http://www.quickfixj.org/

です

YJFXのFIXプロトコルはそこそこ素直に出来たけどOANDAはかなり悩んだ。

ハマったポイントはレートサーバーは別です!
//settings.setString(“SocketConnectHost”, “fxgame-fix.oanda.com”);
settings.setString(“SocketConnectHost”, “fxtrade-fix.oanda.com”);

だけじゃだめ

if(rateServer)settings.setString(“TargetSubID”, “RATES”);

これがいる

これあるとレートサーバーに繋いでくれます。そうじゃないと

toApp :8=FIX.4.49=12735=V34=249=USERID52=20171104-11:48:06.69256=OANDA262=foo263=1264=1265=1266=Y146=155=USD/JPY267=2269=0269=110=207

fromApp :8=FIX.4.49=10835=j34=349=OANDA52=20171104-11:48:05.33056=pp35260445=258=MsgType <35> = V not supported.372=V380=310=180

って怒られます。

正しいリクエスト↓

toApp :8=FIX.4.49=13635=V34=249=USERID52=20171104-11:54:35.94856=OANDA57=RATES262=foo263=1264=1265=1266=Y146=155=USD/JPY267=2269=0269=110=251

んですべてのリクエストに毎回「57=RATES」を入れないとダメです

@Override
public void toAdmin(Message msg, SessionID sessionID) {

try {
String msgType = msg.getHeader().getString(MsgType.FIELD);
if(settings.isSetting(“TargetSubID”))
try {
msg.setString(quickfix.field.TargetSubID.FIELD,
settings.getString(sessionID, “TargetSubID”));
} catch (ConfigError | FieldConvertError e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(MsgType.LOGON.compareTo(msgType) == 0)
{

try {
if(settings.isSetting(“Password”))msg.setString(quickfix.field.Password.FIELD,
settings.getString(sessionID, “Password”));
msg.setString(quickfix.field.ResetSeqNumFlag.FIELD,
“Y”);

} catch (ConfigError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FieldConvertError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (FieldNotFound e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

System.out.println(“toAdmin :”+msg.toString());
}
public void toApp(Message msg, SessionID sessionId) throws DoNotSend {
if(settings.isSetting(“TargetSubID”))
try {
msg.setString(quickfix.field.TargetSubID.FIELD,
settings.getString(sessionID, “TargetSubID”));
} catch (ConfigError | FieldConvertError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(“toApp :”+msg.toString());
}

ゴミコードも置いときます。

 

tomcatでwebsocketしたい

なんか結構悩んで時間かかったからメモ

WebServerを新しく構築しようと思ってんで、高速に通信出来るようにしたいからwebSocketを使って通信しようかなーって思った

https://www.pegaxchange.com/tag/setup-tomcat-9-server-in-eclipse-neon/

まぁここ見ながらやったら開発環境は基本的にできた

開発環境:Eclipse IDE for Java EE Developers
https://www.eclipse.org/downloads/packages/release/neon/3

なんかJava SEで動いたからこれいれる
Java SE Runtime Environment 8 Downloads
http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html
jre-8u181-windows-x64.exe

ハマったポイントがeclipseのneonだとHelpのEclipse MarketPlaceで~みたいな記事あったけど、できなかった。

https://tomcat.apache.org/download-90.cgi

から9.0.0.M20の64-bit Windows zipをダウンロードしてください

そしたらコピペだけど

例えばCドライブ上に解凍した後

In the Preferences dialog, select Server > Runtime Environments and then click on the Add… button to setup a new runtime environment.
Eclipse IDE for Java EE Developers – Preferences > Server Runtime Environments > Add

In the New Server Runtime Environment dialog, select Apache Tomcat v9.0 from the list and then click on the Next button.
Eclipse IDE for Java EE Developers – Preferences > Server Runtime Environments > New Server Runtime Environment

ここでtomcat installation directoryで解凍したファルダのC:\Tomcat 9.0 指定
JREはデフォルトでいいとおもう

Specify the installation directory of Tomcat by clicking on Browse and selecting the root folder of the Tomcat installation. In this example c:\tomcat9 was used as the root folder.
Click on Finish to continue.
Eclipse IDE for Java EE Developers – Preferences > Server Runtime Environments > New Tomcat Server Runtime Environment

The Apache Tomcat v9.0 web server is now available as a server runtime environment in Eclipse and can now be used to deploy and run Java web modules containing Servlets, JSP files, web services and so on. Click on OK to close the Preferences dialog.
Eclipse IDE for Java EE Developers – Preferences > Server Runtime Environments > Apache Tomcat v9.0

してください

記事消えたら嫌だからついでに後もコピペ

5 Setup of new Dynamic Web Project in Eclipse

A Dynamic Web Project in Eclipse is a project facet for developing Java web applications as defined in the Servlet Specification. It generates a web application deployment descriptor (web.xml) and allows to export the project to a web archive (WAR) file for deployment to a Servlet container such as Tomcat.

On the Eclipse Welcome page, select Create a new Java EE Web Project or use the Eclipse main menu and select File > New> Dynamic Web Project. Both links will show the same dialog for configuring a new dynamic web project.
Eclipse IDE for Java EE Developers > Create a new Java EE Web Project

In the Dynamic Web Project dialog, enter the project’s name and select the target runtime, in this case Apache Tomcat v9.0.
Select the Dynamic web module version, in this case it is 3.1, indicating Servlet Specification 3.1, then click on the Finish button.
Eclipse IDE for Java EE Developers > Create a Dynamic Web Project

The new dynamic web project will now show up in the Project Explorer of Eclipse. To open the Project Explorer, navigate to Window> Show View > Project Explorer in the Eclipse main menu.
Eclipse IDE for Java EE Developers > Project Explorer > Dynamic Web Project

It may be necessary to configure the project’s build path so that the Tomcat 9 JAR files are added as a dependent library to the project. These JAR file include the Servlet API, Annotations API and others.
Create a new user library by navigating to Window > Preferences in the Eclipse main menu.
In the tree menu of the Preferences dialog, navigate to Java> Build Path> User Libraries.
Click on the New button to add a new user library.
Eclipse IDE for Java EE Developers > Preferences > Java > Build Path > User Libraries

In the New User Library dialog, enter a library name, here it is Tomcat9Library
Eclipse IDE for Java EE Developers > Preferences > Java > Build Path > User Libraries > New User Library

The new library now shows up in the User Library list. Click on Add External JARs to add the Tomcat JAR files to it.
Eclipse IDE for Java EE Developers > Preferences > Java > Build Path > User Libraries > Add External JARs

In the JAR Selection dialog, navigate to the Tomcat 9 “lib” folder. In this example, the complete folder path is c:\tomcat9\lib.
Select all of the JAR files in that folder and click on “Open“.
Apache Tomcat 9 lib folder JAR files

The JAR files are now listed under the newly created library.
Click on OK to close the Preferences window.
Eclipse IDE for Java EE Developers > Preferences > Java > Build Path > User Libraries > Tomcat 9 JAR files

Adding the library to the web project: In the Eclipse Project Explorer, right click on the project name and select Properties from the context menu.
Eclipse IDE for Java EE Developers > Project Explorer > Dynamic Web Project > Properties

In the tree menu, select Java Build Path and open the Libraries tab in the main area.
Eclipse IDE for Java EE Developers > Project Explorer > Dynamic Web Project > Properties > Java Build Path > Libraries

Click on the button Add Library and select User Library in the Add Library dialog.
Eclipse IDE for Java EE Developers > Project Explorer > Dynamic Web Project > Properties > Java Build Path > Libraries > Add Library > User Library

Select the newly created user library, in this case, Tomcat9Runtime and click on Finish.
Eclipse IDE for Java EE Developers > Project Explorer > Dynamic Web Project > Properties > Java Build Path > Libraries > Add Library > Select User Library to add to the classpath

The library is now added to the web project’s list of dependent libraries.
Eclipse IDE for Java EE Developers > Project Explorer > Dynamic Web Project > Properties > Java Build Path > User Library

When expanding the Java Resources > Libraries node in the Project Explorer tree menu, the JAR files from that library are now listed.
Eclipse IDE for Java EE Developers > Project Explorer > Dynamic Web Project > Java Resources > Libraries > User Library

ながいなー

まぁとりあえずユーザーライブラリーに登録して、それを毎回使うようにしましょうーってことぽい

あと新規のServlet(.javaのファイル)を作るときNew> Servletってするんだけどいつも忘れる

んで、eclipseの左上あたりに強制的に動作を停止させるボタン表示させるなら↓いる。

https://sourceforge.net/projects/tomcatplugin/files/
1. Eclipseのtomcatプラグインをダウンロード
2. Eclipse>help>Install New Software
3. Work withのadd>Archive>手順1でダウンロードしたzipを選択
4. Tomcat Pluginが表示されたらチェックしてインストール
5. Eclipse > 環境設定
6. Tomcat
7. Tomcatバージョンを選択
8. Tomcat Homeを選択(C:\Tomcat 9.0)
9. コンテキスト宣言モードを設定

あとテストサーバーとかで試すときfiddlerとかで解析させるのが便利だけど、httpsのオレオレ証明書で怒られる場合はfiddlerのoptionのcaputure https チェックしてdecrypted https trafficにチェックして、右らへんにactionってあるからそこからtrust root certificateで証明書作って、Windowsに登録したらexport root certificate to desktopして、それをfirefoxの「編集」->「設定」->「プライバシー」 & 「セキュリティー」->「証明書」->「証明書管理」とかで認証局証明書としていれる

[Fiddler] The Fiddler AutoResponder is enabled, but this request did not match any of the listed rules. Because the “Unmatched requests passthrough” option on the AutoResponder tab is not enabled, this HTTP/404 response has been generated.
の場合はAutoresponderのパススルーを有効にしてください

んでwebsocketでfirefox console securityerror the operation is insecure って言われる場合は(ws://だと言われる)about:config で network.websocket.allowInsecureFromHTTPSを有効

とりあえず開発がんばろ

DD-WRTでVPNの設定

バッファローやTP-LINKなどのルーターはオリジナルのファームウェアではなくカスタマイズされたDD-WRTというファームを入れることができる。

今回はOpenVPNでDD-WRTでプライベートネットワークを作ろうとした。

とりあえずWEB画面からOpenVPNのサーバーにログインさせる

AdministrationのCommandsに

#!/bin/sh
touch /tmp/auth.conf
echo “USERNAME” > /tmp/auth.conf
echo “PASSWORD” >> /tmp/auth.conf

をStartupに登録で

ServicesのVPNに

Additional Config:

resolv-retry infinite
nobind
persist-key
persist-tun
client
verb 3
auth-user-pass /tmp/auth.conf

Server IP/Name:接続するサーバー

Encryption Cipher: AES-128 CBC

Hash Algorithm:SHA1

CA Cert:鍵

Public Client Cert:鍵

Private Client Key:鍵

Bridge TAP to br0は有効した

そうするとSoftEtherのOpenVPNに接続はできた(StatusのVPNでConnectedになる)が、なんかうまいことeth0からプライベートネットワークにつながらない

とりあえず様子見

java.lang.IllegalStateException in com.quinny898.library.persistentsearch.SearchBox$SearchAdapter

I can finally figure out what happen.

I am using “com.quinny898.library.persistentsearch:library:1.1.0-SNAPSHOT”.

When I try to do “notifyDataSetChanged();” in another ListViewAdapter, this error message shows up.

Error Message:

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131690277, class android.widget.ListView) with Adapter(class com.quinny898.library.persistentsearch.SearchBox$SearchAdapter)] : at android.widget.ListView.layoutChildren(ListView.java:1597)

Solution!

You Should call closeSearch() when search box is closed;

@Override
public void onSearch(String searchTerm) {

    closeSearch();//Important!
}

@Override
public void onResultClick(SearchResult result) {
    //React to result being clicked
    closeSearch();//Important!
}

@Override
public void onSearchCleared() {

}
protected void closeSearch() {
    search.hideCircularly(MainActivity.this);
    search.clearResults();
}

ActivityとFragmentとChildFragmentの連動

ややこしいからメモ

Activity→Fragment→ChildFragmentのViewPagerである特定のViewPagerのpositionを呼び出したいとき

try {
   FragmentManager fm = ((MainActivity) context).getSupportFragmentManager();

   Fragment prev = fm.findFragmentByTag("たぐ");
   if (prev != null) {

      FragmentManager fmF =prev.getChildFragmentManager();
      ChildClass fragInFrag = (ChildClass)fmF.findFragmentByTag(
            "android:switcher:" + R.id.pager + ":1(ここはPositionを指定)");
      if (fragInFrag!= null){
         fragInFrag.なんかの動作();
      }

   }



} catch (ClassCastException e) {
   Log.e("TAG", "Can't get fragment manager");
}

ActivityからFragmentのフラグメントの動作を呼び出したいとき

//親fragmentの呼び出し
Fragment prev = getParentFragment().getFragmentManager().findFragmentByTag("たぐ");
if (prev != null) {
Class df = (Class) prev;
    df.なんかの動作();
 }

FragmentまたはChildFragmentからActivityを呼び出したいとき

MainActivity activity = (MainActivity) getActivity();
if(activity!=null)activity.なんか();

FragmentまたはChildFragmentからFragmentを呼び出したいとき

 try{
 FragmentManager fm = getActivity().getSupportFragmentManager();
 Fragment_class main = (Fragment_class)fm.findFragmentById(R.id.container);
 if (main != null){
 main.なんか
 }
 }catch(ClassCastException e){
 }

 

projectにmoduleを追加するときは気を付けよう!

世の中には便利なライブラリがたくさんあるけどたまにバグってる時もある。

そんなときは自分でプロジェクトにモジュールを追加して、んで

dependencies {
    compile project(':library')

を追加させると自分で編集できるライブラリになる

でも何も考えずfileのnewよりimport Moduleをしてlibraryを追加させるとGradleさんがなんか動いてくれない、てか新しく追加もされていないし、なんかプロジェクトめちゃくちゃになった。

とりあえずライブラリのあったフォルダを直接削除して、

gradleを更新かけると追加したフォルダが出てくれたので

fileのproject structureから追加したモジュール名選択して、「-」記号をクリックして削除して、もう一度gradle更新したらなんとか治った。

皆さんもモジュールとか追加するときはバックアップしましょう

 

TableLayoutでTextViewを文字サイズによって調整する

サイズを指定して表示させとけばそのサイズになるけどきちんとサイズを自動的に調整させると意外とハマった

<TableLayout
    android:id="@+id/shelfTableLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</TableLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/viewID"
    >

    <RelativeLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        android:id="@+id/ShelfSectionLinearLayout">

        <ImageView
            android:id="@+id/listImg"
            android:layout_width="80dip"
            android:layout_height="50dip"
            android:layout_weight="0"
            android:layout_gravity="center"
            android:layout_centerInParent="true"
            android:layout_alignParentLeft="true"
            android:src="@drawable/plusc"

            />

        <LinearLayout
            android:id="@+id/ShelfSectionTextLinearLayout"
            android:orientation="vertical"
            android:layout_toRightOf="@+id/listImg"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:id="@+id/ShelfSectionText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=""
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:layout_weight="0"/>

            <TextView
                android:id="@+id/ShelfSectionText2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:text=""
                android:layout_weight="0"/>
        </LinearLayout>
    </RelativeLayout>
</RelativeLayout>

これでわりといい感じに表示される

RelativeLayoutが良い感じになるコツ!

Screenshot_2016-08-16-09-49-30

いい感じ