azure Web.configで301リダイレクトさせてRSSを取得

Web.configのファイルをつくります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="boj-zh.azurewebsites.net" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^boj-zh\.azurewebsites\.net$" />
                    </conditions>
                    <action type="Redirect" url="http://hpscript.com/rss/rss.xml" redirectType="Permanent" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

boj-zh.azurewebsites.net のwebrootのディレクトリにconfigファイルを置きます。

boj-zh.azurewebsites.netにアクセスすると、http://hpscript.com/rss/rss.xmlにリダイレクトされるようになりました。
では、vagrantから、azureにアクセスして、rssが取得できるか確認してみましょう。
vagrantからazureのアドレスを読みに行きます。

require_once 'vendor/dg/rss-php/src/Feed.php';
$rss = Feed::loadRss('https://boj-zh.azurewebsites.net');

foreach($rss->item as $item){
	echo $item->title ."<br>";
}

問題なくリダイレクトして取れてます。なるほど!

vagrant->azureでwebappを作っていく

azure CLIにてplanをつくって、webappをcreate

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name boj-zh --runtime "PHP|7.0" --deployment-local-git

local

[vagrant@localhost azure]$ git init
[vagrant@localhost azure]$ git add *
[vagrant@localhost azure]$ git commit -m "initial commit"

[vagrant@localhost azure]$ git remote add azure https://name@boj-zh.scm.azurewebsites.net/boj-zh.git
[vagrant@localhost azure]$ git push azure master
Password for 'https://name@boj-zh.scm.azurewebsites.net':

azureに載りました。わーいわーい
若干気になるのは、ローカル(vagrant)と、azure(上)だと翻訳のされ方が違う。。何故?気になるな。

もうちょっとやりたいところだが、、、さーアプリやろう!!
Let’s Go!


iOSもやりますが、まずはandroidから。
welcome back!

日銀pdf->txtに変換したファイルを中国語に翻訳

まず、xpdfでつくったテキストファイルを1行ずつ読み込みます。

$file = fopen("boj.txt", "r");

if($file){
	while ($line = fgets($file)){
		echo $line;
	}
}

fclose($file);

good job!

while文で$txt .= $line; として、変数に入れていき、
これをazureで中国語に翻訳します。

<?php

$file = fopen("boj.txt", "r");

if($file){
	while ($line = fgets($file)){
		$text .= $line;
	}
}

fclose($file);

$key = 'hogehoge';

$host = "https://api.cognitive.microsofttranslator.com";
$path = "/translate?api-version=3.0";
$params = "&to=zh";

if(!function_exists('com_create_guid')){
	function com_create_guid(){
		return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
		mt_rand(0, 0xffff), mt_rand(0, 0xffff),
		mt_rand(0, 0xffff),
		mt_rand(0, 0x0fff) | 0x4000,
		mt_rand(0, 0x3fff) | 0x8000,
		mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
	}
}

function Translate ($host, $path, $key, $params, $content) {
    $headers = "Content-type: application/json\r\n" .
        "Content-length: " . strlen($content) . "\r\n" .
        "Ocp-Apim-Subscription-Key: $key\r\n" .
        "X-ClientTraceId: " . com_create_guid() . "\r\n";
    $options = array (
        'http' => array (
            'header' => $headers,
            'method' => 'POST',
            'content' => $content
        )
    );
    $context  = stream_context_create($options);
    $result = file_get_contents ($host . $path . $params, false, $context);
    return $result;
}

$requestBody = array (
    array (
        'Text' => $text,
    ),
);
$content = json_encode($requestBody);
$result = Translate($host, $path, $key, $params, $content);

$json = json_decode($result);
$newtext =  $json[0]->translations[0]->text;
?>
<div id="text1">
    <?php echo $newtext; ?>
</div>

あれ、これなんかヤベーことになってないか?大丈夫か?

