OmniAICreator/Qiita-1.07M huggingface dataset:
numpy配列への演算でハマった話(+=には気をつけようという話)

# はじめに
本日numpyをゴリゴリいじっていた結果、思っていた挙動と違う挙動で少しハマったのでそのメモです。
先にお断りしておくと、参考にあるstackoverflowと結局は同じことです。

# 前座: よく見る足し算関数
例えば以下のような2つの関数があったとする

```python3
def add(x, y):
  x = x + y

def add2(x, y):
  x += y
```

内部的にx + yと書いたか +=でかいたかでパッと見大きな違いはない。
事実、以下のようにすると

```python3
x = 5
y = 2

add(x, y)
print(x) # => 5

add2(x, y)
print(x) # => 5
```

となり、まぁそりゃそうだな、という感じである。

# 本論: numpy配列で同じことをすると話が違う

しかしここでnumpyを登場させると話がややこしくなる

```python3
x = np.arrange(5)
y = 2

add(x, y)
print(x) # => [0 1 2 3 4]
add2(x, y)
print(x) # => [2 3 4 5 6] 
```
想像とは違い += を使った方は参照元のnumpy配列も変更されています。

# 結論
ということで、numpy配列を用いて演算を行うとき、

- numpy配列 = numpy配列 + 数値 とすると参照元は変更されず、ローカル側しか変更されない
- numpy配列 += 数値 とすると参照元もローカルも変更される

と言った違いがあるため、十分に注意して利用しないと変な挙動になる。
ここでは演算子は+で書いたが、確認した限りでは他の演算子でも同一だった。

