OmniAICreator/Qiita-1.07M huggingface dataset:
Redmine 3.3.0 新機能のご紹介(2)

#Redmine 3.3.0 新機能のご紹介(2)

##6.チケット一覧画面からウォッチャーを一括追加(#5754)
Allow addition of watchers via bulk edit context menu

チケット一覧画面でチェックボックスをオンにして、チケットを選択後、マウス右ボタンをクリックして表示されるコンテキストメニュに「ウォッチャー」項目が追加され、任意のユーザーをウォッチャーとして追加できるようになりました。以前のバージョンでは「ウォッチ」という項目しかなく、ログインしているユーザーだけをウォッチャーとして登録できました。
<img width="523" alt="WS000007.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/bee07ce2-b782-bf5b-c1dd-ef03f684ca80.jpeg">

##7.「新規オブジェクト作成タブ」でオプション選択が可能(#6204)
Make the “New issue” menu item optional

「管理」→「設定」→「表示」に「新規オブジェクト作成タブ」項目が追加されました。デフォルト値は「”+”ドロップダウンを表示」で、下図のように「＋」をクリックして「新しいチケット」をクリックすることによってチケットを新規登録することができます。もしくは「チケット」タブの画面右側の「新しいチケット」をクリックすることによってもチケットの新規登録が可能です。既存の「新しいチケット」タブは表示されません。
<img width="525" alt="WS000008.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/d45b5963-1aba-1686-1430-fc1b262b3ae8.jpeg">

「新規オブジェクト作成タブ」で「なし」を選択すると「新しいチケット」タブも「＋」ボタンも表示されず、「チケット」タブの画面右側の「新しいチケット」をクリックすることによってチケットの新規登録が可能です。
<img width="523" alt="WS000009.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/3e783310-a3c8-478b-3c0a-d7cc6e6e14b5.jpeg">

「新規オブジェクト作成タブ」で「”新しいチケット”タブを表示」を選択すると既存のバージョンと同様に「新しいチケット」タブが表示されます。その際にも、「チケット」タブの画面右側の「新しいチケット」をクリックすることによってもチケットの新規登録が可能です。
<img width="523" alt="WS000009_2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/d444d09a-b68e-d8d9-46eb-e2f03a71972f.jpeg">

##8.「＋」ボタンの追加 (#15880)
Consistent, global button/menu to add new content

「管理」→「設定」→「表示」に「新規オブジェクト作成タブ」項目で「”+”ドロップダウンを表示」を選択すると、「新しいチケット」、「新しいカテゴリ」、「新しいバージョン」、「ニュースを追加」、「新しい文書」、「新しいWikiページ」、「新しいファイル」を追加できる「＋」ボタンが表示されます。「＋」ボタンから各々の項目の作成が可能になります。
<img width="523" alt="WS000009_3.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/9b3e94b8-e639-9ce3-25b7-97ac1b32d9a8.jpeg">

##9.チケットの履歴で予定工数に単位が追加(#12456)
Add units in history for estimated time

以前のバージョンではチケットの履歴で予定工数に単位が表示されませんでしたが、3.3.0バージョンからは「時間」という単位が追加されました。
<img width="526" alt="WS000010.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/36c449e2-17e6-9829-20fe-5ad6783fdb84.jpeg">

##10.ステータスやトラッカーのソートをマウスドラッグで可能 (#12909)
Drag’n’drop order configuration for statuses, trackers, roles…

以前のバージョンではステータスやトラッカーのソートを上下ボタンをクリックすることによって行ったため、項目が増えるとソート設定をするのにかなりの手間がかかりました。
<img width="526" alt="WS000011.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/669d742d-2b69-c669-0fe5-169b91875110.jpeg">

3.3.0バージョンからはソート項目がなくなり、代わりに 上下アイコン部分でマウス左ボタンをクリックするとドラッグでき、任意の場所にドロップすることができます。これにより、簡単にソートを変更することができます。
<img width="526" alt="WS000011_2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/40df7368-5272-3b9a-c6bf-d861fe4bd34a.jpeg">

##[関連リンク] 出典・参考情報
本資料は、[Ankosoft社](http://www.ankosoft.co.jp/)の資料を元に作成しました。
出典URL：http://www.ankosoft.co.jp/redmine3-3-0-2/
PDF資料は[こちらから](http://www.ankosoft.co.jp/wp-content/uploads/2015/09/Redmine_3.3.0.pdf)
Redmine 3.3.0 新機能のご紹介(1)

#概要
Redmineの公式ホームページである「http://www.redmine.org/ 」の「ロードマップ」でRedmineの各バージョン別の機能を調べることができます。
2016年6月19日にリリースされた「Redmine3.3.0」バージョンでは全部で105箇所の変更がありました。
本書では代表的な16項目に対して説明いたします。

 

<「Redmine 3.3.0」バージョンの新機能一覧画面>
<img width="914" alt="WS000000.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/54b69c1b-4dfd-ce0d-fa4a-dbe988293899.jpeg">
URL: http://www.redmine.org/versions/110

 

変更された項目の内訳は下記の表の通りです。

<img width="376" alt="WS000001.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/1518cffa-2228-0e73-09b8-09a1a87aae6c.jpeg">


機能別の変更された項目の内訳は下記の表の通りです。

翻訳を除くと、UIとIssuesが高い比率で改善されたことが分かります。
<img width="457" alt="WS000002.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/c2c1a544-ebfc-4577-72d0-5035f26d080e.jpeg">

##1.ロール別にトラッカー別の権限の設定機能(#285)
Tracker role-based permissioning

「管理]->「ロールと権限]->「ロール」で「権限」項目の下に以前のバージョン※１にはなかった、「チケットトラッキング」項目が追加されました。トラッカー別に「チケットの閲覧」、「チケットの追加」、「チケットの編集」、「注記の追加」、「チケットの削除」の設定が可能になりました。デフォルトでは「すべてのトラッカー」にチェックが入っています。
特定のトラッカーに権限を指定したい場合は、「すべてのトラッカー」のチェックをオフにします。
※１：本書で使用する「以前のバージョン」は「Redmine 3.2.0.stable」バージョンを意味します。

<3.3.0バージョン画面>
<img width="523" alt="WS000003.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/98ffd021-4872-56c9-f8f5-962fa162d1db.jpeg">
 
##2.チケットの追加時に、選択可能なトラッカーをロールごとに指定可能 (#7839)
Limit trackers for new issue to certain roles

上記の機能と関連して、チケットの追加時に、選択可能なトラッカーをロールごとに指定可能になりました。「管理]->「ロールと権限]->「ロール」で「権限」項目の「チケットトラッキング」項目で「チケットの追加」の設定が可能です。
特定のトラッカーに権限を指定すると、該当ロールでは指定されたトラッカーのみ新規チケット作成時に選択が可能になります。

##3.チケットの注記に削除ボタンを追加(#1725)
Delete button on comments

以前のバージョンでは、チケットに注記を登録すると、注記の編集は可能でしたが、削除はできませんでした。3.3.0バージョンからゴミ箱アイコンをクリックすることにより、注記の削除が可能になりました。
<img width="524" alt="WS000004.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/badf6660-24fa-9880-e0c7-054216717ddb.jpeg">

##4.チケットのフィルタに、「チケット」が追加(#4806)
Filter the issue list by issue ids

チケットのフィルタに「チケット」という項目が追加されました。これにより特定のチケット番号での検索が可能になります。

<3.3.0バージョン画面>
<img width="524" alt="WS000005.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/f4312ee1-3e79-171b-ce14-d8626a499670.jpeg">
 
##5.「新しいWikiページ」が追加 (#5536)
Simplify Wiki Page creation (“Add Page” link)


以前のバージョンでは新しいWikiページを生成するためには「Wiki」ページの編集をクリックして、ページを生成しましたが、3.3.0バージョンから、「新しいWikiページ」という項目が追加され、それをクリックするとことにより、簡単に新しいページを作成することが可能になりました。
<img width="523" alt="WS000006.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/94912/4b17b29b-7bf4-469b-1476-ba3584500de9.jpeg">