2018年4月27日日本货币政策银行近期1。 日本银行今日决定在政策委员会货币政策会议上作出以下决定。 [1] (1) 短和长率操作 (屈服曲线控制) (倾向于 8) 金融市场调整政策, 直到下个货币政策会议如下。 短期利率: 0.1% 的负利率适用于日本银行支票账户的政策利率平衡。 长期利率: 购买长期的日本国债, 以确保10年期的日本国债将保持在零的百分比。 采购金额应管理, 以实现利率经营政策, 以近似目前的购买速度 (约80兆日元每年)。 (2) 资产购买政策 (一致) 购买非长期政府债券的资产如下。 对于① etf 和 J-房地产投资基金, 该行购买其持有量以相当于每年约6日元和大约900亿日元的速度增长。 ② CP 等, 以及债券等, 分别为2.2 日元左右, 以维持约3.2 日元的平衡。 2。 日本央行将继续 “以短期业务进行定量和定性的货币宽松政策”, 以实现2% 的 “价格稳定目标”, 并稳定地维持它。 货币基础的扩张政策应继续下去, 直到 CPI (不包括新鲜食品) 的实际价值以稳定的方式增加到2%。 今后, 我们将对必要的政策作出调整, 以便根据经济、价格和财政状况保持 “价格稳定目标” 的势头 (注 2)。 1以上 (注 1): 黑田、Amemiya、尚志 Wakatabe、原田、Funo、樱井、马赛、铃木等会员。 相反: 片冈。 片冈考虑到2020财年的风险因素, 如消费税上调和美国经济衰退, 最好是进一步加强货币宽松政策, 并适当购买长期国债, 以进一步降低10年来的广泛的政府债券利率。 非常。 (2) 片冈委员会须指明 “价格稳定指标” 的时间, 并从加强超调型承诺的角度出发, 在因国内因素而延迟完成时, 采取额外的纾缓措施是适当的。 这是不必要的, 写在文本中。 2 (参考) 时间–4月26日 (星期四) 14:00-15:21 4月27日 (星期五) 9:00 ~ 11:56 出席委员会-主席黑田东彦 (总督) 正义 Amemiya (副省长) 尚志 Wakatabe 昌原田 Yukitoshi, 马赛孝子, 正诚铃木 (副总裁) 片冈, 4月27日, 财政部内阁办公室出席。 (Funo) 除上述外, 4月26日, 财政部和武务部 (让凯布), 押川内阁办公室主任 (14:00 ~ 15:21) (14:00 ~ 15:22), Kihara Shingai 财政部副部长 (9:00 ~ 11:32, 11:39 ~ 11:56) 内阁办公室副部长 (9:00 ~ 11:32, 11:39-11:56), 货币政策的日期和时间 -4月27日 (星期五) 12:03 经济活动和价格展望 (全文包括背景说明)–4月28日 (星期六) 14:00–主要意见–5月10日 (星期四) 8:50 预定分钟

azure phpで翻訳してonclickで喋らせる

text apiから返ってきたjsonをdocument.getElementById(“text1”).innerHTMLで取得して、speechSynthesisを使います。

<?php

$key = 'hoge';

$host = "https://api.cognitive.microsofttranslator.com";
$path = "/translate?api-version=3.0";
$params = "&to=en";
$text = "当社は中長期的かつ持続的な企業価値の向上を目指しており、そのためには、将来の成長を見据えた
サービスへの先行投資や設備投資、資本業務提携を積極的に行うことが重要だと認識しています。同時
に、利益還元を通じて株主の皆さまに報いることが上場会社としての責務と捉えています。
上記方針のもと、当期の期末配当金につきましては、1 株当たり8.86 円(配当金総額は504 億円)と
いたしました。
当社はこれからも、将来の成長のための投資を継続しながら、株主の皆さまへの適切な利益還元を行
うことにより、企業価値の向上を目指していきます。";

if(!function_exists('com_create_guid')){
	function com_create_guid(){
		return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
		mt_rand(0, 0xffff), mt_rand(0, 0xffff),
		mt_rand(0, 0xffff),
		mt_rand(0, 0x0fff) | 0x4000,
		mt_rand(0, 0x3fff) | 0x8000,
		mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
	}
}