# 参考
[- vs -= operators with numpy
](https://stackoverflow.com/questions/9047111/vs-operators-with-numpy)
AngularDartで開発環境と本番環境の設定を変えよう

　本格的にアプリケーション開発をする場合、本番環境とそれ以外で設定（APIの接続先等）を買える必要が出てくると思いますが、AngularDartの場合はビルド時の環境変数にて設定情報を切り替える形になります。

### 手順
　大まかな手順は下記になります。

1. build.yamlを追加
2. dart2js時の設定情報を追加
3. AngularDart側で設定情報を読み込む処理の追加

順を追って説明していきたいと思います。

## 1. build.yamlの追加

　Dartではbuild時に様々な処理を差し込める機構が用意されていて、AngularDartでもいろんな部分でこのbuildシステムが使われています。そしてそのbuildの設定をdefault値ではなく、カスタマイズしたりする場合は`build.yaml`がプロジェクト直下に必要になります。なのでまずはプロジェクト直下に`build.yaml`という名前でファイルを追加しましょう。
　今回の記事の趣旨は設定周りなので、このbuild周りに関してあまり触れませんが、細かく知りたい人は@kyorohiroさんの下記記事が参考になると思います。

- [Dart の BuildRunner を使ってみよう その1](https://qiita.com/kyorohiro/items/a227c5e3b70949f572d8)

## 2. dart2js時の設定情報を追加

　上記で追加した`build.yaml`ファイルを下記のように修正します。

```yaml
targets:
  $default:
    builders:
      build_web_compilers|entrypoint:
        options:
          dart2js_args:
            - -DAPI_URL=http://api-host:80/api
```

　なんかいろいろネストされていて面食らうかもしれませんが、とりあえず今は最後の行以外は何も考えずにコピペしてしまってOKです。最後の行の`- -DAPI_URL=http://api-host:80/api`が重要です。この部分はリリース用の成果物を生成する場合に使用される`dart2js`というコンパイラ（トランスパイラ）に渡す引数になります。ここでビルド時の環境変数を指定する事が可能です書き方は

```
-D<flag>=<value>
```
という書き方になります。なので`-DAPI_URL=http://api-host:80/api`という書き方であれば`API_URL`という名前で`http://api-host:80/api`という値の環境変数を定義するという意味になります。
　`dart2js_args`には環境変数以外にもいろいろ指定する事が可能です。気になる方は[こちら](https://webdev.dartlang.org/tools/dart2js#build-config-usage)を見てみて下さい。

## 3. AngularDart側で設定情報を読み込む処理の追加

　こちらは簡単です。下記のように`String.fromEnvironment`を使って値を取得しましょう。`const`で定数化しておきましょう。

```dart
const apiUrl = String.fromEnvironment('API_URL', defaultValue: 'http://localhost/api');
```
上記の記述の場合、開発時（DDCによるコンパイル）の場合は`defaultValue`で指定した値（`http://localhost/api`）が使われ、リリース時（dart2jsによるコンパイル）には上記`build.yaml`にて指定した`http://api-host:80/api`が使われるようになります。

## 最後に

　AngularDartは本家のチュートリアル等は結構充実しているのですが、こういったプロダクション環境に持っていくために必要な情報だったりはあまりまとまっていなので今回書いてみました。ちなみに上記では単に変数として定義していますが、DIを使ってもっとエレガントに設定情報を変える事も可能です。いつかそのあたりも記事に出来ればなと思っています。
本日学んだこと　Ruby クラス編

クラス・・・車の設計図（車種ごとにクラスがあると考える）
インスタンス・・・設計図から作ることができる具体的な1台１台の車（Aさんが●月に✖️で買った車など）
（ご指摘していただいたが、他に例えて考えるのはあまり良くないことらしい）


クラス　→　インスタンス　を作成する。

```
class Car
 def hello
  puts "hello"
 end
end
```
これがクラス。
そっから、

インスタンスを作成する

```
car = Car.new #←〇〇.newでインスタンスを作れる。これを変数に代入。
car.hello←変数.メソッド名にすることで、呼び出せる。
```
newが使われた時、

```
def initialize←＃initializeという名前のメソッドは、newが使われた時に呼ばれる特殊なメソッド。
end
```
initializeメソッドを呼ぶことができる。

```
class Car
 def initialize(name)
  @name = name
 end　
 def hello
  puts "hello"
 end
end

car = Car.new('Kitt') #←〇〇.newでインスタンスを作れる
car.hello
```
⑴newに引数を渡す
⑵initializeメソッドが呼ばれる
⑶変数nameに引数が渡される
⑷initializeメソッドの中で使用することができる

`
@name←　インスタンス変数
`
インスタンス変数はインスタンス内であれば、どこでも使うことができる。

```
class Car
 def initialize(name)
  @name = name
 end
 
 def hello
  puts "Hello! I am #{@name}."
 end
end


car = Car.new('Kitt')
car.hello
```
これを実行すると、
`Hello! I am Kitt.`
が出力される。
よし！それではMDD(娘運転開発)の事例を教えてやろう

# はじめに

作りたいものがあったり勉強したいけどなかなか時間がとれない令和時代のパパエンジニアが、開発時間を確保するためにやっていることを紹介します。

その名は

**娘運転開発(Musume-drives development)**

です！

> [えっ？YDD(嫁駆動開発)は試したことがないの？](https://qiita.com/jakushin/items/a3964037fd3a36b98570)

この記事がおもしろいなぁと思ったので、自分も娘に置き換えて書いてみました (勝手にパクってすみません)

# アーキテクチャ

- 娘 (炎上中)
    - 1歳8ヶ月
    - イヤイヤ期
    - 猫へのパワハラがひどい
    - とにかくかわいい
- 嫁ポイント
    - 減らさないための努力が必要
- 猫
    - 暴力を振るわれたり、しっぽを掴まれたり、追いかけ回されるようなブラック企業で働いている
    - 上司のパワハラから守ってあげたいがなかなか難しい

# 開発手順

## 娘のことがまずあって、それ終わったら開発。娘運転開発です

1. 朝は6:30に起きて猫の餌を上げたり、娘の保育園の準備
2. 8時過ぎに保育園に娘を送り届け、自分も会社へ
3. 残業はしない　(むしろ1時間早くいってその分早く帰る)
4. 19時付近には家について娘と少し遊んだり、お風呂or歯磨き、寝かしつけとか
5. あと食洗機やキッチンまわりの後片付けや洗濯物たたんだり
6. 21時付近には業務が完了するが、たまに寝かしつけにいったまま自分も寝るミイラ取りバグが発生し、開発時間がとれないことも

早ければ21時半前後に開発を開始することができる

## 休日の開発

日中は娘と遊ぶので精一杯で開発は諦めました。
家にいる場合は、昼寝中などにチャンスはありますが、もろもろやることもあったり、時間もそんなにとれないので、最近は別に無理してPC開かなくても良いかなという感じに
(1歳になる前とかは昼寝が2回あったりしたので多少やってた)

夜は平日と大体一緒ですが、団らんしたりテレビ見たりしてもいいかな。遊んだりする時間も大事なので休日気が向いたらとかノッているとき位でよいかも

## ボーナス開発

月イチ位の頻度で、夫婦お互いに娘を一日片方に預けて自由な日を設けています
その時は集中できる場所へ行って開発したり、もくもく会にいったりします

# まとめ

という感じで、平日は頑張って早くいろいろを終わらせて、終わったときにやる気があればやる。
確保しなきゃって感じではなく、無理なく気長に開発していこうかなって感じです。

基本的には娘が手綱を握っているので、娘駆動ではなく娘運転開発という話でした。
娘の年齢によっては開発スタイルがガラッと変わりそうなので、気が向いたらまた書くかもしれません。
iOSアプリの利用状況分析のためのFirebase Analyticsの設定手順

# はじめに
iOSアプリの改善のために、アプリの利用状況の分析をしたいと思い、Firebase Analyticsを使ってみました。この記事では、Firebase Analyticsのクラウド側の設定と、iOSアプリを作成してFirebase Analyticsでデータが取得できるまでを書いていきます。

基本的には、Firebase Analyticsの説明通りに進めればうまくいきました。１つだけ、はまったところがあったので、それも書いておきます。最後の方は、画面キャプチャを並べてあるので、雰囲気をみたい方は、見てみてください。

Firebase Analyticsで何が見れるかは、[Firebase Console](https://console.firebase.google.com/)にあるデモプロジェクトを見るのがわかりやすいと思います。

# iOSアプリのFirebase Analytics導入手順
1. Firebase Consoleでプロジェクトの作成
2. Firebase Consoleでアプリの登録
3. Swift用のgoogleService-Info.plistをXcodeプロジェクトに登録
4. CocoaPodsでFirebase SDKの追加
 - `pod init` でPodfileを作成
 - Podfileに以下を追加\\
 　`pod 'Firebase/Core'`
 - `pod install` で`.xcworkspace`ファイルの作成
5. `.xcworkspace`ファイルを開いて、AppDelegate.swiftに初期コードを追加。

``` swift
import Firebase // この行を追加

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    FirebaseApp.configure() // この行を追加
    return true
}
```

# はまったところ
初期コード'import Firebase'をAppDelegate.swiftに追加した時に、以下のエラーメッセージが出ました。

```
Could not build Objective-C module 'Firebase'
```

最初は、なかなか原因がわかりませんでしたが、`projectName.xcodeproj`でXcodeを立ち上げていました。
`pod install`で生成した`projectName.xcworkspace`でXcodeを立ち上げたら上記のエラーは出なくなりました。

# 手順(画面キャプチャ付き)
Firebase Analyticsの設定画面のキャプチャです。手順通りに進めていけば、ダッシュボードにアプリの情報が表示されるようになります。
## アプリの追加
ダッシュボードからアプリを追加する。ここでは、iOSを選択。

<img width="300" alt="
20190509-firebase-analytics-install1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/48fb6334-9949-05a4-dd4f-f93761957bd2.png">


## アプリの登録
iOSのバンドルIDを登録する。
<img width="300" alt="
20190509-firebase-analytics-install2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/f1887afa-40e1-6063-b5d2-78abfc8132cf.png">

## 設定ファイル(plist)を追加

<img width="300" alt="
20190509-firebase-analytics-install3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/58958cb4-c009-9306-386b-584bb216f293.png">

## CocoaPodsでFirebaseの設定

<img width="300" alt="
20190509-firebase-analytics-install4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/0969471e-6463-32c1-e5d4-47ee626b2f95.png">

## アプリにFirebase Analyticsの設定を追加
<img width="300" alt="
20190509-firebase-analytics-install5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/0e99635e-6559-5a0e-517b-e6d0d9aa4d95.png">

# 参考文献
- [FireBaseのコンソールページ](https://console.firebase.google.com/)
Japan IT Week 2019春 レポート

# 概要

[Japan IT Week 2019 春](https://spring.japan-it.jp/ja-jp.html) レポートに参加した内容を共有します。
以下で紹介する製品やサービスに関しては個人的な関係は一切なく、見た中で興味があったものをピックアップしたものになります。
それとは別に個人的に今展示会（両会場通して）でよく耳にしたキーワードとしては、「AI OCR」、「RPA」、「チャットBOT」でした。

# レポート

## [Cocktail Cloud](http://www.cocktailcloud.io/ja/)
[namu tech japan社](http://namutech.co.jp/)が提供しているコンテナ向けDevOpsツールです。

### 特徴
異なるコンテナプラットフォーム（AWS、GCP、Azure、VMware、Alibaba、OpenStackなど）を一元管理できる。
システムのメトリックス（k8s標準で提供されている範囲）も統合されている。

### デプロイまでの簡単な流れ
以下のデプロイまでの手順はすべて手作業（WebUI上でポチポチ）で実施されていた

1. githubからソースを取得  
githubのWebhookで自動連携するのではなく、cocktail cloudから手動で実行する
2. コンテナイメージのビルド
3. レジストリに登録
4. 特定のタグバージョンをクラスタにデプロイ

### 価格
クラウド版(Pod単位？)とオンプレ版(cpu単位？)があり、初期費用が必要とのこと。
価格は応相談とのこと。

### 所感
コンテナベースのシステムを複数保守している場合は一元管理できるツールがあることで飛躍的に運用コストを削減できるだろう。
ただ、デモでみれなかったが、権限の仕組みはあるのか？上記のデプロイまでの流れは自動化できるのか？が気になった。

## [mackerel](https://mackerel.io/ja/)

言わずと知れた[hatena社](https://hatenacorp.jp/)のシステム監視サービスです。

### 特徴
国産のクラウド型システム監視サービスです。
なのですべてが日本語対応。
エージェント1つを導入するだけで簡単に監視できる。

### 簡単な機能紹介

- 標準的なメトリックスの監視
- 役割ごとにホストをグルーピング
- カスタムメトリックスは可能
- 外形監視（サービスの死活監視）が追加料金なしで使える
- アラート
- 他システム（Slack、Twilio、PagerDuty）との連携
- クラウドのマネージドサービス対応（EC2、RDSなど）
- API
- ログファイル監視
- 特定のプロセス監視
- 機械学習による障害予測

### 価格
基本的にホスト単位1,800/月ですが、スケールアウトや短時間利用のホストは時間当たりの算出になる。
また、コンテナのマネージドサービスは別料金体系（ちょっと安め）になる。
※[ホスト数の計算方法](https://mackerel.io/ja/docs/entry/faq/contracts/calculate-host-number)

### 所感

システム監視に必要な最低限の機能を有しているので、安心して使える。
料金プランも追加料金が必要なくシンプルである。
Datadogに比べて対応しているマネージドサービス数が少ないので、ニーズによっては対応不可の場合はもあるかもしれないので事前確認は必要。また、AMPもない。
監視対象が一定数以上になりそうになったら、監視システムの冗長化も考慮しないといけなくなるので、そういった場合はクラウド型の監視サービスも検討視野に入れるとよいかもしれない。

## [Protect Cat](https://www.lanscope.jp/cat/special/protectcat/)

MOTEX社が販売しているアンチウイルスソフトです。
※米Cylance社のAIアンチウィルス CylancePROTECT技術を統合している製品です。

### 特徴

- パターンファイルの更新が不要！
- AIによるマルウエアのモデル化  
  WannaCryの出現の1年前のデータモデルですでに防御できたとのこと
- インターネット非接続環境でも利用できる

### 所感

なんと言ってもパターンファイルの更新が不要！というのは楽ですね！と言ってもパターンファイルに代わるデータモデルの更新は必要ですが、おそらく更新頻度がパターンファイルのように毎日ではなく、大きくモデルに変更があった時に更新が必要になるだろう。少なくとも現状の運用負荷（毎週フルスキャンとか）は大きく抑えられると思われる。


## [OutSystems](https://www.outsystems.com/ja-jp/)

ポルトガルのOutSystems社が開発しているモデル駆動型開発ツールです。
国内は伊藤忠テクノソリューションズ社やBlueMeme社が販売している。

### 特徴

- ローコーディングでモデル駆動型の開発ができる  
  ダイアグラム図のように何が、どのケースで、何をするのか？などをモデル化したものです。
  ![alt](http://www.bluememe.jp/outsystems/img/top/top_01.png)  
  ※BlueMeme社のHPより引用
- Cordovaベースのモバイルアプリも同様に作れる
- .NETコードが生成されるため、Windowsが必須  
  将来的に.NET Core対応する予定なので、Linux＋.NET Coreコンテナの運用も可能になる
- DevOpsの一連の流れが組み込まれている
- ユーザからフィードバックの仕組みがある  
  どこの画面のどこがおかしいです。こうしてほしいと報告する機能
- 高品質  
  プログラミングなしの場合は、SQLインジェクションやXSSなどの脆弱性を気にする必要もない  
  オンプレで運用する場合は、アプリケーションよりも上位層（Webサーバ、ミドル、OS）のセキュリティは自己責任になります


### 所感

凝ったことをしないのであれば、圧倒的な速さと高品質で開発できそうだ。
イメージとしてはSalesforceのようにオブジェクト（テーブル）を作ったら、そのオブジェクトにデータを登録するための新規作成画面、変更画面がデフォルトで生成され、必要であればUIをドラッグ＆ドロップで位置調整したり、他のデータソースからデータを引っ張ってくるとかができる。サーバサイドは前述のモデル駆動でビジネスロジックをモデル化していくような感じです。
ただ、Windows環境必須なのとデフォルトでSQL Server?（他のDBに変更も可能）が必要になるので、プランによっては高額になる。
Leetcode #43: Multiply Strings

```swift
func multiply(_ nums1: String, _ nums2: String) -> String {
    if nums1 == "0" || nums2 == "0" {
        return "0"
    }
    var s1 = [Character]()
    var s2 = [Character]()
    if nums1.count >= nums2.count {
        s1 = Array(nums1)
        s2 = Array(nums2)
    }  else {
        s1 = Array(nums2)
        s2 = Array(nums1)
    }
    var answer = Array(repeating: 0, count: s1.count + s2.count + 1)
    for (i, char1) in s1.reversed().enumerated() {
        var carry = 0
        for (j, char2) in s2.reversed().enumerated() {
            let tmp = Int(String(char2))! * Int(String(char1))! + carry + answer[i+j]
            answer[i+j] = tmp % 10
            carry = tmp / 10
        }
        if carry != 0 {
            answer[i+s2.count] += carry
        }
    }
    answer = answer.reversed()
    var zeros = 0
    for num in answer {
        if num != 0 {
            break
        }
        zeros += 1
    }
    answer = Array(answer[zeros...])
    return answer.map { String($0) }.joined()
}
```
WKWebViewから外部リンクが開けない場合の対応(http,https)

WKwebviewからhtmlで作成したサイトを開く際に、外部リンクが開けないことがありました。
http,https共に発生したので、その際に対応した内容をまとめました。

## リンク先がhttpの場合
htmlで下記のようにhttpsのサイトへのリンクを作成していたのですが、webviewから開くと、ロードが終わらずに画面が切り替わらない現象が発生しました。

```html
<a href="http://www.metro.tokyo.jp/">東京都公式ホームページ</a>
```

### ATSを無効にする
ATSを有効にしているとhttpsのみ許可されます。
デフォルトで有効になっているため、こちらの変更をすることでリンクを開けるようになります。

#### デメリット
セキュリティ上全てのhttpサイトを許可してしまうことは良くないです。

### ドメインを指定してATSを無効にする
ドメインを指定して許可をするとセキュリティ的には良いそうです。

#### デメリット
webview側に新しくリンクを作成した場合、アプリ側の修正も必要になります。
運用を考えると、webの修正のためにアプリの修正が発生してしまうことは良くないと思います。

参考
[「http://」のAPIを実行できるようにする(Swift)](https://qiita.com/uhooi/items/68939999c2c31e5f5557)

## リンク先がhttpsの場合
httpsのリンクでも表示ができないパターンがありました。
リンク先に飛ぶと、画面が真っ白になってしまい、戻るボタンを押すと一瞬表示がされたりされなかったりという状態でした。

下記の記事によると、
> リダイレクト関連の通信でhttpがあるとATSによって弾かれてしまうようですね。
> リダイレクト先もException Domainの設定に含めるか、非推奨ですがAllowsArbitraryLoadsをYESにして無効化すると表示できるようになります。

[【Swift】WKWebViewでhttpsのページを表示できない原因（ATS）](https://www.hfoasi8fje3.work/entry/2018/08/28/000943)

## safariで開くようにする
ATSの設定を変更せずに、webviewではなくsafariで開くようにする方法です。

個別ドメインを許可する場合にはwebviewに新しくリンクを変更した時にアプリ側にも変更が必要になってしまいますが、
safariで開くようにしてしまえば、webview側の変更をしてもアプリの変更が必要なくなります。

また、将来的にATSが必須化になるため、できればsafariで開くようにしておくと今後の対応も不要になるかと思います。
[iOS/Android セキュリティガイドライン [iOS] App Transport Security(ATS)](https://qiita.com/alt_yamamoto/items/f67a7ddb6ba13cca7369#ios-app-transport-securityats)


safariで開く対応に関してはstack overflowに上がっていましたので、参考になるかと思います。
[WKWebView open links from certain domain in safari](https://stackoverflow.com/questions/36231061/wkwebview-open-links-from-certain-domain-in-safari)
cron設定メモ



# cronの設定

##エディタで設定

実行コマンド

```
crontab [ -u ユーザ名 ] { -l | -r | -e }
```

option

```
-u: cronを設定するユーザーを指定
-l: cronを一覧で表示
-r: cronの設定を全消去
-e: cronを設定するエディタを起動する
```



###1.エディタを起動

```
crontab -e
```

### 2.設定を記述

以下の書式に従って設定する。

```
分 時 日 月 曜日 <実行コマンド>
```



#### 実行時間を固定して指定

15時になる度に実行

```
0 15 * * * echo "hello."
```



#### 実行間隔を指定

5分毎に実行

```
*/5 * * * * echo "hello."
```



#### 複数時間を指定

午前2時5分と午前2時10分に実行

```
5,10 2 * * * echo "hello."
```



#### 実行時間範囲を指定

午前2時5分、午前3時5分、午前4時5分、午前5時5分に実行

```
5 2-5 * * * echo "hello."
```



上記のように記述したあと、保存してエディタを閉じれば設定完了。



### 設定ファイルの読み込み

設定ファイルを読み込んでcronを設定

```
//ファイル生成
echo '*/5 * * * * echo "hello."' > cron.conf

//読み込み
crontab cron.conf
```



`crontab -e` で設定できるけど、誤って`crontab -r`をすると設定が全部消えて泣くので設定ファイルを用意して読み込むのがベター。



## ファイルで設定

`/etc/cron.d/`に拡張子なしのファイルを置く。

```Go:hello_world
5 2-5 * * * echo "hello."
```



# 設定内容の確認

下記コマンドで設定しているcrontabを確認できる。

```
crontab -l
```



# メール送信機能の停止

cronには実行時にメールを送信する機能がデフォルトで入っている。
不要なので停止したいそんなとき。



## パターン1:MAILTO=""

設定箇所は以下の3つ

・/etc/crontab
・/etc/cron.d/0hourly
・/var/spool/cron/（各ユーザのcrontab）



とりあえず`MAILTO="..."`があればそこを空白を設定する。`MAILTO=""`



## パターン2:crondの設定変更

下記コマンドを打つと

```
sudo cat /etc/sysconfig/crond
```

下記が表示される

```
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS=
```

viでエディタ開いて`"-m off"`を追加する。

```
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS="-m off"
```



**必ずcronデーモンを再起動**する

```
sudo service crond restart
```



# logの出力

## 標準出力

```
/path/script.sh 1> /path/exec.log
```

## エラー出力

```
/path/script.sh 2> /path/error.log
```

## 標準&エラー出力

```
/path/script.sh > /path/both.log 2>&1
```

## 標準&エラー出力(ファイル別)

```
/path/script.sh 1> /path/exec.log 2> /path/error.log
```



# 環境変数

cronの実行は手動でshellを動かす場合とは異なりログイン時に適用される環境変数の設定等は反映されない。

そのため手動でshell叩くと動くけどcronでは動かないみたいな事が起きる。



cron実行時にログイン時と同様に環境変数の設定を反映させたい場合下記のように書いておく。

```
* * * * * bash -l script.sh
```



他にshellに環境変数の設定を書いておく方法とかある。



#補足

・cronのログは標準でメールが実行ユーザーのメールボックスに送信されるらしい。

　EC2だと`cat /var/spool/mail/ec2-user`で見れる。
エンジニアの能力を測りたい時に使えそうな方法

エンジニアの能力を測る時に使えそうな方法を教育学から見つけてきた。そのメモ。

# TL;DR
* 能力を高くするには現地点を知ってそれをよくしていくことが必要。
* 社会で求められる能力は大抵パフォーマンス的な能力。
* パフォーマンス的な能力を規定するのにルーブリックが便利。
* ルーブリックを作るのにもちょっとしたコツがあるよ。

# 能力を測る
エンジニアの能力を高めたいというのは、エンジニアやマネージャーだったら誰だって思うことだろう。
能力を高めるためには**能力を測って、それをより良い方向に持っていく**努力が必要だ。
しかし、そもそも能力って測れるものなの？という疑問がすぐに浮かぶと思う。
まず測定できるかどうか。そこが大事だ。

# 測定しやすい能力と測定しにくい能力
能力は、**計量的に測定できる**ものと**計量的に測定できない**ものに分けられる。
##### 計量的に測定できる能力
計量的に測定できる能力とは測定対象がそのまま数えたり数値にできる能力のこと。
例えば以下のようなもの

* 走る速さ (100m10秒で走れる)
* 英単語の記憶量(500単語覚えている)
* タイプの速さ (3 types/second)
* Githubの連続芝の数(30日)
 
##### 計量的に測定できない能力
計量的に測定できない能力とは測定対象を直接数えたり数値にできない能力のこと。主にパフォーマンス的な能力。
例えば以下のようなもの

* カーブボールを投げられる。
* ５分の英語のプレゼンテーションができる。
* アクセス数がそれほど多くなれけば、ストレスのあまりないWebアプリを作成できる。
* 10人以下のOSSコミュニティの運営ができる。

基本的に計量的に測定できない能力は、測定できるものより複雑。社会的に評価される能力のほとんどがこちらの能力に属している。

# 測定しにくい能力をどう測るか
エンジニアの能力などパフォーマンスに属するものをどのように測るか？考えてみるとパフォーマンスを測るのは学校教育でも行われる。このパフォーマンスを測定するために教育学には**ルーブリック**(または**Can-do list**)というものがある。

> ルーブリック (Rubric) とは、学習到達度を示す評価基準を観点と尺度からなる表として示したものである。主に、パフォーマンス課題を評価するために使われる。
([Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%BC%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF)より引用)

つまり、ある観点（例えば、組織力)に対して尺度として課題(例えば、「2人での共同開発ができる。」「10人以下のOSSコミュニティの運営ができる。」など)を用意してそれを並べて達成度を規定する。
例として英語で用いられるものを示す。([CEFRの資料PDF](https://jfstandard.jp/pdf/CEFR_Cando_Category_list.pdf)より抜粋[^1])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30977/1ccb9161-f108-b30d-1a61-d06a631c70a6.png)
ルーブリックの利点として

* 複雑な能力の測定ができる
* 能力に対しての自信をつけることができる
* 次のステップを見ることができる

というものがあげられる。

# ルーブリックの開発
上で挙げた利点を最大限活かすために、ルーブリックを構成する課題を作成する時にいくつか守ると良いルールがある。以下にそれらをあげる。

* 全て「〜できる」と肯定的な表現で書くこと positiveness
* 具体的な行動に基づいて一義的に書くこと（複数に解釈できるものは書かない) definititeness
* 専門用語を使用しないで明確に書くこと clarity
* できるだけ簡潔に書くこと brevity
* 記述を独立させること independence

上記のルールも含めてルーブリックの開発方法はCEFRの[付録A](https://rm.coe.int/1680459f97#page=206)にある。
[^1]: CEFRとはThe Common European Framework of Reference for Languagesの略でヨーロッパにおける言語(英語に限らない)学習教育における共通フレームワーク。taskを中心に考えを構成してある。日本の英語教育においてのスタンダードの一つ。
Apacheを使ってLaravelのページを表示できない時の対応方法

# 事象1 : ページにアクセスしたら`404 Not Found`になった
![スクリーンショット 2019-05-09 21.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/20faf46d-7340-39e3-b5f9-f87d5f11787d.png)

## 原因1.1 : Apacheの設定(httpd.conf等)で`AllowOverride`が`All`になっていないから
`AllowOverride`に`None`が指定されていることでドキュメントルートとなるpublicディレクトリ配下の`.htaccess`の使用が許可されていないから。

### 対応方法 : `AllowOverride`に`None`が指定されていると`.htaccess`の使用が禁止された状態となっているので`All`へ設定してApacheを再起動する
[Laravelでルーティングをしているはずが404エラー？ - Qiita](https://qiita.com/msht0511/items/b32122413745d0a3d50a)

```conf:httpd.conf
<Directory "/path/to/public">
    AllowOverride All
</Directory>
```
## 原因1.2 : Apacheの設定(httpd.conf等)でmod_rewriteモジュールを有効になっていないから
> Apache
> LaravelをApache上で動作させるときは、確実にmod_rewriteモジュールを有効に設定し、そのサーバで.htaccessファイルを動作させます。
> [インストール 5.7 Laravel の きれいなURL](https://readouble.com/laravel/5.7/ja/installation.html#installing-laravel)

### 対応方法 : `mod_rewrite.so`を有効にしてApacheを再起動する

```conf:httpd.conf
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
```

## 原因1.3 : Webサーバが書き込みするディレクトリに権限が付与されていないから
> ディレクトリパーミッション
> Laravelをインストールした後に、多少のパーミッションの設定が必要です。`storage`下と`bootstrap/cache`ディレクトリをWebサーバから書き込み可能にしてください。設定しないとLaravelは正しく実行されません。
> [インストール 5.7 Laravel の 設定](https://readouble.com/laravel/5.7/ja/installation.html#installing-laravel)

### 対応方法 : 権限を付与する

```bash:本当は777ではなく最低限にします
$ chmod -R 777 storage/
$ chmod -R 777 bootstrap/cache/
```

# 事象2 : ページにアクセスしたら`500 Internal Server Error`になった
![スクリーンショット 2019-05-09 22.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/f6c3db7c-718b-2f6b-b6ed-481c8c7b2ffb.png)
## 事象2.1 : リダイレクトで無限ループが発生している
補足 : Apacheのerror_logのファイルパスはhttpd.confに`ErrorLog`として定義されている

```text:error_log
AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
```
### 原因2.1 : `.htaccess`に`RewriteBase`が定義されていないから
[apache - Laravel sends the server on 10 redirects? - Stack Overflow](https://stackoverflow.com/questions/16885467/laravel-sends-the-server-on-10-redirects)
対応方法 : `RewriteBase`を定義する

```text:.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
...省略
```
1 日 1 Qiita 活動をはじめよう

株式会社オズビジョンのユッコ (@terra_yucco) です。
2018 年から 2019 年になる年末はインフルエンザで臥せっており、とても新年の目標とか立てられる状況ではなかったので、この GW に大掃除もして抱負を固めました。
それが【 1 日 1 Qiita 】となります。

# 1 日 1 Qiita
## 目的

私は自分の所属している会社・チーム・プロダクトが大好きです。
また、日々の業務で学ぶことはとてもたくさんあります。
なので自分の「会社・チーム・プロダクト」や「日々の学び」をもっと広く知ってもらうため、日々の業務をベースにゆるっと書いてみようかと思いました。
私自身がエンジニアのため、学びを得られるのはやはりエンジニアリング領域が多いですし、同じエンジニアに見てほしいので、プラットフォームに Qiita を選びました。

## 計画

毎日 1 記事書く。以上。

：
：
：

というだけでは不足で、例えば業務をベースにするなら土日祝は書きにくいですし、忙しい日もあって書けないこともあるかもしれません。

## Next Action

「めんどくさいをめんどくさくなくする」スキルがあるはずのエンジニアなので、まずはこれを無理なく続ける方法を考えていこうと思います。
Leetcode #38: Count and Say

```swift
func countAndSay(_ n: Int) -> String {
    if n == 1 {
        return "1"
    }
    var answer = "1"
    for _ in 1...n-1 {
        var ar = [Int]()
        var num = answer.first!
        var count = 1
        for char in answer.dropFirst() {
            if char == num {
                count += 1
            } else {
                ar.append(count)
                ar.append(Int(String(num))!)
                num = char
                count = 1
            }
        }
        ar.append(count)
        ar.append(Int(String(num))!)
        answer = ar.map{String($0)}.joined()
    }
    return answer
}
```
Windows ファイル拡張子を表示する .txtを表示させる ～画像付き解説～

# 目的
- Windowsでファイルの拡張子を表示させる  

# この記事のターゲット
- Windowsでファイル名の後に拡張子(.txt)が表示されなくて困っている方  

# 実施方法
1.「Windowsキー」+「Eキー」を押してエクスプローラを起動させる

1. 下記画像の赤矢印部分の「表示」をクリックする
![ファイル拡張子01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9582c05f-3028-c82e-1035-aa79be16aeae.png)

1. 下記画像の帯が出てきたら赤矢印部分の「ファイル名拡張子」のチェックボックスにチェックを入れる
![ファイル拡張子02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f8456247-c059-ddf5-98da-b0c78bd0fb06.png)

1. ファイル名に拡張子が表示されたことを確認する
![ファイル拡張子03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6304e668-15c1-1ca6-4f0d-0b62c8a46609.png)

# まとめ
PCを買い替えたときなどに初期設定でファイル名拡張子にチェックが入っておらず一瞬戸惑った
本手順を踏めば拡張子を表示させることが可能
TypeScriptでSSHポート転送する

JavaScript (TypeScript) でSSHポート転送するには [tunnel-ssh](https://www.npmjs.com/package/tunnel-ssh) を使うとよい。[tunnel-ssh](https://www.npmjs.com/package/tunnel-ssh) は [ssh2](https://www.npmjs.com/package/ssh2) のポート転送機能を使いやすくしたライブラリである。

### 実装例

#### Tunnel.ts

```typescript
import * as tunnel from 'tunnel-ssh';

interface Config {
    host: string;
    port: number;
    username: string;
    password: string;
    localPort: number;
    dstHost: string;
    dstPort: number;
}

class Tunnel {
    private static connections: any[] = new Array<any>();

    public static async createConnection(config: Config) {
        var tnl = tunnel(config, (error, tnl) => {
            if (error) {
                throw new Error(error);
            } else {
                this.connections.push(tnl);
            }
        });
    }

    public static async closeAllConnections() {
        this.connections.forEach(tnl => {
            tnl.close();
        });
    }
}

export default Tunnel;
```

#### 使い方

```typescript
await Tunnel.createConnection({
    host: 'sshd.example.com',
    port: 22,
    username: 'username',
    password: 'password',
    localPort: 10080,
    dstHost: 'dst.example.com',
    dstPort: 80           
});

// ここでコネクションを使う通信処理を行う。

await Tunnel.closeAllConnections();
```
matplotlibのヒストグラムに枠線をつける

# 枠線あり
![plot_out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/147fef7f-a9c0-f711-e9cd-a938c6ead0b3.jpeg)

```python:histogram
#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt

# prepare test data
data=np.random.randn(1000)

# histogram
fig=plt.figure(figsize=(5,2.5))
ax=fig.add_subplot(111)

ax.hist(data, color='yellow')  # histogram
ax.hist(data, histtype='step', color='k', stacked=True, linewidth=0.5)  # ヒストグラムに枠線をつける

plt.savefig('plot_out.pdf')
```

# 追記 (2019/5/16)
下のコメントでnkayさんからいただいた情報。
この1行で枠線付きヒストグラムが可能。
簡潔で素敵です！

```python
ax.hist(data, histtype='stepfilled', color='yellow', ec='k', lw=0.5)  # 枠線付きヒストグラム
```

# 環境
Ubuntu 18.04
Python 3.7.2
matplotlib 3.0.3
seaborn 0.9.0
numpy 1.15.4
Go言語でgRPCを使用した際の動作確認にgrpcurlを使ってみた


## サーバのTLS起動など

gRPCを使用する際は、平文での通信とTLSでの通信の２パターンがあります。

grpcurlの使い方も、サーバーがどちらで起動しているか？によって変わります。

この記事は文献が少なかったような気がしたので、TLSメインで書きます。

## 事前準備

- ドメインの取得（テストするだけなら無料ドメインでおｋ）
- 証明書の取得（テストするだけなら無料のLet's Encryptでおｋ）

## 証明書関連ファイルの用意

- ca.crt（grpcurlなどクライアントが使う）
- hoge.pem（サーバが使う証明書ファイル）
- hoge.key（サーバが使う暗号キーファイル）

下記に上記の証明書一式があります。動かなくてどんな中身か？見たい場合は良いかもしれません。
https://github.com/grpc/grpc-go/tree/master/testdata

## Go言語が必要なので下記からインストールする。

[https://golang.org/dl/](https://golang.org/dl/)

## grpcurlインストール

https://github.com/fullstorydev/grpcurl

## serverコード

https://github.com/grpc/grpc-go/blob/master/examples/route_guide/server/server.go

```golang
package main

import (
	"context"
	"log"
	"net"

	// helloworldのサンプルでprotoファイルから生成したコードを使用
	// ソース：https://github.com/grpc/grpc-go/tree/master/examples/helloworld/helloworld
	// リフレクションの設定があるのでgRPCの動作のみ見たい場合は、消してもおｋです。
	pb "grpc-sample/src/grpc/helloworld"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/peer"
	"google.golang.org/grpc/reflection"
)

func main() {
	log.Println("start!!")

	var err error

	// TCPサーバ
	// tcpServer, err := net.Listen("tcp", ":443") // この指定だとtcp6になる。。
	tcpServer, err := net.Listen("tcp4", ":443")
	if err != nil {
		log.Fatalln(err)
	}

	creds, err := credentials.NewServerTLSFromFile(
		"hoge.crt",
		"hoge.key",
	)
	if err != nil {
		log.Fatalf("Failed to generate credentials %v", err)
	}

	// 複数指定予定なので、配列扱い
	opts := []grpc.ServerOption{
		grpc.Creds(creds),
	}

	grpcServer := grpc.NewServer(opts...)

	pb.RegisterGreeterServer(grpcServer, &HelloService{})

	// ※メソッドリストを表示するため必要（本番では不要）
	reflection.Register(grpcServer)

	grpcServer.Serve(tcpServer)
}

// HelloService .
type HelloService struct{}

// SayHello .
func (s *HelloService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
	p, _ := peer.FromContext(ctx)
	response := new(pb.HelloReply)
	response.Message = req.Name + p.Addr.String()
	return response, nil
}
```

## grpcurl

```bash
# certファイルを使ったメソッドリスト表示
$ ~/go/bin/grpcurl -cacert ca.crt example.com:443 list
grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter

# 証明書チェック無し（暗号化あり）でメソッドリスト表示
$ ~/go/bin/grpcurl -insecure example.com:443 list
grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter

# certファイルを使ったリクエスト
$ ~/go/bin/grpcurl -cacert ca.crt -d '{"name": "Morix"}' example.com:443 helloworld.Greeter/SayHello
{
  "message": "Morix ipaddress:62709"
}

# 証明書チェック無し（暗号化あり）で送るリクエスト
$ ~/go/bin/grpcurl -insecure -d '{"name": "Morix"}' example.com:443 helloworld.Greeter/SayHello
{
  "message": "Morix ipaddress:61815"
}

```

## はまったところ

```bash
$ ~/go/bin/grpcurl -plaintext example.com:443 list
Failed to dial target host "example.com:443": context deadline exceeded
```

タイムアウトエラーになった。。なんでや？と思ってヘルプ見たら。

```bash
-plaintext
    	Use plain-text HTTP/2 when connecting to server (no TLS).
```

ばっちり書いてありますね。。

## 暗号化状態かどうか？の確認

下記のようにしてパケットを表示しておいて通信すれば暗号化状態かどうか？確認できます。

```bash
sudo tcpdump -s0 -i eth0 -X port 443
```

## 最後に

grpcurlのおかげで疎通確認やテストがしやすくて良いですね。

ブラウザとcurlなど、ツールの豊富なhttp系プロトコル比べて、gRPCは辛かったのですがこれで開発がしやすくなりますね＾＾
Leetcode #50: Pow(x, n)

```swift
 func myPow(_ x: Double, _ n: Int) -> Double {
     return n >= 0 ? power(x, n) : 1/power(x, abs(n))
 }
 
 private func power(_ x: Double, _ n: Int) -> Double {
     if n == 0 { return 1 }
     if n == 1 { return x }
     
     if n % 2 == 0 {
         return power(x*x, n/2)
     } else {
         return power(x*x, n/2) * x
     }
 }
```
ローカルサーバに置いたHTMLファイルが画像を認識しない、CSSが読み込まれない

表題の通りの問題が発生し、解決したのでまとめます。
この問題を解決してくれた未来電子テクノロジーの畑野さんにはこの場をお借りして改めて感謝申し上げます。

#結論
cgi-binディレクトリ下のファイルはcgiファイルとして扱われるのでここに画像ファイルを置いても画像と認識してくれないし、cssファイルをcssとして認識してくれない。

#前提の環境
概ね[この記事](https://qiita.com/okhrn/items/4d3c74563154f191ba16)の通りの環境です。
pythonでサーバを立て、cgi-binディレクトリ下にpngファイルやcssファイルを置いていました。

#ディレクトリ構造
####解決前
```
Name/
　└web/
     └cgi-bin/
            ├index.py
            ├stylesheet.css
            └twitter.png
```
####解決後
```
Name/
　└web/
     ├cgi-bin/
     │      └index.py
     ├stylesheet.css
     └twitter.png
```

#サンプルコード

```py:index.py
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

print("Content-type: text/html; charset=utf-8")

print(
   """
    <!DOCTYPE html>
    <html lang="en" dir="ltr">
      <head>
        <meta charset="utf-8">
        <title>index</title>
        <link rel="stylesheet" href="stylesheet.css">
      </head>
      <body>
        <p class="change-color">色を変える</p>
        <p>↓画像を表示</p>
        <img src="twitter.png" alt="">
      </body>
    </html>
     """
)
```

```css:stylesheet.css
.change-color{
  color:red;
}
```

####解決前

```py:index.py
<link rel="stylesheet" href="stylesheet.css">
<img src="twitter.png" alt="">
```

####解決後

```py:index.py
<link rel="stylesheet" href="../stylesheet.css">
<img src="../twitter.png" alt="">
```

パスを変えただけです。

#実行結果
####解決前
![before.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/9f66fc2c-b728-8e9d-ef6e-769e5166e13a.png)


####解決後
![after.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/f65b07af-b6d2-06b2-8c80-25fbd0b76257.png)
親クラスから派生クラスのメソッドを呼ぶ

##前書
抽象クラス的なことがしたかったので

##呼び方
非staticメソッドからstaticメソッドを呼ぶ場合のみ呼び方が異なる
「非staticメソッドから非staticメソッド」と「staticメソッドからstaticメソッド」の呼び方は同じ
何が起きているかはなんとなく分かるけど、もっとわかりやすくならなかったものか

```JavaScript
"use strict";
class Parent {
	static yourMethod(msg){
		this.hisMethod(msg);
	}

	myMethod(msg){
		this.constructor.hisMethod(msg);
		this.herMethod(msg);
	}
}

class Child extends Parent {
	static hisMethod(msg) {
		console.log('Child static', msg);
	}

	herMethod(msg){
		console.log('Child instance', msg);
	}
}

Child.yourMethod(1);//Child static 1

const child = new Child(); 

child.myMethod(2);//Child static 2, Child instance 2
    
```
firebase-tools(v6.9.1)でfirebase serve --only functionsを実行するとエラー

2019/05/09現在の最新バージョンであるv6.9.1で実行するとエラーが出て進めなかったのでメモ。

この事象は既にIssuesの中で議論されているので近い内にfixされると思われる。

Issues
https://github.com/firebase/firebase-tools/issues/1262

一時的な解決策として、firebase-toolsのバージョンを6.8.0に戻すとエラーは解消される。6.8.0より後のバージョンについて。6.9.0が2019/05/07, 6.9.1が2019/05/09にリリースされているのでこの日以降にダウンロードした人は要注意。

## エラーの内容

### 動作環境

MaxOS Mojave
node v8.16.0
firebase v6.9.1

```
$ firebase serve --only functions
✔  functions: Using node@8 from host.
✔  functions: Emulator started at http://localhost:5001
i  functions: Watching "/Users/xxx" for Cloud Functions...
⚠  The Cloud Functions emulator requires the module "firebase-admin" to be installed. This package is in your package.json, but it's not available. You probably need to run "npm install" in your functions directory.
i  functions: Your functions could not be parsed due to an issue with your node_modules (see above)
```
`npm install`を実行してもエラーは解消されない（`node_modules`を削除して実行しても同じ）

### 解決策

```
npm uninstall -g firebase-tools
npm install -g firebase-tools@6.8.0
$ firebase -V
6.8.0
```
Mathematicaでフラクタルの世界を探検する

#Mandelbrot集合#
Mandelbrot集合とは、複素平面上の原点に対し、複素数の写像 $z \to z^2+c$を繰り返し適用したときに、zが発散しないようなcの集合です。色付けは発散するスピードによって決めます。

まずあるcに対し、発散にかかる時間を計算する関数`EscapeTime`を作ります。

```
EscapeTime = 
  Compile[{{c, _Complex}, {rmax, _Real}, {nmax, _Integer}}, 
   Block[{z = c, n = 1}, 
    While[Abs[z] <= rmax && n < nmax, z = z^2 + c; n++]; n], 
   RuntimeOptions -> "Speed", CompilationTarget -> "C", 
   RuntimeAttributes -> Listable, Parallelization -> True];
```
+ `rmax`：zの絶対値がこの値を超えたときに発散したと判定します
+ `nmax`：写像の繰り返し数の上限

高速化のため絶対に`Compile`を使いましょう。オプションの説明は以下のとおりです。

+ `RuntimeOptions -> "Speed"` オーバーフローの検知を省く代わりに高速化されます。
+ `CompilationTarget -> "C"` コードが10倍ほど速くなります。
+ `RuntimeAttributes -> Listable` この関数に複数のcのリストを渡すと、それぞれの計算結果がリストになって返ってきます。
+ `Parallelization -> True ` 複数のCPUコアを使って並列計算してくれます。

次にMandelbrot集合を描画する関数 `Draw`を作ります。
`DensityPlot`は遅いので使わないでください。配列を作成してArrayPlotで描画します。

```
Draw[center_, radius_, n_, rmax_, nmax_, size_] :=
  Module[
   {array = Reverse@Table[x + I y,
       {y, center[[2]] - radius, center[[2]] + radius, 2*radius/n},
       {x, center[[1]] - radius, center[[1]] + radius, 2*radius/n}]
    },
   ArrayPlot[
    EscapeTime[array, rmax, nmax],
    ColorFunction -> ColorData[{"SunsetColors", "Reverse"}],
    ImageSize -> size,
    Frame -> None,
    PlotRangeClipping -> False
    ]
   ];
```
+ `center`：描画する領域の中心座標
+ `radius`：描画する範囲
+ `n`：画像の縦横のピクセル数
+ `rmax`：発散の判定に使う値
+ `nmax`：繰り返し数の上限
+ `size`：画像のサイズ

###実行結果###
<img width="545" alt="mb.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178902/b6ac3ed1-84f7-51ec-baae-d4106ef93db8.png">

##Manipulateを使った簡易GUIの作成##
ここからがMathematicaの本領発揮です。
Manipulateを使ってMandelbrotを拡大したりできる簡易GUIを作りましょう。

```
Manipulate[
 cent = 0.5*{n, n};
 p = {x, y};
 image = Draw[p, radius, n, escapeRadius, maxIteration, size];
 q = cent;
 image
 ,
 {radius, 0.5 \[Pi]},
 {escapeRadius, 2},
 {maxIteration, 100},
 {n, 500},
 {size, 500},
 {x, 0},
 {y, 0},
 {{q, cent}, Locator},
 Row[
  {
   Button[
    "Zoom in", ({x, y} += (q - cent)*2 radius/n; radius *= 0.25;)],
   Button["Zoom out", ({x, y} += (q - cent)*2 radius/n; radius *= 4;)],
   Button["Reset", ({x, y} = {0, 0}; radius = 0.5 \[Pi];)]
   }
  ],
 Initialization :> {
   cent = 0.5*{n, n};
 ]
```
###実行結果###
マウスでマーカーを動かしてZoom inボタンを押すと、その点が拡大されます。
パラメータは全て直接入力できるので、低解像度でおもしろそうな場所を探して、いい点が見つかったら高解像度で描画し直すということもできます。

<img width="862" alt="mb2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178902/81140750-4c19-9ca2-3da7-e1732c9a029b.png">

#他の写像を使ったフラクタル#
ここからMathematicaの本当の本領が発揮されます。
Mandelbrot集合はは $z \to z^2+c$という写像を使いましたが、ここの式を変えると別の形のフラクタルができます。

最後に自分が見つけたいろんなフラクタルを紹介します。
ありがとうございました。
$z \to z^i + c$
![x^i_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178902/d8940aa3-f0ed-d882-6966-eb3be46b5bba.png)

$z \to \exp(z^{-2}) + c$
![mb3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178902/30c332ec-ff60-7eb9-709b-ca42173359f8.png)

$z \to z^c$
![mb4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178902/c55fe73d-33bc-e109-c931-ad22206cc8ab.png)
AWS LambdaFunctionのS3イベントの対象バケットは同一テンプレート内で定義したものしかサポートしない!

#きっかけ
S3へのファイル格納をトリガーとしたLambdaFunctionを作成した。

そして
運用自動化のため、SAMのファイルに定義を記述していざ、
デプロイしようとしたときである

#問題発生
下記のエラーが発生した

```
Transform AWS::Serverless-2016-10-31 failed with: Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [hoge] is invalid. Event with id [hogeUpload] is invalid. S3 events must reference an S3 bucket in the same template.
```

よくよく見てみると

`S3 events must reference an S3 bucket in the same template.`

「同じテンプレート内のS3を参照〜」と記述されているので

SAMファイルから生成したCFnのファイル内でAWSの画面コンソールから作成しようとしても
変更セット作成時に同一のエラーが発生した。

#原因
どうやら
「対象バケットは同一テンプレート内で定義したものしかサポートしない」らしい
参考URL
https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3

issueも上がっている
https://github.com/awslabs/serverless-application-model/issues/124

#対応
同一テンプレート内のS3バケットであれば[**!GetAtt**]で問題なく定義できる。

#所感
AWS的にはアプリの機能毎にテンプレートを分けて欲しい為の仕様と思われる

アプリの立ち上げ時にS3、EC2、RDS、etcというAWSの機能単位でテンプレートを作成していた為、当事象に直面した。

他にもアプリを機能単位でまとめないと
CloudFormationのテンプレート内で使う組み込み関数での参照時に
循環依存の問題にぶち当たる事が多々ある

AWS的なベストプラクティスは
アプリの機能毎にテンプレートを分ける
という事なのだろうか？
Leetcode #49: Group Anagrams

```swift
func groupAnagrams(_ strs: [String]) -> [[String]] {
    var dict = [[Character: Int]: [String]]()
    for str in strs {
        var charDict = [Character: Int]()
        for char in str {
            if let value = charDict[char] {
                charDict[char] = value + 1
            } else {
                charDict[char] = 1
            }
        }
        if dict[charDict] != nil {
            dict[charDict]!.append(str)
        } else {
            dict[charDict] = [str]
        }
    }
    var answer = [[String]]()
    for value in dict.values {
        answer.append(value)
    }
    return answer
}
```
RISCV のやや個人的な用語集

RISCV にはいろいろな用語が登場し、規格書を読めば大体意味が頭に入ってくるのだが、たまに規格書には載っていなかったり、なかなか覚えられない用語がある。それらをメモする。

まずは、規格書に載っていない実装関係の用語。

|略称|説明|
|---|---|
|bbl|Berkeley Boot Loader の略。|
|fesvr| RISCV Frontend Server の略。 <br> htif などの機能を抱えるサーバー。https://github.com/riscv/riscv-fesvr|
|htif|Host/Target Interface の略。 <br> Linux システムコールエミュレーションなどの機能を提供する。 <br> ホストは PC (amd64) で、ターゲットは (エミュレータなどで動く) RISCV プロセッサのことだと思えばよい。 <br> fesvr に含まれる。|
|clint|Core Local Interruptor の略。SiFive E31 Core Complex Manual v19.02 Chaper 6 などに記述がある。|


以下には RISC-V Privileged Architectures v1.10 の 2.3 CSR Field Specifications に載っている用語をまとめる。
これらの用語はマニュアル中で頻出するのだが、全然覚えられない。
なお、SW 実装方針 / HW 実装方針は独自解釈なので、間違っているかもしれない。

|用語|説明|
|---|---|
|WIRI|Reserved Writes Ignored, Reads Ignore Values (WIRI) <br> 将来的に追加される可能性があり、SW 側は書き込んではならないフィールド。 <br> 書き込みは no effect, ただし read-only なレジスタなら例外が発生する可能性がある（フィールド起因ではない）。 <br> HW 実装方針: write は無視、read は 0 を返す。|
|WPRI|Reserved Writes Preserve Values, Read Ignore Values <br> 将来的に追加される可能性があり、SW 側で保存することが義務となるフィールド。 <br> HW 実装方針: write, read ともに通常のレジスタと同じ。|
|WLRL|Write / Read Only Legal Values <br> legal な値しか書いてはならない。 <br> illegal な値を書くと例外が発生するかもしれないし、発生しないかもしれない。 <br> HW 実装方針: write, read ともに通常のレジスタと同じ。|
|WARL|Write Any Values, Read Legal Values <br> どんな値を書いてもよい。（illegal な値は無視される） <br> 読み出すと正しい値が得られる。 <br> HW 実装方針: write は legal な場合のみ commit, read は通常のレジスタと同じ。|
[備忘録]iPhoneでつかえるショートカット集(画像保存編)

###はじめに
ショートカットとはiPhoneのiOS12から使えるようになったアプリです．知らない方は調べてください．

備忘録も兼ねて作成したショートカットのリンクを乗せています．ご自由にお使いください．iPhoneでリンクをタップして「ショートカットを入手」で取得できます．

インスタの画像保存については他の方が紹介したものを少し改良したものです．TwitterやYoutubeの保存ショートカットもありますが，それは各自で調べてください…

随時追加予定…？


##1.Instagramの画像動画一括保存
このショートカット実行で複数の画像，また動画を一括で保存します．
投稿の右上の「...」から「別アプリでシェア」を選択し，追加したショートカットを選択してください．
https://www.icloud.com/shortcuts/95de5514e6b24214830215d57438821a


##2.Instagramの動画保存
**1.**のショートカットではすべての画像動画を保存できますが，動画のみを保存したいときにはこのショートカットを実行してください．
https://www.icloud.com/shortcuts/428076f87feb4852b3dac99871968284

##3.Instagramの画像選択保存
**1.**のショートカットではすべての画像動画を保存できすが，この画像が保存したい！ってときにはこのショートカットを実行してください．このショートカットは動画に対応していないため，動画のみを保存したい場合は**2.**を実行してください．
https://www.icloud.com/shortcuts/b69f45a6113d4b1abe2cbea58adf65f3




##4.アメブロなどの画像保存
アメブロなどの画像がいくつかあるサイトの画像を保存したい場合に利用してください．
https://www.icloud.com/shortcuts/e6d4bffb09714054ad3303ae28db2cf9

**注意点**
- 画像サイズでフィルタをかけて保存するかどうか決めているため，小さな画像ははじくようにしてあります．必要に応じてフィルタのサイズを変更してください．
- ![必要に応じてココを変更](https://i.imgur.com/1bKCdFN.jpg)
- ログインが必要になるようなサイトでは使えません．




##最後に
画像保存編としましたが，他のショートカット編を作るかは未定です…
作ってほしいものなどありましたら連絡ください．
できそうだったら対応します．

はじめてのQiita投稿でした．
Leetcode #40: Combination Sum II

```swift
func combinationSum2(_ candidates: [Int], _ target: Int) -> [[Int]] {
    var answer = [[Int]]()
    helper(candidates.sorted(), 0, [], target, &answer)
    return answer
}

private func helper(_ candidates: [Int], _ startIndex: Int, _ ar: [Int], _ sum: Int, _ answer: inout [[Int]]) {
    if sum == 0 {
        answer.append(ar)
        return
    }
    if sum < 0 {
        return
    }
    guard startIndex < candidates.count else {
        return;
    }
    for i in startIndex..<candidates.count {
        if i-1 >= startIndex && candidates[i] == candidates[i-1] {
            continue
        }
        helper(candidates, i+1, ar+[candidates[i]], sum-candidates[i], &answer)
    }
}
```
Python3 初心者　関数

# 関数とは
関数とは文でいうと動詞みたいなもので何をしたいかというものを示しているものだと思ってくれればいい。これはコードをなんども定義しなくても関数を使うことで再利用することができる。例えば文字を出力する時はprint()を使っている。今回は関数を作ってみよう。
##　関数の作成
関数は（def　関数名():）
から作ることができる。それでは例を示してみよう

```py
def superman():
    print('Oops')

superman()
Oops
```

このように関数を呼び出す時には関数の後に()をつけることにより関数を使うことができます。その関数から返ってきたものが出てきます。
これからは何もしないただの関数の作り方を示していきます

```py
def nothing():
    pass
```

で関数は存在するが実際は関数は何もしないということである。
これから少し応用をして行こう。関数でTrueを返すものを作る。

```py
def agree():
    return True

if agree():
    print('nice')
else:
    print('Oops')

nice
```

ここで今までみたことのないreturnというものがある。returnは実際はprint()のように文字は打たないがTrueのようにその関数に形を表すのに必要と思ってくれれば良い。例えば

```py
def super():
    return 'Oh my god'
#　エラーが出ます
super()
'Oh my god'
print(super())
Oh my god
```

returnはそのままを返すものであるためprint()により文字列化してくれるのがわかるだろう。

## 仮引数
最初からそのサービスを使おうとわかるわけはない。だけど関数をつかっていろいろなことをしたい時にはどうすればいいのかというと仮引数を使うことが大切です。例を示してみましょう

```py
def superboy(someone):
    print(someone, 'is superboy')

superboy('Antoman')
Antoman is superboy
```

という風に自分の好きな文字列を好きなように入れられる。これはとても便利だと思います。次にオライリージャパンのpython３入門で書かれている例コードを書いてみます。python３入門はとてもわかりやすい入門書なのでぜひ読んでみてください。

```py
def commentry(color):
    if color=='red':
        return 'It is red'
    elif color=='green':
        return 'It is green'
    else:
        return 'What do you chose?'

commentry('green')
'It is green'
```

このようにif文と併用で関数は使うことができる。

##　None
Noneとは存在しない値のことを言います。例えばJavaでいうとNullみたいなものだ。これからis演算子を使ってNoneというものをチェックして行こう。is演算子は＋と同様に間に入れるものでisと似たような意味を持つものである。そのつでにどのようなものがNoneなのかみてみよう。

```py
def is_none(thing):
    if thing is None:
        print('It is None')
    elif thing:
        print('It is True')
    else:
        print('It is False')

is_none(None)
It is None
is_none(True)
It is True
is_none(0)
It is False
is_none([])
It is False  
```

これからわかる通りNoneというものは空の値や０などはFalseとして認識されているということを覚えてもらいたい。次のブログでは引数について詳しく触れていきたと思う。
Leetcode #39: Combination Sum

```swift
func combinationSum(_ candidates: [Int], _ target: Int) -> [[Int]] {
    var answer = [[Int]]()
    helper(candidates, 0, [], target, &answer)
    return answer
}

private func helper(_ candidates: [Int], _ startIndex: Int, _ ar: [Int], _ sum: Int, _ answer: inout [[Int]]) {
    if sum == 0 {
        answer.append(ar)
        return
    }
    if sum < 0 {
        return
    }
    for i in startIndex..<candidates.count {
        helper(candidates, i, ar+[candidates[i]], sum-candidates[i], &answer)
    }
}
```
Leetcode #48: Rotate Image

```swift
func rotate(_ matrix: inout [[Int]]) {
    let n = matrix.count
    var start = 0
    var end = n-2
    for i in 0..<n/2 {
        for j in start...end {
            var num = matrix[i][j]
            var x = i
            var y = j
            for _ in 0..<4 {
                let tmpNum = num
                num = matrix[y][n-x-1]
                matrix[y][n-x-1] = tmpNum
                let tmpX = x
                x = y
                y = n-tmpX-1
            }
        }
        start += 1
        end -= 1
    }
}
```
linuxでcutコマンドを使ってテキストファイルやログを整形する


備忘録
linuxでテキストファイルやログを整形する。

例えばファイアウォールのログなどで、日付と送信元IPアドレスと宛先IPアドレスだけを確認したい時。

```sample.log
2019-05-08 00:00:00,aaa,bbb,cccc,192.168.0.1,192.168.10.1,yy,zz
2019-05-08 00:00:01,aaa,bbb,cccc,192.168.0.1,192.168.10.2,yy,zz
2019-05-08 00:00:02,aaa,bbb,cccc,192.168.0.2,192.168.20.1,yy,zz
2019-05-08 00:00:03,aaa,bbb,cccc,192.168.0.2,192.168.20.2,yy,zz
```
とりあえずcutコマンドを使う。
-fオプションで取り出すフィールドを指定します。

```
$ cut -f 1,5-6 sample.log
```
あかん。何もならん・・・。
デフォルトでは区切り文字が`タブ`になっている。

区切り文字を指定する場合`-dオプション`を指定する。

```
$ cut -f 1,5-6 -d "," sample.log
```
１、５、６列目のみ取り出すことができた。

```
2019-05-08 00:00:00,192.168.0.1,192.168.10.1
2019-05-08 00:00:01,192.168.0.1,192.168.10.2
2019-05-08 00:00:02,192.168.0.2,192.168.20.1
2019-05-08 00:00:03,192.168.0.2,192.168.20.2
```
男女を判別するモデルを作成

# 概要
[この記事](https://qiita.com/iharak/items/1163eeeeb189664c951f)の一部です。

目標：顔が写っている画像から、男女を識別したい。

## 全体の流れ
1. 男女別のラベルが付いている画像データを用意。
2. VGG16を転移学習させる

# 1. 男女別のラベルが付いている画像データを用意。
[UTKFace](https://susanqq.github.io/UTKFace/)のデータセットを利用。
もともと顔の部分のみ切り取られた画像のものと、上半身が写っている画像のものが用意されているが、実際に適用したい画像はdlibでマージンをつけて切り取ったものなので、こちらも同様にdlibで切り取った。

#2. VGG16を転移学習させる
```vgg_face.py
import os
import glob
import numpy as np
import keras
import matplotlib.pyplot as plt
%matplotlib inline

img_width, img_height = 224, 224

from keras.preprocessing.image import ImageDataGenerator

# data augumentation
train_datagen = ImageDataGenerator(
    rescale=1.0 / 255,
    zca_whitening=True,
    rotation_range=20,
    zoom_range=0.2,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True
)

test_datagen = ImageDataGenerator(rescale=1.0 / 255)

from keras.models import Sequential, Model
from keras.layers import Dense, Input, Flatten, Dropout
from keras.applications.vgg16 import VGG16

# set input layer and load vgg16
input_tensor = Input(shape=(img_height, img_width, 3))
vgg16_model = VGG16(include_top=False, input_tensor=input_tensor)
# 14層目までのモデル重みを固定（VGG16のモデル重みを用いる）
for layer in vgg16_model.layers[:15]:
    layer.trainable = False

# define FC layer
fc_model = Sequential()
fc_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
fc_model.add(Dense(256, activation='relu'))
fc_model.add(Dropout(0.5))
fc_model.add(Dense(1, activation='sigmoid'))

model = Model(inputs=vgg16_model.input, outputs=fc_model(vgg16_model.output))

model.compile(
    # optimizer = "adam", これはうまく行かないらしい
    optimizer=keras.optimizers.SGD(lr=1e-4, momentum=0.9),
    loss='binary_crossentropy',
    metrics=['accuracy']
)

# es_cb = keras.callbacks.EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')
tb_cb = keras.callbacks.TensorBoard(log_dir="./logs")

#VGG
train_data_dir = './margin30/train'
test_data_dir = './margin30/test/'

train_generator = train_datagen.flow_from_directory(
        train_data_dir,
        target_size=(224, 224),
        batch_size=32,
        class_mode='binary')

test_generator = test_datagen.flow_from_directory(
    test_data_dir,
    target_size=(224, 224),
    batch_size=32,
    class_mode='binary')

train_steps = len(glob.glob('./margin30/train/man/*'))
validation_steps = len(glob.glob('./margin30/test/man/*'))
epochs = 100

history = model.fit_generator(
        train_generator,
        steps_per_epoch=train_steps,
        epochs=epochs,
        validation_data=test_generator,
        validation_steps=validation_steps,
        callbacks=[tb_cb]
)

model.save('margin20_close_100.hdf5')
```
RStudioが起動しなくなった（起動するけど白い）→解決済み

# 起きたこと
RStudioを起動しても、上部メニューバー以外が白くなって、動かない。
メニューバーも表示はされるが、ボタンは反応しない
RStudioのバージョンは、Version 1.2.1335

# 原因
たぶん、Rstudioをネットワーク上のRportable内のR.exeに紐づけ設定したのが悪かった気がする。
知らんけど
(追記）ネットワークパスに「日本語」が入っていると発生する模様。
これもしかしたらネットワーク関係なく、R.exeへのパスに日本語入ってるとダメなのかも。

# とった対策（効果なし）
R、Rstudio　全部アンインストール
Users/**/Appdata 内の関連ファイルも全部削除
↓
その後、再インストール
が、回復せず。オワタ？？

さらに。Ctrlキーを推しながらRStudioアイコンをダブルクリックして、
Rのパスを選択する画面は呼び出せたので、ネットワーク上→ローカルのRに変更した。
でもコレも意味なかったかも。

# 解決
ここに同じ症状のQ&Aがあった。（英語）
https://support.rstudio.com/hc/en-us/community/posts/200653226-Can-t-start-R-Studio-Fatal-error-R-code-execution-error
要は、古いRStudioを入れたら動いたよ　ということらしい。
ここの、RStudio-1.1.463.exe　を入れたら確かに起動できた。
で、その後最新バージョンを再インストールしたらそれも動いた。

というわけで解決。結構詰まったので共有です。
コマンドラインオプション付きのChromeをLaunchpadから起動する

# 概要

ウェブアプリケーションのテストなどの際、通常利用するブラウザとは別にテスト用のブラウザプロセスを立ち上げる必要が生じることがある。
その際使用するChromeの起動オプションと、MacのLaunchpadからこれを呼び出すためのAutomatorの設定をまとめる。

# Chromeの起動オプション

前提:

- `${HOME}/Workspace/Google/Chrome/Default` が存在する
- `localhost:8080` でプロキシツールがlistenしている
- 脆弱性診断用途を想定

```bash
open -na "Google Chrome" --args --user-data-dir="${HOME}/Workspace/Google/Chrome/Default" --proxy-server=localhost:8080 --disable-xss-auditor
```

# Automatorの設定

Automatorに上記コマンドを書いて `/Applications` に保存する。アイコンは適当に設定する。

<img width="1112" alt="スクリーンショット 2019-05-09 20.17.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53690/c423c0c4-9bd9-bceb-aaaa-e497561432b9.png">

すると、Launchpadから起動できるようになる。
<img width="1920" alt="スクリーンショット 2019-05-09 20.21.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53690/350ef48a-a02e-9a7f-7c89-e83516ef8467.png">
ショートカットキーメモ

#Word
ALTを押した後にキーボード入力をするとマウス操作なしで以下の項目にたどり着く。

1. 相互参照
ALT,s,rf    #ALT→参考資料→Reference

2. 図の挿入
ALT,s,g     #ALT→参考資料→Graph

3. 写真の挿入
ALT,n,p    #ALT→iNsert→Photo

#Excel
貼り付け
Ctrl + Alt のあと V を押すと，貼り付けのオプションを選択できる．
【Java】管理のためのパッケージ

Javaでプログラミングしていくとき、作成されるクラスをたくさん作成してしまうと、それをきちんと整理しておかないと、管理が難しくなっていきます。また、共同でクラスを作成していた場合、他の人が作ったクラスを利用するとき、自分が作ったクラスと区別する必要があります。それらを行うためのパッケージについて説明します。
#パッケージとクラス
Javaではクラスを集めてパッケージと呼ばれるクラスの集まりを作ることができます。クラスを部品と考えると、関連の強い部品を1つに集めたものが**パッケージ**ということができます。
例えば、科学計算などを行うプログラムを作成する場合、複雑な計算式をプログラム中に１から記述する必要はなく、科学計算パッケージを入手しそれを利用することで簡単に科学計算を行うことができます。
パッケージは他のパッケージと区別できるように、それぞれ固有の名前が付けられています。固有の名前付けがきちんと守られるように、Javaではインターネットのドメインを逆順にしたものをパッケージの先頭につけることを推奨しています。例えば、ドメイン名が「blogramming.co.jp」としたとき、パッケージ名の先頭は「jp.co.blogramming」となります。
#パッケージ名を使ったパッケージ利用
Javaは必要なパッケージを必要な時に必要なだけ取り組む仕組みになっています。そのため、プログラム中にimportを用いて、どのパッケージを取り込むかを明記する必要があります。その１つの方法がパッケージ名を指定したパッケージの利用です。
以下に示すプログラムは、java.textパッケージのDecimalFormatクラスを使用したものです。
パッケージ名の後に、「.」を付けクラス名を指定することで、java.textパッケージに含まれているDecimalFormatクラスのインスタンスを生成しています。

```java:PackageTest1.java
class PackageTest1{
  public static void main(String[] args){
    int x=1234567;

    java.text.DecimalFormat df=new java.text.DecimalFormat(",###");

    System.out.println("x="+x);
    System.out.println("x="+df.format(x));
  }
}
```

#importによるパッケージ利用
パッケージ名を記述することで、パッケージに含まれているクラスを使用することができるようになりましたが、プログラムの記述がとても長くなってしまっています。
ここでimportを使います。importを用いることで、パッケージの取り込みができるのでパッケージ名を記述することなく、手元にあるクラスとしてクラス名だけで使用することが可能になります。ただし、importは物理的にパッケージ内のクラスをコピーしたり、プログラムリストの中に挿入したりするわけではなく論理的に取り込んでいるので、一度importしてしまえば後はしなくてよいのではなく、プログラムの作成中は常にimportを記述しておかなかればなりません。

```java:PackageTest2.java
import java.text.DecimalFormat;

class PackageTest2{
  public static void main(String[] args){
    int x=1234567;

    DecimalFormat df=new DecimalFormat(",###");

    System.out.println("x="+x);
    System.out.println("x="+df.format(x));
  }
}
```