OmniAICreator/Qiita-1.07M huggingface dataset:
【Android】Google I/O 2017のSpeeding up your Android Gradle buildsで発表された10のTips

Google I/O 2017のSpeeding up your Android Gradle builds（ビルド高速化）で発表された10のTipsです。

## Tips

### Tips 1: 最新のGradle Pluginを使う
https://maven.google.com から最新のgradle pluginを使う。

### Tips 2: レガシーなMultiDexは避ける
レガシーなMultiDexとは、MultiDexかつminSdkVersionが21未満のこと。
開発buildのときだけ21にすれば良いらしい。

### Tips 3: multi-APKを無効化する
`sprits()`ブロックは開発中は不要なので開発buildのときは無効化する。

Preferencesの左カラムで`Build, Excution, Deployment`->`Compiler`を選択後、`Command-line Options`に`-PdevBuild`を入力。

build.gradleに以下を追記。（セッションで紹介されていた例）

```
android {
    if (project.hasProperty('devBuild')) {
        splits.abi.enable = false
        splits.density.enable = false
    }
}
```

![a.png](https://qiita-image-store.s3.amazonaws.com/0/123122/891e7321-d122-85be-559b-d64e9503f85e.png)

### Tips 4: 最小のリソースを含める（言語とDPIを指定する）
開発buildは言語とDPIを指定する。
例: `resConfig("en", "xxhdpi")`

### Tips 5: PNGのcrunchingは無効化する
Android Studioが最適化してくれるので不要。
`aaptOptions.cruncherEnables = false`を指定する。
もしくはWebPを使えないか検討する。

### Tips 6: Instant Runを使う
:arrow_forward: (`^-R`) : :no_good: 
:zap: (`⌘-F10`) :ok_woman: 

### Tips 7: Manifestの不用な変更は避ける
ManifestのversionCodeが動的に変わるような設定（例えば日時がversionに付与されるような設定）だとFull Buildが走るので避ける。
開発buildは固定値になるようにする。

### Tips 8: dependenciesの動的バージョンは避ける
compile 'com.android.support:appcompat-v7:+'の`+`のこと。
最新バージョンがないかを探しにいってしまうので固定バージョンにする。

### Tips 9: メモリに注意する
gradle.propertiesの`org.gradle.jvmargs=-Xmx1536m`を試してみる。
build.gradleの`dexOption`で`javaMaxHeapSize = "4g"`とかになってる場合は注意。

### Tips 10: Gradleのキャッシュを有効化する
Gradle 3.5からgradle.propertiesに`org.gradle.caching`が追加されたので有効化する。

### おまけTips: Crashlyticsを無効化する

以下の設定すれば開発buildのときはCrashlyticsを無効に出来ます。

```
android {
    buildTypes {
        debug {
          // Disable fabric build ID generation for debug builds
          ext.enableCrashlytics = false
          ...
```

（参考）
[Build Tools — Fabric for Android documentation]
(https://docs.fabric.io/android/crashlytics/build-tools.html?gradle#build-tools)

## 結果
以上のTipsを全部やったらこのくらい各種build早くなったそうです。（Santa Trackerの場合）

|Full Build|Incremental Build (Java Change)|Incremental Build (Resource Change)|
|--:|--:|--:|
|3倍|12倍|3倍|

各種Tipsの効果

|Tips|Full Build|Incremental Build (Java Change)|Incremental Build (Resource Change)|
|:--|--:|--:|--:|
|**1: 最新のGradle Pluginを使う**|-25%|-38%|-16%|
|**2: レガシーなMultiDexは避ける**|-12%|-53%|0%|
|**3: multi-APKを無効化する**|-12%|-6%|-26%|
|**4: 最小のリソースを含める（言語とDPIを指定する）**|-17%|-24%|-21%|
|**5: PNGのcrunchingは無効化する**|-33%|0%|0%|
|**6: Instant Runを使う**|+37%|-54%|-42%|
|**7: Manifestの不用な変更は避ける**|-|+130%|+90%|
|**8: dependenciesの動的バージョンは避ける**|-|-|-|
|**9: メモリに注意する**|-|-|-|
|**10: Gradleのキャッシュを有効化する**|-25%|0%|+12%|


ソース: https://github.com/google/santa-tracker-android
OS の起動時間を早く

#起動時間を速く

FreeBSD の起動ステージの最終段階で実行されるローダ(loader)は、標準で 10 秒の間、キー入力を待つようになっている。
この時間を変更する方法は色々あるようだが例えば、次のような記述をしておけば良い。
# /boot/loader.conf.local を編集する
```text:/boot/loader.conf.local
autoboot_delay="3"
```
Cognosでお手軽にメール通知環境を構築する

##概要
Cognos BIを使用していて、レポートの出力をメールで送るテストをしてみたい時に、お手軽にメール通知できる環境を作れると楽ですよね。
今回は、BlackJumboDogというフリーのメールサーバーツールを用いて、お手軽にCognosから自分のメールアドレスに、レポートが添付されたメールを送付する環境を構築する手順です。

##手順
Cognos BI 10.2.2@Windowsの環境でやっています。

まずはこちらのサイトから、BlackJumboDogのイメージをダウンロードします。
http://blackjumbodog.codeplex.com/releases/view/121525

![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ad9123fd-885c-99a4-2c28-1d2b50d8864b.png)

Cognosサーバー上で、ダウンロードしたイメージファイルを右クリックして「インストール」します。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a600b362-5e9a-911a-cd5e-fc498b2b9f32.png)

次へ
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/201f8ece-9dd7-5e0e-521f-1aea96af7f73.png)

次へ
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b95c00bd-a39f-89cd-a0df-96bc68bade39.png)

インストール
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b277bb23-8511-1827-f9fb-e2d0f5d3f55f.png)

完了
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/35e19c6a-4aa4-3ddd-5be2-8011490e9ba0.png)

スタートメニューから「Launch BJD.exe」を選択します。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2168e207-f82b-ab51-b6b1-fd81d66b5ab4.png)

こんな画面が起動します。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1dff5753-466e-c108-9556-1b82263c0cc7.png)

「オプション」→「メールサーバ」→「SMTPサーバ」を選択します。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/430ea4f3-05ae-6a8b-c78e-6c6a58637508.png)

中継許可タブにて、以下の様にローカルのアドレスを追加します。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/202e2c41-9d8b-798c-87f0-9e0097340a36.png)

ACLタブでも同様に、ローカルのアドレスを追加し、ＯＫします。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5dfd9f0d-59eb-bb2e-eb86-c3a6b40a1ac4.png)

Cognos Configurationの「通知」にて、下のようにSMTPメール・サーバーを指定し、テストを行います。
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/adc48046-eec8-c5f1-0d76-8f7f7bdf2da7.png)

テストが問題なければ設定を保存し、Cognos ConfigurationからCognosサービスを起動します。
![013.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/30a05f81-f1c4-4cb1-96d3-8ed58a021954.png)

Cognos Connectionから、自分のメールアドレスを指定して、レポートを送信する処理を実行します。
![017.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/fe88f257-ae6c-735a-7051-045b44996703.png)

無事に自分のアドレスに、Cognosからレポート付きメールが届きました。
![018.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/cadb9def-bb1f-661a-d7a8-34aead7ab092.png)

ちなみに、SMTPサーバーへのテストは成功しているのにメールが送信されてこない場合は、Content Store DBのNC_XXXテーブルの再作成を実施すると直る事が多いですので、困った時はやってみてください。
※もちろん、Content Storeのバックアップ取得してから。

以下のSQLでNC_XXXテーブルを全部ドロップし、Cognos ConfigurationからCognosサービスを再起動すると、NC_XXXテーブルが再作成されます。
C:\Program Files\ibm\cognos\c10_64\configuration\schemas\delivery\db2\NC_DROP_DB2.sql
CodedeployのLifeCycleに関するメモ

# CodedeployのLifeCycleに関する雑な理解

大きくアプリケーション周りのライフサイクル(7つ)とロードバランサーに関係するライフサイクル(6つ)がある。初回デプロイ時にはDownloadBundleされる前のApplicationStopはrunscriptがないので実行されない。

## Application周りのライフサイクル(Application止めて、正常稼働確認まで)

- ApplicationStop
- DownloadBundle
- BeforeInstall
- Install
- AfterInstall
- ApplicationStart
- ValidateService

## LB周りのライフサイクル

- BeforeBlockTraffic
- BlockTraffic
- AfterBlockTraffic
- BeforeAllowTraffic
- AllowTraffic
- AfterAllowTraffic

## runscriptの実行可否一覧

IP:InPlaceDeployment
BG:Blue/GreenDeployment
BGR:Blue/GreenDeployment Rollback
CLB:ClassicELB

◯:runscriptは実行される
△:runscriptは場合によって実行される(2回目以降のデプロイから)
×:runscriptは実行されない
太字:runscriptは実行されない。codedeploy占有。