function Translate ($host, $path, $key, $params, $content) {
    $headers = "Content-type: application/json\r\n" .
        "Content-length: " . strlen($content) . "\r\n" .
        "Ocp-Apim-Subscription-Key: $key\r\n" .
        "X-ClientTraceId: " . com_create_guid() . "\r\n";
    $options = array (
        'http' => array (
            'header' => $headers,
            'method' => 'POST',
            'content' => $content
        )
    );
    $context  = stream_context_create($options);
    $result = file_get_contents ($host . $path . $params, false, $context);
    return $result;
}

$requestBody = array (
    array (
        'Text' => $text,
    ),
);
$content = json_encode($requestBody);
$result = Translate($host, $path, $key, $params, $content);

$json = json_decode($result);
$newtext =  $json[0]->translations[0]->text;
?>
<div id="text1">
    <?php echo $newtext; ?>
</div>
<br>
<button id="btn">speach</button>
<script>
    document.querySelector('#btn').onclick = function(){
        var msg = new SpeechSynthesisUtterance();
        msg.volume = 1;
        msg.rate = 1;
        msg.pitch = 2;
        msg.lang = "en-US";
        msg.text = document.getElementById("text1").innerHTML;

        speechSynthesis.speak(msg);
    }
</script>

こいつはすげー

$params = “&to=zh”; にすると、
————-
我们的目标是在中长期内提高公司的价值, 并 我们认识到, 积极参与服务、资本投资和商业联盟的前期投资是重要的。 相同 , 作为上市公司, 我们有责任通过利润回报回报股东。 在上述政策下, 本期年终股息为每股8.86 日元 (总股息为504亿日元) 我们。 我们将继续投资于未来的增长, 并将适当的利润返还给我们的股东。 我们的目标是提高企业价值。
————-
ざっとみたところ、良さそう。
これを日銀のStatements on Monetary Policyでやりたいと思います。

決算ir情報をphpで翻訳する

yahoo 譲渡制限付株式報酬としての新株式の発行に関するお知らせ(259文字)
当社は中長期的かつ持続的な企業価値の向上を目指しており、そのためには、将来の成長を見据えた
サービスへの先行投資や設備投資、資本業務提携を積極的に行うことが重要だと認識しています。同時
に、利益還元を通じて株主の皆さまに報いることが上場会社としての責務と捉えています。
上記方針のもと、当期の期末配当金につきましては、1 株当たり8.86 円(配当金総額は504 億円)と
いたしました。
当社はこれからも、将来の成長のための投資を継続しながら、株主の皆さまへの適切な利益還元を行
うことにより、企業価値の向上を目指していきます。

$key = 'hoge';

$host = "https://api.cognitive.microsofttranslator.com";
$path = "/translate?api-version=3.0";
$params = "&to=en";
$text = "当社は中長期的かつ持続的な企業価値の向上を目指しており、そのためには、将来の成長を見据えた
サービスへの先行投資や設備投資、資本業務提携を積極的に行うことが重要だと認識しています。同時
に、利益還元を通じて株主の皆さまに報いることが上場会社としての責務と捉えています。
上記方針のもと、当期の期末配当金につきましては、1 株当たり8.86 円(配当金総額は504 億円)と
いたしました。
当社はこれからも、将来の成長のための投資を継続しながら、株主の皆さまへの適切な利益還元を行
うことにより、企業価値の向上を目指していきます。";

if(!function_exists('com_create_guid')){
	function com_create_guid(){
		return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
		mt_rand(0, 0xffff), mt_rand(0, 0xffff),
		mt_rand(0, 0xffff),
		mt_rand(0, 0x0fff) | 0x4000,
		mt_rand(0, 0x3fff) | 0x8000,
		mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
	}
}

function Translate ($host, $path, $key, $params, $content) {
    $headers = "Content-type: application/json\r\n" .
        "Content-length: " . strlen($content) . "\r\n" .
        "Ocp-Apim-Subscription-Key: $key\r\n" .
        "X-ClientTraceId: " . com_create_guid() . "\r\n";
    $options = array (
        'http' => array (
            'header' => $headers,
            'method' => 'POST',
            'content' => $content
        )
    );
    $context  = stream_context_create($options);
    $result = file_get_contents ($host . $path . $params, false, $context);
    return $result;
}

