みんなの自動翻訳APIをJavaで使う

Main.java

package minhon_client;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.StringReader;
import java.util.GregorianCalendar;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

import minhon.TranslateFile;

public class Main {
    private static final String USERNAME = "";
    private static final String KEY = "";
    private static final String SECRET = "";

    private static int getTranslateState(TranslateFile tf, String pid) {
    		String translate_result;
	    	translate_result = tf.getStatus(pid);
//	    	System.out.println(translate_result);
	
	    	try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
	    	    	InputSource is = new InputSource(new StringReader(translate_result));
	    	    	Document document = builder.parse(is);
	    	    String state_str = "";
	    	    state_str = document.getElementsByTagName("state").item(0).getTextContent();
	    	    int state = Integer.parseInt(state_str);
	    	    return state;
	    	} catch (Exception e) {
	    		return -2;
	    	}
    }
    
	public static void main(String[] args) throws Exception {
		String file_path = args[0];
		String translate_result = "";
		Boolean result = false;


		/* 文字列の翻訳 */
//		TranslateLine tl = new TranslateLine(USERNAME, KEY, SECRET);
//		tl.translate("こんにちわ");

		/* APIライブラリの初期化 */
//		minhon.Client c = new minhon.Client(USERNAME, KEY, SECRET);

		/* ファイルの翻訳 */
//		result = c.registTranslateFile(file_path);
//		System.out.println(result);

//		result = c.listTranslateFile();
//		System.out.println(result);
		
//		translate_result = c.getTranslateFile("66834");
//		System.out.println(translate_result);

		// 翻訳ファイルの登録
		TranslateFile tf = new TranslateFile(USERNAME, KEY, SECRET);
		translate_result = tf.regist(file_path);
		System.out.println(translate_result);
		
		 // DocumentBuilderFactory インスタンスを取得
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        
        // StringReaderを使ってXML文字列を読み込む
        InputSource is = new InputSource(new StringReader(translate_result));
        
        // InputSourceからDocumentオブジェクトを生成
        Document document = builder.parse(is);
        String pid = document.getElementsByTagName("pid").item(0).getTextContent();
        	System.out.println("pid:" + pid);
        
        	
        	// 翻訳ファイルのステータスを取得
        	System.out.println("get state of pid:" + pid);
        	int state = 1;
        	int wait_time_ms = 5000;
        	int count_time = 0;
        	while(state!=2) {
        		if (120000 < count_time) {
        			System.out.println("timeout pid:" + pid);
        			break;
        		}
            	Thread.sleep(wait_time_ms);
            state = getTranslateState(tf, pid);
            GregorianCalendar cal = new GregorianCalendar();
        		System.out.println("state pid:" + pid
        				+ " " + "state:" + state
        				+ " " + cal.get(cal.HOUR_OF_DAY) + ":" + cal.get(cal.MINUTE) + ":" + cal.get(cal.SECOND));
            count_time += wait_time_ms;
        	}
        	
        	System.out.println("complete pid:" + pid);

        	// 翻訳ファイルのダウンロード
        	System.out.println("get the file of pid:" + pid);
        	translate_result = tf.download(pid);
        	System.out.println("\"\"\"\n" + translate_result + "\"\"\"");
        	File file = new File(file_path);
        	String new_path = file.getParent() + "/" + file.getName()+"_translated.txt";
        	BufferedWriter fout = new BufferedWriter(new FileWriter(new_path, true));
        	fout.write(translate_result);
        	fout.close();

        	System.out.println("download the file of pid:" + pid + " " + new_path);
	}
	
}

TranslateFile.java

package minhon;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.github.scribejava.core.builder.ServiceBuilder;
import com.github.scribejava.core.builder.api.DefaultApi20;
import com.github.scribejava.core.model.OAuth2AccessToken;
import com.github.scribejava.core.oauth.OAuth20Service;