|LifeCycleEvent|IP(LB無し)|IP+CLB|IP+ALB|BG(Blue)|BG(Green)|BGR(Blue)|BGR(Green)|
|---|---|---|---|---|---|---|---|
|1.ApplicationStop|△|△|△|×|△|×|×|
|**2.DownloadBundle**|×|×|×|×|×|×|×|
|3.BeforeInstall|○|○|○|×|○|×|×|
|**4.Install**|×|×|×|×|×|×|×|
|5.AfterInstall|○|○|○|×|○|×|×|
|6.ApplicationStart|○|○|○|×|○|×|×|
|7.ValidateService|○|○|○|×|○|×|×|
|8.BeforeBlockTraffic|×|○|×|○|×|×|○|
|**9.BlockTraffic**|×|×|×|×|×|×|×|
|10.AfterBlockTraffic|×|○|×|○|×|×|○|
|11.BeforeAllowTraffic|×|○|×|×|○|○|×|
|**12.AllowTraffic**|×|×|×|×|×|×|×|
|13.AfterAllowTraffic|×|○|×|×|○|○|×|

# runscript内で使える環境変数

個人的にDEPLOYMENT_GROUP_NAMEくらいしか使わない。

- APPLICATION_NAME
- DEPLOYMENT_ID
- DEPLOYMENT_GROUP_NAME
- DEPLOYMENT_GROUP_ID
- LIFECYCLE_EVENT

# 個人的Tips

- runscriptの名前にイベントの順序ごとに番号つける。`1_application_stop.sh`等にしておくと順序悩まない。
- とりあえずEC2のUSERDATAやAutoScalingのLaunchConfigurationに以下のコード入れて置くと楽。

```bash
#!/bin/bash
REGION=$(curl 169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/[a-z]$//')
yum install -y aws-cli
cd /home/ec2-user/
aws s3 cp s3://aws-codedeploy-${REGION}/latest/install . --region ${REGION}
chmod +x ./install
./install auto
```

# 参考