$requestBody = array (
    array (
        'Text' => $text,
    ),
);
$content = json_encode($requestBody);
$result = Translate($host, $path, $key, $params, $content);

$json = json_decode($result);
echo $json[0]->translations[0]->text;

echoの結果->565文字
—–
We aim to improve our corporate value in the medium to long term and We recognize that it is important to actively engage in upfront investment in services, capital investment, and business alliances. Same , it is our duty as a listed company to repay our shareholders through the return of profits. Under the above policy, the year-end dividend for the current period is 8.86 yen per share (total dividend of 50.4 billion yen) We. We will continue to invest in future growth and to return appropriate profits to our shareholders. We aim to improve corporate value.

悪くない!というか、金融系に強い帰国子女に頼むよりも質が高く、早くて安い(笑)
これは自動化したい。

月200万文字まで無料なので、1000文字の翻訳だとすると、上限2000回か。
全銘柄のEdinet IR自動翻訳だとちょっとキツイな。
うーん、どうする?

Azure Translator Text APIを使ってphpで翻訳する

file_get_contentsしたjsonをdecodeします。

$key = 'hogehoge';

$host = "https://api.cognitive.microsofttranslator.com";
$path = "/translate?api-version=3.0";
$params = "&to=en";
$text = "1文をバラバラにして単語レベルで翻訳をするのではなく、1文をひとまとめにして翻訳";

if(!function_exists('com_create_guid')){
	function com_create_guid(){
		return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
		mt_rand(0, 0xffff), mt_rand(0, 0xffff),
		mt_rand(0, 0xffff),
		mt_rand(0, 0x0fff) | 0x4000,
		mt_rand(0, 0x3fff) | 0x8000,
		mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
	}
}

function Translate ($host, $path, $key, $params, $content) {
    $headers = "Content-type: application/json\r\n" .
        "Content-length: " . strlen($content) . "\r\n" .
        "Ocp-Apim-Subscription-Key: $key\r\n" .
        "X-ClientTraceId: " . com_create_guid() . "\r\n";
    $options = array (
        'http' => array (
            'header' => $headers,
            'method' => 'POST',
            'content' => $content
        )
    );
    $context  = stream_context_create($options);
    $result = file_get_contents ($host . $path . $params, false, $context);
    return $result;
}

$requestBody = array (
    array (
        'Text' => $text,
    ),
);
$content = json_encode($requestBody);
$result = Translate($host, $path, $key, $params, $content);


$json = json_decode($result);
echo $json[0]->translations[0]->text;

これは。。。

eminem lose yourself
——-
Look, if you had one shot, one opportunity
To seize everything you ever wanted
One moment
Would you capture it or just let it slip?
Yo
His palms are sweaty, knees weak, arms are heavy
There’s vomit on his sweater already, mom’s spaghetti
He’s nervous, but on the surface he looks calm and ready
To drop bombs, but he keeps on forgettin’
What he wrote down, the whole crowd goes so loud
He opens his mouth, but the words won’t come out
He’s chokin’, how, everybody’s jokin’ now
The clocks run out, times up, over, blaow!
Snap back to reality, oh there goes gravity
Oh, there goes Rabbit, he choked
He’s so mad, but he won’t give up that easy? No
He won’t have it, he knows his whole back city’s ropes
It don’t matter,
He’s dope,…

ラップの翻訳って難しいと思うが、
結果

ほお

cyberduckでazure app serviceにftp接続する

(1)app serviceのデプロイ資格情報でname、passを入力する

(2)概要->発行プロファイルの取得 でpublish settingファイルを取得する

<publishProfile profileName="nanalytics - FTP" publishMethod="FTP" publishUrl="ftp://hoge.ftp.azurewebsites.windows.net/site/wwwroot" ftpPassiveMode="True" userName="hoge" userPWD="hogehoge" destinationAppUrl="http://nanalytics.azurewebsites.net" SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink="" controlPanelLink="http://windows.azure.com" webSystem="WebSites"><databases /></publishProfile>