public class TranslateFile {
    private String NAME   = ""; // ログインID
    private String KEY    = ""; // API key
    private String SECRET = ""; // API secret
    private static final String URL    = "https://mt-auto-minhon-mlt.ucri.jgn-x.jp"; // 基底URL (https://xxx.jpまでを入力)

    private static final String API_NAME  = "trans_file"; // API名 (https:#xxx.jp/api/mt/generalNT_ja_en/ の場合は、"mt")
    private static final String API_PARAM = "set"; // API値 (https:#xxx.jp/api/mt/generalNT_ja_en/ の場合は、"generalNT_ja_en")

    public TranslateFile(String name, String key, String secret) {
    		this.NAME = name;
    		this.KEY = key;
    		this.SECRET = secret;
    }

    
    public String regist(String file_path) {
        final OAuth20Service service = new ServiceBuilder(KEY)
            .apiSecret(SECRET)
            .build(new DefaultApi20() {
                @Override
                public String getAccessTokenEndpoint() {
                    return URL + "/oauth2/token.php";
                }

                @Override
                protected String getAuthorizationBaseUrl() {
                    return null;
                }
            });

        try {
            final OAuth2AccessToken accessToken = service.getAccessTokenClientCredentialsGrant();

            try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
                MultipartEntityBuilder builder = MultipartEntityBuilder.create();

                builder.addTextBody("access_token", accessToken.getAccessToken(), ContentType.TEXT_PLAIN); // アクセストークン
                builder.addTextBody("key", KEY, ContentType.TEXT_PLAIN);                                   // API key
                builder.addTextBody("name", NAME, ContentType.TEXT_PLAIN);                                 // ログインID
                builder.addTextBody("api_name", API_NAME, ContentType.TEXT_PLAIN);                         // API名
                builder.addTextBody("api_param", "set", ContentType.TEXT_PLAIN);                       // API値
                builder.addTextBody("mt_id", "generalNT_ja_en", ContentType.TEXT_PLAIN);
                // builder.addTextBody("xxx", "xxx", ContentType.TEXT_PLAIN);                              // 以下、APIごとのパラメータ

	    			File file = new File(file_path);
	    			File f = File.createTempFile(file.getName(), ".txt");
	    			BufferedReader in = new BufferedReader(new FileReader(file_path));
	    			BufferedWriter out_tmp = new BufferedWriter(new FileWriter(f));
	    			String str;
	    			while((str=in.readLine())!=null) {
	    				out_tmp.write(str + "\n");
	    			}
	    			in.close();
	    			out_tmp.close();
                builder.addTextBody("title", f.getName(), ContentType.TEXT_PLAIN);
                builder.addBinaryBody("file", f, ContentType.APPLICATION_OCTET_STREAM, f.getName());
                
                HttpEntity entity = builder.build();

                HttpPost httpPost = new HttpPost(URL + "/api/?");
                httpPost.setEntity(entity);
                BufferedInputStream bis = null;

                try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
	                	InputStream respBodyStream = response.getEntity().getContent();
	    				int respStatus = response.getStatusLine().getStatusCode();
	    				bis = new BufferedInputStream(respBodyStream);
	    				System.out.println("Http response status: " + respStatus);
	    				String responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
                    return responseString;
    				}
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "error";
    }
    
    
    public String getStatus(String pid) {
        final OAuth20Service service = new ServiceBuilder(KEY)
            .apiSecret(SECRET)
            .build(new DefaultApi20() {
                @Override
                public String getAccessTokenEndpoint() {
                    return URL + "/oauth2/token.php";
                }

                @Override
                protected String getAuthorizationBaseUrl() {
                    return null;
                }
            });

        try {
            final OAuth2AccessToken accessToken = service.getAccessTokenClientCredentialsGrant();

            try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
                MultipartEntityBuilder builder = MultipartEntityBuilder.create();

                builder.addTextBody("access_token", accessToken.getAccessToken(), ContentType.TEXT_PLAIN); // アクセストークン
                builder.addTextBody("key", KEY, ContentType.TEXT_PLAIN);                                   // API key
                builder.addTextBody("name", NAME, ContentType.TEXT_PLAIN);                                 // ログインID
                builder.addTextBody("api_name", API_NAME, ContentType.TEXT_PLAIN);                         // API名
                builder.addTextBody("api_param", "status", ContentType.TEXT_PLAIN);                       // API値
                builder.addTextBody("pid", pid, ContentType.TEXT_PLAIN);                              // 以下、APIごとのパラメータ

                HttpEntity entity = builder.build();

                HttpPost httpPost = new HttpPost(URL + "/api/?");
                httpPost.setEntity(entity);

                try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                    String responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
                    return responseString;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return "error";
    }


    public String download(String pid) {
        final OAuth20Service service = new ServiceBuilder(KEY)
            .apiSecret(SECRET)
            .build(new DefaultApi20() {
                @Override
                public String getAccessTokenEndpoint() {
                    return URL + "/oauth2/token.php";
                }

                @Override
                protected String getAuthorizationBaseUrl() {
                    return null;
                }
            });

        try {
            final OAuth2AccessToken accessToken = service.getAccessTokenClientCredentialsGrant();

            try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
                MultipartEntityBuilder builder = MultipartEntityBuilder.create();

                builder.addTextBody("access_token", accessToken.getAccessToken(), ContentType.TEXT_PLAIN); // アクセストークン
                builder.addTextBody("key", KEY, ContentType.TEXT_PLAIN);                                   // API key
                builder.addTextBody("name", NAME, ContentType.TEXT_PLAIN);                                 // ログインID
                builder.addTextBody("api_name", API_NAME, ContentType.TEXT_PLAIN);                         // API名
                builder.addTextBody("api_param", "get", ContentType.TEXT_PLAIN);                       // API値
                builder.addTextBody("pid", pid, ContentType.TEXT_PLAIN);                              // 以下、APIごとのパラメータ

                HttpEntity entity = builder.build();

                HttpPost httpPost = new HttpPost(URL + "/api/?");
                httpPost.setEntity(entity);

                try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                    String responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
                    return responseString;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return "error";
    }
    
}

windows10からmacOSにつながらなくなったときはApple Bonjour

コマンドプロンプトからのsshやフォルダ共有でmacOSにつなげていたのにつながらなくなったら、Apple Bonjourをインストールするとつながります。

WindowsのmDNSはモダンアプリしかサポートしないそうです。

windows-10 ? Windows 10ビルド17134でmDNSを有効にする方法 (web-dev-qa-db-ja.com)

他の方法としてはつながるlinuxにログインしてmacOSにsshすると、windowsからもつながります。

A-Frameの単位

What type of units does A-Frame use?

A-Frame uses meters with a 1:1 ratio since the WebVR API also uses meters. 5 units in A-Frame is equal to 5 meters in real life. Furthermore, when using programs like Blender, configured in imperial or metric mode, measurements will also translate 1:1. 10 feet in Blender will equal 10 feet in real life.

https://aframe.io/docs/1.4.0/introduction/faq.html#what-type-of-units-does-a-frame-use

“A-Frameの単位” の続きを読む

A-Frameの文字を表示する「aframe-html-shader」について

#targetHTMLが表示されたままになる場合、たぶんskyエンティティが作られていません。これはたぶん、A-Frameの描画の都合です。
下記のようにa-skyエンティティを加えてください。

<a-sky color="white"></a-sky>

リンク:https://github.com/mayognaise/aframe-html-shader

Mac Xquartzでglxgears

Macのxquartzでリモートのglxgearsを実行してもエラーになる場合は、

ターミナルで下のコマンドを実行してiglxを有効にして、

defaults write org.xquartz.X11 enable_iglx -bool YES

# defaults write org.macosforge.xquartz.X11 enable_iglx -bool trueは以前のバージョンなので上のコマンドを実行すること。

次にリモート先の/etc/ssh/sshd_configの下の行を有効にしてから、

X11Forwarding yes

ssh -Xでログインしてglxgearsコマンドを実行する。

参考

Indirect GLX not functioning in some cases?#144