##[関連リンク] 出典・参考情報
本資料は、[Ankosoft社](http://www.ankosoft.co.jp/)の資料を元に作成しました。
出典URL：http://www.ankosoft.co.jp/redmine3-3-0-1/
PDF資料は[こちらから](http://www.ankosoft.co.jp/wp-content/uploads/2015/09/Redmine_3.3.0.pdf)
30秒で読める要件定義の機能要件＆非機能要件まとめ

システムが保証しなければならないサービスの信頼性はエンジニアが担保しなければならない。

要件定義書をまとめる際、重要なことを欠落する事がないようポイントを記載。
30秒で読めるようにざっくり書く。

# 機能要件
システムで何をやりたいのか。

# 非機能要件
* システムの提供時間
* セキュリティ
* 非機能要件を実現している大部分がインフラ
* 非機能要求はアプリケーションの快適さを表す

# RASIS

実現したい要求である機能要件以外の機能が、正しく動作する仕組みを定義。
非機能要件の一部。

|項目|略称|概要|一例|
|:-----------|------------|:------------|:------------|
|Relibility |(R)信頼性 |	障害の発生しにくさ|稼働時間当たりの障害発生回数で表す|
|Availability|(A)可用性 |	障害が発生した際の復旧|SPOFの排除などで対策|
|Serviceability |(S) 保守性 | 保守や修理のし易さ|メンテナンスの容易なソースコードに保つ|
|Integrity |(I) 保全性 | 過負荷時や障害時のデータの破壊|矛盾を排除する。データベースだとACID属性|
|Security |(S) 安全性 |	外部からの侵入・改ざんや機密漏洩の起きにくさ|不正アクセス対策|


リリース後、機能を追加する時にゼロから作り直したほうが早いと感じられるシステムは保守性が低いと言える。
一方で、既存のシステムを再利用して新しい機能を追加したり、既存のシステムを改修する事が可能であれば保守性が高いと言える。




# 参考情報
http://blog.father.gedow.net/2012/08/14/system-reliability-indicator-rasis/
https://bongineer.net/entry/rasis/
データベースのリストア履歴を確認する

```CheckRestoreHistory.sql
SELECT TOP 10 *
 
FROM msdb.dbo.restorehistory
 
ORDER BY restore_date DESC
```

上記クエリではトップ10のみ確認していますが、全件表示も可能です。

「これいつのデータだっけ」なんて時にお使いください。
Linuxホスト名変更

Linuxサーバのホスト名を変更したい場合、以下の作業を実施します。

###1.現状のホスト名を変更
```
$sudo hostname 新しいホスト名
```
###2.ホスト名を確認
```
$hostname
```
＊＊＊以上の作業だけでは、再起動すると元のホスト名に戻ってしまいます＊＊＊
###3.ネットワークにおけるホスト名の変更
```
$sudo vi /etc/sysconfig/network
パスワードを入力
```

```/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=新しいホスト名
```
###4.ホスト名を確認
・再起動を行います

```
$sudo shutdown -r now
```
```
$hostname
```

以下サイトを参考にしました。
http://mountainbigroad.jp/linux/host_mod.html
ng-classでButtonをdisabledにする方法

AngularJSがよくわからないので備忘のためにメモ。

今回は、$watchで監視している値が0のとき、ボタンを使えなくする。

```js:スクリプト
$scope.inputValue = function() {
  var total = 0;
  // 0の場合はボタンが押せないようにする
  $scope.test = true;
  if(total > 0){
    $scope.test = false;
  }
  return total;
}

$scope.$watch($scope.inputValue);
```

```html:テンプレート
<p>値 {{inputValue()}}</p>
<a class="button" ng-class="{disabled: test}">送信</a>
```
[Salesforce][Eclipse] この組織では TLS 1.0が無効になりました。の対応

## 背景

EclipseからSalesforceに接続できなくなり焦る。

<img width="433" alt="スクリーンショット 2016-06-29 10.05.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/38394/b9e18ffc-dcc3-8062-c676-934d0fb3e6e7.png">

この組織では TLS 1.0が無効になりました。HTTPSを使用して Salesforce に接続するには、TLS1.1以降を使用してください。
<img width="563" alt="スクリーンショット 2016-06-29 10.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/38394/c7502c83-66a6-c48d-02e0-e12e6ad5fc6d.png">

## 環境

OS X El Capitan 10.11.5
Eclipse Kepler

## 原因

先日、SalesforceのSandbox環境がTLS1.0無効化しました。
告知はあったのは把握していたんですが、Eclipseの暗号化まで把握しておらず。

https://help.salesforce.com/apex/HTViewSolution?id=000221207&language=ja

> 2016 年 6 月から、Salesforce では段階的アプローチにより、影響を受ける Salesforce サービスで TLS 1.0 暗号化プロトコルの無効化を開始します。TLS 1.0 を無効化することで、TLS 1.0 がインバウンドおよびアウトバウンド接続内で Salesforce サービスへのアクセスに使用されないようにします。


## 対応

ここに解決方法がありました。
https://help.salesforce.com/apex/HTViewSolution?id=000232418&language=ja

> eclipse の設定ファイル "eclipse.ini" に下記の行を追加し、TLS1.0 を無効化してください。

eclipse.iniを探して、、

```
vim /Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini
```

最後の行に以下を追記して。

```
-Dhttps.protocols=TLSv1.1,TLSv1.2
```

Eclipseを再起動で解決。
keras 「ImportError: numpy.core.multiarray failed to import」が出た時の解決策

・環境
Mac book air / python2.7

# 解決策

NumpyをUpdateする。

```
$ pip install -U numpy
```
を実行します。

kerasをimportしてみます。

```
>>> import keras
Using TensorFlow backend.
>>>
```

# おまけ
デフォルトは__Theano__ですが、
__~/.keras/keras.json__を以下のように書き換えることで__TensorFlow__を
バックエンドにすることが出来ます。

```keras.json
{
    "image_dim_ordering": "th", 
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "backend": "tensorflow"
}
```
WebStormのマルチカーソル機能が便利すぎて鼻から牛乳が出る（IntelliJ IDEA、PhpStorm対応）

JetBrainsのIDEWebStorm（PhpStorm、IntelliJ IDEA等）には、複数の箇所を同時に編集できる便利な「マルチカーソル機能」があります。

# マルチカーソル機能の使い方
次のようなHTMLコードの「image」の文字列を「cat」に置き換える例を説明します。

```html
<img src="image1.png">
<img src="image2.png">
<img src="image3.png">
<img src="image4.png">
```

**[Alt]キー（Windows / macOS）を押しながら同時編集したい箇所をクリックする**と、マルチカーソルモードになります。編集したい行を選択後、[Alt]キーを離してテキスト編集をすると、選択したすべての箇所に変更が反映されます。解除するには、[ESC]キーを押します。

![multi_0.gif](https://qiita-image-store.s3.amazonaws.com/0/67884/33898f29-685c-4970-8e2d-574ca394e76c.gif)

列が同じであれば、[Alt]キーを押しながらマウスをドラッグするのが楽です。

![multi.gif](https://qiita-image-store.s3.amazonaws.com/0/67884/26c14021-594e-660b-b859-6a81822e5d15.gif)


## 長さの異なる文字列の一括編集にも便利
ここまでは一括置換でもできますが、長さの異なる文字列を一括編集したい場合にも役に立ちます。マルチカーソルで編集開始位置を選択した後、[shift]+[option]で編集位置全体を選択します。

![multi_2.gif](https://qiita-image-store.s3.amazonaws.com/0/67884/8cec4be8-142b-382e-5039-66ccfa56c1c8.gif)

## 行は同じでも良い
この機能を紹介するとたまに勘違いされますが、編集箇所は違う行である必要はありません。同じ行でも同時編集できます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/40fd9ea5-2ff2-78ce-76ac-a2672e9e7e8f.gif)

## あらゆるファイルでマルチカーソルが使える

**WebStormで対応しているファイルなら、CSS、JavaScript、JSON、XML等あらゆるファイルでこのマルチカーソルが使えます**。次に示すのは、TypeScriptでマルチカーソルを使っている例です。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/910f8e2d-7d46-685c-d246-58183f2264c0.gif)

ファイルの相対パスを取得する「Copy Relative Paths」（ファイルを選択して右クリック）と連携させ、Emmetで`background-image()`を入力後に異なる複数の画像パスをCSSに記述している例です。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/da6c45c2-0792-3081-d28f-94eb76a1669b.gif)


# マルチカーソル機能を使いこなして作業時間とミスを減らそう
マルチカーソルは[IntelliJ](https://www.jetbrains.com/idea/)、[PhpStorm](https://www.jetbrains.com/phpstorm/)といったJetBrains製品でも利用可能です。複数箇所の同時編集は、ミスと作業時間とストレスを減らす便利な機能。是非使ってみてください。

「[JavaScriptのプログラミングはこれだけ効率化できる！ 使用歴5年目のエンジニアが送るWebStormの厳選神業集 \- ICS MEDIA](https://ics.media/entry/16760)」でも様々なテクニックを紹介しているのであわせて参照ください。
App Analytics アップデートでインプレッション数の閲覧が可能に

久しぶりに iTunes Connect の App Analytics を見たら App Analytics で表示されるデータが増えていたので、
自分が調べた変更点を簡単にまとめてみる。

## インプレッション数

<img width="274" alt="スクリーンショット 2016-06-29 10.09.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/e951a747-3637-1a9a-f6d2-6e130c58328c.png">

これまでプロダクトページ（＝アプリ詳細ページ）閲覧数とインストール数が閲覧できたが、これに加えてインプレッション数という項目が増えた。
iTunes Connect 公式の FAQ の記述を見てみると以下のように書かれている。

[iTunes Connect 公式の FAQ](https://itunespartner.apple.com/en/apps/faq/App%20Analytics_Definitions)
> **What is an impression?**
> An impression is the number of times your app’s icon was viewed on the App Store. This includes search results, Featured, Top Charts and app Product Page Views. Apps listed in Updates in the App Store app are not included.

簡単に言うと、
**インプレッション数＝App Store 内でアプリアイコンが表示された数**
ということらしい。

App Store 内で、
* 検索結果画面のリストで表示された数
* Feature 枠で表示された数
* ランキングページで表示された数
* プロダクトページ閲覧数

の合計がインプレッション数ということらしい。

WWDC2016 の発表であった、検索広告の導入に伴って、インプレッション数の表示が必要になったのだと思われる。
これまではプロダクトページ閲覧数とインストール数しか見れなかったので、 ASO の成果を検証しづらかったが、今後この数値をうまく利用することで、「キーワード変更による効果」や「アプリアイコン/スクリーンショット変更による効果」など分析できる範囲が広がった。

（プロダクトページ閲覧数という項目が以前どういう名前で表示されていたかは忘れたが、この項目名も変更された。）

## ユニークデバイス分析

<img width="562" alt="スクリーンショット 2016-06-29 10.13.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/009c9a33-bc6c-109a-0ac1-236ec6247372.png">

メトリックスのインプレッション数とプロダクト閲覧数に対してユニークデバイスのチェックボックスが追加された。

これにより、アプリ遷移のコンバージョン率、インストールコンバージョン率の測定においてより正確な値が求められるようになった。

## まとめ
以上、 Apple 的には検索広告の導入に伴って導入したような気もするが、 ASO 的な効果測定がしやすくなった印象を受けた。

アプリのプロモーションページや広告による遷移などがあるため、アプリ遷移のコンバージョン率などは以前として正確な値を計算するのは難しいが、そのあたりはソース＞トップウェブサイト/トップキャンペーンなどを駆使していけば良さそう。
新卒2年目SEの備忘録 [SSRS レポート作成してみた]

#想像以上に簡単なレポート作成
レポートの作成というと、
正直難しく、複雑な処理が必要なのではないかと思っていました。
しかし、実際に作成してみると
簡単なものであればものの※10分程度で作成することが出来、
少しばかりの感動を覚えました。

※実際にレポートを作成する時間のみであり
　それまでの環境構築の時間は含んでいません。

#環境構築
まずは、作成の前に環境の構築が必要になります。
今回は、以下のサイトを参考に環境構築を行いました。
★[SSRS(SQL Server Reporting Services)のインストールと設定](https://techwing.wordpress.com/2009/05/02/ssrssql-server-reporting-services-%E3%81%AE-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E8%A8%AD%E5%AE%9A/)
★[MicrosoftSQLServer2008R2 レポートビルダー3.0のインストール]
(https://www.microsoft.com/ja-jp/download/details.aspx?id=6116)

#レポートビルダーを使ったレポート作成
環境構築が完了したら、実際にレポートを作成してみます。
今回は、マトリクス機能を使って簡単な表を作成します。
<手順>
①マトリクスを作成
　⇒挿入タブのマトリクスを選択後、マトリクスウィザードを選択します。
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/bbe1c874-b7d6-588e-81fc-e1e2af7fa3f0.png)

②データセットを作成するを選択し、次へボタンを選択します。
③環境構築の際に作成しておいたデータソースを選択し、次へボタンを選択します。
④左上のテキストとして編集を選択し、以下のTESTSQL1を貼り付け実行できることを確認し、次へボタンを選択します。
⑤フィールドの配置画面にて、値に「出身地」「性別」「購入金額」を配置し、次へボタンを選択します。
⑥その後のページはデフォルト設定で問題ないので、次へボタンを選択していきます。

~~~
-- TESTSQL1
WITH
	顧客マスタ	(ID, 性別, 年齢, 出身地)
	AS (
			SELECT
				1 AS ID, '女' AS 性別, 18 AS 年齢, '埼玉' AS 出身地
			UNION ALL
			SELECT
				2 AS ID, '男' AS 性別, 23 AS 年齢, '東京' AS 出身地
			UNION ALL
			SELECT
				3 AS ID, '女' AS 性別, 15 AS 年齢, '神奈川' AS 出身地
			UNION ALL
			SELECT
				4 AS ID, '男' AS 性別, 54 AS 年齢, '千葉' AS 出身地
			UNION ALL
			SELECT
				5 AS ID, '男' AS 性別, 30 AS 年齢, '茨城' AS 出身地
		),
	購入履歴	(ID, 購入金額)
	AS (
			SELECT
				1 AS ID, 1050 AS 購入金額
			UNION ALL
			SELECT
				2 AS ID, 300 AS 購入金額
			UNION ALL
			SELECT
				3 AS ID, 50000 AS 購入金額
			UNION ALL
			SELECT
				4 AS ID, 15400 AS 購入金額
			UNION ALL
			SELECT
				5 AS ID, 3570 AS 購入金額
		)

-- 
SELECT
	A.ID, A.出身地, A.年齢, A.性別, B.購入金額
FROM
	顧客マスタ AS A
INNER JOIN
	購入履歴 AS B
	ON A.ID = B.ID
~~~

簡単なマトリクスが完成しました。
<実行前>
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/fcdecb54-13b2-66d0-a14c-6c81f9738db6.png)

<実行後>
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/06e02c42-fa91-d70b-7cd7-17fe8a2c13c0.png)


簡単なものですが、少し工夫を凝らし
①年齢に”歳”を付け加えて表示する②購入金額をカンマ区切りで表示する
以上2点の操作をしてみました。

①年齢に”歳”を付け加える
(1)マトリクスの年齢を表示するフィールドの上で右クリックし、式を選択します。
(2)式を以下のように変更し、OKを選択します。
   ※&を+にしてしまったり、"を'にしてしまうと、実行時にエラーとなります。
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/494d05af-b0a1-1d9a-3acb-6ad4822aaed0.png)

②購入金額をカンマ区切りで表示する
(1)マトリクスの購入金額を表示するフィールドを選択し、書式を数値に変更します。
![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/34ae54e3-f49a-ceda-bf3c-70613991720a.png)

(2)書式の下にある,ボタンを選択します。
　 ※,ボタンの隣のボタンで、小数点以下の表示桁数を変更することが出来ます。

①、②の操作をした後の実行結果は以下の通りです。
![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/d6640d20-a6ed-8b3b-e0d8-8a0d84e16860.png)


<実行結果>
本当に簡単なものですが、マトリクスを表示することが出来ました。
さらに、マトリクスの式機能やパラメータと組み合わせて
使用することで高度なマトリクスを作成することも可能です。
Teraterm > 4.91: ウイルスを検出しました > マルウェア誤検知

```txt:動作確認
Windows 10 pro (64bit) 
Google Chrome バージョン 51.0.2704.106 m
Windows Defender
```

https://osdn.jp/projects/ttssh2/
にてTera Term 4.91をダウンロードすると「失敗 - ウイルスを検出しました」と表示される。
Tera Term 4.90ではこうはならない。

本当のウイルスなのか不明であるが、注意が必要かもしれない。

この事象の連絡用にチケットを作成した。これでいいのだろうか。
https://osdn.jp/ticket/browse.php?group_id=1412&tid=36416

<hr>
chromeのforumのリンク
https://productforums.google.com/forum/#!msg/chrome-ja/_jV14PiGOG8/BHZ0FMZ9BwAJ

<hr>
以下がありました。
https://osdn.jp/projects/ttssh2/forums/5841/37807/78220/
> チケットで誤検知であるとの記述を確認しました。
最新版がダウンロードできないのは残念です。MS の対応待ちですね。

こちらが関連チケットのようです。
https://osdn.jp/ticket/browse.php?group_id=1412&tid=36398
> 誤検知されたのはttpmenu.exeのようです。
vimのモード

## ノーマルモード
[esc]
デフォルトのモード
カーソル移動、コピペ、デリート、別モードへ移項することができる


## インサートモード
[i,a,I,A]
文字を書き込める。これをすることでようやくエディタとして使える感じ

## exコマンドモード
[:,?,/]
ファイルの保存、検索などのコマンドが使える

## ビジュアルモード
[v, V, ctrl+v]
文字を選択する
一般的なエディタでshift押しながらカーソル移動したときの動作

参考
http://www.webhtm.net/vim/mode.htm
簡単な検索findコマンド

ターミナル上でファイル名から検索をしたいときに使うコマンド

```sh
find <ディレクトリ> <検索条件> <アクション>
```

基本は
<ディレクトリ>はカレントディレクトリを意味する`./`
<検索条件>`-name '正規表現で探す名前'`
<アクション>デフォルトが`-print`なので何もかかなくてok

参考
https://hydrocul.github.io/wiki/commands/find.html
SpineをStarling1.7で使う:フィルタを使えるようにする

別の記事にも書きましたが、Spine-StarlingのSkeletonAnimation(SkeletonSprite)にはデフォルトの状態でフィルタが正しく適用できません。せっかくの表現力が下がってもったいないので、フィルタが適用できるSkeletonAnimationクラスを作ってみました。

#デモ

<img width="435" alt="DropShadow" src="https://qiita-image-store.s3.amazonaws.com/0/8302/bbf231c6-292d-bd19-ab85-1a7fbcc4bf42.png">
http://harayoki.github.io/qiita_demo/SpineAndFilter/
ドロップシャドウフィルタを適用してみました。いい感じですね。もちろん発光でもブラーでもカラーマトリックスでもディスプレースメントでも適用できます。ちなみに背景やキャラをタッチすると動きます。

#使い方

SkeletonAnimationFilterApplicableというクラスが、SkeletonAnimationにフィルタが適用できるように拡張したクラスです。
[SkeletonAnimationFilterApplicable.as](https://github.com/harayoki/SpineTest1/blob/master/src/harayoki/spine/starling/SkeletonAnimationFilterApplicable.as)

```sample.as
// skeletonDataを引数にインスタンス化(引数はSkeletonAnimationクラスと同じです。)
var skeletonAnimation:SkeletonAnimationFilterApplicable = new SkeletonAnimationFilterApplicable(skeletonData);

// 適用なフィルタ適用して配置
skeletonAnimation.filter = BlurFilter.createDropShadow();
addChild(skeletonAnimation);
```

これだけでも動きますが、アニメーションの切り替わり時などに、下記の手順を追加する事を推奨します。意味合いは後述。

```sample.as

// アニメーションの再生指示後など、大きさが著しくかわるタイミングで、
animationState.addAnimationByName(0, "guruguru", true, 0);

// updateBoundsを呼び出す。もしくは、
skeletonAnimation.updateBounds(20, 20);

// skeletonAnimationのローカル座標で大きさを直接指定する。
skeletonAnimation.setBoundsDirectly(new Rectangle(-160, -160, 320, 320));
```
(updateBoundsとsetBoundsDirectlyはどちらかを呼べば良いです。)

<img width="418" src="https://qiita-image-store.s3.amazonaws.com/0/8302/cf0fc6c3-e656-ee10-3160-d91ac965ce74.png">
あまり試していませんが、Sprite3Dでの3D表示にも対応してあります。

#仕組み
SkeletonSpriteはなぜかgetBounds()メソッドが座標は返すものの大きさを返しません。（おそらくSkeletonSpriteの内部構造が複雑なため、真面目にgetBounds()を実装するとパフォーマンスに問題がでてしまうので、このような実装になっているのではないか？）そして、StarlingのフィルタはgetBounds()が返す大きさを元に描画エリアを決定するので、SkeletonSpriteにはフィルタが適用できない状態になってしまっています。

ここを適当な固定の大きさを返すようにすればフィルタが描画されるわけですが、getBoundsは引数で指定された座標空間上でのbounds(座標と大きさ)を返す仕様なため、固定の値でなく、座標変換処理をやってやらないといけません。というところで、直接Bounds値をsetBoundsDirectlyメソッドで指定できて(内部で大きさを計算させず、固定の大きさをユーザが与える）、getBoundsメソッドではその値を元に座標変換を行う実装をしました。

もちろん固定の大きさを返すよりも、表示中のSkeletonSpriteの大きさをきちんと計算して返したほうが良いのですが、前述のように都度まじめに計算させるとパフォーマンス低下の問題が出そうです。

この問題を解決するために、指定したタイミングで大きさを計算して、再度の計算指示があるまではその固定値を元に大きさを返すような仕様の実装を追加しました。通常はアニメーションを変更するたびに１回だけupdateBoundsメソッドを呼んでやると良いでしょう。その際、引数で縦横のマージン幅を指定できるので、アニメーション中に大きさが変わったり、フィルタ描画でSkeletonSpriteの大きさが大きくなる場合は、多めにマージンを指定して下さい。（さもないとはみ出た部分のフィルタが描画されません。)

Spineのデータ側に編集を入れていいなら、透明なパーツなどをダミーで置いておき、明示的にアニメーション中の最大描画領域の大きさを指定するのも良いかもしれません。

いろいろ他とまざってますが、デモのソースはここにあります。
https://github.com/harayoki/SpineTest1/blob/master/src/demos/FilterDemo1.as

#終わりに
一番Spine-Starlingランタイムで気になっていた部分をなんとかできました。このあたりも制作される予定のStarling2対応ランタイムで直っていると良いですね。では。
vmware > ホストとゲストのSerial接続 (調査中)

```txt:動作環境
ホストOS: Windows 10 pro
ゲストOS: Window 7 pro
```

## 状況

1. RS-232Cシリアル出力するエミュレータがある
2. RS-232Cシリアル入力を受け付けるソフトがある

1のソフトをホストOSにて動作させて2のソフトをゲストOSで動作させた状態で1-2間の通信を行いたい。Windows 10上でのソフトの動作確認として使う。

## 調査

Named Pipe TCP Proxyなるソフトを使えば、ゲストOS側でTCPとして入力は受け付けできる。しかしこれをRS-232Cに変換する方法が不明。
[Serial portをつかってtera termで接続する](http://snail-like.com/mediawiki/index.php/Serial_port%E3%82%92%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%A6tera_term%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B)


別の方法として、ゲストOS側でシリアル出力をファイル出力して、そのファイルをホストOS側で読取るということは可能。この場合、上記2のソフトでシリアル入力の代わりにファイル読取りにするようなアダプタ機能が必要。

以下では可能であるが、変換ケーブルが必要という点はいまいち。

- 2本のUSBシリアル変換ケーブルを用意する
- 1本の変換ケーブルをゲストOSで認識させる
- もう1本の変換ケーブルをホストOSで認識させる
- 2本の変換ケーブルをクロス接続する

Named pipe serial proxyはないのだろうか。そういうのを自作できるだろうか。

### Named Pipeのコード例
(追記 2016/07/08)

delphi実装のNamed Pipe Server/Client実装例
http://stackoverflow.com/questions/13465393/how-to-pass-string-between-2-delphi-applications

上記を実装しようとしたが、TReadPipeが見つからないとなった。

### Named Pipe TCP Proxy + TCP転送ソフト

1. Named Pipe TCP Proxy @ ゲストOS
2. Named Pipe TCP Proxy @ ホストOS
3. 自作TCP転送ソフト @ いずれかのOS

上記の構成により、ゲストOSのCOMポートからホストOSのCOMポートに通信できるようになるかもしれない。
API Gatewayの設定をローカルで簡単にできるSimple API Gatewayというツールを作りました

![Screenshot](https://raw.githubusercontent.com/horike37/simple-api-gateway/sample/samplescreen-1.gif)

## 概要
[Simple API Gateway](https://github.com/horike37/simple-api-gateway)というコマンドラインツールを作って公開しました。
API Gatewayの設定からデプロイまでを対話形式のコマンドで行ってくれるツールです。

## 解決する課題
API GatewayはAPIの管理作成をやってくれるAWSのサービスですが、マネジメントコンソールやaws-cliでの設定は設定項目や手順がそれなりに多く大変です。

Simple API Gatewayはコマンドラインでの対話形式で設定を手引してくれます。結果、API Gatewayの設定の煩雑さから開放されます。

## 特徴
ざっとあげると以下の通りだと思います
### メリット
- コマンドラインの対話式でAPI Gatewayの設定が可能なため、迷わない。手引の通りにやれば良い
- POSTやGETで送られてきた値をよろしくバックエンドのLambdaに渡すように自動でマッピングテンプレートを構成しているため、マッピングテンプレートの設定を考えなくて良い
- CORSにも対応している

### デメリット
- Lambda以外の統合タイプが使えない
- LAmbdaの返り値に応じてヘッダを変えたりといった、複雑な設定は対応できない

## インストール
npmにglobalオプションを付けてインストールしてください。

    $ npm install -g simple-api-gateway
## 使い方
詳しくはREADMEに書いていますが、以下の4つのコマンドを用意しています。
それぞれの操作に応じてコマンドを発行すれば対話形式で設定が可能です。

|役割     |コマンド|
|:-------|:------|
|APIの作成|`$ apigw create`|
|APIの編集|`$ apigw edit`|
|APIのデプロイ|`$ apigw deploy`|
|APIの削除|`$ apigw delete`|

## 今後の課題
~~まだ、ローカルだけでAPI Gatewayのすべての操作が完結できる状態ではないので、そこまでもっていきたいっすね。具体的にはcorsの設定とか、mapping templateの設定とか。
最低限の機能だけ提供して、より簡単にローカルだけで完結出来るようにしたいです。~~
↑
今のバージョン0.1.7ではできるようになりました。
今は対話での設定に合わせて、できるだけ簡単なyamlファイルで継続的な運用管理が出来るように開発を進めいています。

それでは良いAPI Gatewayライフを！
Mavenのdependencyに、p2リポジトリにあるjarを加える

前提
----
Eclipse/Tycho を使うと、<repository>にlayout=p2を指定でき、p2リポジトリの中にある OSGi bundles を Maven 内で使える。

Xtext でのコード生成には MWE2 が用いられており、Maven を用いたビルドでは exec-maven-plugin 経由で OSGi とは無関係な Java アプリケーションとして実行される。

Xtext の高度な利用では、サードパーティが作成した EMF モデル/バンドルを使う場合がある。

環境は mvn: 3.0.5、Tycho: 0.23.1、Xtext: 2.9.2


課題
----

exec-maven-plugin の dependency に P2 リポジトリ内にある OSGi bundle を加えたい。

検討
----

OSGi には、Maven での artifactId に相当する Bundle-SymbolicName は存在する。しかし、groupId の概念は無い。

試しに `mvn dependency:tree` を実行してみる。

```
[INFO] +- p2.eclipse-plugin:org.eclipse.sphinx.emf:jar:0.8.1.201409171422:system
```

なるほど、`p2.eclipse-plugin` が groupId か?

```
<!-- snip -->
    <plugin>
      <artifactId>exec-maven-plugin</artifactid>
<!-- snip --->
        <dependencies>
          <dependency>
            <groupId>p2.eclipse-plugin</groupId> <!-- bingo? -->
            <artifactId>org.artop.aal.autosar421</artifactId>
            <version>4.4.1.201503251636</version>
          </dependency>
        </dependencies>
<!-- snip -->
```

でも、これは誤り。

正解
----

`~/.m2/repository` を見ると、取得した p2/osgi/bundle というディレクトリがある。
(`p2/eclipse-plugin` というディレクトリは無い)

そこで…

```
<!-- snip -->
    <plugin>
      <artifactId>exec-maven-plugin</artifactid>
<!-- snip --->
        <dependencies>
          <dependency>
            <groupId>p2.osgi.bundle</groupId> <!-- Bingo! -->
            <artifactId>org.artop.aal.autosar421</artifactId>
            <version>4.4.1.201503251636</version>
          </dependency>
        </dependencies>
<!-- snip -->
```

が、正解、っぽい。

注意
----

このような dependency の記述では、OSGi bundle は単に jar ファイルとして解釈されているようだ。MANIFEST.MF にある記述を用いた依存性解決は**してくれない**ようなので、地味に頑張るしか無い、っぽい。

p2 リポジトリには `-SNAPSHOT` の概念は無い。よって、バージョンの qualifirer は厳密に指定する必要がある。

別段の指定がない場合、 groupId として p2 osgi.bundle を指定しても、ローカルの m2 リポジトリに groupId 付きの m2 artifacts がある場合には、そちらを優先して参照しに行く。(これ、なんとなく仕様のバグではないかという気もするけれども…)
'Native kernel (python2) is not available'

###
When you got Warning : 'Native kernel (python2) is not available'
with jupyter notebook...

```
pip uninstall backports.shutil_get_terminal_size
```
```
Uninstalling backports.shutil-get-terminal-size-1.0.0:
  /usr/lib/python2.7/site-packages/backports.shutil_get_terminal_size-1.0.0.dist-info/DESCRIPTION.rst
  /usr/lib/python2.7/site-packages/backports.shutil_get_terminal_size-1.0.0.dist-info/INSTALLER
  /usr/lib/python2.7/site-packages/backports.shutil_get_terminal_size-1.0.0.dist-info/METADATA
  /usr/lib/python2.7/site-packages/backports.shutil_get_terminal_size-1.0.0.dist-info/RECORD
  /usr/lib/python2.7/site-packages/backports.shutil_get_terminal_size-1.0.0.dist-info/WHEEL
  /usr/lib/python2.7/site-packages/backports.shutil_get_terminal_size-1.0.0.dist-info/metadata.json
  /usr/lib/python2.7/site-packages/backports.shutil_get_terminal_size-1.0.0.dist-info/top_level.txt
  /usr/lib/python2.7/site-packages/backports/__init__.py
  /usr/lib/python2.7/site-packages/backports/__init__.pyc
  /usr/lib/python2.7/site-packages/shutil_backports/__init__.py
  /usr/lib/python2.7/site-packages/shutil_backports/__init__.pyc
  /usr/lib/python2.7/site-packages/shutil_backports/get_terminal_size.py
  /usr/lib/python2.7/site-packages/shutil_backports/get_terminal_size.pyc
Proceed (y/n)? y
  Successfully uninstalled backports.shutil-get-terminal-size-1.0.0

```

```
pip install backports.shutil_get_terminal_size
```
```
Collecting backports.shutil_get_terminal_size
  Downloading backports.shutil_get_terminal_size-1.0.0-py2.py3-none-any.whl
Installing collected packages: backports.shutil-get-terminal-size
Successfully installed backports.shutil-get-terminal-size-1.0.0

```

```
ipython kernelspec install-self
```
```
[TerminalIPythonApp] WARNING | Subcommand `ipython kernelspec` is deprecated and will be removed in future versions.
[TerminalIPythonApp] WARNING | You likely want to use `jupyter kernelspec` in the future
[InstallNativeKernelSpec] WARNING | `jupyter kernelspec install-self` is DEPRECATED as of 4.0. You probably want `ipython kernel install` to install the IPython kernelspec.
[InstallNativeKernelSpec] Installed kernelspec python2 in /usr/local/share/jupyter/kernels/python2

```

```
ipython kernel install
```
```
Installed kernelspec python2 in /usr/local/share/jupyter/kernels/python2

```
新人プログラマが知るべきプログラミングの原則６選！

#この記事について
この記事は筆者がプリンシプルオブプログラミングを読んで、備忘録的にまとめたものです。
これから紹介する６つの原則を用いて、「よいプログラマ」に近づきましょう！

#新人プログラマが知るべきプログラミングの原則7選
##KISS
>Keep It Simple,Stupid
>シンプルにしておけ、愚か者よ

コードを書くとき、「単純性」や「簡潔性」を最重要項目ということ。

コードは、自然に任せて修正していくと、無秩序になり、複雑になる。その結果、読みにくく、修正しにくくなっていく。コードをシンプルに保つことで、修正に容易にすることができる。

具体的には、プログラミングをする際に、「動作させるために、もっともシンプルなものは何か」と常に問いかけることが必要である。

##DRY
>Don't Repeat Yourself.
>繰り返すな。

同じコードを重複して書くなということ。

なぜかというと、コードの改善が難しくなるからである。まず、同じコードが複数あると、量的に「より多く」、質的に「より複雑」になるため、コードを読む作業が難しくなる。また、修正するときにも、一つ直すときにも、重複して書いたコードに対しても漏れなく直さなければならないので大変である。

具体的には、処理のまとまりには「関数化」「モジュール化」をし、データは名前をつけて定数を定義することで重要である。
##YAGNI
>You Aren't Going to Need it.
>それはきっと必要にならない

コードが必要最低限にしろということ。

あらかじめ、いろいろな事態に備えてコードを盛り込んでおいても、結局は利用されないことが多い。そして、それによってコードに「余計な」複雑性を盛り込んでしまうことになり、KISSに思想にも反することになる。つまり、予想が外れた場合、時間が無駄になるどころか、邪魔にもなってしまうのである。そして、単純なコードの方が、汎用性が高いことさえある。

具体的には、汎用性よりも、単純性を考えることが重要。コードは「今」必要なものだけにすること。
##PIE
>Program Intently and Expressively
>意図を表現してプログラミングせよ

コードは意図を明確に表現するように書くということ。

コードが「人」が読むためのものであり、コードだけがソフトウェアの動作を「正確に」「完全に」知るための手がかりである。よって、ソフトウェアの動作を把握するには、わかりやすいコードを書いて、コードで意図を伝えるしかない。

具体的には、コードを書くときには、「書きやすさ」より「読みやすさ」を重視すること。コードは「書かれること」よりも「読まれること」の方がずっと多いものであるからである。

##SLAP
>Single Level of Abstraction Principle
>抽象化レベルの統一

コードを書くとき、高いレベルの抽象化概念と低いレベルの抽象化概念を分離するようにすること。

コードがレベルに揃った関数に分割されることで、「要約性」「閲覧性」を同時に満たすことができる。同じところには、同じ抽象度の処理といったように、コードが統一されることで、コードはよどみなく流れ、理解しやすくなる。

具体的には、関数を構造化することが重要である。一つの関数で、ある部分ではデータベース接続という低水準の処理を行い、他の部分ではビジネスロジックの実行という高水準な処理行うという書き方はしないことが重要である。

##参考文献
上田勲　『プリンシプルオブプログラミング』 秀和システム
ZYBO / Zynq > 0x0000_0400 > アドレスの表記方法

@ ug585-Zynq-7000-TRM.pdf
14.3.2 GPIO Pin Configurations

> 1. Set the direction as output: Write 0x0000_0400 to the gpio.DIRM_0 register

0x0000_0400 という記載は初めてみた。

以下の（重い）pdfにも記載がある。
http://www.xilinx.com/support/documentation/ip_documentation/axi_ethernet/v6_0/pg138-axi-ethernet.pdf

p.30
> When transmitting frames, the outgoing frame is detected as a VLAN frame by recognizing a VLAN Tag Protocol Identifier value (TPID) in the Type/Length field by comparing it against user defined values in the VLAN TPID Word 0 Register — Offset <font color=red>0x0000_0028</font> in Chapter 2 and VLAN TPID Word 1 Register — <font color=red>Offset 0x0000_002C</font> in Chapter 2. The TPID values are shared between the receive and transmit paths.

> After a VLAN frame is identified, the 12-bit Unique VLAN Identifier (VID) is used to access the TEMAC Receive Configuration Word 0 Register – <font color=red>Offset 0x0000_0400</font> in Chapter 2 to supply a replacement VID value which is substituted into the outgoing frame.

0x0000_0400というのはアドレスの値が0x00000400だと読みにくいから表記上0x0000_0400としているのだろうか？ 実際にVivadoやXSDKで指定する場合も0x0000_0400と指定するのかが未消化。
rubyの%記法にハマった

# 前提

* ruby 2.3.1

# やったこと

```sample1.rb
require 'active_support'
require 'active_support/core_ext/hash/slice'

{ 'key1' => 'hoge', 'key2' => 'fuga', 'key3' => 'piyo' }.slice(*%w( key1 key2 ))
#=> { "key1" => "hoge", "key2" => "fuga" }
```

のようにハッシュから指定したキーのみの部分ハッシュを取得したかった．
この際sliceに渡すキーを```%w(...)```で指定していたつもりが下記のように```%(...)```になってしまっていた

```sample2.rb
require 'active_support'
require 'active_support/core_ext/hash/slice'

{ 'key1' => 'hoge', 'key2' => 'fuga', 'key3' => 'piyo' }.slice(%( key1 key2 ))
#=> { }
```

実行結果にもあるように，実はこれ文法エラーにならない．
区切り文字前が%のみの場合文字列として評価されてしまう．

```sample3.rb
%w( a b c ) #=> ["a", "b", "c"]
%( a b c ) #=> " a b c "
```

なので，sample3.rbは実は下記と等価になり想定外の結果となっていたのでした．

```rb
require 'active_support'
require 'active_support/core_ext/hash/slice'

# キーを２つ指定したつもりが単なる文字列になってしまっていた．．．
{ 'key1' => 'hoge', 'key2' => 'fuga', 'key3' => 'piyo' }.slice(*" key1 key2 ")
#=> { }
```

文法上のエラーではないのでLintで気づかなくてハマった．．．

# おまけ

[日本語ドキュメント](http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fliteral.html#percent)に%記法の区切り文字は%w、%W、%i、%I以外なら改行もいけると書いていたので試してみた

```sample4.rb
x = %
This is a pen!

puts x 
```

```
This is a pen!
```

これはキモい


# 参考

http://ruby-doc.org/core-2.3.1/doc/syntax/literals_rdoc.html#label-Percent+Strings
http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fliteral.html#percent
ZYBO / Zynq > IOB > I/O Buffer

@ ug585-Zynq-7000-TRM.pdf

IOBというのがTRMに出てくる。

TRMの「2.5.7 MIO Pin Electrical Parameters」に以下のように記載があった。

> The MIO_PIN registers include bit fields to control the electrical pin characteristics of each I/O Buffer (GPIOB).

IOBはI/O Bufferの略だった(I/O Busではなかった）。

Xilinx Glossary
http://www.xilinx.com/company/terms.htm#I
には記載なし。
ZYBO / Zynq > Link > APB > Understanding FPGA Processor Interconnects > AXI / AHB / ASB / APB / ATB > Advanced Peripheral Bus (APB) > low bandwidth, transactionなし

ug585-Zynq-7000-TRM.pdfを読んでいる中で出てくるAPBについて調べてみた。

http://electronicdesign.com/fpgas/understanding-fpga-processor-interconnects

> The latest AMBA 4.0 specification defines five interfaces:
- Advanced eXtensible Interface (AXI)
- Advanced High-performance Bus (AHB)
- Advanced System Bus (ASB)
- Advanced Peripheral Bus (APB)
- Advanced Trace Bus (ATB)

> APB connects to AHB and provides a low bandwidth and register interfaces for peripherals like serial ports. It is similar to AHB but less complex, requiring fewer transistors to implement. It doesn’t support transactions such as burst mode and targets smaller width interfaces.

low bandwidth, transactionなし。
技術英語 > Nathie Katzoff > I sleep standing up. / while you are in it, 

Master Craftsman, Nathie Katzoff | HUMAN
https://www.youtube.com/watch?v=m3yVCHj3jA8&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=61
木工技術者の動画。字幕がしっかり付いている。

(3:59-)
Yes, I sleep standing up. 

最近はやっていそうなのは

I code standing up.

<hr>
関連して思い出したのは

https://github.com/qgis/QGIS-Documentation/issues/557
> <font color=red>while you are in it</font>, would you mind to fork the doc repo and
Ecto 2.0 に対応した changeset/2 の書き方

[Changelog for v2.0
](https://github.com/elixir-ecto/ecto/blob/v2.0.0-rc.1/CHANGELOG.md)の[Revamped changesets](https://github.com/elixir-ecto/ecto/blob/v2.0.0-rc.1/CHANGELOG.md#revamped-changesets)に記載がありますが、Ecto 2.0 では changeset/2 の第二引数のデフォルトが :empty から %{} に変更になりました。またそれに伴い、cast/4 も廃止予定となり、cast/3 と validate_required/3 を組み合わせて書くことが推奨されています。

```ex:従来の書き方
def changeset(user, params \\ :empty) do
  user
  |> cast(params, [:name], [:age])
end
```

```ex:Ecto2.0対応版
@params = ~w[name age]a
def changeset(user, params \\ %{}) do
  user
  |> cast(params, @paramas)
  |> validate_required(~w[name]a)
end
```

またこれに伴い、初期表示の時のアクションなど :empty が入ることを期待していた
処理を少し変えてやる必要があります（そうしないと、「メールアドレスが未入力です」のようなバリデーションエラーがいきなり表示されてしまうことになります）。

モデルの changeset/2 のバリデーションを通さない方法は色々あるかと思いますが、個人的には [Ecto.Changeset.change/2](https://hexdocs.pm/ecto/Ecto.Changeset.html#change/2) を利用して、changeset.valid? が true な changeset を生成してしまうのが好みです。こうすることにより、モデルの changeset/2 はデータをPOSTされた後にしか呼び出されないため、バリデーションの処理に集中することができます。

```ex:初期表示の時のアクションの例
defmodule UserController do
  def new(conn, _params) do
    changeset = Ecto.Changeset.change(%User{})
    render(conn, "new.html", changeset: changeset)
  end
end
```
メモ: IE9以降でwebサーバの設定(?)によりiframe内のlocation.reload()をするとブラウザがifameのurlを表示する組み合わせがある

* IE9(win7), IE11(win7, win10)、Edgeで発生を確認。
* chrome, firefox, safari(IOS9.3.2), IE6(xp), IE8(win7) では問題なし。
* apacheは2.2系。
* 同じような現象に遭遇した人用に残しておく。

IEの設定かも(?)

## 現象

iframe内の`location.reload();`を実行すると

![index.png](https://qiita-image-store.s3.amazonaws.com/0/25728/803964b6-3f0b-67fb-9906-5becb72de5ac.png)

iframeだけがブラウザに表示される (ブラウザのURLはiframeのsrc)

![parts.png](https://qiita-image-store.s3.amazonaws.com/0/25728/35749f5f-1696-b91a-d38a-e19794e6f79b.png)

という現象に遭遇。

なおこの現象は`<a href="http://xxx.com/a.html">reload</a>`と書けばフレーム内でリロード問題なかった。

## ソース

```html:index.html
aaa
<iframe src="http://xxx.com/a.html"></iframe>
aaa
```

```html:a.html
<input type='button' onclick='location.reload();' value='reload' />
```

## 組み合わせ

* urlはぼかしています。htmlファイル名は何でも良いです。
* 発生するサーバ内で完結すると発生しない。
* 発生するサーバがからむと発生する。
* 発生しないサーバ同士だと発生しない。

|パターン|有無|
|:--|:--|
| http://xxx.com/index.html で iframe src="http://xxx.com/a.html" の時 | 現象は起きない |
| http://xxx.com/index.html で iframe src="http://hoge.com/a.html" の時 | 発生 |
| http://hoge.com/index.html で iframe src="http://xxx.com/a.html" の時 | 発生 | 
| http://fuga.com/index.html で iframe src="http://xxx.com/a.html" の時 | 現象は起きない | 
| http://xxx.com/index.html で iframe src="http://fuga.com/a.html" の時 | 現象は起きない |
Vagrant上のUbuntu16.0にPHP7+Phalcon2.1.0の開発環境を構築する

Ubuntu 16.04 + PHP7.0.4 + nginx1.10.1 + MySQL 5.7.12 + Phalcon 2.1.0 の環境をVagrantに構築する

ホストOSがWindows10の場合だけ？
vagrant upするとipの固定化に失敗したため、VirtualBoxとVagrantは下記のバージョンにアップデート

##前提条件
- HostOS:Windows 10
- Vagrant 1.8.4
- VirtualBox 5.0.22
- Ubuntu 16.04(bento/ubuntu-16.04)

###Vagrant Box
vagrant boxの作成を行う。
boxは[bento/ubuntu-16.04](https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04)を使用

```
mkdir hoge
cd hoge
vagrant init bento/ubuntu-16.04
```

###Vagrantfileの設定
下記の箇所のコメントアウトを解除

```ruby:Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
```
```ruby:Vagrantfile
  config.vm.provider "virtualbox" do |vb|
#   # Display the VirtualBox GUI when booting the machine
#   vb.gui = true
#
#   # Customize the amount of memory on the VM:
   vb.memory = "1024"
  end
```

###仮想マシン起動,sshログイン
```
vagrant up
vagrant ssh
```

###php等インストール
####パッケージリスト更新
```
sudo apt-get update
```
####インストール
```
sudo apt-get install -y php7.0-fpm php7.0-cli php7.0-curl php7.0-gd php7.0-intl php7.0-pgsql curl vim wget git
```

###Phalconのインストール
```
sudo apt-get install -y gcc make re2c libpcre3-dev php7.0-dev build-essential php7.0-zip

sudo curl -sS http://getcomposer.org/installer | sudo php
sudo mv composer.phar /usr/local/bin/composer

sudo composer global require "phalcon/zephir:dev-master" 

sudo composer require "phalcon/devtools" -d /usr/local/bin/ 
sudo ln -s /usr/local/bin/vendor/phalcon/devtools/phalcon.php /usr/bin/phalcon

sudo git clone https://github.com/phalcon/cphalcon.git -b 2.1.x --single-branch
cd cphalcon/
sudo ~/.composer/vendor/bin/zephir build --backend=ZendEngine3

sudo service php7.0-fpm restart
```

####phalcon.soの設定
```
sudo echo "extension=phalcon.so" >> /etc/php/7.0/mods-available/phalcon.ini
sudo ln -s /etc/php/7.0/mods-available/phalcon.ini /etc/php/7.0/fpm/conf.d/20-phalcon.ini
sudo ln -s /etc/php/7.0/mods-available/phalcon.ini /etc/php/7.0/cli/conf.d/20-phalcon.ini

sudo service php7.0-fpm restart

```

###nginxのインストール
```
curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

sudo sh -c "echo 'deb http://nginx.org/packages/ubuntu/ xenial nginx' >> /etc/apt/sources.list"
sudo sh -c "echo 'deb-src http://nginx.org/packages/ubuntu/ xenial nginx' >> /etc/apt/sources.list"

sudo apt-get update
sudo apt-get install nginx
```

###MySQLのインストール
```
apt-get -y install mysql-server mysql-client
```

###参考
- https://phalconphp.com/en/download
- https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04
- https://gist.github.com/Tosyn/fef6437dd3906ff200e471e478eaae95
- http://qiita.com/tarr1124/items/8276e609c0f7cdec79e7
CentOS6.5にApache2.2.27をyumで簡単インストール

1. 既にApacheがインスールされている場合はアンインストール
`# yum remove -y httpd`

2. EPELリポジトリ導入
`# rpm -ihv http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm`
`# vi /etc/yum.repos.d/epel.repo`
`[CentALT]
name=CentALT Packages for Enterprise Linux 6 - $basearch
baseurl=http://mirror.sysadminguide.net/centalt/repository/centos/6/$basearch/
enabled=0
gpgcheck=0`を追記

3. Apacheインストール
`# yum install -y --enablerepo=CentALT httpd`

4. 設定ファイル変更
`# vi /etc/httpd/conf/httpd.conf`
`Timeout 60
ExtendedStatus On
ServerTokens Prod
ServerName www.example.com:80
ServerSignature Off`

5. 初期ファイル削除
`rm -f /etc/httpd/conf.d/welcome.conf /var/www/error/noindex.html`

6. 起動
`# service httpd start`

7. 自動起動設定
`# chkconfig httpd on`
`# chkconfig httpd --list
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off`

8. 確認
`# httpd -v
Server version: Apache/2.2.27 (Unix)
Server built:   Apr  9 2014 22:08:12`

終わり
[Visual Studio Code]ウィンドウ幅の右端で行を折り返す。

ウィンドウの右端で折り返す方法。
次のショートカットでON、OFFのトグルができる。

```
ALT + Z 
```

あとは
メニューバーの「表示」->「折り返しの切り替え」
でも設定できる。
JavaScript - 画像にモザイクかけるライブラリまとめ



![image](https://qiita-image-store.s3.amazonaws.com/0/17342/ee2bdfaa-8bdc-8799-df46-175fef9cb074.png)

https://github.com/williamngan/kubist

---

![image](https://qiita-image-store.s3.amazonaws.com/0/17342/075132b3-3ada-0664-01d4-38ef0fb1f349.png)

https://syncer.jp/how-to-applying-a-blur-to-image-and-text-by-javascript

---

![image](https://qiita-image-store.s3.amazonaws.com/0/17342/c6e71c88-b26b-8128-da58-910ab1acf9c4.png)

http://close-pixelate.desandro.com/

---

![image](https://qiita-image-store.s3.amazonaws.com/0/17342/7e335da3-a026-f26f-3203-5a9426b74b6f.png)

http://www.hp-stylelink.com/news/2014/11/20141107.php#list03
scala - for,if文のまとめて書くやりかた（phpと比較）


```php

$array1 = Array(1,2,3);
$array2 = Array(1,2,3);

1,2,3
2,2,4
3,2,5

for ($i=0;$i<count($array1);$i++) {
  for ($j=0;$j<count($array2);$j++) {
    if( $j % 2 == 0 )
    {
      $a = $i + $j;
      echo $array1[$i] . "," . $array2[$j] . "," . $a . "¥n";
    }
  }
}

foreach( $val as $array1 ){
  foreach( $val2 as $array2 ){
    if( $val2 % 2 == 0 )
    {
      $a = $val + $val2;
      echo $val . "," . $val2 . "," . $a . "¥n";
    }
  }
}

```
```scala

for (val1 <- array1) {
  for (val2 <- array2) {
    if (val2 % 2 == 0) {
      val a = val1 + val2
      println(val1 + "," + val2 + "," a)
    }
  }
}

for {
  val1 <- array1
  val2 <- array2 if val2 % 2 == 0
  a = val1 + val2
} {
  println(val1 + "," + val2 + "," a)
}

```
phpでメール送るやーつ


```php

<?php
function send_mail( $subject, $msg_body, $to_addr )
{
	
	//自社の設定（テスト終了後アドレスを変更する！）
	$from_addr='xxxxxxxx.info@xxx.jp';
	$cc_addr  ='xxxxxxxx.info@xxx.jp, XXXXXXX@xxx.jp';
	
//      言語設定は Japanese、内部文字エンコーディングは UTF-8 を使用していることを想定
//     いろいろな文献からuniを使うことにしちゃう。
     mb_language( 'uni' );
     mb_internal_encoding( 'UTF-8' );

     $subject      = mb_encode_mimeheader( $subject, 'ISO-2022-JP-MS', 'UTF-8' );
     $mailto       = $to_addr;
     $body         = mb_convert_encoding( $msg_body, 'ISO-2022-JP-MS', 'UTF-8' );
     $add_headers  = "Content-Type: text/plain; charset=ISO-2022-JP\r\n"
                   . 'From:' . $from_addr;
     if($cc_addr)
       $add_headers.="\r\n". 'Bcc: ' . $cc_addr;
    
     //確認用： echo $msg_body;
    
     return mail( $mailto, $subject, $body, $add_headers, "-f {$from_addr}" );
} 

?>

```
バリデーション一部抜粋



```js
$(function(){
	
	//------------------------------------------------------------------------
	//	Validation
	//	
	//	Emailバリデーションが必要なときはinput要素にクラス名"mail"を付与してください。
	//------------------------------------------------------------------------
	
	(function(){
		
		var $r_input =$('#BasicForm .require, #BasicForm .un_require').find('input, textarea');
		var $r_select=$('#BasicForm .require, #BasicForm .un_require').find('select');
		//↑送信時はイベント発生毎に再チェックする必要があるので、イベントのスコープ内にも書きました
		//↑あと、隠れている要素（.un_requireとしている）ものにも指定したいので追加しました
		
		var $email   =$('#BasicForm input[name="usr_mail"]');
		var $please  =$('#BasicForm .pleaseValidMail');
		
		function checkEmailAddress(str){
		    
		    if(str.match(/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/)==null){
		        return false;
		    }else{
		        return true;
		    }
		}
		
		/*
		$('input[type="submit"]').prop() が正解?
		$('input[type="submit"]').attr({
			'disabled': true
		});*/
		
		$please.hide();//不正なEmailの警告を隠す
		
		///フォーカスアウトした時のイベント
		$r_input.focusout(function(){
			
			if( $(this).val()=='' ){
				
				$(this).css({
					background:'#fcc'
				});
				
			}else if( 
			//emailが不正なら
			$(this).is('.mail') &&
			!checkEmailAddress( $(this).val() ) ){
				
				$(this).css({
					background:'#fcc'
				})
				.next('.pleaseValidMail').show();
				
			}else{
				
				$(this).css({
					background:'inherit'
				})
				.next('.pleaseValidMail').hide();
			}
		});
		
		$r_select.focusout(function(){
			
			if( $(this).find('option').is(':selected')==false ||
			    $(this).find('option').filter(':selected').text()=='-' ){
				
				$(this).css({
					background:'#f33'
				});
			}else{
				
				$(this).css({
					background:'inherit'
				});
			}
		});
		
		///送信ボタンを押された時のイベント（上と同じ働き。.focusout()と.each()が違うだけ。 ）
		$('#BasicForm').submit(function(){
			
			var flag=false;
			
			var $r_input =$('#BasicForm .require').find('input, textarea');
			var $r_select=$('#BasicForm .require').find('select');
			
			$r_input.each(function(){
				
				if( $(this).val()=='' ){
					
					$(this).css({
						background:'#fcc'
					});
					flag=true;
					
				}else if( 
				//emailが不正なら
				$(this).is('.mail') &&
				!checkEmailAddress( $(this).val() ) ){
					
					$(this).css({
						background:'#fcc'
					})
					.next('.pleaseValidMail').show();
					flag=true;
					
				}else{
					
					$(this).css({
						background:'inherit'
					})
					.next('.pleaseValidMail').hide();
				}
				
			});
			
			$r_select.each(function(){
				
				if( $(this).find('option').is(':selected')==false ||
				    $(this).find('option').filter(':selected').text()=='-' ){
					
					$(this).css({
						background:'#f33'
					});
					flag=true;
				}else{
					
					$(this).css({
						background:'inherit'
					});
				}
			});
			
			if(flag){
				$('.finalcheck').show();
			}
			return flag ? false : true ;
			
		});
		
	})();
	
	//------------------------------------------------------------------------
	//------------------------------------------------------------------------
	
	
});
```
cloud9のgitを最新バージョンにする

# 概要
cloud9のgitは1.9.1と古く、何かと作業効率が悪い。このため、gitの最新バージョンをインストールする。cloud9のOSはubuntuなので、ubuntuのgitのバージョンアップの手順をそのまま使う形となる。

# 手順
1. ppaを追加する。
`sudo apt-get install python-software-common`
`sudo add-apt-repository ppa:git-core/ppa`
`sudo apt-get update`

2. gitを最新版にバージョンアップする。
`sudo apt-get install git` 

3. gitのバージョンを確認する。
`git --version`

以上でgitのバージョンが最新になります。
今更ローカルにPHP&MySQLの環境を構築する	

VagrantやDockerといった仮想環境構築ツールがある中で今更あえてローカルにPHPの実行環境を構築する方法について書きたいと思います。
※ Macでの説明になります。

---
### 1.Homebrewをインストールする
Macを買ったらやっておいた方がいいことをはてぶにまとめていますので、こちらを行ってから次に進んでください。
・[oh my zsh 導入手順] (http://ken-sayama.hateblo.jp/entry/2015/08/23/191743)


### 2.brewで色々インストールする
1.でインストールしたbrewでPHP5.6をインストールします。
ターミナルを開き以下

```
brew install php56 git mysql //php5.6、git、mysql
brew list //インストール出来ていればリストに上記が表示されます
brew update //年のためアップデートをしておきます
```

### 3.作業ディレクトリを作る
ターミナルで以下入力

```
mkdir workspace //workspaceディレクトリを作成
cd workspace //workspaceディレクトリに移動
mkdir htdocs //htdocsディレクトリを作成
```

### 4.Apacheの設定をする
ターミナルで以下入力

`sudo vi /etc/apache2/httpd.conf`をします。
そして以下を編集してください。

```
/etc/apache2/httpd.conf
ターミナルで以下


DocumentRoot "/Users/ユーザー名/workspace"
AllowOverride All //htaccessでURLの上書きを許可
Include /usr/local/etc/apache2/2.2/extra/httpd-vhosts.conf //こちらの行のコメントアウトを解除

//編集し終わったら、「esc」キーを押して「:wq」でvimを保存して終了します。
```


### 5.Virtualhostを設定する
`sudo vi /etc/apache2/extra/httpd-vhosts.conf.`と打ち以下を入力します。

```
<VirtualHost *:80>
	ServerAdmin hoge@hoge.com
   	DocumentRoot "/Users/ユーザ名/workspace/htdocs"
   	ServerName localhost
   	DirectoryIndex index.php index.html
   	Errorlog "/private/var/log/apache2/htdocs-error_log"
   	Customlog "/private/var/log/apache2/htdocs-access_log" common
</VirtualHost>

<Directory "/Users/ユーザ名/workspace/htdocs">
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
   	Allow from All
</Directory>
//編集し終わったら、「esc」キーを押して「:wq」でvimを保存して終了します。
```

### 6.hostsを編集する
ターミナルに以下入力。
`sudo vi /etc/hosts`でhostsファイルに以下を追記

```
127.0.0.1 localhost
//編集し終わったら、「esc」キーを押して「:wq」でvimを保存して終了します。
```



### 7.mysqlの設定

・ ユーザー：root
・ パスワード：root
を作成するためにターミナルで以下


```
mysql.server start
mysql -u root
GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY ‘root' WITH GRANT OPTION;
```

### 8.phpが動いているか確認。
ここまで終わったらPHPの動作確認をします。
ターミナルで以下

```
vi /workspace/htdocs/info.php
//ファイルを開いたら以下を入力
<?php
phpinfo();
//上記のみを入力したら、「esc」キーを押して「:wq」でvimを保存して終了します。
```

ブラウザで、http://localhost/ をURLバーに入力して、php.iniの設定が表示されれば完成です。

### 9. 完成後のプロジェクトの配置
以降の開発に関しては、`/Users/ユーザー名/workspace/htdocs`内にphpプロジェクトを入れてhttp://htdocs/でブラウザを開けば実行環境が整います。

### 10.終わりに
さっとPHPの実行環境を作ることを目的に書いてみました。
はしょってしまった箇所もあるので、間違っている箇所などありましたら、コメントをいただけますと幸いです。
.keterファイルの解凍でエラーになる時は

# 現象

Yesodアプリをデプロイするのに便利なketerだが、サーバ上で.keterファイルを解凍に失敗し、デプロイできないことがある。

次のようなログが出力される。

```
Unpacking bundle '/opt/keter/incoming/Main.keter'
  Error occured when launching bundle Main: Codec.Compression.Zlib: incorrect header check
```

# 原因

config/keter.ymlファイルの設定値に不備がある場合に、このようなエラーが出る。
自分の場合、exec の値が間違っていた。

```yaml
stanzas:
  - type: webapp
    exec: <誤ったパスを書いていた>
```


エラーログから推測される原因とかけ離れており、なかなか解消に苦労した。

以下のページで解決策を見つけた。
http://stackoverflow.com/questions/29359038/error-occured-when-launching-bundle-main-keter

さすがStackOverFlow。
Reactでinputを扱う

[Reactでinputを扱う(TypeScript版)](https://qiita.com/takaki@github/items/9ac4e3f1e461fdaf7c30)という改訂版を書きました。

---

input要素をReactで使うとReactがinputを自分でコントロールするので注意が必要。

```jsx
var React = require('react');
var ReactDOM = require('react-dom');

var App = React.createClass({
    render: function() {
        return (
            <div>
                <label>value a</label>
                <input type="radio" name="aradio" value="A" checked="checked" /> <br />
                <label>value b</label>
                <input type="radio" name="aradio" value="B" />
                <hr />
                <label>text input</label>
                <input type="text" name="atext" value="" />
            </div>
        )
    }
});
```
このようにするとラジオボタンの操作はできないしテキストの入力もできない。input要素のvalue属性はstateを通して操作する必要がある。

```jsx
var App = React.createClass({
    getInitialState: function() {
        return {
            radio: "a",
            text: ""
        }
    },
    render: function() {
        return (
            <div>
                <label>value a</label>
                <input type="radio" name="aradio" value="A" checked={this.state.radio === 'a'}
                       onChange={() => this.setState({radio: 'a'})}/> <br />
                <label>value b</label>
                <input type="radio" name="aradio" value="B" checked={this.state.radio === 'b'}
                       onChange={() => this.setState({radio: 'b'})}/> 
                <hr />
                <label>text input</label>
                <input type="text" name="atext" value={this.state.text}
                       onChange={(e) => this.setState({text: e.target.value})}/>
            </div>
        )
    }
});
```
このように`onChange`においてハンドラを記述し，その中で`this.setState`を使ってthis.stateを書き直す形になる。