(3)ファイル転送ツール等で、サーバーは発行プロファイルのpublishUrl、ユーザー名はuserName、パスワードはuserPWDを入れる。ポートは21でOK

(4)webrootに接続完了! timezoneが-9H(GMT)になってますね。

azureでMongoDB\Driver\Managerの接続が上手くいかない

azureで、php・jsファイルは問題なく動くんだが、MongoDB\Driver\Managerが上手くいなかない。

恐らくapp serviceにphp mongodbのドライバーが入ってないからだと思うのだが(そう思いたい..)

app serviceにライブラリを入れる場合はどうするんでしょうか?
アクティビティログでは、Write DatabaseAccounts 失敗と表示されています。。。

stack overflowで他の方もいってますが、mongodbの接続tutorialはNode.js, .NET、Java、Go、Pythonしかないってところです。

あああ、なるほど、C# & visual studioだったら、簡単にドライバーを入れらるのですね。
ここでC#か~~~~
まぁ、C#でやってみるか~。。。。。。どう頑張ってもNGそうだったら、VPSで構築します。

mondoDBを使いたいのでcosmosDBを作成する

azure cloud shell

az cosmosdb create --name nacosmosdb --resource-group myResourceGroup --kind MongoDB

さーどうしましょう

{
  "additionalProperties": {},
  "capabilities": [],
  "consistencyPolicy": {
    "additionalProperties": {},
    "defaultConsistencyLevel": "Session",
    "maxIntervalInSeconds": 5,
    "maxStalenessPrefix": 100
  },
  "databaseAccountOfferType": "Standard",
  "documentEndpoint": "https://nacosmosdb.documents.azure.com:443/",
  "enableAutomaticFailover": false,
  "failoverPolicies": [
    {
      "additionalProperties": {},
      "failoverPriority": 0,
      "id": "nacosmosdb-westeurope",
      "locationName": "West Europe"
    }
  ],
  "id": "/subscriptions/hoge/resourceGroups/myResourceGroup/providers/Microsoft.DocumentDB/databaseAccounts/nacosmosdb",
  "ipRangeFilter": "",
  "kind": "MongoDB",
  "location": "West Europe",
  "name": "nacosmosdb",
  "provisioningState": "Succeeded",
  "readLocations": [
    {
      "additionalProperties": {},
      "documentEndpoint": "https://nacosmosdb-westeurope.documents.azure.com:443/",
      "failoverPriority": 0,
      "id": "nacosmosdb-westeurope",
      "locationName": "West Europe",
      "provisioningState": "Succeeded"
    }
  ],
  "resourceGroup": "myResourceGroup",
  "tags": {},
  "type": "Microsoft.DocumentDB/databaseAccounts",
  "writeLocations": [
    {
      "additionalProperties": {},
      "documentEndpoint": "https://nacosmosdb-westeurope.documents.azure.com:443/",
      "failoverPriority": 0,
      "id": "nacosmosdb-westeurope",
      "locationName": "West Europe",
      "provisioningState": "Succeeded"
    }
  ]
}

primary master keyを発行する

az cosmosdb list-keys --name nacosmosdb --resource-group myResourceGroup --query "primaryMasterKey"

接続

'use strict';

module.exports = {
  db: {
    uri: 'mongodb://:@.documents.azure.com:10255/mean-dev?ssl=true&sslverifycertificate=false'
  }
};

ん?

AppServiceからAzure DatabaseにPDOでssl接続する

vagrant環境をmasterにpushするだけです。

$ git commit -am “azure mysql ssl pdo”
$ git push azure master

PDOもOK

次は、ドメインのマウント。
これが出来れば、一通りアプリケーションの公開まではOKになる(はず?)

あ、無料版のサブスクリプションでは購入できませんが、
ドメイン購入のマニュアル読むと、そんなに難しそうではなさそうですね。
https://docs.microsoft.com/ja-jp/azure/app-service/custom-dns-web-site-buydomains-web-app

ということで、一通りOKですね。
では、いよいよazureでmongoDBです。Let’s Go!