[Lifecycle Event Hook Availability](http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html#reference-appspec-file-structure-hooks-availability)
【HTML5学習】 Part.6 -table-

今回は表を作成する**table(テーブル)**について。
テーブルを作るときによく混乱してしまうので、整理の為に。

例えば、


| イベント|開催日|場所|料金|
|:-----------:|:------------:|:------------:|:------------:|
| 〇〇フェス |        2017/5/19 |     東京     |3,000円
| 〇〇イベント  |      2017/6/20 |    大阪    |3,000円
| 〇〇祭   |        2017/7/21 |     福岡     |3,000円


##tableの基本構造

>###**table要素**
>**&lt;table&gt; &lt;/table&gt;** : 表を作成するときに使う。 この要素内にtrやtdを配置し、行とセルを示す。

><img width="371" alt="スクリーンショット 2017-05-19 11.28.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/78291eea-8e08-d706-e98e-97a1b35b598d.png">


>###**th要素**

>**&lt;th&gt; &lt;/th&gt;** : table header　表の**見出し**を作る

><img width="366" alt="th.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/b0af0490-661a-ded4-374b-566d2d53fc98.png">


>###**tr要素**

>**&lt;tr&gt; &lt;/tr&gt;** : table row 表の**行**を作る

><img width="372" alt="tr.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/9fd8b526-5e4b-6e33-7a04-3cec7c6f6b5f.png">

>###**td要素**

>**&lt;td&gt; &lt;/td&gt;** : table data 表の**データ**を作る

><img width="372" alt="td.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/be2a6ad8-841f-10b2-115b-3d74afd2e57b.png">

>###**caption要素**

>この要素を使うと、テーブルに表題(タイトル)をつけることができる

><img width="369" alt="caption.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/eb25eabb-ed9e-6f0a-8ad3-b6ef54fa2dac.png">

>例の表のコードはこんな感じでしょうか。　とてもシンプルです。

>```html
><table>
		<caption>開催イベント</caption>
		<tr>
			<th>イベント</th>
			<th>開催日</th>
			<th>場所</th>
			<th>料金</th>
		</tr>
		<tr>
			<td>〇〇フェス</td>
			<td>2017/5/19</td>
			<td>東京</td>
			<td>3,000円</td>
		</tr>
		<tr>
			<td>〇〇イベント</td>
			<td>2017/6/20</td>
			<td>大阪</td>
			<td>3,000円</td>
		</tr>
		<tr>
			<td>〇〇祭</td>
			<td>2017/7/21</td>
			<td>福岡</td>
			<td>3,000円</td>
		</tr>
	</table>
```


##行をグループ化する

行を意味的なまとまりとしてグループ化すると、テーブルの構成を管理しやすくなり、CSSもつけやすくなる。

>###**thead**

>**&lt;thead&gt; &lt;/thead&gt;** : テーブルの見出しにあたる行をグループ化する。table要素の子要素として１つしか入れられない。

>###**tbody**

>**&lt;tbody&gt; &lt;/tbody&gt;** : テーブルのボディ(データ)にあたる行をグループ化する。tbodyはいくつでも入れられる。

>###**tfoot**

>**&lt;tfoot&gt; &lt;/tfoot&gt;** : テーブルのフッターにあたる行をグループ化する。table要素の子要素として１つしか入れられない。


><img width="542" alt="table_group.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/ff80db78-0255-eda2-ab13-b23bea5dcdd2.png">




>```html
>	<table>
		<caption>ご注文内容</caption>
		<thead>
			<tr>
				<th>商品</th>
				<th>単価</th>
				<th>数量</th>
				<th>小計</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>ショートケーキ</td>
				<td>360円</td>
				<td>1</td>
				<td>360円</td>
			</tr>
			<tr>
				<td>チーズケーキ</td>
				<td>400円</td>
				<td>2</td>
				<td>800円</td>
			</tr>
			<tr>
				<td>ガトーショコラ</td>
				<td>420円</td>
				<td>2</td>
				<td>840円</td>
			</tr>
			<tr>
				<td>シュークリーム</td>
				<td>320円</td>
				<td>4</td>
				<td>1,280円</td>
			</tr>
		</tbody>
		<tfoot>
			<tr>
				<th>合計</th>
				<td></td>
				<td>9</td>
				<td>3,280円</td>
			</tr>
		</tfoot>
 </table>
```

今回はここまで。
まとめてみると、頭の中も整理できた気がします。
難しいテーブルも組めるように練習するぞ〜:wink:
Bootstrap3とは

#たくさんのCSSがあらかじめ設定された、WEBデザインフレーム

自分でCSSを書いていくのもありですが、１から全てを組むのは大変で、時間もかかります。

ですので、あらかじめ様々なclass名でデザインが書き込まれてあるBootstrap等のWEBデザインフレームを使用することで開発のスピードを飛躍的に早め、手間も減らしていきましょう。

例えば、以下。

```Sample.html
<body>
  <header class="navbar navbar-fixed-top navbar-inverse">

  ~中略~

</body>
```
ここで出てくるclass名。
「navbar navbar-fixed-top navbar-inverse」
以上がそれに当たりますが、これらはインデント(スペース)を使用して三つ、指定されています。
これらは、それぞれ以下のような意味をBootstrap上で設定されています。

```
navbar  =>  ナビゲーションバーに付ける基本スタイル
navbar-fixed-top  =>  上部固定
navbar-inverse  =>  色指定
```
こういった形で、用途に応じた形でclassが指定されているため、それぞれのclassにどういった内容が指定されているか知っておくことで、望んだ通りのデザインが手軽に作成できるようになるのです。

#CSSの勉強には、まずBootstrap3でできることを知りましょう。
多くのインターネットサイトにおいて、Bootstrap3は活用されているそうです。

で、あるならば。

Bootstrap3でできることがわかっていれば、あなたが「こんなサイトを作ってみたい！」と見て思ったサイトに似たサイトの構築もスムーズに行えるかもしれません。

それだけでなく、ただ真似るだけでなく、そこに自分が追加で別ファイルに書き込んだCSSを適用するなどして、より自分の理想に近いサイトの製作が可能です。

いきなりBootstrapを調べても意味がわからないかもしれませんんが、CSSの扱いに慣れてきたら、勉強してみることをお勧めします。
PythonのWebスクレイピングでproxy経由でのhttpsアクセスがrequestsを使ったら簡単だった

Python3でurllibとBeautifulsoupでWebスクレイピングに挑戦しています。
前回はProxyがあるため、通信エラーが起こることに対処しました。
　　[PythonのWebスクレイピングでProxy設定のため応答がなかったときの対処](http://qiita.com/koharite/items/5bf10ef6b8cace8cac7e)
httpによる通信は上記の方法でうまくいったが、httpsのサイトになったときに通信が確立されずにエラーとなってしまいました。
最近のWebサイトはhttpsが多いので困りました。。:disappointed_relieved:
前回の方法で下記のようにproxiesに"https"の項目を追記しても解決しません。
proxies={"http":"http:proxy.-----.co.jp/proxy.pac",
"https":"http:proxy.-----.co.jp/proxy.pac"}

調べていると、[requests](http://docs.python-requests.org/en/master/#)というライブラリがありました。urllibの代わりに使えるか試してみたら、驚くほど簡単に解決しました。

使い方例は以下です。

```python:requsts_sample.py
import requests

proxies = {
"http":"http://proxy.-----.co.jp/proxy.pac",
"https":"http://proxy.-----.co.jp/proxy.pac"
}
r = requests.get('https://github.com/timeline.json', proxies=proxies)
print(r.text)
```

Beautifulsourpを使う場合は、requests.getで取得したオブジェクトのcontentを渡せばよいようです。
簡単なサンプルを示します。

```python::requests_beautifulsoup_sample.py
import requests
from bs4 import BeautifulSoup

proxies = {
'http':'http://proxy.-----.co.jp/proxy.pac',
'https':'http://proxy.-----.co.jp/proxy.pac'
}

def getBS(url):
    html = requests.get(url, proxies=proxies)
    bsObj = BeautifulSoup(html.content, "html.parser")
    return bsObj

htmlSource = getBS("https://en.wikipedia.org/wiki/Kevin_Bacon")

# ページに存在するリンク先を表示する
for link in htmlSource.findAll("a"):
    if 'href' in link.attrs:
        print(link.attrs['href'])

```
requestsライブラリはAnacondaでPython 3.5.2をインストールしたときに、入っていました。
Anaconda Navigatorでインストールしたパッケージが確認できます。WindowsでGUIインストールした場合は、Windows->すべてのプログラム->Anaconda3->Anaconda Navigatorにあります。

[requestsライブラリのQuickstartはこちら](http://docs.python-requests.org/en/master/user/quickstart/)
【Android】Google I/O 2017のBest Practices to slim down your app sizeメモ

Google I/O 2017の「Best Practices to slim down your app size」メモです。

## メモ
- サイズがでかいと20%もダウンロードキャンセルさせる
- 100MB以上のアプリは８倍もアンインストールされやすい
- apkサイズ削減方法
    - ProguardのminifyEnableを有効にする(classes.dexをoriginalの33%に削減)
    - shrinkResourcesを有効にする（resをoriginalの25%に削減）
    - Multiple APKを有効にする（resをoriginalの44%に削減）
    - Vector Drawableを使う

## 所感
アプリはres（特に画像）が大半を占めるのでそこをいかに圧縮・削減するかが大事。
今回紹介された例だとshrinkResourcesが一番効果的。
SqlServer 文字列の一部を切り出す



## 概要

SqlServerで文字列の一部を切り出したい場合は、SUBSTRING関数を使用する。

<h3><i class="fa fa-pencil-square-o"></i> 使用例</h3>

```SQL
SELECT s = SUBSTRING('あいうえお', 2, 3);
```

<h3><i class="fa fa-play-circle"></i> 結果</h3>

`いうえ`
[Android] Android Studioで簡単なSHA-1発給。

こんにちは。皆様、Firebaseや他のサービスを利用するためにSHA-1をよく更新して使っているんですね？

Android Studioで簡単SHA KEYを見る方法を皆さんと共有したいと思ったので今から書きたいと思います。

本当に以前にCMDやterminalで複雑にSHA-1をもらうことは違い、
めっちゃくちゃしやすいので、この方法なので是非

# 2021年
- この方法は、今でも使用可能です。

#序論

例えば、Firebaseとアプリを連動しようとしたら、下の課程が必要です。

![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/580ed6ea-942f-530b-b22e-8847aaa7160e.jpeg)

以前はCMDでkeystoreに移動して、したの命令でSHAを更新しました。
よくすると、正直に面倒くさいです。:sweat_smile:

```
keytool -list -v -keystore debug.keystore
```

今回はAndroid Studioのbuild Tool　Gradleを利用して簡単にSHA－１貰えるます。

#本論

## Create Project

新しいプロジェクトをCreate、利用しているプロジェクトもOK!です。
新しいプロジェクトを更新する方法はここを参考してください。

[[Android]CoordinatorLayout利用してみた。](http://qiita.com/Dreamwalker/items/ce89d54064558f4d4b3f#%E6%96%B0%E3%81%97%E3%81%84project)

## Hello Gradle

1．android studioの**右にはGradle**のTapがあります。Gradleをクリックします。

![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/7688f445-d3aa-fbc2-eda6-97b1033908d7.jpeg)


2．クリックした後、何も見えない場合 Refreshボタンをクリックします。
![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/46474d1a-59be-c878-74d6-7f972fb9877f.jpeg)

3.更新するとしたのように、何かが見えます。

```
app -> Tasks -> android -> signingReport
```
signingReportをダブルクリックします。するとGradleがRUNになります。

![4.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/12814494-a341-d7e4-2b04-fd3f2879cc63.jpeg)

4.　SHA-1を確認。

これで終わりです。**右の下**にある**Gradle Console**をクリックします。

![5.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/978c4356-603c-8edb-0d8c-3b47106c57e2.jpeg)

#結論

要約。
1.　android studioの右にはGradleをクリック。
2.　何も見えない場合 Refreshボタンをクリック
3.　signingReportをダブルクリック
4.　Gradle ConsoleでSHA-1を確認。

#終わりに

簡単にSHA-1をもらいました。いかがでしたか？
これより**もっとしやすい方法**があれば、コメントお願いします。


読みいただきありがとうございました。
次のPostで会いましょう！

**Dreamwalker**
字形分析して和文オプティカルカーニングを行うJavaScriptライブラリの開発

# はじめに

## 経緯

Webページにおいて、[Google Fonts + 日本語早期アクセス](https://googlefonts.github.io/japanese/)の提供する等幅和文フォントでプロポーショナルな和文のレイアウトを行いたいと思い、文字形状を分析して文字をプロポーショナル幅にしつつ、文字同士の間隔をオプティカルカーニングにより自動調整するJavaScriptライブラリを開発しました。いわゆるタイトルだけでなく、本文のテキストにも適用する想定です。

## 開発したライブラリ

![Screenshot](https://raw.githubusercontent.com/data9824/optical-kerning/master/demo/screenshot.png)

[optical-kerning.js](https://github.com/data9824/optical-kerning)として公開しています。

## 注意

OpenTypeフォントには、以下のようなCSSプロパティで、プロポーショナル幅やカーニングを有効にできるものもあります。これらを利用できるときは、そのほうがフォント制作者の意図する表示になるでしょう。

```css
{
    font-feature-settings : "pwid" 1, "kern" 1;
}
```

# アイデア

文字一つ一つをspan要素に分解します。隣り合う文字について、それぞれcanvas上に、HTMLで指定されたフォントで左右に描画し、Y軸方向のピクセル数全てについて、X軸方向に文字間の空白の長さを測ります。それらのうち最短のものを文字間の元々の距離とし、その距離が0（カーニング強度の係数が1.0の場合）になるようにletter-spacing CSSプロパティを設定します。

# 問題

## 文字の食い込み

例えば、「ト」と「フ」が隣接しているとき、字形そのままで距離を測って間隔を狭めると、「ト」の右側が、「フ」の左側に入り込んでしまい、視覚的にかなり違和感があります。一方「ダ」と「イ」の隣接において、「ダ」の右下に「イ」が入り込んでいるのは、さほど違和感は感じないと思います。

この問題を解決するため、文字間の距離を調べる際には、文字を凸包で囲い、その凸包同士の距離を求めるようにしています。これにより、文字の中央部分に隣の文字が入り込む問題は無くなりました。

## リガチャの判定

特に欧文では、"fi"のような特定の文字の列に対して、美しい字形を保つため専用の字形を用意しており、リガチャと呼ばれます。リガチャを構成している文字をspan要素で分断してしまうと、リガチャを使わないレンダリングが行われて、表示品質を損ねてしまいます。

そこでリガチャ部分は分断しないような処理が必要になります。たとえば、文字を個別にcanvasにレンダリングした場合と、文字列をまとめてレンダリングした場合の結果を比較する、などの方法があり得ますが、残念ながら誤検出が多く発生しました。

そこで、リガチャ判定はあきらめ、また、そもそも欧文フォントにおいてはフォントにカーニング用の設定がされておりメトリクスカーニングされている可能性も高いので、オプション設定によりアルファベット等の文字を本ライブラリの適用対象から除外できるようにしました。

# パフォーマンス改善

各ブラウザでパフォーマンスを確認し、結果的に以下の処理時間になっています。（約15000文字の[サンプルテキスト](https://data9824.github.io/optical-kerning/demo/demo2.html)に対する処理時間）

* Chrome (Windows, Core i7 6700 3.4GHz)
 * 450ms
* Firefox (Windows, Core i7 6700 3.4GHz)
 * 1000ms
* Edge (Windows, Core i7 6700 3.4GHz)
 * 2200ms
* Internet Explorer (Windows, Core i7 6700 3.4GHz)
 * 2600ms
* Safari (macOS, Core M 1.2GHz)
 * 650ms
* Safari (iPhone 6s)
 * 1000ms

パフォーマンス改善を行った内容を以下に挙げます。

## getImageData()の影響

`CanvasRenderingContext2D.getImageData()`の呼び出しが、Chrome以外のブラウザでパフォーマンスを大きく落とす要因となっていました。そこで、文字の描画と分析を一つ一つ順に行うのではなく、多数の文字に対する描画を大きいcanvasに対してまとめて行った後`getImageData()`を呼び出し、ピクセルデータの分析を行うようにしました。

## ループ最深部のインデックス計算

ピクセルデータの分析において、最深部のループでは配列アクセスのためのインデックスの計算の影響が大きかったため、インデックス計算を加減算のみで行うようにしました。

```javascript:修正前
for (var x = sx + width - 1; x >= sx; --x) {
	if (image.data[3 + 4 * (x + y * image.width)] !== 0) {
		// ...
	}
}
```

```javascript:修正後
var i = 3 + 4 * ((sx + width - 1) + y * image.width);
for (var x = sx + width - 1; x >= sx; --x, i -= 4) {
	if (image.data[i] !== 0) {
		// ...
	}
}
```

## 凸包走査

凸包を求めるアルゴリズムは、三角関数を使って全頂点に対する角度を求めていくナイーブなものでは時間がかかっていたので、Andrewの凸包走査と呼ばれるアルゴリズムを用いるようにしました。

# まとめ

手動で文字間隔の指定をすること無く、カーニングを行うことができました。実行時間も実用上問題ないものにできたかと思います。
apacheのアクセスログ解析

# コピペ用

## ログローテーションされたファイルを結合して、ステータスコード別の行数を表示する

```shell-session
ls access_log-201704* | xargs cat | cut -f 9 -d ' ' | sort | uniq -c
```

# アクセスログ解析で使えるコマンド

## catでファイルを結合する

こうやって書くと、file1とfile2を結合できる

```
cat file1 file2 
```

例）

```
$ echo 123 > file1
$ echo 456 > file2
$ cat file1 file2
#=>
123
456
```

複数ファイルを一気に指定したい時は、xargsが使える。
xargsはパイプで受け取った値をコマンドの引数として渡せる。

```
$ echo 123 > file1
$ echo 456 > file2
$ ls file* | xargs cat
#=>
123
456
```

## ステータスコード毎の行数を出力する

1. cutコマンドでステータスコードだけ取り出す
2. sortコマンドでソートする（uniqコマンドのため）
3. uniqでステータス毎の行数を出力する

### cutコマンドでステータスコードだけ取り出す

cutコマンドで行の中の一部分をとり出せる。
今回は、半角スペースで分割してステータスコードの部分を取り出す.

- -d で分割する文字を指定する（指定しないとタブで分割する）
- -f で分割した何番目のフィールドを取り出すかを指定する

```
$ echo "a b c" | cut -f1 -d ' '
#=>a
$ echo "a b c" | cut -f2 -d ' '
#=>b
$ echo "a b c" | cut -f3 -d ' '
#=>c
```

アクセスログからステータスを取り出す

```
$ cat access_log | cut -f9 -d ' '
#=>
200
200
200
401
200
500
```

### sortコマンドでソートする（uniqコマンドのため）

sortしてくれる。

```
$ echo "3" > sort.txt
$ echo "1" >> sort.txt
$ echo "2" >> sort.txt
$ cat sort.txt
3
1
2

$ cat sort.txt | sort
1
2
3
```

### uniqでステータス毎の行数を出力する

重複した削除して、重複をなくすことができる。 -c を指定すると重複してた数を表示してくれる。
ソートした文字列じゃないと上手く重複してくれない。

```
$ echo "a" > uniq.txt
$ echo "a" >> uniq.txt
$ echo "b" >> uniq.txt
$ cat uniq.txt
#=>
a
a
b
$ cat uniq.txt | uniq -c
#=>
   2 a
   1 b
```

### 組み合わせる

```
ls access_log-201704* | xargs cat | cut -f 9 -d ' ' | sort | uniq -c
```
Go for Windows で子プロセスに二重引用符を引数でそのまま渡したい時

問題の症状
=========

親プロセスのソース：

```exec1.go
package main

import (
	"os"
	"os/exec"
)

func main() {
	c := exec.Command("foo", `"<BAR>"`)
	c.Stdout = os.Stdout
	c.Stderr = os.Stderr
	c.Stdin = os.Stdin
	c.Run()
}
```

子プロセスのソース（バッチファイル）：

```foo.cmd
@echo %0 %*
@exit /b 0
```

実行すると

```console
$ go run exec1.go
foo \"<BAR>\"
```

二重引用符の前にバックスラッシュがついてしまう。

解決方法
=======

バックスラッシュが付かないようにするには、Go言語標準の`exec.Cmd.Args[]`を Windows 形式の引数形式に展開する処理をパスして、自前で直接指定すればよい。

```exec2.go
package main

import (
	"os"
	"os/exec"
	"syscall"
)

func main() {
	c := exec.Command("foo")
	c.SysProcAttr = &syscall.SysProcAttr{CmdLine: `foo "<BAR>"`}
	c.Stdout = os.Stdout
	c.Stderr = os.Stderr
	c.Stdin = os.Stdin
	c.Run()
}
```

```console
$ go run exec2.go
foo "<BAR>"
```

なぜ、こんなことをする必要があるのか
================================

FIND.EXE や CMD.EXE は、引数につけられた二重引用符の有無で、その引数がどういうものか判別しています。このため、Goのプログラムから FIND.EXE が意図どおりに呼べないという問題が発生していました。

* [dir | find "<DIR>" · Issue #218 · zetamatta/nyagos](https://github.com/zetamatta/nyagos/issues/218)

こういう仕様って、どこに書いてあったの？
====================================

[ここ](https://github.com/golang/go/blob/master/src/syscall/exec_windows.go#L267)
ruby/railsのaccessorいろいろ

メンバー変数やクラス変数のgetter/setterみたいなアクセッサーが
何個かあるみたいなのでまとめてみた。

## 準備

rubyのバージョンは2.3.0。

```ruby
source 'https://rubygems.org'

gem 'rails', '5.1.1'
gem 'test-unit'
```

```ruby
require 'test/unit'
extend Test::Unit::Assertions

require 'active_support/all'

module Mod
  mattr_accessor :module_variable
  self.module_variable = '<nil>'

  thread_mattr_accessor :thread_module_variable
  self.thread_module_variable = '<nil>'
end

class Base
  include Mod

  attr_accessor :instance_variable

  cattr_accessor :class_variable
  @@class_variable = '<nil>' # わかりやすいようにnilは文字列

  thread_cattr_accessor :thread_class_variable
  self.thread_class_variable = '<nil>'

  def initialize
    @instance_variable = '<nil>'
  end
end

class Super < Base
  self.thread_class_variable = '<nil>'
end

base = Base.new
sup = Super.new
```

## attr_*系

インスタンス変数のアクセッサー。

```ruby
base.instance_variable = 'madoka'

assert_equal base.instance_variable, 'madoka'
assert_equal sup.instance_variable, '<nil>'
```

## cattr_*系

クラス変数用のアクセッサー。

```ruby
base.class_variable = 'kaname'

assert_equal base.class_variable, 'kaname'
assert_equal sup.class_variable, 'kaname'
assert_equal Base.class_variable, 'kaname'
assert_equal Super.class_variable, 'kaname'

# 継承先で変更
sup.class_variable = 'homura'

assert_equal base.class_variable, 'homura'
assert_equal sup.class_variable, 'homura'
assert_equal Base.class_variable, 'homura'
assert_equal Super.class_variable, 'homura'
```

## mattr_*系

モジュール用のアクセッサー。

`alias :cattr_accessor :mattr_accessor`らしいです。
あと、[こちら](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb)にも書かれてました。

便利だけど、値が変わったりするので気をつけて使いましょう。

```ruby
Mod.module_variable = 'tomoe'

assert_equal Mod.module_variable, 'tomoe'
assert_equal base.module_variable, 'tomoe'
assert_equal sup.module_variable, 'tomoe'

# 継承先で変更
sup.module_variable = 'mami'

assert_equal Mod.module_variable, 'mami'
assert_equal base.module_variable, 'mami'
assert_equal sup.module_variable, 'mami'

# インスタンス作ったあとにモジュールくっつけてみる
class Other; end

other = Other.new
other.extend Mod

assert_equal other.module_variable, 'mami'
```

## thread_(m|c)attr_*系

Threadに値がはいってるっぽい。
どこからでもアクセスできるグローバルな感じで使えそう。

継承先で値をかえても親の値は変わらないので、ちょっと安全な気がします。
（Threadにクラス名をキーにして値を格納してるっぽい）

```ruby
Mod.thread_module_variable = 'sakura'

assert_equal Mod.thread_module_variable, 'sakura'
assert_equal base.thread_class_variable, '<nil>'
assert_equal sup.thread_class_variable, '<nil>'

# 継承元で設定
base.thread_class_variable = 'kyouko'

assert_equal Mod.thread_module_variable, 'sakura'
assert_equal base.thread_class_variable, 'kyouko'
assert_equal sup.thread_class_variable, '<nil>'

# 継承先で変更
sup.thread_class_variable = 'sayaka'

assert_equal Mod.thread_module_variable, 'sakura'
assert_equal base.thread_class_variable, 'kyouko'
assert_equal sup.thread_class_variable, 'sayaka'

p Thread.current.keys
# [:i18n_config, :"BigDecimal.precision_limit", :"BigDecimal.exception_mode", :attr_Mod_thread_module_variable, :attr_Base_thread_class_variable, :attr_Super_thread_class_variable]

```

## まとめ

気がついたら、いろいろできてた。
libc.so.6のシンボリックリンクを変更しようとしたところ、誤って消してしまった時の対応

# 状況
/lib64/libc.so.6 のリンク先を変更する際に上書きせず、シンボリックリンクを削除してから作成することにした。
( 消したことによってこんな状態になると知らず。 )

# 問題発生から解決までの一連作業
```
$ su
password: 
# rm /lib64/libc.so.6
# ln -s /lib64/libc-2.17.so /lib64/libc.so.6
ln: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
# ldconfig -l -v /lib64/libc-2.12.so
```
これで一応、解決した模様。
OCMockを利用してNSDateをStub化する

NSDateFormatterを使って日付文字列を取得するときに、[NSDate date]で現在の時刻を取得すると取得時ごとに時間が変化してしまうので、正しいフォーマットの文字列が出力されているかをテストすることが難しくなります。
そこで、[NSDate date]で得られる値を固定化できれば、正しいフォーマットで文字列が作成されているかを確認することができます。

# OCMClassMockを利用してNSDateをStub化する

```objc
id dateMock = OCMClassMock([NSDate class]);
NSString *mockTimeStamp = @"1494925200"; //2017-05-16T09:00:00Z in UTC
OCMStub([dateMock date]).andReturn([NSDate dateWithTimeIntervalSince1970:[mockTimeStamp intValue]]);

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
NSString *dateStr = [dateFormatter stringFromDate:[NSDate date]];

XCTAssertEqualObjects(dateStr,@"2017-05-16T09:00:00Z");
```

これで、指定した固定の文字列でテストできるようになりました。

## メソッド内での使用
メソッド内で使用している場合も同じになります。

```objc
id dateMock = OCMClassMock([NSDate class]);
NSString *mockTimeStamp = @"1494925200"; //2017-05-16T09:00:00Z in UTC
OCMStub([dateMock date]).andReturn([NSDate dateWithTimeIntervalSince1970:[mockTimeStamp intValue]]);

MyClass *myObject = [MyClass alloc]init];
NSString *dateStr = [myObject createDateString];

XCTAssertEqualObjects(dateStr,@"2017-05-16T09:00:00Z");
```

```objc:MyClass.m
- (NSString *)createDateString {
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
    
    return [dateFormatter stringFromDate:[NSDate date]];
}
```
[obsolete] FreeBSD 4.x 系で sendmail + drac + qpopper の連携で、 POP bofore SMTP を導入する

sendmail は OS 付属の版を利用し、 darc と qpopper は ports を利用する

# drac のインスコ
```
# cd /usr/ports/mail/drac && make install
```
# qpopper のインスコ
```
# cd /usr/ports/mail/qpopper && make WITH_DRAC=yes install
```
# /etc/rc.conf の編集
```text:/etc/rc.conf
portmap_enable="YES"
```
# /etc/rc.conf.local の編集
```text:/etc/rc.conf.local
dracd_enable="YES"
```
# /etc/inetd.conf の編集
```text:/etc/inetd.conf
pop3 stream tcp nowait root /usr/local/libexec/qpopper qpopper -s
```
# /etc/mail/\`hostname\`.mc の作成
```
# cd /etc/mail && make
```
# /etc/mail/\`hostname\`.mc の編集
```diff
--- /usr/src/etc/sendmail/freebsd.mc	Wed Dec 31 17:42:16 2003
+++ /etc/mail/releng4x.example.jp.mc
@@ -90,3 +90,11 @@ define(`confNO_RCPT_ACTION', `add-to-und
 define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
 MAILER(local)
 MAILER(smtp)
+LOCAL_CONFIG
+Kdrac btree /usr/local/etc/dracd
+LOCAL_RULESETS
+SLocal_check_rcpt
+R$*	$: $&{client_addr}
+R$+	$: $(drac $1 $: ? $)
+R?	$@ ?
+R$+	$@ $#OK
```
注：R\$ 及び R? R\$+ の空白は \t (tab) となるように注意する

# /etc/mail/\`hostname\`.mc から \`hostname\`.cf の作成とインスコ
```
# cd /etc/mail && make && make install
```
ここで一旦 OS の再起動するか、個別 daemon の再起動又は起動させる。
# 再起動の方法
```
# kill -HUP `cat /var/run/inetd.pid`
# /usr/local/etc/rc.d/dracd.sh restart
# killall -HUP sendmail
# kill -HUP `ps ax | grep portmap | awk '{print $1}'`
```
# 起動方法
```
# /usr/sbin/inetd -wW -C 60
# /usr/local/etc/rc.d/dracd.sh start
# sh /etc/rc.sendmail
# /usr/sbin/portmap
```
此処までで、各 daemon の下準備は完了、続いて試験
# qpopper の動作確認
```
# telnet 0 pop3
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
+OK Qpopper (version 4.0.5) at releng4x.example.jp starting.  <0.0@releng4x.example.jp>
user je3kmz
+OK Password required for je3kmz.
pass example.jp
+OK takefu has 0 visible messages (0 hidden) in 0 octets.
list
+OK 0 visible messages (0 octets)
.
quit
+OK Pop server at releng4x.example.jp signing off.
Connection closed by foreign host.
```
ここで、drac の肝心要となる pop3 で認証成功した IPv4 アドレスと、その時刻の UNIXTIME がデータベースに格納される。
# データベースファイルの確認
```
# ls -l /usr/local/etc/dracd.db
-rw-r--r--  1 root  wheel  1024  1  1  1970 /usr/local/etc/dracd.db
```
# 他のユーザーからファイルを操作させないようにパーミッションを設定
```
# chmod go-r /usr/local/etc/dracd.db
```
# drac データーベースの確認
```
# makemap -u btree /usr/local/etc/dracd
127.0.0.1       0
```
ここで、qpopper のテストで他のマシンから telnet 試験した場合は、localhost の IPv4 アドレスでは無くなり、アクセス元の IPv4 アドレスが追加される
# sendmail の drac 連携試験
```
# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> /map drac 127.0.0.1
map_lookup: drac (127.0.0.1) returns 0 (0)
```
未認証だと以下のように表示される

```
map_lookup: drac (127.0.0.1) no match (0)
```
# dracd.allow は必要に応じて編集
```text:/usr/local/etc/dracd.allow
255.255.255.255 127.0.0.1
```
ネットマスク IPv4 アドレス
の順に書く
MySQLでcount(*)の結果がある一定数以下である場合にのみカウントしたい

# はじめに
MySQLで、としていますが、他のRDBでも利用できるテクニックかもしれません。(未検証です)

# 何がしたい
SQLにおいて、特定の条件を指定したケースにおける実行結果の行数が10,000行を超えるかどうかなどを知りたい。
例：ある検索システムでは、結果セットが10000行を超えた場合には結果セットを返す必要はなく、追って絞り込み条件を追加してもらうようにしたい。（※どうせ画面上でチェックなんてできない）

# 何が問題？
普通にSELECT count(*)を実施するとクエリの内容によっては非常に長い時間がかかってしまう。
Webからユーザー指定の検索オプションで検索されるケースなどでこれをやられると簡単にタイムアウトしてまう。

# 通常のやり方
普通にSQLで絞込結果のカウントを行ないたい場合は、以下の構文を使います。

```
SELECT count(*) AS COUNT 
  FROM [TABLE] 
  WHERE [絞込条件] ;
```

しかし、これはこの結果行数が大きい場合には非常に遅くなります。（実際にSelect Queryで全部絞り込んでから律儀にカウントするため、元のデータの全スキャンになったり、結果セットのサイズに依存したりする。）

結果セットが10000行よりも大きいかどうかだけを知りたい場合にはあまり良くありません。

# SELECT 時にSQL_CALC_FOUND_ROWSを指定する場合
MySQLでは、SQL_CALC_FOUND_ROWSを利用する事により、わざわざSELECT count(*) を別途コールしなくても、LIMIT/OFFSET句付きのクエリで実データを取得すると同時に、LIMIT句を指定しなかったときの全体数も取得可能となります。

一見スマートな方法に見えますが、この方法では最初のLIMIT/OFFSET付き結果取得クエリで全件Hitするまでスキャンしてしまい、応答が非常に遅くなります。（count(*)を使った場合と同じコストがかかる。）

## LIMIT/OFFSET付き結果取得クエリ
```
SELECT SQL_CALC_FOUND_ROWS *  
  FROM [TABLE] 
  WHERE [絞込条件] 
  LIMIT 100 OFFSET 1000;
```

## Limitをつけなかったときの行数取得クエリ
```
SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|      7452906 |
+--------------+
1 row in set (0.00 sec)
```

# サブクエリでLimitをつけた結果をカウントする方法
以下の書き方にすると、Select Query部分も10,000行の結果セットが見つかった時点で応答を返答するので、SQLの実行時間を一定時間に押さえ込むことができます。

```
SELECT count(id) as COUNT 
FROM(
    SELECT 1 as id
      FROM [TABLE] 
      WHERE [絞込条件]
      LIMIT 10000
) as tmp;
```

このクエリを利用すると、

結果セット行数が10000行より小さい場合→結果行数を返答する
結果セット行数が10000行より大きい場合→10000を返答する

という挙動となります。

参考までに、テーブルサイズ1千万行、絞り込み結果行数百万行程度のクエリの場合、先のクエリで2分程度、後者のクエリで2秒程度の実行時間でした。

# 最後に
上記の他に、LIMIT/OFFSETによるページングは、SELECTで10,000件全部取得してから、スクリプト側でSliceするという方法もありますが、あまりにも富豪的プログラミング過ぎるので、ここでは割愛します。
Oracle Live for the Code

勉強会のメモ

#### キーノート

統計学習のエレメント

#### API first

API Life Cycle Management

#### トッピック分析

* collection of document

        model
              ->100%->topic1
              -> 10%->topic2

* relaxmap(parallel version of algorithm)

* Oracle PGX (graph analytics)
  初期化
  graphを作る

#### クラウドネイティブアプリの展開

Twelve-Factor App

#### 機械学習

      センサー
      |
      >
      Hadoop(フィルター)
      |
      >
      DB
      |
      >
      SQL App
---
      センサー
      |
      >
      リアルタイム分析(大規模でデータを収集したい場合、クラウドを利用)
      (ストリーム分析)

      グラフ分析

#### 位置情報アプリ

Oracle Spatial and Graph

* 空間検索、経路検索

* Oracle Spatial 空間演算子

          道路の交差
          道路と都市の位置関係(内包、外れ)

#### DevOps
日時（DateTimeオブジェクト）を曜日付きの文字列に変換する


## 概要

- たまに曜日付きの書式に変換したくなるけど、よく忘れるのでメモ

## 使用例

```VBNET
'2017年5月19日（金）
Today.ToString("yyyy年MM月dd日（ddd）")
'曜日という文字付き
'2017年5月19日（金曜日）
Today.ToString("yyyy年MM月dd日（dddd）")
```
Linux 上の Visual Basic コンパイラー

Arch　Linux でのインストール方法

```bash
yaourt -Sb mono-basic
```

```vbnet:vb01.vb
' ------------------------------------------------------------------
'	vb01.vb
'
'					May/19/2017
' ------------------------------------------------------------------
public class compiler
shared function Main as integer
Console.WriteLine ("*** start ***")
Console.WriteLine ("Good Afternoon")
Console.WriteLine ("*** end ***")
return 0
End function
end class
' ------------------------------------------------------------------
```


```text:Makefile
vb01.exe: vb01.vb
	vbnc vb01.vb
clean:
	rm -f vb01.exe
```

実行

```text
$ mono vb01.exe 
*** start ***
Good Afternoon
*** end ***
```

次の環境で動作を確認しました。

```text
$ uname -a
Linux iwata 4.16.10-1-ARCH #1 SMP PREEMPT Mon May 21 07:57:23 UTC 2018 x86_64 GNU/Linux
$ mono --version
Mono JIT compiler version 5.12.0 (makepkg/9824e260f56 Wed May 16 00:11:44 CEST 2018)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
	TLS:           __thread
	SIGSEGV:       altstack
	Notifications: epoll
	Architecture:  amd64
	Disabled:      none
	Misc:          softdebug 
	Interpreter:   yes
	LLVM:          supported, not enabled.
	GC:            sgen (concurrent by default)
```
GCP app.yamlの環境変数がdockerビルド中、見えない

RailsアプリをGCP App Engineにデプロイしています。

https://github.com/GoogleCloudPlatform/ruby-docker/issues/91 にバグレポートした通り、GCP App Engineへdeployするとき、dockerビルド中には、GCP App Engine設定ファイル`app.yaml`に定義した環境変数が、見えません。

実は、更に悲しいことに、どうも docker の entrypoint にも環境変数が伝搬されていない模様です。Railsの設定ファイル`config/database.yml`や`config/secrets.yml`で、環境から変数を取得することができません。

暫定処置としては、CIサーバでGCP App Engineへdeployする直前に、環境変数をRailsの設定ファイルにべた書きするしかなさそうです。
Oracle Java Day 2017

## Java 9

最新 Java 情報局

#### Compatibility

* アンダースコアのみの変数がサポートされない
* deprecated メソッドが使えなくなる可能性あり
  リフレクション関係

* Java Plug-in Applet 廃止
* Windows x86 Client VM 提供中止
* Java DB 廃止
* Visual VM 廃止
* hprof, jhat 提供中止

* ディレクトリ構成の変更

         jre-9-+-bin
               +-conf
               +-lib

* rt.jar, tool.jar, lib/ext 廃止
* deprecated CMS

#### New

* Reactive Streams
  reactive-streams.org

* Publisher-Subscriber Model

Flow


* Incubator Modules

     Non-Final APIs
     Finalize or Remove in Feature Release
     HTTP/2 Client

#### Update

* @SafeVarargs

* try-with-resources
  final であればtryの中で変数の置き換えをしなくて良い

          final Reader reader=
          try (reader){

          }catch (Exception e){

          }

* Diamond Operator
  匿名クラスで<>が使えるようになる->ラムダ式が使えるのであまり使い道なし

          Function<String, String> func = new Function<>(){
              public String apply(String s){}
          }

* Private Method in Interface

* Stream

         ofNullable( t)
         iterate(seed, hasNext, next)
         take/dropWhile
         Collectors.flatMapping
         stream()
         ifPresentOrElse(action, elseAction)
         or(supplier)
         opt=opt1.or(()->opt2);

* Collection

         of()

         List<Integer> l = List.of(0,1,2,);
         Map<Integer, String> m = Map.of(0,"a",1,"b");
         Immutable Collection!

* String

         char[]->byte[]
         Concatenation
         invokeDynamic

* Deprecated
Ingressにstatic-ipを指定してやった on GKE and GCE

GKEとGCEのIngressではGCPで予約したstatic-ipをNameで指定出来ます。
ちなみに何も指定しないでIngressを作ると毎回IPが変わります。

# なぜstatic-ipを振るのか
IngressのIPにドメインを振ってる場合に毎回IPが変わるとかなり辛いため。

# 手順

+ static-ipを予約する
+ 予約したstatic-ipを指定してingressを作る
+ 予約したstatic-ipがingressに振られているか確認

## 準備
### gcloudのコマンドがどのプロジェクトにセットされているかを確認

```
gcloud config get-value project
```
以前、Ingressを作りたいプロジェクトとは違うプロジェクトがセットされていて 
Ingressを作り直しても予約したはずstatic-ipが使われずに辛い思いをしました・・・

### もし違うプロジェクトがsetされていれば
```
gcloud config set project {project-name}
```

## 1. static-ipを予約する
gcloud コマンドでstatic-ipを予約。
予約するのはIPのタイプはグローバルです。
ちなみにGCPのコンソールからも出来ます。

```
gcloud compute addresses create test-ip --global
```

ちゃんとcreateできていれば、listに追加されてます。予約しただけなのでSTATUSはRESERVEDのはずです。

```
gcloud compute addresses list --global
NAME                     REGION  ADDRESS          STATUS
test-ip                          35.186.221.137   RESERVED
```

## 2. 予約したstatic-ipを指定してingressを作る

> kubernetes.io/ingress.global-static-ip-name: "test-ip"

を追加したingress.yamlを指定してcreateする。

```
kubectl create -f ingress.yaml
```

### ingress.yaml
```
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: static-ip
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "test-ip"
spec:
  tls:
  # This assumes tls-secret exists.
  - secretName: tls-secret
  backend:
    # This assumes http-svc exists and routes to healthy endpoints.
    serviceName: http-svc
    servicePort: 80
```

# 3. 予約したstatic-ipがingressに振られているか確認

```
$ kubectl get ing
NAME           HOSTS     ADDRESS         PORTS     AGE
test-ingress   *         35.186.221.137   80, 443   1h

$ gcloud compute addresses list --global
NAME                     REGION  ADDRESS          STATUS
test-ip                          35.186.221.137   IN_USE

```

# 参考
ほとんど、このリンクからの引用です！
https://github.com/kubernetes/ingress/tree/master/examples/static-ip/gce
Oracle Java Day 2017

勉強会参加のログ。

### Java 9

|Java 9 Features||
|:---|:---|
|Module System|jigsaw, Cloud deployment に向いている, Docker, module-info.javaに定義|
|The Modular JDK||
|jShell||
|Encapsulate Internal APIs||
|jlink|ツール, Linker can produce custom runtime image(Regular, JVM specific memory images, fast exec)|
|Ahead of Time (AOT) Compilation|statically compile java classes, 静的、動的コンパイルの統合|
|G1 Garbage Collector as the Default|heap スペースを固定サイズに分割, E, S, Oにマーク付けする|

モジュール化の方法

    module com.foo.bar{
      require com.foo.bar
      exports com.foo.bar
    }

### Modular Development


|各レイヤーでモジュール化が行える|
|:---|:---|
|Modular Application|
|Modular Link|
|Modular JDK|

|Accessibility|Java 9 の Accessibility|
|:---|:---|
|public|public to everyone|
||public but only ...|
||public only within a module|
|protected|protected|
|<package>|<package>|
|private|private|

src/module-info.java

    module hello.world{
      exports com.example.hello; //外部に公開パッケージ
      requires java.base;
    }

|hello.world|
|:---|
|com.example.hello 公開|
|(No concealed packages) 隠蔽|

* jarにmodule-info.classが追加される、これのクラスでアクセス制限される
* モージュール単位(クラス単位では無く)で取り込める
->デプロイするファイルのサイズが減少
* 起動時にモジュールが無いとエラーになる
循環依存関係も検出できる

### Migrating from the top down

* サードパーティのライブラリの依存関係
     -> jdeps コマンドで依存関係を抽出する

* Automatic Modules
     自動モジュール化(サードパーティのlibをモジュール化で使いたい時)
     JARファイル名がモジュール名
     全てを公開

          module hello.world{
            exports com.example.hello to myapp;
            requires java.base; //デフォルトで追加される
            requires jackson-core;
            opens com.myapp.domain to jackson.databind //リフレクションを使用している場合のみの振る舞い

            uses javax.print.PrintServiceLookup
          }

          module printlib{
            provides javax.print.PrintServiceLookup with groovy.backend.CodeEvaluatetionEngineFactory;
          }




* JDK layout assumptions
     ディレクトリの変更、rt.jar

* Class loader assumptions
     クラスロードの順番

* System property changes

* 参考資料 JEP 261

Module の循環依存の回避

* 依存図

         httpClient.java(loging.apisに依存)
         |
         >
         loging.apis
         interface LogSPI
         <
         |
         loging.impl(loging.apisに依存)
         class HTTPLogger implements LogSPI

### Java のこれから

|Java Future|Java のこれから|
|:---|:---|
|uniform model|object, Array, value, types, methods|
|post-threaded|Confined/immutable data|
|Data Layout|Codes like a class, works like an int!|

Data Layout

    class Point {
      final int x;
      final int y;
    }

    Point[] pts = |x|y|x|y|x|y|のイメージにしたい
    今は、|x|y|   |x|y|   |x|y|のように隙間があるイメージ
    GCがかかるともっと効率的でない

### Java EE 8

|Java EE 8||
|:---|:---|
|JAX-RX2.1||
|Servlet 4.0|HTTP/2 performance, server push|
|JSON-B 1.0|JSON <-> Java binding|
|JSON-P 1.1||
|CDI 2.0||
|Bean Validation||
|JSF 2.3||
|Security 1.0|　|

### Deep Learning

deepleaning4j
cannot resolve 'import com.android.ims.ImsManager'みたいなエラーの解決方法

# 1. ＜状況説明＞<br>
あるmakefile,例えばdevice.mkに<br>
```
PRODUCT_PACKAGES += \
    com.android.phone.common
```
を追加して<br>
cannot resolve import com.android.imscannot resolve 'import com.android.ims.ImsManager'みたいなエラーが出たと仮定する<br>

# 2. ＜調査方法＞<br>
## Step1:概略調査<br>
ソースのトップディレクトリから<br>
```
$ find ./ -name '*.java' | xargs grep 'package com.android.ims.ImsManager' -lrns
```
で検索する。すると<br>
frameworks/opt/net/ims/src/java/com/android/ims/ImsManager.java<br>
がヒットする。<br>

## Step2:ImsManager.javaのAndroid.mkの内容チェック。<br>
```
LOCAL_MODULE := ims-common
```
がある。<br>

## Step3:Android.mkにStep2の結果を反映。<br>
packages/apps/PhoneCommon/Android.mkに<br>
```
LOCAL_JAVA_LIBRARIES := ims-common
```
を追加する。:v:<br>
FIRフィルタ参考したブログ(授業用)

http://personalutility.blogspot.jp/2012/11/python-scipy-fir.html


http://aidiary.hatenablog.com/entry/20111102/1320241544


http://blog.livedoor.jp/sce_info3-craft/archives/8585251.html


http://org-technology.com/2015/index.html
Rubyで漢字を読み上げる

# 翻車魚

ウッ....(よめない)

ちなみに答えは<b>マンボウ</b>です

こういったことは割とよくあるし、Railsで開発している身としてはユーザが自分の名前を入力した時などにオートコンプリートで読み仮名を自動入力させてあげたいものです.


なので漢字を読み上げてくれるいいgemはないかなと漁っていたのですが、あんまりないので作ってみようと思い立ちました.



#成果物

ソースは[こちら](https://github.com/100010/KanjiReader)から

## 前準備

<b>yahoo japanのAPIを使用しているため、yahoo japanのapplication_idなるものが必要です.</b>

gemのreadmeでも紹介してますが、[こちらから](https://e.developer.yahoo.co.jp/register)簡単に取得できます.


日本語なので気持ち的にも楽


## KanjiReader

```ruby
client = KanjiReader::Client.new(YOUR_APPLICATION_ID)
client.perform("翻車魚")
client.kanji #=> "翻車魚"
client.roman #=> "manbou"
client.hiragana #=> 'まんぼう'
client.katakana #=> 'マンボウ'
```

といった感じで引数に漢字を渡せば、

- ひらがな
- かたかな
- ローマ字

を取得できます。便利！！！


# 漢字以外のものを引数に入れたらどうなるか

### 漢字 + ひらがな + かたかな + 絵文字 ❌

```ruby
client.perform("今夜は翻車魚とディナー❤️")
client.kanji #=> ""
client.roman #=> ""
client.hiragana #=> ''
client.katakana #=> ''
```


### 漢字 + ひらがな + かたかな ❌

```ruby
client.perform("今夜は翻車魚とディナー")
client.kanji #=> ""
client.roman #=> ""
client.hiragana #=> ''
client.katakana #=> ''
```

### 漢字 + ひらがな　⭕️


```ruby
client.perform("今夜は翻車魚")
client.kanji #=> "今夜は翻車魚"
client.roman #=> "konyahamanbou"
client.hiragana #=> 'こんやはまんぼう'
client.katakana #=> 'コンヤハマンボウ'
```

### 漢字 + ひらがな(文章) 🔺

```ruby
client.perform("今夜は翻車魚とご飯を食べて朝まで飲み明かす")
client.kanji #=> "今夜は翻車魚とご飯ご飯を食べ食べて朝まで飲み明かす飲み明かす"
client.roman #=> "konyahamanboutogohangohanwotabetabeteasamadenomiakasunomiakasu"
client.hiragana #=> 'こんやはまんぼうとごはんごはんをたべたべてあさまでのみあかすのみあかす'
client.katakana #=> 'コンヤハマンボウトゴハンゴハンヲタベタベテアサマデノミアカスノミアカス'
```
docker-composeでRails5.1.1環境開発環境構築

ウェブ上のdocker+Railsの記事だけではうまくいかなかったので、備忘録としてメモ。

基本は下記のQuickStartをベースにすればOK

https://docs.docker.com/compose/rails/

だけど、いくつかポイントがあって、最後の

```docker-compose run web rails new . --force --database=postgresql --skip-bundle```

はいきなりやってもエラーでコケたので、上記実行前に

```docker-compose build```

しておくと良さげ。

そのままではbundlerのキャッシュが効かないのと、DBのデータが永続化されないので、
docker-compose.ymlを以下のように修正

```
version: '2'
services:
  db:
    image: postgres
    volumes:
      - ../pgdata:/var/lib/postgresql/data
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    volumes_from:
      - bundle

  bundle:
    image: busybox
    volumes:
      - /bundle
```

で、できました。

http://localhost:3000/

で確認。
tomcatが複数上がっているときの対処

ログで確認。
`# cat /opt/tomcat/logs/catalina.20xx-xx-xx.log`

`アドレスは既に使用中です`
このようなメッセージを発見したら、tomcatを複数挙げているか、他のサーバのアドレスと衝突しています。

例えば、以下のようなコマンドを実行して
`# ps -ef | grep java`
tomcatのプロセスを探して、killしましょう。
Cloud9 IDE keybidings for Chromebook


```json:~/.c9/keybindings.settings
// Edit this keymap file and save to apply.
[
    { "command": "findnext", "keys": { "win": [""] } },
    { "command": "navigate", "keys": { "win": ["Alt-E"] } },
    { "command": "goToNextError", "keys": { "win": [""] } },
    { "command": "tab0", "keys": { "mac": ["Alt-0"] } },
    { "command": "tab1", "keys": { "mac": ["Alt-1"] } },
    { "command": "tab2", "keys": { "mac": ["Alt-2"] } },
    { "command": "tab3", "keys": { "mac": ["Alt-3"] } },
    { "command": "tab4", "keys": { "mac": ["Alt-4"] } },
    { "command": "tab5", "keys": { "mac": ["Alt-5"] } },
    { "command": "tab6", "keys": { "mac": ["Alt-6"] } },
    { "command": "tab7", "keys": { "mac": ["Alt-7"] } },
    { "command": "tab8", "keys": { "mac": ["Alt-8"] } },
    { "command": "tab9", "keys": { "mac": ["Alt-9"] } },
    { "command": "find", "keys": { "win": ["Alt-F"] } },
    { "command": "selectall", "keys": { "win": ["Alt-A"] } }
]
```
Visual Studio で一部の処理がデバッグ実行で遅すぎる場合の対応(C++)

## デバッグ実行
visual studioに限った話ではないのですが、実行時エラーチェックなども入るせいか、デバッグ実行は遅いです。でもvisual studioは極端に遅くなる気がします。メモリ破壊など色々チェックしてくれるのはありがたいのですが、デバッグ実行が遅すぎても開発効率に悪影響を与える場合もあります。

## コンパイルオプション
一部関数だけが遅い場合、なのはよくあることだと思います。
その場合、その処理が入っている特定のソースファイルのみ、コンパイルオプションを変更するという方法があります。

## Visual Studio 2015ではどこなのよ
ソースファイルを選択してプロパティを出します。その後、
C/C++ -> Code Generation -> Basic Runtime Checks を Defaultに
C/C++ -> Optimization を OxまたはO2
とすることで対応は完了です。

![opt2.png](https://qiita-image-store.s3.amazonaws.com/0/8588/132c6ea3-d7b1-c76d-840e-c380b1389f8b.png)
![opt1.png](https://qiita-image-store.s3.amazonaws.com/0/8588/e86a312d-35d6-51ea-c944-99eda1112bb6.png)

## まとめ
ツールとうまく付き合っていきたいところです。
【GitHub】コメント内の画像に枠線（ボーダー）をつける

GitHubでプルリクコメントを書く際、よくスクショを添付する。
背景が白いページだと、どこまでが画像なのかがわかりにくい。
そこで、画像に枠をつけたい。

## コード

いろいろ調べたり実験した結果、以下のコードでできた。

```
<kbd><img src="画像URL" /></kbd>
```

参考 : http://stackoverflow.com/questions/37349314/is-it-possible-to-add-border-to-image-in-github-markdown

GitHubならコメント欄に画像をドラッグ・アンド・ドロップすれば自動で画像がアップロードされ、ディフォルトの画像挿入コードが生成されるので、画像URLはそこから取れば良い。

kbdタグというのはユーザーが入力する内容であることを示すものとのこと。初めて見た。
http://www.htmq.com/html5/kbd.shtml

きちんとした書き方と言うよりは現状のGitHubのマークダウンレンダリングの仕様を利用したハック的なものなので、今後GitHubの仕様が変わると使えなくなるかもしれませんね。

## 例

```
![2017-05-19 11 43 13](https://cloud.githubusercontent.com/assets/7123644/26231237/0d584952-3c89-11e7-866e-9078bd8207a8.png)

---

<kbd><img src="https://cloud.githubusercontent.com/assets/7123644/26231237/0d584952-3c89-11e7-866e-9078bd8207a8.png" /></kbd>
```

![スクリーンショット 2017-05-19 11.51.08.png](https://qiita-image-store.s3.amazonaws.com/0/159641/7058b411-83ca-7240-464a-c20ee4cc2aa7.png)
gradleのプロキシ設定

設定ファイル
===

```~/.gradle/gradle.properties
systemProp.http.proxyHost=www.somehost.org
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=userid
systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost

systemProp.https.proxyHost=www.somehost.org
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=userid
systemProp.https.proxyPassword=password
systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost

systemProp.jdk.http.auth.tunneling.disabledSchemes=""
```

参考
===
- [docs.gradle.org](https://docs.gradle.org/current/userguide/build_environment.html)
- [JavaでHTTPSのサイトに認証付きプロキシ経由でアクセスしようとすると407エラー](http://qiita.com/kaakaa_hoe/items/d4fb11a3af035a287972)
git difftool -d を使って翻訳作業を楽しく効率的にしよう！

## はじめに

最新技術を調べる際にはよく英語のサイトを読まなくてはならなくなります。場合によっては適当でも良いので翻訳してみていなどということもあるでしょう。そんな時みなさんはどのようにして翻訳しているでしょうか？私の場合は markdown を使って気合いで英語の文章をコメントアウトしてそこに日本語を書き込むといったことをしていました。結構これが分量あると手間でした。VS Code の拡張を作ってみたいなどと思って翻訳してみようと思ったところ、どうもドキュメントがgithub に乗っていて markdown で書かれていたので、 clone してくれば画像がそのまま使えて便利だと思って拾ってきました。書き換え他箇所は VS Code で 変更分だけを diff 取ってみることが出来ました。でもコミットすると Diff を見れなくなります。またワードラップして見たいと思っても出来ません。なんか使いづらいぞということで、良いやり方を探してみたのでした。

## git difftool -d

~/.gitconfig 内に以下を書き込みます。

```ini
[diff]
        tool = meld
[difftool "meld"]
        cmd = meld $LOCAL $REMOTE
[merge]
        tool = meld
[mergetool "meld"]
        cmd = meld $LOCAL $BASE $REMOTE --auto-merge
```

## git リポジトリ

gitを初期化して data.md に英語の記事を書いておきます。

```bash
$ git init
$ vi data.md
$ git add *
$ git commit -a
```

コミットします。

次に、ja ブランチを作成し チェックアウトします。

```bash
$ git branch ja
$ git checkout ja
```

data.md を google 翻訳でコピって翻訳して保存します。

```bash
$ vi data.md
```

diffみながら変更する。

```bash
$ git difftool -d
```



とすると、 meld が起動されて、差分が表示されます。

![Screenshot from 2017-05-19 11-32-56.png](https://qiita-image-store.s3.amazonaws.com/0/25489/099bc774-22c9-0edf-ef7b-deac6882f7b5.png)

ファイルを選択すると編集画面になります:

![Screenshot from 2017-05-19 11-32-43.png](https://qiita-image-store.s3.amazonaws.com/0/25489/bcd63422-53a1-bdb7-6ab7-57e95bfdcdd6.png)

以下のように編集してみました:

![Screenshot from 2017-05-19 11-26-42.png](https://qiita-image-store.s3.amazonaws.com/0/25489/59cea508-4bce-bf7f-cafe-738acc3ebfb0.png)

Linux の場合は 右側のファイルを変更するとそのままファイルが書き換わります。 Windows でも工夫すれば書き換えることができるそうです。

```
$ git commit -a
```

コミットすると差分がなくなります。

```bash
$ git difftool -d
```

としても何も起こりません。

```bash
$ git difftool -d master ja
```

そこでブランチ名を指定して master ブランチと ja ブランチの差分をディレクトリ単位で表示し編集できます。

```bash
$ git difftool -d master
```

と書いても同じです。

このようにすることで、コミットを何度繰り返しても左に英語を右に日本語を対訳表示しながら翻訳作業をすることが出来ます。

github などにリポジトリを作っておき、

```bash
$ git commit -a
$ git push origin ja
```

などとすれば、Web上で翻訳前、翻訳後をdiff を取ってみることも出来て便利でしょう。